forked from
rocksky.app/rocksky
A decentralized music tracking and discovery platform built on AT Protocol 馃幍
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}