diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts index ec484b40..eb40f61e 100644 --- a/src/main/plugins/menubar.ts +++ b/src/main/plugins/menubar.ts @@ -101,7 +101,7 @@ export default class Thumbar { { label: 'Pause / Play', accelerator: 'Space', - click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.playPause()`) + click: () => this._win.webContents.executeJavaScript(`app.SpacePause()`) }, { label: 'Next', diff --git a/src/main/plugins/webNowPlaying.ts b/src/main/plugins/webNowPlaying.ts index 2787e4c1..27b5af42 100644 --- a/src/main/plugins/webNowPlaying.ts +++ b/src/main/plugins/webNowPlaying.ts @@ -14,7 +14,7 @@ const pad = (number: number, length: number) => String(number).padStart(length, * @param {Number} timeInSeconds * @returns String */ - const convertTimeToString = (timeInSeconds: number) => { +const convertTimeToString = (timeInSeconds: number) => { const timeInMinutes = Math.floor(timeInSeconds / 60); if (timeInMinutes < 60) { return timeInMinutes + ":" + pad(Math.floor(timeInSeconds % 60), 2); @@ -28,13 +28,13 @@ export default class WebNowPlaying { */ public name: string = 'WebNowPlaying'; public description: string = 'Song info and playback control for the Rainmeter WebNowPlaying plugin.'; - public version: string = '1.0.0'; + public version: string = '1.0.1'; public author: string = 'Zennn '; private _win: any; - private ws: any = null; - private wsapiConn: any = null; - private playerName: string = 'Cider'/* Apple Music */; + private ws?: WebSocket; + private wsapiConn?: WebSocket; + private playerName: string = 'Cider'; constructor() { console.debug(`[Plugin][${this.name}] Loading Complete.`); @@ -47,9 +47,7 @@ export default class WebNowPlaying { */ private static windowsOnly(_target: any, _propertyKey: string, descriptor: PropertyDescriptor) { if (process.platform !== 'win32') { - descriptor.value = function () { - return - } + descriptor.value = () => void 0; } } @@ -92,22 +90,25 @@ export default class WebNowPlaying { value = attributes.shuffleMode; break; } - this.ws.send(`${field}:${value}`); + this.ws?.send(`${field}:${value}`); } catch (error) { - if (this.ws.readyState === WebSocket.OPEN) { + if (this.ws?.readyState === WebSocket.OPEN) { this.ws.send(`Error:Error updating ${field} for ${this.playerName}`); this.ws.send(`ErrorD:${error}`); } } }); } - private fireEvent(evt: any) { + + private fireEvent(evt: WebSocket.MessageEvent) { if (!evt.data) return; - let value = ''; - if (evt.data.split(/ (.+)/).length > 1) { - value = evt.data.split(/ (.+)/)[1]; + const data = evt.data; + + let value: string = ''; + if (data.split(/ (.+)/).length > 1) { + value = data.split(/ (.+)/)[1]; } - const eventName = evt.data.split(' ')[0].toLowerCase(); + const eventName = data.split(' ')[0].toLowerCase(); try { switch (eventName) { @@ -144,7 +145,7 @@ export default class WebNowPlaying { } } catch (error) { console.debug(error); - if (this.ws.readyState === WebSocket.OPEN) { + if (this.ws?.readyState === WebSocket.OPEN) { this.ws.send(`Error:Error sending event to ${this.playerName}`); this.ws.send(`ErrorD:${error}`); } @@ -163,10 +164,10 @@ export default class WebNowPlaying { try { this.ws = new WebSocket('ws://127.0.0.1:8974/'); let retry: NodeJS.Timeout; - this.ws.onopen = (() => { + this.ws.onopen = () => { console.info('[WebNowPlaying] Connected to Rainmeter'); - this.ws.send(`PLAYER:${this.playerName}`); - }).bind(this); + this.ws?.send(`PLAYER:${this.playerName}`); + }; this.ws.onclose = () => { clearTimeout(retry); @@ -175,7 +176,7 @@ export default class WebNowPlaying { this.ws.onerror = () => { clearTimeout(retry); - this.ws.close(); + this.ws?.close(); }; this.ws.onmessage = this.fireEvent?.bind(this); @@ -194,8 +195,8 @@ export default class WebNowPlaying { console.info('[WebNowPlaying] Connected to wsapi'); }; - this.wsapiConn.onmessage = (evt: { data: string; }) => { - const response = JSON.parse(evt.data); + this.wsapiConn.onmessage = (evt: WebSocket.MessageEvent) => { + const response = JSON.parse(evt.data); if (response.type === 'playbackStateUpdate') { this.sendSongInfo(response.data); } @@ -214,8 +215,8 @@ export default class WebNowPlaying { public onBeforeQuit() { if (this.ws) { this.ws.send('STATE:0'); - this.ws.onclose = null; // disable onclose handler first to stop it from retrying - this.ws.close(); + this.ws.onclose = () => void 0; // disable onclose handler first to stop it from retrying + this.ws.close(); } if (this.wsapiConn) { this.wsapiConn.close(); @@ -227,7 +228,8 @@ export default class WebNowPlaying { * Runs on playback State Change * @param attributes Music Attributes (attributes.status = current state) */ - onPlaybackStateDidChange(attributes: any) { + @WebNowPlaying.windowsOnly + public onPlaybackStateDidChange(attributes: any) { this.sendSongInfo(attributes); } diff --git a/src/renderer/index.js b/src/renderer/index.js index b50e35a7..7b0631f5 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -3572,6 +3572,27 @@ const app = new Vue({ darwinShare(url) { ipcRenderer.send('share-menu', url) }, + SpacePause() { + const elems = document.querySelectorAll('input'); + for (elem of elems){ + if (elem === document.activeElement) { + return; + } + } + if (!this.isDev) // disable in dev mode to keep my sanity + MusicKitInterop.playPause(); + }, + MKJSLang(){ + let u = this.cfg.general.language; + let langcodes = ['af', 'sq', 'ar', 'eu', 'bg', 'be', 'ca', 'zh', 'zh-tw', 'zh-cn', 'zh-hk', 'zh-sg', 'hr', 'cs', 'da', 'nl', 'nl-be', 'en', 'en-us', 'en-eg', 'en-au', 'en-gb', 'en-ca', 'en-nz', 'en-ie', 'en-za', 'en-jm', 'en-bz', 'en-tt', 'en-001', 'et', 'fo', 'fa', 'fi', 'fr', 'fr-ca', 'gd', 'de', 'de-ch', 'el', 'he', 'hi', 'hu', 'is', 'id', 'it', 'ja', 'ko', 'lv', 'lt', 'mk', 'mt', 'no', 'nb', 'nn', 'pl', 'pt-br', 'pt', 'rm', 'ro', 'ru', 'sr', 'sk', 'sl', 'es', 'es-mx', 'es-419', 'sv', 'th', 'ts', 'tn', 'tr', 'uk', 'ur', 've', 'vi', 'xh', 'yi', 'zu', 'ms', 'iw', 'lo', 'tl', 'kk', 'ta', 'te', 'bn', 'ga', 'ht', 'la', 'pa', 'sa']; + let sellang = "en" + if (u && langcodes.includes(u.toLowerCase().replace('_', "-"))) { + sellang = ((u.toLowerCase()).replace('_', "-")) + } else if (u && u.includes('_') && langcodes.includes(((u.toLowerCase()).replace('_', "-")).split("-")[0])) { + sellang = ((u.toLowerCase()).replace('_', "-")).split("-")[0] + } + return sellang + } } }) diff --git a/src/renderer/views/pages/search.ejs b/src/renderer/views/pages/search.ejs index 70ed1e74..60974726 100644 --- a/src/renderer/views/pages/search.ejs +++ b/src/renderer/views/pages/search.ejs @@ -93,7 +93,7 @@ + v-for="item of getFlattenedCategories()"> @@ -123,9 +123,22 @@ if (this.categoriesView != [] && this.categoriesView.length > 0) { this.categoriesReady = true; return await true; } else { let response = await this.app.mk.api.v3.music(`/v1/recommendations/${this.app.mk.storefrontId}?timezone=${encodeURIComponent(this.app.formatTimezoneOffset())}&name=search-landing&platform=web&extend=editorialArtwork&art%5Burl%5D=f%2Cc&types=editorial-items%2Capple-curators%2Cactivities`); this.categoriesView = response.data.data; + console.log(this.categoriesView) this.categoriesReady = true; return await true; } + }, + getFlattenedCategories() { + let flattened = []; + for (let i = 0; i < this.categoriesView.length; i++) { + if (this.categoriesView[i].relationships && this.categoriesView[i].relationships.contents && this.categoriesView[i].relationships.contents.data) { + for (let j = 0; j < this.categoriesView[i].relationships.contents.data.length; j++) { + if (this.categoriesView[i].relationships.contents.data[j].type != 'editorial-items') + flattened.push(this.categoriesView[i].relationships.contents.data[j]) + } + } + } + return flattened; } } }) diff --git a/src/web-remote/icon-192x192.png b/src/web-remote/icon-192x192.png index 73f1a793..fd78ddc4 100644 Binary files a/src/web-remote/icon-192x192.png and b/src/web-remote/icon-192x192.png differ diff --git a/src/web-remote/icon-256x256.png b/src/web-remote/icon-256x256.png index 6f399893..20a970af 100644 Binary files a/src/web-remote/icon-256x256.png and b/src/web-remote/icon-256x256.png differ diff --git a/src/web-remote/icon-384x384.png b/src/web-remote/icon-384x384.png index c0220657..ae978aec 100644 Binary files a/src/web-remote/icon-384x384.png and b/src/web-remote/icon-384x384.png differ diff --git a/src/web-remote/icon-512x512.png b/src/web-remote/icon-512x512.png index ae74febb..9c413e4a 100644 Binary files a/src/web-remote/icon-512x512.png and b/src/web-remote/icon-512x512.png differ