some fallbacks

This commit is contained in:
ConfiG 2024-09-27 23:33:09 +03:00
parent 9b80d38f17
commit 57c88f1f8e
No known key found for this signature in database
GPG key ID: 44DA1983F524C11B

View file

@ -304,21 +304,22 @@ export default definePlugin({
return null; return null;
} }
const trackData = json.payload.listens[0]; const trackData = json.payload?.listens?.[0];
if (!trackData?.playing_now) if (!trackData?.playing_now || !trackData.track_metadata)
return null; return null;
const trackAddInfo = trackData.track_metadata.additional_info; const trackMeta = trackData.track_metadata;
const trackAddInfo = trackMeta.additional_info;
let recordingMbid = trackAddInfo.recording_mbid; let recordingMbid = trackAddInfo?.recording_mbid;
let releaseMbid = trackAddInfo.release_mbid; let releaseMbid = trackAddInfo?.release_mbid;
if (!recordingMbid || !releaseMbid) { if (!recordingMbid || !releaseMbid) {
const metadata = await this.lookupListenBrainzMetadata( const metadata = await this.lookupListenBrainzMetadata(
trackData.track_metadata.artist_name, trackMeta.artist_name,
trackData.track_metadata.track_name, trackMeta.track_name,
trackData.track_metadata.release_name trackMeta.release_name
); );
recordingMbid = recordingMbid || metadata.recording_mbid; recordingMbid = recordingMbid || metadata.recording_mbid;
@ -326,11 +327,10 @@ export default definePlugin({
} }
return { return {
name: trackData.track_metadata.track_name, name: trackMeta.track_name || "Unknown",
album: trackData.track_metadata.release_name, album: trackMeta.release_name || "Unknown",
artist: trackData.track_metadata.artist_name, artist: trackMeta.artist_name || "Unknown",
url: trackAddInfo.origin_url || url: trackAddInfo?.origin_url || recordingMbid && `https://musicbrainz.org/recording/${recordingMbid}`,
recordingMbid && `https://musicbrainz.org/recording/${recordingMbid}`,
imageUrl: releaseMbid && `https://coverartarchive.org/release/${releaseMbid}/front`, imageUrl: releaseMbid && `https://coverartarchive.org/release/${releaseMbid}/front`,
timestamps: settings.store.sendTimestamps ? await this.getListenBrainzTimestamps(trackData) : undefined, timestamps: settings.store.sendTimestamps ? await this.getListenBrainzTimestamps(trackData) : undefined,
client: trackAddInfo?.music_service_name || trackAddInfo?.music_service || trackAddInfo?.media_player client: trackAddInfo?.music_service_name || trackAddInfo?.music_service || trackAddInfo?.media_player
@ -371,20 +371,11 @@ export default definePlugin({
// pausing while listening and unpausing before the track would've ended will throw this off // pausing while listening and unpausing before the track would've ended will throw this off
// but other than that it's pretty accurate, at least accurate enough :p // but other than that it's pretty accurate, at least accurate enough :p
async getListenBrainzTimestamps(trackData: any) { async getListenBrainzTimestamps(trackData: any) {
try {
if (!trackData.track_metadata.additional_info?.duration && !trackData.track_metadata.additional_info?.duration_ms) if (!trackData.track_metadata.additional_info?.duration && !trackData.track_metadata.additional_info?.duration_ms)
return undefined; return undefined;
const now = Date.now(); const now = Date.now();
const res = await fetch(`https://api.listenbrainz.org/1/user/${settings.store.listenBrainzUsername}/listens?count=1`);
if (!res.ok) throw `${res.status} ${res.statusText}`;
const json = await res.json();
if (json.error) {
logger.error("Error from ListenBrainz API", `${json.error}: ${json.message}`);
return undefined;
}
const duration = trackData.track_metadata.additional_info.duration_ms || const duration = trackData.track_metadata.additional_info.duration_ms ||
trackData.track_metadata.additional_info.duration * 1000; trackData.track_metadata.additional_info.duration * 1000;
@ -399,6 +390,15 @@ export default definePlugin({
this.timestampStuff.lastTrackChange = now; this.timestampStuff.lastTrackChange = now;
} }
const res = await fetch(`https://api.listenbrainz.org/1/user/${settings.store.listenBrainzUsername}/listens?count=1`);
if (!res.ok) throw `${res.status} ${res.statusText}`;
const json = await res.json();
if (json.error) {
logger.error("Error from ListenBrainz API", `${json.error}: ${json.message}`);
return undefined;
}
const listenAddInfo = json.payload.count >= 1 && json.payload.listens[0].track_metadata.additional_info; const listenAddInfo = json.payload.count >= 1 && json.payload.listens[0].track_metadata.additional_info;
if (listenAddInfo?.duration || listenAddInfo?.duration_ms) { if (listenAddInfo?.duration || listenAddInfo?.duration_ms) {
const listenDuration = listenAddInfo.duration_ms || listenAddInfo.duration * 1000; const listenDuration = listenAddInfo.duration_ms || listenAddInfo.duration * 1000;
@ -429,6 +429,10 @@ export default definePlugin({
start: this.timestampStuff.lastTrackChange, start: this.timestampStuff.lastTrackChange,
end: this.timestampStuff.lastTrackChange + duration end: this.timestampStuff.lastTrackChange + duration
}; };
} catch (e) {
logger.error("Failed to query ListenBrainz API", e);
return undefined;
}
}, },
async updatePresence() { async updatePresence() {