From b7f7d604381130acd5ebc832922a8878dfa320b9 Mon Sep 17 00:00:00 2001 From: Damir Modyarov Date: Mon, 6 Nov 2023 14:52:32 +0300 Subject: [PATCH] feat: add support for Last.fm "Now playing" status (#83) * feat: add support for Last.fm "Now playing" status Fixes #82 * chore: bump version number --- package.json | 2 +- src/app/lib/lastfm/client.ts | 9 +++++++++ src/app/plugins/lastfmProvider.plugin.ts | 13 +++++++++++++ src/app/plugins/trackProvider.plugin.ts | 3 ++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index dcf8b25a..4e7484b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ytmdesktop2", - "version": "0.10.11", + "version": "0.10.12", "private": false, "author": "Venipa ", "scripts": { diff --git a/src/app/lib/lastfm/client.ts b/src/app/lib/lastfm/client.ts index c6b79149..8bfcfa43 100644 --- a/src/app/lib/lastfm/client.ts +++ b/src/app/lib/lastfm/client.ts @@ -81,6 +81,15 @@ export class LastFMClient { this.sessionName = s.name; return this.session = s.key; } + async updateNowPlaying(...tracks: { artist: string, track: string, album?: string, duration?: number }[]) { + if (!this.session) throw new Error("Invalid session"); + const updatePromise = this.callMethod("track.updateNowPlaying", "post", { + query: { + sk: this.session, + ...tracks[0] + } + }) + } async scrobble(...tracks: { artist: string, track: string, timestamp: number, album?: string, duration?: number }[]) { if (!this.session) throw new Error("Invalid session"); return await this.callMethod("track.scrobble", "post", { diff --git a/src/app/plugins/lastfmProvider.plugin.ts b/src/app/plugins/lastfmProvider.plugin.ts index 97d9119e..88ca746a 100644 --- a/src/app/plugins/lastfmProvider.plugin.ts +++ b/src/app/plugins/lastfmProvider.plugin.ts @@ -163,6 +163,19 @@ export default class LastFMProvider extends BaseProvider implements AfterInit, O return this.getState() } + async handleTrackStart(track: TrackData) {{ + if (!this.client.isConnected()) return; + await this.client.updateNowPlaying({ + artist: track.video.author, + track: track.video.title, + duration: track.meta.duration + }).then(stringifyJson) + .then(d => this.logger.debug(d)) + .catch(err => { + this.logger.error(err); + }) + }} + async handleTrackChange(track: TrackData) { if (!this.client.isConnected()) return; await this.client.scrobble({ diff --git a/src/app/plugins/trackProvider.plugin.ts b/src/app/plugins/trackProvider.plugin.ts index 25011060..05eb75f5 100644 --- a/src/app/plugins/trackProvider.plugin.ts +++ b/src/app/plugins/trackProvider.plugin.ts @@ -93,7 +93,7 @@ export default class TrackProvider extends BaseProvider implements AfterInit { if (trackId) this.__onActiveTrack(trackId); } /** - * + * * @param lazy 500ms timeout before throwing * @returns [like, dislike] tuple */ @@ -150,6 +150,7 @@ export default class TrackProvider extends BaseProvider implements AfterInit { const lastfm = this.getProvider("lastfm"); const lastfmState = lastfm.getState(); if (lastfm && lastfmState.connected && !lastfmState.processing) { + await lastfm.handleTrackStart(track) if (this.trackChangeTimeout) clearTimeout(this.trackChangeTimeout); this.trackChangeTimeout = setTimeout(() => { lastfm.handleTrackChange(track)