A decentralized music tracking and discovery platform built on AT Protocol 🎵 forked from rocksky.app/rocksky
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127import { equals } from "@xata.io/client";import chalk from "chalk";import { ctx } from "context";import { createHash } from "crypto";import { publishScrobble } from "nowplaying/nowplaying.service";
const args = process.argv.slice(2);
async function updateUris(did: string) { const { records } = await ctx.client.db.scrobbles .select(["track_id.*", "user_id.*"]) .filter({ $any: [{ "user_id.did": did }, { "user_id.handle": did }], }) .getPaginated({ pagination: { size: process.env.SYNC_SIZE ? parseInt(process.env.SYNC_SIZE) : 20, }, sort: [{ xata_createdat: "desc" }], }); for (const { track_id: track } of records) { const existingTrack = await ctx.client.db.tracks .filter( "sha256", equals( createHash("sha256") .update( `${track.title} - ${track.artist} - ${track.album}`.toLowerCase(), ) .digest("hex"), ), ) .getFirst();
if (existingTrack && !existingTrack.album_uri) { console.log(`Updating album uri for ${chalk.cyan(track.xata_id)} ...`); const album = await ctx.client.db.albums .filter( "sha256", equals( createHash("sha256") .update(`${track.album} - ${track.album_artist}`.toLowerCase()) .digest("hex"), ), ) .getFirst(); if (album) { await ctx.client.db.tracks.update(existingTrack.xata_id, { album_uri: album.uri, }); } }
if (existingTrack && !existingTrack.artist_uri) { console.log(`Updating artist uri for ${chalk.cyan(track.xata_id)} ...`); const artist = await ctx.client.db.artists .filter( "sha256", equals( createHash("sha256") .update(track.album_artist.toLowerCase()) .digest("hex"), ), ) .getFirst(); if (artist) { await ctx.client.db.tracks.update(existingTrack.xata_id, { artist_uri: artist.uri, }); } }
const album = await ctx.client.db.albums .filter( "sha256", equals( createHash("sha256") .update(`${track.album} - ${track.album_artist}`.toLowerCase()) .digest("hex"), ), ) .getFirst();
if (existingTrack && !album.artist_uri) { console.log(`Updating artist uri for ${chalk.cyan(album.xata_id)} ...`); const artist = await ctx.client.db.artists .filter( "sha256", equals( createHash("sha256") .update(track.album_artist.toLowerCase()) .digest("hex"), ), ) .getFirst(); if (artist) { await ctx.client.db.albums.update(album.xata_id, { artist_uri: artist.uri, }); } } }}
for (const arg of args) { console.log(`Syncing scrobbles ${chalk.magenta(arg)} ...`); await updateUris(arg);
const { records } = await ctx.client.db.scrobbles .filter({ $any: [{ "user_id.did": arg }, { "user_id.handle": arg }], }) .getPaginated({ pagination: { size: process.env.SYNC_SIZE ? parseInt(process.env.SYNC_SIZE) : 20, }, sort: [{ xata_createdat: "desc" }], }); for (const scrobble of records) { console.log(`Syncing scrobble ${chalk.cyan(scrobble.xata_id)} ...`); await publishScrobble(ctx, scrobble.xata_id); } console.log(`Synced ${chalk.greenBright(records.length)} scrobbles`);}
process.exit(0);