From dfd3fe6271f8328e3530bc7bc89d60c2f9536b87 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Fri, 11 Mar 2022 05:51:35 +0000 Subject: [PATCH] various formatting, mpris patch, menubar patch --- src/main/plugins/chromecast.ts | 61 ++++++++------- src/main/plugins/discordrpc.ts | 122 ++++++++++++++++-------------- src/main/plugins/lastfm.ts | 17 +++-- src/main/plugins/menubar.ts | 43 ++++++----- src/main/plugins/mpris.ts | 19 ++--- src/main/plugins/thumbar.ts | 5 +- src/main/plugins/webNowPlaying.ts | 16 ++-- 7 files changed, 151 insertions(+), 132 deletions(-) diff --git a/src/main/plugins/chromecast.ts b/src/main/plugins/chromecast.ts index 72ac9dcb..ef14f79d 100644 --- a/src/main/plugins/chromecast.ts +++ b/src/main/plugins/chromecast.ts @@ -16,23 +16,23 @@ export default class ChromecastPlugin { private audioClient = require('castv2-client').Client; private mdns = require('mdns-js'); - private devices : any = []; - private castDevices : any = []; + private devices: any = []; + private castDevices: any = []; // private GCRunning = false; // private GCBuffer: any; // private expectedConnections = 0; // private currentConnections = 0; - private activeConnections : any = []; + private activeConnections: any = []; // private requests = []; // private GCstream = new Stream.PassThrough(), - private connectedHosts : any = {}; + private connectedHosts: any = {}; // private port = false; // private server = false; // private bufcount = 0; // private bufcount2 = 0; // private headerSent = false; - + private searchForGCDevices() { try { @@ -40,7 +40,7 @@ export default class ChromecastPlugin { let browser = this.mdns.createBrowser(this.mdns.tcp('googlecast')); browser.on('ready', browser.discover); - browser.on('update', (service :any) => { + browser.on('update', (service: any) => { if (service.addresses && service.fullname && service.fullname.includes('_googlecast._tcp')) { this.ondeviceup(service.addresses[0], service.fullname.substring(0, service.fullname.indexOf("._googlecast")) + " " + (service.type[0].description ?? ""), '', 'googlecast'); } @@ -48,18 +48,21 @@ export default class ChromecastPlugin { const Client = require('node-ssdp').Client; // also do a SSDP/UPnP search let ssdpBrowser = new Client(); - ssdpBrowser.on('response', (headers :any , statusCode : any, rinfo: any) => { - var location = getLocation(headers); - if (location != null) { + ssdpBrowser.on('response', (headers: any, statusCode: any, rinfo: any) => { + var location = getLocation(headers); + if (location != null) { this.getServiceDescription(location, rinfo.address); - } + } }); function getLocation(headers: any) { let location = null; - if (headers["LOCATION"] != null ){location = headers["LOCATION"]} - else if (headers["Location"] != null ){location = headers["Location"]} + if (headers["LOCATION"] != null) { + location = headers["LOCATION"] + } else if (headers["Location"] != null) { + location = headers["Location"] + } return location; } @@ -85,7 +88,7 @@ export default class ChromecastPlugin { } } - private getServiceDescription(url:any, address:any) { + private getServiceDescription(url: any, address: any) { const request = require('request'); request.get(url, (error: any, response: any, body: any) => { if (!error && response.statusCode === 200) { @@ -95,7 +98,7 @@ export default class ChromecastPlugin { } private ondeviceup(host: any, name: any, location: any, type: any) { - if (this.castDevices.findIndex((item:any) => item.host === host && item.name === name && item.location === location && item.type === type) === -1) { + if (this.castDevices.findIndex((item: any) => item.host === host && item.name === name && item.location === location && item.type === type) === -1) { this.castDevices.push({ name: name, host: host, @@ -106,7 +109,7 @@ export default class ChromecastPlugin { this.devices.push(host); } if (name) { - this._win.webContents.executeJavaScript(`console.log('deviceFound','ip: ${host} name:${name}')`).catch((err: any) => console.error(err)); + this._win.webContents.executeJavaScript(`console.log('deviceFound','ip: ${host} name:${name}')`).catch((err: any) => console.error(err)); console.log("deviceFound", host, name); } } else { @@ -134,7 +137,7 @@ export default class ChromecastPlugin { private loadMedia(client: any, song: any, artist: any, album: any, albumart: any, cb?: any) { // const u = 'http://' + this.getIp() + ':' + server.address().port + '/'; - // const DefaultMediaReceiver : any = require('castv2-client').DefaultMediaReceiver; + // const DefaultMediaReceiver : any = require('castv2-client').DefaultMediaReceiver; client.launch(CiderReceiver, (err: any, player: any) => { if (err) { console.log(err); @@ -178,10 +181,10 @@ export default class ChromecastPlugin { client.stepInterval = status.volume.stepInterval; } }) - + // send websocket ip - player.sendIp("ws://"+this.getIp()+":26369"); + player.sendIp("ws://" + this.getIp() + ":26369"); }); } @@ -191,7 +194,7 @@ export default class ChromecastPlugin { let alias = 0; let ifaces: any = os.networkInterfaces(); for (var dev in ifaces) { - ifaces[dev].forEach((details:any) => { + ifaces[dev].forEach((details: any) => { if (details.family === 'IPv4') { if (!/(loopback|vmware|internal|hamachi|vboxnet|virtualbox)/gi.test(dev + (alias ? ':' + alias : ''))) { if (details.address.substring(0, 8) === '192.168.' || @@ -222,7 +225,7 @@ export default class ChromecastPlugin { client.muted = false; client.connect(device.host, () => { - // console.log('connected, launching app ...', 'http://' + this.getIp() + ':' + server.address().port + '/'); + // console.log('connected, launching app ...', 'http://' + this.getIp() + ':' + server.address().port + '/'); if (!this.connectedHosts[device.host]) { this.connectedHosts[device.host] = client; this.activeConnections.push(client); @@ -272,8 +275,8 @@ export default class ChromecastPlugin { // } } } - - private async setupGCServer(){ + + private async setupGCServer() { return '' } @@ -303,21 +306,21 @@ export default class ChromecastPlugin { event.returnValue = this.castDevices }); - electron.ipcMain.on('performGCCast', (event, device, song, artist, album, albumart) => { + electron.ipcMain.on('performGCCast', (event, device, song, artist, album, albumart) => { // this.setupGCServer().then( () => { - this._win.webContents.setAudioMuted(true); - console.log(device); - this.stream(device, song, artist, album, albumart); + this._win.webContents.setAudioMuted(true); + console.log(device); + this.stream(device, song, artist, album, albumart); // }) }); - electron.ipcMain.on('getChromeCastDevices', (_event, _data) => { + electron.ipcMain.on('getChromeCastDevices', (_event, _data) => { this.searchForGCDevices(); }); - electron.ipcMain.on('stopGCast', (_event) => { + electron.ipcMain.on('stopGCast', (_event) => { this._win.webContents.setAudioMuted(false); - this.activeConnections = []; + this.activeConnections = []; this.connectedHosts = {}; }) diff --git a/src/main/plugins/discordrpc.ts b/src/main/plugins/discordrpc.ts index e7c5ef92..98fb60f3 100644 --- a/src/main/plugins/discordrpc.ts +++ b/src/main/plugins/discordrpc.ts @@ -8,8 +8,8 @@ export default class DiscordRichPresence { * Private variables for interaction in plugins */ private static _store: any; - private _app : any; - private _attributes : any; + private _app: any; + private _attributes: any; private static _connection: boolean = false; /** @@ -76,17 +76,19 @@ export default class DiscordRichPresence { // Login to Discord this._client.login({clientId}) - .then(() => { - DiscordRichPresence._connection = true; - }) - .catch((e: any) => console.error(`[DiscordRichPresence][connect] ${e}`)); + .then(() => { + DiscordRichPresence._connection = true; + }) + .catch((e: any) => console.error(`[DiscordRichPresence][connect] ${e}`)); } /** * Disconnects from Discord RPC */ private disconnect() { - if (!this._client) return; + if (!this._client) { + return + } this._client.destroy().then(() => { DiscordRichPresence._connection = false; @@ -94,50 +96,56 @@ export default class DiscordRichPresence { }).catch((e: any) => console.error(`[DiscordRPC][disconnect] ${e}`)); } - /** - * Filter the Discord activity object - */ - private filterActivity(activity: any, attributes: any): Object { - - // Checks if the name is greater than 128 because some songs can be that long + /** + * Filter the Discord activity object + */ + private filterActivity(activity: any, attributes: any): Object { + + // Checks if the name is greater than 128 because some songs can be that long if (activity.details && activity.details.length > 128) { activity.details = activity.details.substring(0, 125) + '...' } - // Check large image - if (activity.largeImageKey == null || activity.largeImageKey === "" || activity.largeImageKey.length > 256) { + // Check large image + if (activity.largeImageKey == null || activity.largeImageKey === "" || activity.largeImageKey.length > 256) { activity.largeImageKey = "cider"; } - // Timestamp - if (new Date(attributes.endTime).getTime() < 0) { - delete activity.startTime - delete activity.endTime - } + // Timestamp + if (new Date(attributes.endTime).getTime() < 0) { + delete activity.startTime + delete activity.endTime + } - // not sure - if (!attributes.artistName) { - delete activity.state; - } + // not sure + if (!attributes.artistName) { + delete activity.state; + } - if (!activity.largeImageText || activity.largeImageText.length < 2) { + if (!activity.largeImageText || activity.largeImageText.length < 2) { delete activity.largeImageText } - activity.buttons.forEach((key: {label: string, url: string}, _v: Number) => { - if (key.url.includes('undefined') || key.url.includes('no-id-found')) { + activity.buttons.forEach((key: { label: string, url: string }, _v: Number) => { + if (key.url.includes('undefined') || key.url.includes('no-id-found')) { activity.buttons.splice(key, 1); - } - }) - return activity - } + } + }) + return activity + } /** * Sets the activity of the client * @param {object} attributes */ private updateActivity(attributes: any) { - if (!this._client) return; + if (DiscordRichPresence._store.general.discord_rpc == 0) { + return + } + + if (!this._client) { + this.connect(DiscordRichPresence._store.general.discord_rpc == 1 ? '911790844204437504' : '886578863147192350') + } if (!DiscordRichPresence._connection) { this._client.clearActivity().catch((e: any) => console.error(`[DiscordRichPresence][clearActivity] ${e}`)); @@ -158,20 +166,20 @@ export default class DiscordRichPresence { ] //To change attributes.url => preload/cider-preload.js }; - this._activity = this.filterActivity(this._activity, attributes) + this._activity = this.filterActivity(this._activity, attributes) // Check if its pausing (false) or playing (true) if (!attributes.status) { if (DiscordRichPresence._store.general.discord_rpc_clear_on_pause) { this._client.clearActivity() - .catch((e: any) => console.error(`[DiscordRichPresence][clearActivity] ${e}`)); + .catch((e: any) => console.error(`[DiscordRichPresence][clearActivity] ${e}`)); } else { this._activity.smallImageKey = 'pause'; this._activity.smallImageText = 'Paused'; delete this._activity.endTimestamp; delete this._activity.startTimestamp; this._client.setActivity(this._activity) - .catch((e: any) => console.error(`[DiscordRichPresence][setActivity] ${e}`)); + .catch((e: any) => console.error(`[DiscordRichPresence][setActivity] ${e}`)); } } else if (this._activity && this._activityCache !== this._activity && this._activity.details) { if (!DiscordRichPresence._store.general.discord_rpc_clear_on_pause) { @@ -180,7 +188,7 @@ export default class DiscordRichPresence { } this._client.setActivity(this._activity) - .catch((e: any) => console.error(`[DiscordRichPresence][updateActivity] ${e}`)); + .catch((e: any) => console.error(`[DiscordRichPresence][updateActivity] ${e}`)); this._activityCache = this._activity; } @@ -207,21 +215,21 @@ export default class DiscordRichPresence { this.connect((DiscordRichPresence._store.general.discord_rpc == 1) ? '911790844204437504' : '886578863147192350'); console.debug(`[Plugin][${this.name}] Ready.`); ipcMain.on('updateRPCImage', (_event, imageurl) => { - if (!DiscordRichPresence._store.general.privateEnabled){ - fetch('https://api.cider.sh/v1/images' ,{ + if (!DiscordRichPresence._store.general.privateEnabled) { + fetch('https://api.cider.sh/v1/images', { - method: 'POST', - body: JSON.stringify({url : imageurl}), - headers: { - 'Content-Type': 'application/json', - 'User-Agent': _win.webContents.getUserAgent() - }, - }) - .then(res => res.json()) - .then(function(json){ - self._attributes["artwork"]["url"] = json.url - self.updateActivity(self._attributes) - }) + method: 'POST', + body: JSON.stringify({url: imageurl}), + headers: { + 'Content-Type': 'application/json', + 'User-Agent': _win.webContents.getUserAgent() + }, + }) + .then(res => res.json()) + .then(function (json) { + self._attributes["artwork"]["url"] = json.url + self.updateActivity(self._attributes) + }) } }) } @@ -238,9 +246,10 @@ export default class DiscordRichPresence { * @param attributes Music Attributes (attributes.status = current state) */ onPlaybackStateDidChange(attributes: object): void { - if (!DiscordRichPresence._store.general.privateEnabled){ - this._attributes = attributes - this.updateActivity(attributes)} + if (!DiscordRichPresence._store.general.privateEnabled) { + this._attributes = attributes + this.updateActivity(attributes) + } } /** @@ -248,8 +257,9 @@ export default class DiscordRichPresence { * @param attributes Music Attributes */ onNowPlayingItemDidChange(attributes: object): void { - if (!DiscordRichPresence._store.general.privateEnabled){ - this._attributes = attributes - this.updateActivity(attributes)} + if (!DiscordRichPresence._store.general.privateEnabled) { + this._attributes = attributes + this.updateActivity(attributes) + } } } diff --git a/src/main/plugins/lastfm.ts b/src/main/plugins/lastfm.ts index b161042e..5018c01b 100644 --- a/src/main/plugins/lastfm.ts +++ b/src/main/plugins/lastfm.ts @@ -120,7 +120,7 @@ export default class LastFMPlugin { } else { return console.log('[LastFM] Did not add ', attributes.name, '—', artist, 'because now playing a other song.'); } - }, Math.round(attributes.durationInMillis * Math.min((self._store.lastfm.scrobble_after / 100),0.8))); + }, Math.round(attributes.durationInMillis * Math.min((self._store.lastfm.scrobble_after / 100), 0.8))); } private async updateNowPlayingSong(attributes: any) { @@ -264,14 +264,15 @@ export default class LastFMPlugin { * @param attributes Music Attributes */ nowPlayingItemDidChangeLastFM(attributes: any): void { - if (!this._store.general.privateEnabled){ - attributes.status = true - if (!this._store.lastfm.filterLoop) { - this._lastfm.cachedNowPlayingAttributes = false; - this._lastfm.cachedAttributes = false + if (!this._store.general.privateEnabled) { + attributes.status = true + if (!this._store.lastfm.filterLoop) { + this._lastfm.cachedNowPlayingAttributes = false; + this._lastfm.cachedAttributes = false + } + this.updateNowPlayingSong(attributes) + this.scrobbleSong(attributes) } - this.updateNowPlayingSong(attributes) - this.scrobbleSong(attributes)} } } diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts index 52e9ef7c..ff915800 100644 --- a/src/main/plugins/menubar.ts +++ b/src/main/plugins/menubar.ts @@ -35,7 +35,7 @@ export default class Thumbar { * @private */ private isMac: boolean = process.platform === 'darwin'; - private menubarTemplate: any = [ + private _menuTemplate: any = [ { label: app.getName(), submenu: [ @@ -43,20 +43,20 @@ export default class Thumbar { label: 'About', click: () => this._win.webContents.executeJavaScript(`app.appRoute('about')`) }, - { type: 'separator' }, + {type: 'separator'}, { label: 'Settings', accelerator: 'CommandOrControl+,', click: () => this._win.webContents.executeJavaScript(`app.appRoute('settings')`) }, - { type: 'separator' }, - { role: 'services' }, - { type: 'separator' }, - { role: 'hide' }, - { role: 'hideOthers' }, - { role: 'unhide' }, - { type: 'separator' }, - { role: 'quit' } + {type: 'separator'}, + {role: 'services'}, + {type: 'separator'}, + {role: 'hide'}, + {role: 'hideOthers'}, + {role: 'unhide'}, + {type: 'separator'}, + {role: 'quit'} ] }, { @@ -85,20 +85,20 @@ export default class Thumbar { ...(this.isMac ? [ {type: 'separator'}, {role: 'front'}, + {role: 'close'}, ] : [ - {} + {role: 'close'}, ]), - {role: 'close'}, - {type: 'separator'}, + { label: 'Edit', submenu: [ - { role: 'undo' }, - { role: 'redo' }, - { type: 'separator' }, - { role: 'cut' }, - { role: 'copy' }, - { role: 'paste' }, + {role: 'undo'}, + {role: 'redo'}, + {type: 'separator'}, + {role: 'cut'}, + {role: 'copy'}, + {role: 'paste'}, ] }, {type: 'separator'}, @@ -139,7 +139,7 @@ export default class Thumbar { accelerator: 'CommandOrControl+Left', click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.previous()`) }, - { type: 'separator' }, + {type: 'separator'}, { label: 'Volume Up', accelerator: 'CommandOrControl+Up', @@ -232,7 +232,8 @@ export default class Thumbar { */ onReady(win: Electron.BrowserWindow): void { this._win = win; - Menu.setApplicationMenu(Menu.buildFromTemplate(this.menubarTemplate)) + const menu = Menu.buildFromTemplate(this._menuTemplate); + Menu.setApplicationMenu(menu) } /** diff --git a/src/main/plugins/mpris.ts b/src/main/plugins/mpris.ts index 892f72de..25730ee9 100644 --- a/src/main/plugins/mpris.ts +++ b/src/main/plugins/mpris.ts @@ -58,10 +58,9 @@ export default class mpris { /** * Connects to MPRIS Service */ - @mpris.linuxOnly private static connect() { - const player = Player({ + const player = Player({ name: 'cider', identity: 'Cider', supportedUriSchemes: [], @@ -94,7 +93,6 @@ export default class mpris { /** * Update M.P.R.I.S Player Attributes */ - @mpris.linuxOnly private static updatePlayer(attributes: any) { const MetaData = { @@ -119,7 +117,6 @@ export default class mpris { * @private * @param attributes */ - @mpris.linuxOnly private static updatePlayerState(attributes: any) { switch (attributes.status) { case true: // Playing @@ -139,6 +136,9 @@ export default class mpris { * @private */ private static clearState() { + if (!mpris.player) { + return + } mpris.player.metadata = {'mpris:trackid': '/org/mpris/MediaPlayer2/TrackList/NoTrack'} mpris.player.playbackStatus = Player.PLAYBACK_STATUS_STOPPED; } @@ -160,6 +160,7 @@ export default class mpris { /** * Runs on app ready */ + @mpris.linuxOnly onReady(_: any): void { console.debug(`[Plugin][${mpris.name}] Ready.`); } @@ -167,6 +168,7 @@ export default class mpris { /** * Renderer ready */ + @mpris.linuxOnly onRendererReady(): void { mpris.connect() } @@ -174,19 +176,17 @@ export default class mpris { /** * Runs on app stop */ + @mpris.linuxOnly onBeforeQuit(): void { console.debug(`[Plugin][${mpris.name}] Stopped.`); - try { - mpris.clearState() - }catch(e) { - e = null - } + mpris.clearState() } /** * Runs on playback State Change * @param attributes Music Attributes (attributes.status = current state) */ + @mpris.linuxOnly onPlaybackStateDidChange(attributes: object): void { console.debug(`[Plugin][${mpris.name}] onPlaybackStateDidChange.`); mpris.updatePlayerState(attributes) @@ -196,6 +196,7 @@ export default class mpris { * Runs on song change * @param attributes Music Attributes */ + @mpris.linuxOnly onNowPlayingItemDidChange(attributes: object): void { console.debug(`[Plugin][${mpris.name}] onMetadataDidChange.`); mpris.updatePlayer(attributes); diff --git a/src/main/plugins/thumbar.ts b/src/main/plugins/thumbar.ts index cc7ba952..5f504878 100644 --- a/src/main/plugins/thumbar.ts +++ b/src/main/plugins/thumbar.ts @@ -47,7 +47,6 @@ export default class Thumbar { /** * Update the thumbnail toolbar */ - @Thumbar.windowsOnly private updateButtons(attributes: any) { console.log(attributes) @@ -102,6 +101,7 @@ export default class Thumbar { /** * Runs on app ready */ + @Thumbar.windowsOnly onReady(win: Electron.BrowserWindow): void { this._win = win; console.debug(`[Plugin][${this.name}] Ready.`); @@ -110,6 +110,7 @@ export default class Thumbar { /** * Runs on app stop */ + @Thumbar.windowsOnly onBeforeQuit(): void { console.debug(`[Plugin][${this.name}] Stopped.`); } @@ -118,6 +119,7 @@ export default class Thumbar { * Runs on playback State Change * @param attributes Music Attributes (attributes.status = current state) */ + @Thumbar.windowsOnly onPlaybackStateDidChange(attributes: object): void { this.updateButtons(attributes) } @@ -126,6 +128,7 @@ export default class Thumbar { * Runs on song change * @param attributes Music Attributes */ + @Thumbar.windowsOnly onNowPlayingItemDidChange(attributes: object): void { this.updateButtons(attributes) } diff --git a/src/main/plugins/webNowPlaying.ts b/src/main/plugins/webNowPlaying.ts index 27b5af42..b477d649 100644 --- a/src/main/plugins/webNowPlaying.ts +++ b/src/main/plugins/webNowPlaying.ts @@ -2,8 +2,8 @@ import * as WebSocket from 'ws'; /** * 0-pad a number. - * @param {Number} number - * @param {Number} length + * @param {Number} number + * @param {Number} length * @returns String */ const pad = (number: number, length: number) => String(number).padStart(length, '0'); @@ -11,7 +11,7 @@ const pad = (number: number, length: number) => String(number).padStart(length, /** * Convert seconds to a time string acceptable to Rainmeter * https://github.com/tjhrulz/WebNowPlaying-BrowserExtension/blob/master/WebNowPlaying.js#L50-L59 - * @param {Number} timeInSeconds + * @param {Number} timeInSeconds * @returns String */ const convertTimeToString = (timeInSeconds: number) => { @@ -29,7 +29,7 @@ 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.1'; - public author: string = 'Zennn '; + public author: string = 'Zennn '; private _win: any; private ws?: WebSocket; @@ -168,17 +168,17 @@ export default class WebNowPlaying { console.info('[WebNowPlaying] Connected to Rainmeter'); this.ws?.send(`PLAYER:${this.playerName}`); }; - + this.ws.onclose = () => { clearTimeout(retry); retry = setTimeout(init, 2000); }; - + this.ws.onerror = () => { clearTimeout(retry); this.ws?.close(); }; - + this.ws.onmessage = this.fireEvent?.bind(this); } catch (error) { console.error(error); @@ -190,7 +190,7 @@ export default class WebNowPlaying { // Connect to wsapi. Only used to update progress. try { this.wsapiConn = new WebSocket('ws://127.0.0.1:26369/'); - + this.wsapiConn.onopen = () => { console.info('[WebNowPlaying] Connected to wsapi'); };