+15
-21
src/lib/lastfm.ts
+15
-21
src/lib/lastfm.ts
···
1
1
import { env } from '$env/dynamic/private';
2
2
import { get, writable } from 'svelte/store';
3
3
4
-
const GET_RECENT_TRACKS_ENDPOINT = 'https://api.listenbrainz.org/1/user/90008/playing-now';
4
+
const GET_RECENT_TRACKS_ENDPOINT = 'https://api.listenbrainz.org/1/user/90008/listens?count=1';
5
5
const LAST_TRACK_FILE = `${env.WEBSITE_DATA_DIR}/last_track.json`;
6
6
7
7
type LastTrack = {
···
10
10
image: string | null;
11
11
link: string;
12
12
when: number;
13
-
playing: boolean;
14
13
};
15
14
const lastTrack = writable<LastTrack | null>(null);
16
15
···
35
34
return null;
36
35
};
37
36
37
+
const joinArtists = (artists: any[]) => {
38
+
if (artists.length === 0) return null;
39
+
let result = '';
40
+
for (const artist of artists) {
41
+
result += artist.artist_credit_name + artist.join_phrase;
42
+
}
43
+
return result;
44
+
};
45
+
38
46
export const updateNowPlayingTrack = async () => {
39
47
try {
40
48
const resp = await (await fetch(GET_RECENT_TRACKS_ENDPOINT)).json();
41
49
const track = resp.payload.listens[0]?.track_metadata;
42
-
if (!track) {
43
-
lastTrack.update((t) => {
44
-
if (t !== null) {
45
-
t.playing = false;
46
-
}
47
-
return t;
48
-
});
49
-
return;
50
-
}
50
+
const mapping = track.mbid_mapping;
51
+
if (!track || !mapping) return;
51
52
const data = {
52
-
name: track.track_name,
53
-
artist: track.artist_name,
53
+
name: mapping.recording_name ?? track.track_name,
54
+
artist: joinArtists(mapping.artists ?? []) ?? track.artist_name,
54
55
image: getTrackCoverArt(track),
55
56
link: track.additional_info?.origin_url ?? null,
56
-
when: Date.now(),
57
-
playing: true
57
+
when: resp.payload.latest_listen_ts ? resp.payload.latest_listen_ts * 1000 : Date.now()
58
58
};
59
59
lastTrack.set(data);
60
60
await Deno.writeTextFile(LAST_TRACK_FILE, JSON.stringify(data));
61
61
} catch (why) {
62
62
console.log('could not fetch last fm: ', why);
63
-
lastTrack.update((t) => {
64
-
if (t !== null) {
65
-
t.playing = false;
66
-
}
67
-
return t;
68
-
});
69
63
}
70
64
};
71
65
+1
-3
src/routes/(site)/+page.svelte
+1
-3
src/routes/(site)/+page.svelte
···
177
177
<p
178
178
class="text-shadow-green text-ralsei-green-light text-sm text-ellipsis text-nowrap overflow-hidden max-w-[50ch]"
179
179
>
180
-
<span class="text-sm text-shadow-white text-ralsei-white"
181
-
>{data.lastTrack.playing ? 'listening to' : 'listened to'}</span
182
-
>
180
+
<span class="text-sm text-shadow-white text-ralsei-white">listened to</span>
183
181
<a
184
182
title={data.lastTrack.name}
185
183
href={data.lastTrack.link ?? 'https://listenbrainz.org/user/90008/'}