diff --git a/.circleci/config.yml b/.circleci/config.yml
index 83d25acc..62dc1183 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,21 +1,18 @@
version: 2.1
-
-executors:
- cider-ci:
- docker:
- - image: circleci/node:16
- working_directory: ~/Cider
-
orbs: # adds orbs to your configuration
jira: circleci/jira@1.0.5 # invokes the Jira orb, making its commands accessible
-
-# The jobs for this project
+branches:
+ only:
+ - main
+ - develop
jobs:
- prepare-build:
- executor: cider-ci
+ build:
+ working_directory: ~/Cider
+ docker:
+ - image: circleci/node:16
+
steps:
- checkout
- - run: ls -la
- run:
name: Set App Version
command: echo "export APP_VERSION=$(grep '"version":.*' package.json | cut -d '"' -f 4 | head -1)" >> $BASH_ENV
@@ -35,144 +32,50 @@ jobs:
paths:
- ~/.cache/yarn
- run:
- name: TypeScript Compile
- command: yarn build
- - persist_to_workspace:
- # Must be an absolute path, or relative path from working_directory. This is a directory on the container which is
- # taken to be the root directory of the workspace.
- root: .
- # Must be relative path from root
- paths:
- - node_modules
- - build
- - resources
- - yarn.lock
- - package.json
- - winget.json # winget.json is a file that is generated by the winget package manager
- - LICENSE
- - license.txt
-
- build-windows:
- executor: cider-ci
- steps:
- - attach_workspace:
- at: ~/Cider
- - run:
- name: Install Windows System Build Dependencies
+ name: Install system build dependencies
command: |
sudo apt-get update -y
+ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt-get install -y dpkg fakeroot wine64
sudo dpkg --add-architecture i386
sudo apt-get update -y
sudo apt-get install -y wine32
+ sudo apt install -y gh
- run:
name: Fix Versioning and Add Channel
command: yarn circle:script
- run:
- name: Generate Builds (Windows)
- command: yarn electron-builder -w --x64 -p never
- post-steps:
- - jira/notify
- - persist_to_workspace:
- root: .
- paths:
- - dist/*.exe
- - dist/latest.yml
-
- build-linux:
- executor: cider-ci
- steps:
- - attach_workspace:
- at: ~/Cider
- - run:
- name: Fix Versioning and Add Channel
- command: yarn circle:script
+ name: TypeScript Compile
+ command: yarn build
- run:
name: Generate Builds (Linux)
command: yarn electron-builder -l -p never
post-steps:
- jira/notify
- - persist_to_workspace:
- root: .
- paths:
- - dist/*.deb
- - dist/*.AppImage
- - dist/*.snap
- - dist/latest-linux.yml
-
- build-winget:
- executor: cider-ci
- steps:
- - attach_workspace:
- at: ~/Cider
- run:
- name: Install Windows System Build Dependencies
- command: |
- sudo apt-get update -y
- sudo apt-get install -y dpkg fakeroot wine64
- sudo dpkg --add-architecture i386
- sudo apt-get update -y
- sudo apt-get install -y wine32
- - run:
- name: Fix Versioning and Add Channel
- command: yarn circle:script
+ name: Generate Builds (Windows)
+ command: yarn electron-builder -w --x64 -p never
+ post-steps:
+ - jira/notify
- run:
name: Generate Builds (Winget)
command: yarn electron-builder --win -c winget.json -p never
post-steps:
- jira/notify
- - persist_to_workspace:
- root: .
- paths:
- - dist/*.exe
- # - dist/*.yml
-
- release:
- executor: cider-ci
- steps:
- - attach_workspace:
- at: ~/Cider/
- - run:
- name: Installing GitHub Command Line Interface
- command: |
- sudo apt-get update -y
- curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
- echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
- sudo apt-get update -y
- sudo apt install -y gh
- run:
name: Move Build Files
command: |
- mkdir ~/Cider/dist/artifacts/
- mv ~/Cider/dist/*.exe ~/Cider/dist/artifacts
- mv ~/Cider/dist/*.deb ~/Cider/dist/artifacts
- mv ~/Cider/dist/*.AppImage ~/Cider/dist/artifacts
- mv ~/Cider/dist/*.snap ~/Cider/dist/artifacts
- mv ~/Cider/dist/*.yml ~/Cider/dist/artifacts
- mv ~/Cider/dist/*.blockmap ~/Cider/dist/artifacts
+ mkdir ~/Cider/dist/artifacts/
+ mv ~/Cider/dist/*.exe ~/Cider/dist/artifacts
+ mv ~/Cider/dist/*.deb ~/Cider/dist/artifacts
+ mv ~/Cider/dist/*.AppImage ~/Cider/dist/artifacts
+ mv ~/Cider/dist/*.snap ~/Cider/dist/artifacts
+ mv ~/Cider/dist/*.yml ~/Cider/dist/artifacts
+ mv ~/Cider/dist/*.blockmap ~/Cider/dist/artifacts
- store_artifacts:
- path: ~/Cider/dist/artifacts
+ path: ~/Cider/dist/artifacts
- run:
name: Publish Release
command: |
- gh release create "v${APP_VERSION}.${CIRCLE_BUILD_NUM}" --title "Cider Version ${APP_VERSION} - Build ${CIRCLE_BUILD_NUM} (${CIRCLE_BRANCH})" --generate-notes -R ciderapp/cider-releases ~/Cider/dist/artifacts/*.deb ~/Cider/dist/artifacts/*.AppImage ~/Cider/dist/artifacts/*.snap ~/Cider/dist/artifacts/*.exe ~/Cider/dist/artifacts/*.yml ~/Cider/dist/artifacts/*.blockmap
-
-# Orchestrate our job run sequence
-workflows:
- build_and_release:
- jobs:
- - prepare-build
- - build-windows:
- requires:
- - prepare-build
- - build-linux:
- requires:
- - prepare-build
- - build-winget:
- requires:
- - prepare-build
- - release:
- requires:
- - build-windows
- - build-linux
- - build-winget
+ gh release create "v${APP_VERSION}.${CIRCLE_BUILD_NUM}" --title "Cider Version ${APP_VERSION} - Build ${CIRCLE_BUILD_NUM} (${CIRCLE_BRANCH})" --generate-notes -R ciderapp/cider-releases ~/Cider/dist/artifacts/*.deb ~/Cider/dist/artifacts/*.AppImage ~/Cider/dist/artifacts/*.snap ~/Cider/dist/artifacts/*.exe ~/Cider/dist/artifacts/*.yml ~/Cider/dist/artifacts/*.blockmap
diff --git a/package.json b/package.json
index 70e22263..6cad8ece 100644
--- a/package.json
+++ b/package.json
@@ -39,7 +39,7 @@
"@sentry/electron": "^3.0.7",
"@sentry/integrations": "^6.19.6",
"adm-zip": "0.4.10",
- "airtunes2": "git+https://github.com/vapormusic/node_airtunes2.git",
+ "airtunes2": "git+https://github.com/vapormusic/node_airtunes2.git#hap",
"castv2-client": "^1.2.0",
"chokidar": "^3.5.3",
"discord-rpc": "^4.0.1",
diff --git a/src/i18n/zh_CN.json b/src/i18n/zh_CN.json
index 356b70c1..0726b1cc 100644
--- a/src/i18n/zh_CN.json
+++ b/src/i18n/zh_CN.json
@@ -22,6 +22,7 @@
"term.login": "登录",
"term.about": "关于",
"term.privateSession": "私人聆听",
+ "term.lyrics": "歌词",
"term.queue": "待播清单",
"term.history": "历史记录",
"term.miniplayer": "迷你播放器",
@@ -115,7 +116,11 @@
"term.contributors": "贡献者",
"term.equalizer": "均衡器",
"term.reset": "重置",
- "term.tracks": "首歌曲",
+ "term.track": {
+ "one": "首歌曲",
+ "other": "首歌曲"
+ },
+ "term.tracks": "歌曲",
"term.videos": "音乐视频",
"term.menu": "菜单",
"term.check": "检查",
@@ -161,6 +166,9 @@
"podcast.episodes": "单集",
"podcast.playEpisode": "播放单集",
"podcast.website": "Podcast 网站",
+ "action.edit": "编辑",
+ "action.done": "完成",
+ "action.editTracklist": "编辑歌曲清单",
"action.addToLibrary": "加入资料库",
"action.addToLibrary.success": "成功加入资料库",
"action.addToLibrary.error": "加入资料库的过程发生了错误",
@@ -187,6 +195,7 @@
"action.startRadio": "开始电台",
"action.goToArtist": "前往艺人",
"action.goToAlbum": "前往专辑",
+ "action.showInAppleMusic": "显示于 Apple Music",
"action.moveToTop": "移到顶部",
"action.share": "分享歌曲",
"action.rename": "重命名",
@@ -203,11 +212,19 @@
"action.showAlbum": "显示专辑",
"action.tray.minimize": "最小化",
"action.tray.quit": "退出",
-
"action.update": "更新",
"action.copy": "复制",
"action.newpreset": "新建默认...",
"action.deletepreset": "删除默认",
+ "action.open": "打开",
+ "action.cast.chromecast": "Chromecast",
+ "action.cast.todevices": "投射到设备",
+ "action.cast.stop": "停止投射到所有设备",
+ "action.cast.airplay": "AirPlay",
+ "action.cast.airplay.underdevelopment": "AirPlay 仍处于开发阶段中,敬请期待。",
+ "action.cast.scan": "搜索",
+ "action.cast.scanning": "搜索中...",
+ "action.createNew": "添加...",
"settings.header.general": "通用",
"settings.header.general.description": "调整 Cider 的通用设置",
"settings.option.audio.volumeStep": "音量改变量",
@@ -218,6 +235,10 @@
"settings.option.general.resumebehavior.locally.description": "Cider 将还原你在这台电脑上的最后一次操作。",
"settings.option.general.resumebehavior.history": "历史",
"settings.option.general.resumebehavior.history.description": "Cider 将跨设备将你的整个 Apple Music 历史记录中的最后一首歌曲排队入列。",
+ "settings.option.general.resumetabs": "启动时打开的选项页面",
+ "settings.option.general.resumetabs.description": "你可以选择启动 Cider 时要默认打开的页面。",
+ "settings.option.general.resumetabs.dynamic": "动态",
+ "settings.option.general.resumetabs.dynamic.description": "Cider 将自动打开你上次停留的页面。",
"settings.option.general.language": "语言",
"settings.option.general.language.main": "语言",
"settings.option.general.language.fun": "恶搞语言",
@@ -229,6 +250,8 @@
"settings.option.general.updateCider.branch.develop": "测试(Develop)",
"settings.option.general.customizeSidebar": "自定义侧边栏的功能",
"settings.option.general.customizeSidebar.customize": "自定义",
+ "settings.option.general.keybindings": "快捷操作键",
+ "settings.option.general.keybindings.open": "打开",
"settings.notyf.updateCider.update-not-available": "没有可用的更新",
"settings.notyf.updateCider.update-downloaded": "更新已成功下载,重启后进行更新",
"settings.notyf.updateCider.update-error": "更新时,发生错误",
@@ -250,20 +273,27 @@
"settings.option.audio.audioLab": "Cider 音频实验室",
"settings.option.audio.audioLab.description": "包含由 Cider 开发团队进行的各种音频优化功能。",
"settings.warn.audioLab.withoutAF": "使用 Cider 音频实验室需要打开进阶音频功能才可使用。" ,
-"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "模拟温暖",
+ "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "模拟温暖",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "以 Korg Nutube 6P1 为蓝本的模拟温暖。",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "模拟温暖强度",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "改变模拟温暖模组处理的强度。",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "温和",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "温暖",
-"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 数码增强音频处理™️",
+ "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider 音乐气氛实现器™️",
+ "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "以最先进的音频置为蓝本,实现不同的音乐气氛。",
+ "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider 音乐气氛™️模式",
+ "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "更改气氛实现器模块的操作模式。",
+ "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.natural1": "自然(标准)",
+ "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.natural2": "自然(高)",
+ "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.natural3": "自然(增强)",
+ "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 数码增强音频处理™️",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "通过人类的听力心理学模型和 AAC 编码特色的即时算法,强化 256 kbps AAC 音频的感知音频质量。",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "数码增强音频处理设置",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "将更改音频处理的激进/振奋程度(增强选项有可能会引起杂讯)。",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "标准",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "增强",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡",
-"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自动将歌曲播放音量调整到相同水平,享受更舒适的聆听体验。",
+ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自动将歌曲播放音量调整到相同水平,享受更舒适的聆听体验。",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "此功能由音频实验室管理",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空间音频",
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "将音频进行空间化处理来制造一个更立体的聆听体验(注:此功能不是官方的杜比全景声)。",
@@ -274,6 +304,7 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "标准",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "发烧友",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "音频空间无法与 CAP 相容,请关闭 CAP 在进行操作。",
+ "settings.option.visual.uiscale": "UI界面大小",
"settings.header.visual": "外观",
"settings.header.visual.description": "调整 Cider 的外观",
"settings.option.visual.windowBackgroundStyle": "窗口背景样式",
@@ -327,14 +358,16 @@
"settings.option.lyrics.enableMusixmatchKaraoke": "启用卡拉 OK 模式(仅 Musixmatch)",
"settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌词语言偏好",
"settings.option.lyrics.enableYoutubeLyrics": "播放 MV 时使用 YouTube 歌词",
+ "settings.option.lyrics.enableQQLyrics": "启用 QQ 音乐的歌词",
"settings.header.connectivity": "外部连接",
"settings.header.connectivity.description": "调整 Cider 与外部应用的交互设置",
"settings.option.connectivity.discordRPC": "Discord 动态",
"settings.option.connectivity.playbackNotifications": "歌曲播放通知",
- "settings.header.connectivity.discordRPC.cider": "显示正在使用 'Cider'",
- "settings.header.connectivity.discordRPC.appleMusic": "显示正在使用 'Apple Music'",
+ "settings.option.connectivity.discordRPC.clientName": "应用程序名称",
"settings.option.connectivity.discordRPC.clearOnPause": "暂停时清除 Discord 动态",
"settings.option.connectivity.discordRPC.hideButtons": "隐藏 Discord 动态上的按钮",
+ "settings.option.connectivity.discordRPC.detailsFormat": "详细信息格式",
+ "settings.option.connectivity.discordRPC.stateFormat": "动态格式",
"settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 记录",
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延迟 (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "打开 LastFM 正在播放",
diff --git a/src/i18n/zh_TW.json b/src/i18n/zh_TW.json
index ce9cf9a4..0062f872 100644
--- a/src/i18n/zh_TW.json
+++ b/src/i18n/zh_TW.json
@@ -151,6 +151,9 @@
"podcast.episodes": "單集",
"podcast.playEpisode": "播放單集",
"podcast.website": "Podcast 網站",
+ "action.edit": "編輯",
+ "action.done": "完成",
+ "action.editTracklist": "編輯歌曲清單",
"action.addToLibrary": "加入到資料庫",
"action.addToLibrary.success": "成功加入資料庫",
"action.addToLibrary.error": "加入資料庫時,發生錯誤",
@@ -215,10 +218,10 @@
"settings.option.general.resumebehavior.locally.description": "Cider 將還原你在這台電腦上的最後一次操作。",
"settings.option.general.resumebehavior.history": "歷史",
"settings.option.general.resumebehavior.history.description": "Cider 將跨裝置將你的整個 Apple Music 歷史記錄中的最後一首歌曲排隊入列。",
- "settings.option.general.resumetabs": "啟動時打開的選項",
- "settings.option.general.resumetabs.description": "你可以選擇啟動 Cider 時要預設打開的左側選項欄。",
- "settings.option.general.resumetabs.dynamic": "動態",
- "settings.option.general.resumetabs.dynamic.description": "Cider 將打開你上次停留的左側選項欄。",
+ "settings.option.general.resumetabs": "啟動時打開的選項頁面",
+ "settings.option.general.resumetabs.description": "你可以選擇啟動 Cider 時要預設打開的頁面。",
+ "settings.option.general.resumetabs.dynamic": "自動",
+ "settings.option.general.resumetabs.dynamic.description": "Cider 將自動打開你上次停留的頁面。",
"settings.option.general.language.main": "語言",
"settings.option.general.language.fun": "特殊語言",
"settings.option.general.language.unsorted": "未分類",
diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts
index afb38607..2089686c 100644
--- a/src/main/base/browserwindow.ts
+++ b/src/main/base/browserwindow.ts
@@ -95,6 +95,7 @@ export class BrowserWindow {
"components/fullscreen",
"components/miniplayer",
"components/castmenu",
+ "components/airplay-modal",
"components/artist-chip",
"components/hello-world",
"components/inline-collection-list",
@@ -897,6 +898,10 @@ export class BrowserWindow {
event.returnValue = process.platform;
});
+ ipcMain.on("get-port", (event) => {
+ event.returnValue = this.clientPort;
+ });
+
ipcMain.on("is-dev", (event) => {
event.returnValue = this.devMode;
});
diff --git a/src/main/plugins/chromecast.ts b/src/main/plugins/chromecast.ts
index 5702fefc..0cac3506 100644
--- a/src/main/plugins/chromecast.ts
+++ b/src/main/plugins/chromecast.ts
@@ -28,7 +28,7 @@ export default class ChromecastPlugin {
// private GCstream = new Stream.PassThrough(),
private connectedHosts: any = {};
private connectedPlayer: any;
- // private port = false;
+ private ciderPort :any = 9000;
// private server = false;
// private bufcount = 0;
// private bufcount2 = 0;
@@ -148,7 +148,7 @@ export default class ChromecastPlugin {
}
let media = {
// Here you can plug an URL to any mp4, webm, mp3 or jpg file with the proper contentType.
- contentId: 'http://' + this.getIp() + ':9000/audio.wav',
+ contentId: 'http://' + this.getIp() + ':'+ this.ciderPort +'/audio.wav',
contentType: 'audio/wav',
streamType: 'LIVE', // or LIVE
@@ -361,4 +361,12 @@ export default class ChromecastPlugin {
}
+ onRendererReady(): void {
+ this._win.webContents.executeJavaScript(
+ `ipcRenderer.sendSync('get-port')`
+ ).then((result: any) => {
+ this.ciderPort = result;
+ });
+ }
+
}
\ No newline at end of file
diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts
index e6908375..a4d70aba 100644
--- a/src/main/plugins/raop.ts
+++ b/src/main/plugins/raop.ts
@@ -89,9 +89,9 @@ export default class RAOP {
`;
private ondeviceup(name: any, host: any, port: any, addresses: any, text: any) {
- if (this.castDevices.findIndex((item: any) => item.name === host && item.port === port && item.addresses === addresses) === -1) {
+ if (this.castDevices.findIndex((item: any) => item.name == host.replace(".local","") && item.port == port && item.addresses == addresses) === -1) {
this.castDevices.push({
- name: host,
+ name: host.replace(".local",""),
host: addresses ? addresses[0] : '',
port: port,
addresses: addresses,
@@ -147,14 +147,28 @@ export default class RAOP {
browser.on('ready', browser.discover);
browser.on('update', (service: any) => {
- if (service.addresses && service.fullname && (service.fullname.includes('_raop._tcp') || service.fullname.includes('_airplay._tcp'))) {
+ if (service.addresses && service.fullname && (service.fullname.includes('_raop._tcp') || service.fullname.includes('_airplay._tcp'))) {
// console.log(service.txt)
this._win.webContents.executeJavaScript(`console.log(
"${service.name} ${service.host}:${service.port} ${service.addresses}"
)`);
- this.ondeviceup(service.name, service.host, service.port, service.addresses, service.txt);}
+ this.ondeviceup(service.name, service.host, service.port, service.addresses, service.txt);
+ }
});
+
+ // const browser2 = this.mdns.createBrowser(this.mdns.tcp('airplay'));
+ // browser2.on('ready', browser2.discover);
+ // browser2.on('update', (service: any) => {
+ // if (service.addresses && service.fullname && (service.fullname.includes('_raop._tcp') || service.fullname.includes('_airplay._tcp'))) {
+ // // console.log(service.txt)
+ // this._win.webContents.executeJavaScript(`console.log(
+ // "${service.name} ${service.host}:${service.port} ${service.addresses}"
+ // )`);
+ // this.ondeviceup(service.name, service.host, service.port, service.addresses, service.txt);
+ // }
+ // });
+
});
@@ -178,6 +192,15 @@ export default class RAOP {
this._win.webContents.setAudioMuted(true);
this._win.webContents.executeJavaScript(`CiderAudio.sendAudio()`).catch((err: any) => console.error(err));
}
+ if (status == "need_password"){
+ this._win.webContents.executeJavaScript(`app.setAirPlayCodeUI()`)
+ }
+ if (status == "pair_success"){
+ this._win.webContents.executeJavaScript(`app.sendAirPlaySuccess()`)
+ }
+ if (status == "pair_failed"){
+ this._win.webContents.executeJavaScript(`app.sendAirPlayFailed()`)
+ }
if (status == 'stopped') {
this.airtunes.stopAll(() => {
console.log('end');
@@ -210,6 +233,12 @@ export default class RAOP {
});
+ electron.ipcMain.on('setAirPlayPasscode', (event, passcode) => {
+ if (this.device){
+ this.device.setPasscode(passcode)
+ }
+ })
+
electron.ipcMain.on('writeWAV', (event, leftbuffer, rightbuffer) => {
if (this.airtunes != null) {
if (this.worker == null) {
diff --git a/src/renderer/less/elements.css b/src/renderer/less/elements.css
index 7aef758e..20323ac9 100644
--- a/src/renderer/less/elements.css
+++ b/src/renderer/less/elements.css
@@ -372,8 +372,7 @@
background-repeat: no-repeat;
}
.heart-icon {
- height: 18px;
- width: 39px;
+ position: absolute;
filter: contrast(0);
background-repeat: no-repeat;
}
diff --git a/src/renderer/less/elements.less b/src/renderer/less/elements.less
index c5fae7a8..b2ee7753 100644
--- a/src/renderer/less/elements.less
+++ b/src/renderer/less/elements.less
@@ -457,8 +457,8 @@
}
.heart-icon {
- height: 18px;
- width: 39px;
+ position: absolute;
+ right:0;
filter: contrast(0);
background-repeat: no-repeat;
}
diff --git a/src/renderer/less/helpers.less b/src/renderer/less/helpers.less
index db659232..245cce92 100644
--- a/src/renderer/less/helpers.less
+++ b/src/renderer/less/helpers.less
@@ -70,10 +70,11 @@
.spatialproperties-panel {
.modal-window {
+ &:not(.airplay-modal){
height : 700px;
max-height: 700px;
width : 800px;
- max-width : 800px;
+ max-width : 800px;}
overflow : hidden;
.info-header {
diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js
index a00c345d..0356313f 100644
--- a/src/renderer/main/vueapp.js
+++ b/src/renderer/main/vueapp.js
@@ -207,6 +207,7 @@ const app = new Vue({
showPlaylist: false,
castMenu: false,
moreInfo: false,
+ airplayPW: false,
},
socialBadges: {
badgeMap: {},
@@ -3830,6 +3831,15 @@ const app = new Vue({
// tracks are found in relationship.data
},
+ setAirPlayCodeUI() {
+ this.modals.airplayPW = true
+ },
+ sendAirPlaySuccess(){
+ notyf.success('Device paired successfully!');
+ },
+ sendAirPlayFailed(){
+ notyf.error('Device paring failed!');
+ },
windowFocus(val) {
if (val) {
document.querySelectorAll(".animated-artwork-video").forEach(el => {
@@ -4009,7 +4019,8 @@ const app = new Vue({
}
}
- if (app.mk.nowPlayingItem._container["attributes"] && app.mk.nowPlayingItem._container.name != "station") {
+ const nowPlayingContainer = app.mk.nowPlayingItem._container;
+ if (nowPlayingContainer && nowPlayingContainer["attributes"] && nowPlayingContainer.name != "station") {
menus.normal.items.find(x => x.id == "showInMusic").hidden = false
}
diff --git a/src/renderer/style.css b/src/renderer/style.css
index 4ef47570..5683d8c9 100644
--- a/src/renderer/style.css
+++ b/src/renderer/style.css
@@ -7936,9 +7936,12 @@ fieldset:disabled .btn {
filter: contrast(0);
background-repeat: no-repeat;
}
+.cd-mediaitem-list-item .playIcon{
+ width: 44px;
+ margin-left: 11px;
+}
.cd-mediaitem-list-item .heart-icon {
- height: 18px;
- width: 39px;
+ position: absolute;
filter: contrast(0);
background-repeat: no-repeat;
}
diff --git a/src/renderer/views/app/panels.ejs b/src/renderer/views/app/panels.ejs
index 69a6f18e..eaccb5f2 100644
--- a/src/renderer/views/app/panels.ejs
+++ b/src/renderer/views/app/panels.ejs
@@ -28,6 +28,9 @@