data endpoint for entity 90008 (aka. a website)

refactor: use latest listen instead of using now playing

ptr.pet ff59fcc4 f10e63ef

verified
Changed files
+16 -24
src
lib
routes
(site)
+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
··· 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/'}