From 3e728848d79d630d0a6a6b268ea6ad0bd5ef4a9a Mon Sep 17 00:00:00 2001 From: vapormusic Date: Fri, 29 Apr 2022 16:28:12 +0700 Subject: [PATCH 01/20] uptest --- package.json | 2 +- src/main/base/browserwindow.ts | 1 + src/main/plugins/raop.ts | 12 ++++++ src/renderer/less/helpers.less | 3 +- src/renderer/main/vueapp.js | 7 ++++ src/renderer/views/app/panels.ejs | 3 ++ .../views/components/airplay-modal.ejs | 42 +++++++++++++++++++ 7 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/renderer/views/components/airplay-modal.ejs 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/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index afb38607..56d847be 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", diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts index e6908375..ba8e8395 100644 --- a/src/main/plugins/raop.ts +++ b/src/main/plugins/raop.ts @@ -178,6 +178,12 @@ 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 == 'stopped') { this.airtunes.stopAll(() => { console.log('end'); @@ -210,6 +216,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/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 bcc7dfce..e40ee7a7 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: {}, @@ -3836,6 +3837,12 @@ const app = new Vue({ // tracks are found in relationship.data }, + setAirPlayCodeUI() { + this.modals.airplayPW = true + }, + sendAirPlaySuccess(){ + notyf.success('Device paired successfully!'); + }, windowFocus(val) { if (val) { document.querySelectorAll(".animated-artwork-video").forEach(el => { 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 @@ + + + diff --git a/src/renderer/views/components/airplay-modal.ejs b/src/renderer/views/components/airplay-modal.ejs new file mode 100644 index 00000000..16ab91a4 --- /dev/null +++ b/src/renderer/views/components/airplay-modal.ejs @@ -0,0 +1,42 @@ + + \ No newline at end of file From c4a33b7cb98bdbaf8d28455c809f6d36e8ba707c Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 30 Apr 2022 10:15:52 +0700 Subject: [PATCH 02/20] Update raop.ts --- src/main/plugins/raop.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts index ba8e8395..165ada02 100644 --- a/src/main/plugins/raop.ts +++ b/src/main/plugins/raop.ts @@ -143,7 +143,7 @@ export default class RAOP { this.castDevices = []; console.log("scan for airplay devices"); - const browser = this.mdns.createBrowser(this.mdns.tcp('raop')); + const browser = this.mdns.createBrowser(); browser.on('ready', browser.discover); browser.on('update', (service: any) => { From fb5ab7b6fd8066d7b8566da2a9b9239e594e5d83 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 30 Apr 2022 10:31:57 +0700 Subject: [PATCH 03/20] Update raop.ts --- src/main/plugins/raop.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts index 165ada02..ce7127b3 100644 --- a/src/main/plugins/raop.ts +++ b/src/main/plugins/raop.ts @@ -147,12 +147,13 @@ 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); +// } }); }); From 223c5e7b3adeb8e44e91b24e85f316bcf0a8ad6c Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 30 Apr 2022 10:48:22 +0700 Subject: [PATCH 04/20] Update raop.ts --- src/main/plugins/raop.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts index ce7127b3..ae37f138 100644 --- a/src/main/plugins/raop.ts +++ b/src/main/plugins/raop.ts @@ -143,17 +143,30 @@ export default class RAOP { this.castDevices = []; console.log("scan for airplay devices"); - const browser = this.mdns.createBrowser(); + const browser = this.mdns.createBrowser(this.mdns.tcp('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); -// } + } + }); + + const browser2 = this.mdns.createBrowser(this.mdns.tcp('airplay'); + browser2.on('ready', browser.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); + } }); }); From 9bec345a500f6c55a9e0bb48acdbb69cf9a9002f Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 30 Apr 2022 10:52:01 +0700 Subject: [PATCH 05/20] Update raop.ts --- src/main/plugins/raop.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts index ae37f138..59c4a09c 100644 --- a/src/main/plugins/raop.ts +++ b/src/main/plugins/raop.ts @@ -143,7 +143,7 @@ export default class RAOP { this.castDevices = []; console.log("scan for airplay devices"); - const browser = this.mdns.createBrowser(this.mdns.tcp('raop'); + const browser = this.mdns.createBrowser(this.mdns.tcp('raop')); browser.on('ready', browser.discover); browser.on('update', (service: any) => { @@ -156,7 +156,7 @@ export default class RAOP { } }); - const browser2 = this.mdns.createBrowser(this.mdns.tcp('airplay'); + const browser2 = this.mdns.createBrowser(this.mdns.tcp('airplay')); browser2.on('ready', browser.discover); browser2.on('update', (service: any) => { From 11f34ca4664c327f7a13a5df6448abc9a2d4f914 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 30 Apr 2022 10:54:24 +0700 Subject: [PATCH 06/20] Update raop.ts --- src/main/plugins/raop.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts index 59c4a09c..cb18ab39 100644 --- a/src/main/plugins/raop.ts +++ b/src/main/plugins/raop.ts @@ -157,7 +157,7 @@ export default class RAOP { }); const browser2 = this.mdns.createBrowser(this.mdns.tcp('airplay')); - browser2.on('ready', browser.discover); + 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'))) { From 3aca5dc92bffb6429a79cb757a5cc57103ac51f1 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Sat, 30 Apr 2022 11:20:54 +0700 Subject: [PATCH 07/20] Update raop.ts --- src/main/plugins/raop.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/plugins/raop.ts b/src/main/plugins/raop.ts index cb18ab39..a7de1854 100644 --- a/src/main/plugins/raop.ts +++ b/src/main/plugins/raop.ts @@ -168,7 +168,7 @@ export default class RAOP { this.ondeviceup(service.name, service.host, service.port, service.addresses, service.txt); } }); - + }); From 1ae81aebc04fa45472502c69f60c166ceafa7388 Mon Sep 17 00:00:00 2001 From: umbreon22 Date: Fri, 29 Apr 2022 19:19:38 -0700 Subject: [PATCH 08/20] fix(songs context menu): check for presence of container before displaying 'showInMusic' item --- src/renderer/main/vueapp.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js index d6dfb6cd..e62e8040 100644 --- a/src/renderer/main/vueapp.js +++ b/src/renderer/main/vueapp.js @@ -4009,7 +4009,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 } From 4ff7258a81378a847a05795eb3c712fc24ba35b6 Mon Sep 17 00:00:00 2001 From: umbreon22 Date: Fri, 29 Apr 2022 18:22:47 -0700 Subject: [PATCH 09/20] Limits the display of very large queue items to 50 at a time --- src/renderer/views/components/queue.ejs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/renderer/views/components/queue.ejs b/src/renderer/views/components/queue.ejs index fc675bd5..013cb796 100644 --- a/src/renderer/views/components/queue.ejs +++ b/src/renderer/views/components/queue.ejs @@ -13,12 +13,11 @@
-