A decentralized music tracking and discovery platform built on AT Protocol 馃幍
at feat/scrobble-user-avatar 51 lines 1.5 kB view raw
1import chalk from "chalk"; 2import type { Context } from "context"; 3import { eq } from "drizzle-orm"; 4import _ from "lodash"; 5import { StringCodec } from "nats"; 6import tables from "schema"; 7 8export function onNewTrack(ctx: Context) { 9 const sc = StringCodec(); 10 const sub = ctx.nc.subscribe("rocksky.track"); 11 (async () => { 12 for await (const m of sub) { 13 const payload: { 14 track: { xata_id: string }; 15 artist_album: { 16 artist_id: { xata_id: string }; 17 album_id: { xata_id: string }; 18 }; 19 } = JSON.parse(sc.decode(m.data)); 20 21 const [tracks, artists, albums] = await Promise.all([ 22 ctx.db 23 .select() 24 .from(tables.tracks) 25 .where(eq(tables.tracks.id, payload.track.xata_id)) 26 .execute(), 27 ctx.db 28 .select() 29 .from(tables.artists) 30 .where(eq(tables.artists.id, payload.artist_album.artist_id.xata_id)) 31 .execute(), 32 ctx.db 33 .select() 34 .from(tables.albums) 35 .where(eq(tables.albums.id, payload.artist_album.album_id.xata_id)) 36 .execute(), 37 ]); 38 39 console.log(`New track: ${chalk.cyan(_.get(tracks, "0.title"))}`); 40 41 await Promise.all([ 42 ctx.meilisearch.post(`indexes/albums/documents?primaryKey=id`, albums), 43 ctx.meilisearch.post( 44 `indexes/artists/documents?primaryKey=id`, 45 artists, 46 ), 47 ctx.meilisearch.post(`indexes/tracks/documents?primaryKey=id`, tracks), 48 ]); 49 } 50 })(); 51}