A decentralized music tracking and discovery platform built on AT Protocol 馃幍
at main 47 lines 1.2 kB view raw
1import { RockskyClient } from "client"; 2import { ctx } from "context"; 3import { logger } from "logger"; 4import { SelectTrack } from "schema/tracks"; 5 6export type MusicBrainzArtist = { 7 mbid: string; 8 name: string; 9}; 10 11export type MatchTrackResult = SelectTrack & { 12 genres: string[] | null; 13 artistPicture: string | null; 14 releaseDate: string | null; 15 year: number | null; 16 mbArtists: MusicBrainzArtist[] | null; 17}; 18 19export async function matchTrack( 20 track: string, 21 artist: string, 22): Promise<MatchTrackResult | null> { 23 let match; 24 const cached = await ctx.kv.getItem(`${track} - ${artist}`); 25 const client = new RockskyClient(); 26 27 if (cached) { 28 match = cached; 29 client.matchSong(track, artist).then((newMatch) => { 30 if (newMatch) { 31 ctx.kv.setItem(`${track} - ${artist}`.toLowerCase(), newMatch); 32 } 33 }); 34 } else { 35 match = await client.matchSong(track, artist); 36 await ctx.kv.setItem(`${track} - ${artist}`.toLowerCase(), match); 37 } 38 39 if (!match.title || !match.artist) { 40 logger.error`Failed to match track ${track} by ${artist}`; 41 return null; 42 } 43 44 logger.info`馃捒 Matched track ${match.title} by ${match.artist}`; 45 46 return match; 47}