From 23b6033432caa937dcae88327c92817d8565c5d5 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Mon, 11 Jul 2022 02:02:11 +0100 Subject: [PATCH] set timeout can go away now --- src/main/plugins/lastfm.ts | 121 ++++++++++++++++++------------------ src/renderer/main/vueapp.js | 6 ++ 2 files changed, 68 insertions(+), 59 deletions(-) diff --git a/src/main/plugins/lastfm.ts b/src/main/plugins/lastfm.ts index 33796c84..027f997c 100644 --- a/src/main/plugins/lastfm.ts +++ b/src/main/plugins/lastfm.ts @@ -7,10 +7,7 @@ export default class lastfm { public version: string = '2.0.0'; public author: string = 'Core (Cider Collective)'; - /** - * Private variables for interaction in plugins - */ - private _attributes: any; + private _apiCredentials = { key: "f9986d12aab5a0fe66193c559435ede3", secret: "acba3c29bd5973efa38cc2f0b63cc625" @@ -31,31 +28,36 @@ export default class lastfm { constructor(utils: any) { this._utils = utils; - this.initializeLastFM("", this._apiCredentials) } onReady(_win: Electron.BrowserWindow): void { + this.initializeLastFM("", this._apiCredentials) // Register the ipcMain handlers this._utils.getIPCMain().handle('lastfm:url', (event: any) => { - console.debug(`${lastfm.name}:url`) + console.debug(`[${lastfm.name}:url] Called.`) return this._lfm.getAuthenticationUrl({"cb": "cider://auth/lastfm"}) }) this._utils.getIPCMain().on('lastfm:auth', (event: any, token: string) => { - console.debug(`${lastfm.name}:auth`, token) + console.debug(`[${lastfm.name}:auth] Token: `, token) this.authenticateLastFM(token) }) this._utils.getIPCMain().on('lastfm:disconnect', (_event: any) => { this._lfm.setSessionCredentials(null, null); this._authenticated = false; - console.debug(`${lastfm.name}:disconnect`) + console.debug(`[${lastfm.name}:disconnect] Disconnected`) }) this._utils.getIPCMain().on('lastfm:nowPlayingChange', (event: any, attributes: any) => { - if (this._utils.getStoreValue("connectivity.lastfm.filter_loop")) return; - this.onNowPlayingItemDidChange(attributes) + if (this._utils.getStoreValue("connectivity.lastfm.filter_loop") || this._utils.getStoreValue("general.privateEnabled")) return; + this.updateNowPlayingTrack(attributes) + }) + + this._utils.getIPCMain().on('lastfm:scrobbleTrack', (event: any, attributes: any) => { + if (this._utils.getStoreValue("general.privateEnabled")) return; + this.scrobbleTrack(attributes) }) } @@ -64,22 +66,15 @@ export default class lastfm { * @param attributes Music Attributes (attributes.status = current state) */ onPlaybackStateDidChange(attributes: object): void { - this._attributes = attributes - // this.scrobbleTrack(attributes) } /** * Runs on song change * @param attributes Music Attributes + * @param scrobble */ - onNowPlayingItemDidChange(attributes: any): void { + onNowPlayingItemDidChange(attributes: any, scrobble = false): void { if (this._utils.getStoreValue("general.privateEnabled")) return; - this._attributes = attributes - if (!attributes?.lfmTrack || !attributes?.lfmAlbum) { - this.verifyTrack(attributes) - return - } - this.scrobbleTrack(attributes) this.updateNowPlayingTrack(attributes) } @@ -90,6 +85,7 @@ export default class lastfm { * @private */ private initializeLastFM(token: string, api: { key: string, secret: string }): void { + console.debug(`[${lastfm.name}:initialize] Initializing LastFM`) const LastfmAPI = require("lastfmapi") this._lfm = new LastfmAPI({ 'api_key': api.key, @@ -113,7 +109,7 @@ export default class lastfm { if (!token) return; this._lfm.authenticate(token, (err: any, session: any) => { if (err) { - console.error(err); + console.error(`[${lastfm.name}:authenticate] Error: ${typeof err === "string" ? err : err.message}`); this._utils.getWindow().webContents.executeJavaScript(`app.notyf.error("${err.message}");`) return; @@ -127,37 +123,36 @@ export default class lastfm { /** * Verifies the track information with lastfm * @param attributes + * @param callback * @private */ - private verifyTrack(attributes: any): object { + private verifyTrack(attributes: any, callback: Function): void { if (!attributes) return attributes; if (!attributes.lfmAlbum) { - return this._lfm.album.getInfo({ + this._lfm.album.getInfo({ "artist": attributes.artistName, "album": attributes.albumName }, (err: any, data: any) => { if (err) { console.error(`[${lastfm.name}] [album.getInfo] Error: ${typeof err === "string" ? err : err.message}`) - console.error(err) return {}; } if (data) { attributes.lfmAlbum = data + callback(attributes) } - this.onNowPlayingItemDidChange(attributes) }) } else { - return this._lfm.track.getCorrection(attributes.artistName, attributes.name, (err: any, data: any) => { + this._lfm.track.getCorrection(attributes.artistName, attributes.name, (err: any, data: any) => { if (err) { console.error(`[${lastfm.name}] [track.getCorrection] Error: ${typeof err === "string" ? err : err.message}`) - console.error(err) return {}; } if (data) { attributes.lfmTrack = data.correction.track + callback(attributes) } - this.onNowPlayingItemDidChange(attributes) }) } @@ -170,44 +165,53 @@ export default class lastfm { * @private */ private scrobbleTrack(attributes: any): void { - if (!this._authenticated || !attributes || this._utils.getStoreValue("connectivity.lastfm.filter_types")[attributes.playParams.kind] || (this._utils.getStoreValue("connectivity.lastfm.filter_loop") && this._scrobbleCache.track === attributes.lfmTrack.name)) return; - - if (this._scrobbleDelay) { - clearTimeout(this._scrobbleDelay); + if (!attributes?.lfmTrack || !attributes?.lfmAlbum) { + this.verifyTrack(attributes, (a: any) => { + this.scrobbleTrack(a) + }) + return } - // Scrobble delay - this._scrobbleDelay = setTimeout(() => { + if (!this._authenticated || !attributes || this._utils.getStoreValue("connectivity.lastfm.filter_types")[attributes.playParams.kind] || (this._utils.getStoreValue("connectivity.lastfm.filter_loop") && this._scrobbleCache.track === attributes.lfmTrack.name)) return; - // Scrobble - const scrobble = { - 'artist': attributes.lfmTrack.artist.name, - 'track': attributes.lfmTrack.name, - 'album': attributes.lfmAlbum.name, - 'albumArtist': attributes.lfmAlbum.artist, - 'timestamp': new Date().getTime() / 1000, - 'trackNumber': attributes.trackNumber, - 'duration': attributes.durationInMillis / 1000, + // Scrobble + const scrobble = { + 'artist': attributes.lfmTrack.artist.name, + 'track': attributes.lfmTrack.name, + 'album': attributes.lfmAlbum.name, + 'albumArtist': attributes.lfmAlbum.artist, + 'timestamp': new Date().getTime() / 1000, + 'trackNumber': attributes.trackNumber, + 'duration': attributes.durationInMillis / 1000, + } + + // Easy Debugging + console.debug(`[${lastfm.name}:scrobble] Scrobbling ${scrobble.artist} - ${scrobble.track}`) + + // Scrobble the track + this._lfm.track.scrobble(scrobble, (err: any, _res: any) => { + if (err) { + console.error(`[${lastfm.name}:scrobble] Scrobble failed: ${err.message}`); + } else { + console.debug(`[${lastfm.name}:scrobble] Track scrobbled: ${scrobble.artist} - ${scrobble.track}`); + this._scrobbleCache = scrobble } - - // Easy Debugging - if (!this._utils.getApp().isPackaged) { - console.debug(scrobble) - } - - // Scrobble the track - this._lfm.track.scrobble(scrobble, (err: any, _res: any) => { - if (err) { - console.error(`[${lastfm.name}:scrobble] Scrobble failed: ${err.message}`); - } else { - console.debug(`[${lastfm.name}:scrobble] Track scrobbled: ${scrobble.artist} - ${scrobble.track}`); - this._scrobbleCache = scrobble - } - }); - }, Math.round(attributes.durationInMillis * Math.min((this._utils.getStoreValue("connectivity.lastfm.scrobble_after") / 100), 0.8))) + }); } + /** + * Updates the now playing track + * @param attributes + * @private + */ private updateNowPlayingTrack(attributes: any): void { + if (!attributes?.lfmTrack || !attributes?.lfmAlbum) { + this.verifyTrack(attributes, (a: any) => { + this.updateNowPlayingTrack(a) + }) + return + } + if (!this._authenticated || !attributes || this._utils.getStoreValue("connectivity.lastfm.filter_types")[attributes.playParams.kind] || (this._utils.getStoreValue("connectivity.lastfm.filter_loop") && this._nowPlayingCache.track === attributes.lfmTrack.name)) return; const nowPlaying = { @@ -223,7 +227,6 @@ export default class lastfm { if (err) { console.error(`[${lastfm.name}:updateNowPlaying] Now Playing Update failed: ${err.message}`); } else { - console.log(res) console.debug(`[${lastfm.name}:updateNowPlaying] Now Playing Updated: ${nowPlaying.artist} - ${nowPlaying.track}`); this._nowPlayingCache = nowPlaying } diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js index e964c525..7501d7e1 100644 --- a/src/renderer/main/vueapp.js +++ b/src/renderer/main/vueapp.js @@ -919,6 +919,12 @@ const app = new Vue({ } }); + this.mk.addEventListener(MusicKit.Events.playbackProgressDidChange, () => { + if (self.mk.currentPlaybackProgress === (app.cfg.connectivity.lastfm.scrobble_after / 100)) { + ipcRenderer.send('lastfm:scrobbleTrack', MusicKitInterop.getAttributes()); + } + }) + this.mk.addEventListener(MusicKit.Events.playbackStateDidChange, (event) => { ipcRenderer.send('wsapi-updatePlaybackState', wsapi.getAttributes()); document.body.setAttribute("playback-state", event.state == 2 ? "playing" : "paused")