diff --git a/apps/api/package.json b/apps/api/package.json index f6e1c168..4c3eba61 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -58,6 +58,7 @@ "better-sqlite3": "^12.4.1", "chalk": "^5.4.1", "chanfana": "^2.0.2", + "consola": "^3.4.2", "cors": "^2.8.5", "dayjs": "^1.11.13", "dotenv": "^16.4.7", diff --git a/apps/api/scripts/pkl.ts b/apps/api/scripts/pkl.ts index 082d4ad6..9260e4c6 100644 --- a/apps/api/scripts/pkl.ts +++ b/apps/api/scripts/pkl.ts @@ -2,6 +2,7 @@ import chalk from "chalk"; import { readdirSync, statSync } from "fs"; import { join } from "path"; import { $ } from "zx"; +import { consola } from "consola"; function getPklFilesRecursive(dir: string): string[] { const entries = readdirSync(dir); @@ -28,7 +29,7 @@ const files = await getPklFilesRecursive(join("pkl", "defs")); await Promise.all( files.map(async (fullPath) => { - console.log(`pkl eval ${chalk.cyan(fullPath)}`); + consola.info(`pkl eval ${chalk.cyan(fullPath)}`); await $`pkl eval -f json ${fullPath} > ${fullPath.replace(/\.pkl$/, ".json").replace(/pkl[\\\/]defs/g, "lexicons")}`; - }) + }), ); diff --git a/apps/api/src/bsky/app.ts b/apps/api/src/bsky/app.ts index 194a575d..a9dac415 100644 --- a/apps/api/src/bsky/app.ts +++ b/apps/api/src/bsky/app.ts @@ -1,4 +1,5 @@ import { AtpAgent } from "@atproto/api"; +import { consola } from "consola"; import type { BlobRef } from "@atproto/lexicon"; import { isValidHandle } from "@atproto/syntax"; import { ctx } from "context"; @@ -134,7 +135,7 @@ app.get("/oauth/callback", async (c) => { ); ctx.kv.set(did, token); } catch (err) { - console.error({ err }, "oauth callback failed"); + consola.error({ err }, "oauth callback failed"); return c.redirect(`${env.FRONTEND_URL}?error=1`); } @@ -205,7 +206,7 @@ app.get("/profile", async (c) => { .execute(); } catch (e) { if (!e.message.includes("invalid record: column [did]: is not unique")) { - console.error(e.message); + consola.error(e.message); } else { await ctx.db .update(users) diff --git a/apps/api/src/context.ts b/apps/api/src/context.ts index b409cec2..3e180b9f 100644 --- a/apps/api/src/context.ts +++ b/apps/api/src/context.ts @@ -1,5 +1,6 @@ import { createClient } from "auth/client"; import axios from "axios"; +import { consola } from "consola"; import { createDb, migrateToLatest } from "db"; import drizzle from "drizzle"; import authVerifier from "lib/authVerifier"; @@ -35,7 +36,7 @@ export const ctx = { redis: await redis .createClient({ url: env.REDIS_URL }) .on("error", (err) => { - console.error("Uncaught Redis Client Error", err); + consola.error("Uncaught Redis Client Error", err); process.exit(1); }) .connect(), diff --git a/apps/api/src/db.ts b/apps/api/src/db.ts index 4d091b23..e797fe19 100644 --- a/apps/api/src/db.ts +++ b/apps/api/src/db.ts @@ -9,6 +9,7 @@ import { SqliteDialect, } from "kysely"; import { createAgent } from "lib/agent"; +import { consola } from "consola"; // Types @@ -113,12 +114,12 @@ export const migrateToLatest = async (db: Database) => { export const updateExpiresAt = async (db: Database) => { // get all sessions that have expiresAt is null const sessions = await db.selectFrom("auth_session").selectAll().execute(); - console.log("Found", sessions.length, "sessions to update"); + consola.info("Found", sessions.length, "sessions to update"); for (const session of sessions) { const data = JSON.parse(session.session) as { tokenSet: { expires_at?: string | null }; }; - console.log(session.key, data.tokenSet.expires_at); + consola.info(session.key, data.tokenSet.expires_at); await db .updateTable("auth_session") .set({ expiresAt: data.tokenSet.expires_at }) @@ -126,7 +127,7 @@ export const updateExpiresAt = async (db: Database) => { .execute(); } - console.log(`Updated ${chalk.greenBright(sessions.length)} sessions`); + consola.info(`Updated ${chalk.greenBright(sessions.length)} sessions`); }; export const refreshSessionsAboutToExpire = async ( @@ -144,7 +145,7 @@ export const refreshSessionsAboutToExpire = async ( .execute(); for (const session of sessions) { - console.log( + consola.info( "Session about to expire:", chalk.cyan(session.key), session.expiresAt, @@ -155,7 +156,7 @@ export const refreshSessionsAboutToExpire = async ( await new Promise((r) => setTimeout(r, 200)); } - console.log( + consola.info( `Found ${chalk.yellowBright(sessions.length)} sessions to refresh`, ); }; diff --git a/apps/api/src/dropbox/app.ts b/apps/api/src/dropbox/app.ts index df4be33f..34d6dbab 100644 --- a/apps/api/src/dropbox/app.ts +++ b/apps/api/src/dropbox/app.ts @@ -1,4 +1,5 @@ import axios from "axios"; +import { consola } from "consola"; import { ctx } from "context"; import { eq } from "drizzle-orm"; import { Hono } from "hono"; @@ -159,7 +160,7 @@ app.post("/join", async (c) => { if ( !e.message.includes("invalid record: column [user_id]: is not unique") ) { - console.error(e.message); + consola.error(e.message); } else { throw e; } diff --git a/apps/api/src/googledrive/app.ts b/apps/api/src/googledrive/app.ts index c6a1fa6d..e1addbe1 100644 --- a/apps/api/src/googledrive/app.ts +++ b/apps/api/src/googledrive/app.ts @@ -1,4 +1,5 @@ import axios from "axios"; +import { consola } from "consola"; import { ctx } from "context"; import { eq } from "drizzle-orm"; import fs from "fs"; @@ -185,7 +186,7 @@ app.post("/join", async (c) => { }); } catch (e) { if (!e.message.includes("duplicate key value violates unique constraint")) { - console.error(e.message); + consola.error(e.message); } else { throw e; } @@ -263,7 +264,7 @@ app.get("/files", async (c) => { return c.json(data); } catch (error) { if (axios.isAxiosError(error)) { - console.error("Axios error:", error.response?.data || error.message); + consola.error("Axios error:", error.response?.data || error.message); const credentials = JSON.parse( fs.readFileSync("credentials.json").toString("utf-8"), diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 10324f1a..08f9b31c 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -1,6 +1,7 @@ import { serve } from "@hono/node-server"; import { createNodeWebSocket } from "@hono/node-ws"; import { trace } from "@opentelemetry/api"; +import { consola } from "consola"; import { ctx } from "context"; import { and, desc, eq, isNotNull, or } from "drizzle-orm"; import { Hono } from "hono"; @@ -466,7 +467,7 @@ app.post("/tracks", async (c) => { await saveTrack(ctx, track, agent); } catch (e) { if (!e.message.includes("duplicate key value violates unique constraint")) { - console.error("[tracks]", e.message); + consola.error("[tracks]", e.message); } } diff --git a/apps/api/src/lib/agent.ts b/apps/api/src/lib/agent.ts index 64b1ac72..dcd9140f 100644 --- a/apps/api/src/lib/agent.ts +++ b/apps/api/src/lib/agent.ts @@ -1,5 +1,6 @@ import { Agent, AtpAgent } from "@atproto/api"; import type { NodeOAuthClient } from "@atproto/oauth-client-node"; +import { consola } from "consola"; import extractPdsFromDid from "./extractPdsFromDid"; import { ctx } from "context"; @@ -29,9 +30,9 @@ export async function createAgent( try { await atpAgent.resumeSession(JSON.parse(result.session)); } catch (e) { - console.log("Error resuming session"); - console.log(did); - console.log(e); + consola.info("Error resuming session"); + consola.info(did); + consola.info(e); await ctx.sqliteDb .deleteFrom("auth_session") .where("key", "=", `atp:${did}`) @@ -47,9 +48,9 @@ export async function createAgent( retry += 1; } } catch (e) { - console.log("Error creating agent"); - console.log(did); - console.log(e); + consola.info("Error creating agent"); + consola.info(did); + consola.info(e); await new Promise((r) => setTimeout(r, 1000)); retry += 1; } diff --git a/apps/api/src/lovedtracks/lovedtracks.service.ts b/apps/api/src/lovedtracks/lovedtracks.service.ts index f0fd5c97..e91ac298 100644 --- a/apps/api/src/lovedtracks/lovedtracks.service.ts +++ b/apps/api/src/lovedtracks/lovedtracks.service.ts @@ -1,5 +1,6 @@ import { AtpAgent, type Agent } from "@atproto/api"; import { TID } from "@atproto/common"; +import { consola } from "consola"; import type { Context } from "context"; import { and, desc, eq, type SQLWrapper } from "drizzle-orm"; import * as LikeLexicon from "lexicon/types/app/rocksky/like"; @@ -279,7 +280,7 @@ export async function likeTrack( }; if (!LikeLexicon.validateRecord(record).success) { - console.log(LikeLexicon.validateRecord(record)); + consola.info(LikeLexicon.validateRecord(record)); throw new Error("Invalid record"); } @@ -292,7 +293,7 @@ export async function likeTrack( validate: false, }); const uri = res.data.uri; - console.log(`Like record created at: ${uri}`); + consola.info(`Like record created at: ${uri}`); [created] = await ctx.db .update(lovedTracks) @@ -300,7 +301,7 @@ export async function likeTrack( .where(eq(lovedTracks.id, created.id)) .returning(); } catch (e) { - console.error(`Error creating like record: ${e.message}`); + consola.error(`Error creating like record: ${e.message}`); } } diff --git a/apps/api/src/nowplaying/nowplaying.service.ts b/apps/api/src/nowplaying/nowplaying.service.ts index ac3fc7d5..3fadeed5 100644 --- a/apps/api/src/nowplaying/nowplaying.service.ts +++ b/apps/api/src/nowplaying/nowplaying.service.ts @@ -1,6 +1,7 @@ import type { Agent } from "@atproto/api"; import { TID } from "@atproto/common"; import chalk from "chalk"; +import { consola } from "consola"; import type { Context } from "context"; import dayjs from "dayjs"; import { and, eq, gte, lte, or } from "drizzle-orm"; @@ -38,8 +39,8 @@ export async function putArtistRecord( }; if (!Artist.validateRecord(record).success) { - console.log(Artist.validateRecord(record)); - console.log(JSON.stringify(record, null, 2)); + consola.info(Artist.validateRecord(record)); + consola.info(JSON.stringify(record, null, 2)); throw new Error("Invalid record"); } @@ -52,10 +53,10 @@ export async function putArtistRecord( validate: false, }); const uri = res.data.uri; - console.log(`Artist record created at ${uri}`); + consola.info(`Artist record created at ${uri}`); return uri; } catch (e) { - console.error("Error creating artist record", e); + consola.error("Error creating artist record", e); return null; } } @@ -79,8 +80,8 @@ export async function putAlbumRecord( }; if (!Album.validateRecord(record).success) { - console.log(Album.validateRecord(record)); - console.log(JSON.stringify(record, null, 2)); + consola.info(Album.validateRecord(record)); + consola.info(JSON.stringify(record, null, 2)); throw new Error("Invalid record"); } @@ -93,10 +94,10 @@ export async function putAlbumRecord( validate: false, }); const uri = res.data.uri; - console.log(`Album record created at ${uri}`); + consola.info(`Album record created at ${uri}`); return uri; } catch (e) { - console.error("Error creating album record", e); + consola.error("Error creating album record", e); return null; } } @@ -134,8 +135,8 @@ export async function putSongRecord( }; if (!Song.validateRecord(record).success) { - console.log(Song.validateRecord(record)); - console.log(chalk.cyan(JSON.stringify(record, null, 2))); + consola.info(Song.validateRecord(record)); + consola.info(chalk.cyan(JSON.stringify(record, null, 2))); throw new Error("Invalid record"); } @@ -148,10 +149,10 @@ export async function putSongRecord( validate: false, }); const uri = res.data.uri; - console.log(`Song record created at ${uri}`); + consola.info(`Song record created at ${uri}`); return uri; } catch (e) { - console.error("Error creating song record", e); + consola.error("Error creating song record", e); return null; } } @@ -192,8 +193,8 @@ async function putScrobbleRecord( }; if (!Scrobble.validateRecord(record).success) { - console.log(Scrobble.validateRecord(record)); - console.log(JSON.stringify(record, null, 2)); + consola.info(Scrobble.validateRecord(record)); + consola.info(JSON.stringify(record, null, 2)); throw new Error("Invalid record"); } @@ -206,10 +207,10 @@ async function putScrobbleRecord( validate: false, }); const uri = res.data.uri; - console.log(`Scrobble record created at ${uri}`); + consola.info(`Scrobble record created at ${uri}`); return uri; } catch (e) { - console.error("Error creating scrobble record", e); + consola.error("Error creating scrobble record", e); return null; } } @@ -531,7 +532,7 @@ export async function scrobbleTrack( .then((rows) => rows[0]); if (existingScrobble) { - console.log( + consola.info( `Scrobble already exists for ${chalk.cyan(track.title)} at ${chalk.cyan( scrobbleTime.format("YYYY-MM-DD HH:mm:ss"), )}`, @@ -641,7 +642,7 @@ export async function scrobbleTrack( name: artist.name, })); } catch (error) { - console.error("Error fetching MusicBrainz data"); + consola.error("Error fetching MusicBrainz data"); } if (!existingTrack?.uri || !userTrack?.userTrack.uri?.includes(userDid)) { @@ -664,7 +665,7 @@ export async function scrobbleTrack( let tries = 0; while (!existingTrack && tries < 30) { - console.log(`Song not found, trying again: ${chalk.magenta(tries + 1)}`); + consola.info(`Song not found, trying again: ${chalk.magenta(tries + 1)}`); existingTrack = await ctx.db .select() .from(tracks) @@ -685,11 +686,11 @@ export async function scrobbleTrack( } if (tries === 30 && !existingTrack) { - console.log(`Song not found after ${chalk.magenta("30 tries")}`); + consola.info(`Song not found after ${chalk.magenta("30 tries")}`); } if (existingTrack) { - console.log( + consola.info( `Song found: ${chalk.cyan(existingTrack.id)} - ${track.title}, after ${chalk.magenta(tries)} tries`, ); } @@ -768,7 +769,7 @@ export async function scrobbleTrack( .then((rows) => rows[0]); while (!existingTrack?.artistUri && !existingTrack?.albumUri && tries < 30) { - console.log( + consola.info( `Artist uri not ready, trying again: ${chalk.magenta(tries + 1)}`, ); existingTrack = await ctx.db @@ -847,11 +848,11 @@ export async function scrobbleTrack( } if (tries === 30 && !existingTrack?.artistUri) { - console.log(`Artist uri not ready after ${chalk.magenta("30 tries")}`); + consola.info(`Artist uri not ready after ${chalk.magenta("30 tries")}`); } if (existingTrack?.artistUri) { - console.log( + consola.info( `Artist uri ready: ${chalk.cyan(existingTrack.id)} - ${track.title}, after ${chalk.magenta(tries)} tries`, ); } @@ -925,18 +926,18 @@ export async function scrobbleTrack( scrobble.track.artistUri && scrobble.track.albumUri ) { - console.log("Scrobble found after ", chalk.magenta(tries + 1), " tries"); + consola.info("Scrobble found after ", chalk.magenta(tries + 1), " tries"); await publishScrobble(ctx, scrobble.scrobble.id); - console.log("Scrobble published"); + consola.info("Scrobble published"); break; } tries += 1; - console.log("Scrobble not found, trying again: ", chalk.magenta(tries)); + consola.info("Scrobble not found, trying again: ", chalk.magenta(tries)); await new Promise((resolve) => setTimeout(resolve, 1000)); } if (tries === 30 && !scrobble) { - console.log(`Scrobble not found after ${chalk.magenta("30 tries")}`); + consola.info(`Scrobble not found after ${chalk.magenta("30 tries")}`); } ctx.nc.publish("rocksky.user.scrobble.sync", Buffer.from(userDid)); diff --git a/apps/api/src/scripts/avatar.ts b/apps/api/src/scripts/avatar.ts index 79bcb354..83663a00 100644 --- a/apps/api/src/scripts/avatar.ts +++ b/apps/api/src/scripts/avatar.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import { eq, or } from "drizzle-orm"; import _ from "lodash"; @@ -15,7 +16,7 @@ async function processUser(user: SelectUser) { const serviceEndpoint = _.get(plc, "service.0.serviceEndpoint"); if (!serviceEndpoint) { - console.log(`Service endpoint not found for ${user.did}`); + consola.info(`Service endpoint not found for ${user.did}`); return; } @@ -33,7 +34,7 @@ async function processUser(user: SelectUser) { .where(eq(users.did, user.did)) .execute(); } else { - console.log(`Skipping avatar update for ${user.did}`); + consola.info(`Skipping avatar update for ${user.did}`); } const [u] = await ctx.db @@ -54,7 +55,7 @@ async function processUser(user: SelectUser) { xata_version: u.xataVersion, }; - console.log(userPayload); + consola.info(userPayload); ctx.nc.publish("rocksky.user", Buffer.from(JSON.stringify(userPayload))); } @@ -67,7 +68,7 @@ if (args.length > 0) { .limit(1) .execute(); if (!user) { - console.log(`User ${did} not found`); + consola.info(`User ${did} not found`); continue; } @@ -77,7 +78,7 @@ if (args.length > 0) { let offset = 0; let processedCount = 0; - console.log("Processing all users..."); + consola.info("Processing all users..."); while (true) { const batch = await ctx.db @@ -91,7 +92,7 @@ if (args.length > 0) { break; // No more users to process } - console.log( + consola.info( `Processing batch ${Math.floor(offset / BATCH_SIZE) + 1}, users ${offset + 1}-${offset + batch.length}`, ); @@ -100,7 +101,7 @@ if (args.length > 0) { await processUser(user); processedCount++; } catch (error) { - console.error(`Error processing user ${user.did}:`, error); + consola.error(`Error processing user ${user.did}:`, error); } } @@ -110,12 +111,12 @@ if (args.length > 0) { await new Promise((resolve) => setTimeout(resolve, 100)); } - console.log(`Processed ${chalk.greenBright(processedCount)} users total`); + consola.info(`Processed ${chalk.greenBright(processedCount)} users total`); } // Ensure all messages are flushed before exiting await ctx.nc.flush(); -console.log("Done"); +consola.info("Done"); process.exit(0); diff --git a/apps/api/src/scripts/dedup.ts b/apps/api/src/scripts/dedup.ts index dcb2d4c4..9d50ae4e 100644 --- a/apps/api/src/scripts/dedup.ts +++ b/apps/api/src/scripts/dedup.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import { eq } from "drizzle-orm"; import { createAgent } from "lib/agent"; @@ -7,8 +8,8 @@ import tables from "schema"; const args = process.argv.slice(2); if (args.length === 0) { - console.error("Please provide user author identifier (handle or DID)."); - console.log(`Usage: ${chalk.cyan("npm run feed -- ")}`); + consola.error("Please provide user author identifier (handle or DID)."); + consola.info(`Usage: ${chalk.cyan("npm run feed -- ")}`); process.exit(1); } @@ -36,8 +37,8 @@ do { .where(eq(tables.scrobbles.uri, record.uri)) .limit(1); if (result.length === 0) { - console.log(`${i} Deleting record:`); - console.log(record); + consola.info(`${i} Deleting record:`); + consola.info(record); const rkey = record.uri.split("/").pop(); await agent.com.atproto.repo.deleteRecord({ repo: agent.assertDid, @@ -46,14 +47,14 @@ do { }); await new Promise((resolve) => setTimeout(resolve, 1000)); // rate limit } else { - console.log(chalk.greenBright(`${i} Keeping record:`)); - console.log(record); + consola.info(chalk.greenBright(`${i} Keeping record:`)); + consola.info(record); } i += 1; } cursor = records.data.cursor; } while (cursor); -console.log(chalk.greenBright("Deduplication complete.")); +consola.info(chalk.greenBright("Deduplication complete.")); process.exit(0); diff --git a/apps/api/src/scripts/exp.ts b/apps/api/src/scripts/exp.ts index 06bbfc70..99774caa 100644 --- a/apps/api/src/scripts/exp.ts +++ b/apps/api/src/scripts/exp.ts @@ -1,9 +1,10 @@ +import { consola } from "consola"; import { ctx, db } from "context"; import { refreshSessionsAboutToExpire, updateExpiresAt } from "db"; import { env } from "lib/env"; import cron from "node-cron"; -console.log("DB Path:", env.DB_PATH); +consola.info("DB Path:", env.DB_PATH); await updateExpiresAt(db); @@ -11,6 +12,6 @@ await refreshSessionsAboutToExpire(db, ctx); // run every 1 minute cron.schedule("* * * * *", async () => { - console.log("Running session refresh job..."); + consola.info("Running session refresh job..."); await refreshSessionsAboutToExpire(db, ctx); }); diff --git a/apps/api/src/scripts/feed.ts b/apps/api/src/scripts/feed.ts index cabd1cec..2867581c 100644 --- a/apps/api/src/scripts/feed.ts +++ b/apps/api/src/scripts/feed.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import type * as FeedGenerator from "lexicon/types/app/rocksky/feed/generator"; import { createAgent } from "lib/agent"; @@ -7,7 +8,7 @@ import prompts from "prompts"; const args = process.argv.slice(2); if (args.length === 0) { - console.error("Please provide user author identifier (handle or DID)."); + consola.error("Please provide user author identifier (handle or DID)."); console.log(`Usage: ${chalk.cyan("npm run feed -- ")}`); process.exit(1); } @@ -19,7 +20,7 @@ const name = await prompts({ }); if (name.value.length < 3 || name.value.length > 240) { - console.error("Feed name must be between 3 and 240 characters."); + consola.error("Feed name must be between 3 and 240 characters."); process.exit(1); } @@ -30,7 +31,7 @@ const description = await prompts({ }); if (description.value.length > 3000) { - console.error("Description is too long. Maximum length is 3000 characters."); + consola.error("Description is too long. Maximum length is 3000 characters."); process.exit(1); } @@ -41,7 +42,7 @@ const did = await prompts({ }); if (!/^did:web:[a-zA-Z0-9_.-]{3,30}$/.test(did.value)) { - console.error( + consola.error( "Invalid DID format. It should start with 'did:web:' followed by 3 to 30 alphanumeric characters, underscores, hyphens, or periods.", ); process.exit(1); @@ -54,18 +55,18 @@ const rkey = await prompts({ }); if (!/^[a-zA-Z0-9_-]{3,30}$/.test(rkey.value)) { - console.error( + consola.error( "Invalid record key. Only alphanumeric characters, underscores, and hyphens are allowed. Length must be between 3 and 30 characters.", ); process.exit(1); } -console.log("Creating feed with the following details:"); - -console.log("Feed name:", name.value); -console.log("Description:", description.value); -console.log("DID:", did.value); -console.log("Record key (rkey):", rkey.value); +consola.info("Creating feed with the following details:"); +consola.info("---"); +consola.info("Feed name:", name.value); +consola.info("Description:", description.value); +consola.info("DID:", did.value); +consola.info("Record key (rkey):", rkey.value); const confirm = await prompts({ type: "confirm", @@ -75,7 +76,7 @@ const confirm = await prompts({ }); if (!confirm.value) { - console.log("Feed creation cancelled."); + consola.info("Feed creation cancelled."); process.exit(0); } @@ -87,7 +88,7 @@ if (!userDid.startsWith("did:plc:")) { const agent = await createAgent(ctx.oauthClient, userDid); -console.log( +consola.info( `Writing ${chalk.greenBright("app.rocksky.feed.generator")} record...`, ); @@ -106,7 +107,7 @@ const res = await agent.com.atproto.repo.createRecord({ rkey: rkey.value, }); -console.log(chalk.greenBright("Feed created successfully!")); -console.log(`Record created at: ${chalk.cyan(res.data.uri)}`); +consola.info(chalk.greenBright("Feed created successfully!")); +consola.info(`Record created at: ${chalk.cyan(res.data.uri)}`); process.exit(0); diff --git a/apps/api/src/scripts/genres.ts b/apps/api/src/scripts/genres.ts index 80e6c0ae..9f336bea 100644 --- a/apps/api/src/scripts/genres.ts +++ b/apps/api/src/scripts/genres.ts @@ -1,3 +1,4 @@ +import { consola } from "consola"; import { ctx } from "context"; import { eq, isNull } from "drizzle-orm"; import { decrypt } from "lib/crypto"; @@ -78,7 +79,7 @@ async function getGenresAndPicture(artists) { .then(async (data) => _.get(data, "artists.items.0")); if (result) { - console.log(JSON.stringify(result, null, 2), "\n"); + consola.info(JSON.stringify(result, null, 2), "\n"); if (result.genres && result.genres.length > 0) { await ctx.db .update(tables.artists) @@ -97,7 +98,7 @@ async function getGenresAndPicture(artists) { } break; // exit the retry loop on success } catch (error) { - console.error("Error fetching genres for artist:", artist.name, error); + consola.error("Error fetching genres for artist:", artist.name, error); // wait for a while before retrying await new Promise((resolve) => setTimeout(resolve, 1000)); } @@ -130,6 +131,6 @@ for (let offset = 0; offset < count; offset += PAGE_SIZE) { await getGenresAndPicture(artists); } -console.log(`Artists without genres: ${count}`); +consola.info(`Artists without genres: ${count}`); process.exit(0); diff --git a/apps/api/src/scripts/likes.ts b/apps/api/src/scripts/likes.ts index 18bbfdb0..c6bb4d18 100644 --- a/apps/api/src/scripts/likes.ts +++ b/apps/api/src/scripts/likes.ts @@ -1,6 +1,7 @@ +import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import lovedTracks from "../schema/loved-tracks"; -import chalk from "chalk"; const likes = await ctx.db.select().from(lovedTracks).execute(); @@ -14,12 +15,12 @@ for (const like of likes) { xata_updatedat: like.createdAt.toISOString(), xata_version: 0, }); - console.log("Publishing like:", chalk.cyanBright(like.uri)); + consola.info("Publishing like:", chalk.cyanBright(like.uri)); ctx.nc.publish("rocksky.like", Buffer.from(message)); } await ctx.nc.flush(); -console.log("Done"); +consola.info("Done"); process.exit(0); diff --git a/apps/api/src/scripts/meili.ts b/apps/api/src/scripts/meili.ts index c3d5f569..3a77b862 100644 --- a/apps/api/src/scripts/meili.ts +++ b/apps/api/src/scripts/meili.ts @@ -1,10 +1,11 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import { count } from "drizzle-orm"; import tables from "schema"; async function main() { - console.log(chalk.cyan("Starting Meilisearch sync...")); + consola.info(chalk.cyan("Starting Meilisearch sync...")); try { await Promise.all([ @@ -13,9 +14,9 @@ async function main() { createTracks(), createUsers(), ]); - console.log(chalk.green("Meilisearch sync completed successfully.")); + consola.info(chalk.green("Meilisearch sync completed successfully.")); } catch (error) { - console.error(chalk.red("Error during Meilisearch sync:"), error); + consola.error(chalk.red("Error during Meilisearch sync:"), error); } } @@ -31,7 +32,7 @@ async function createAlbums() { .then(([row]) => row.value); for (let i = 0; i < total; i += size) { const skip = i; - console.log( + consola.info( `Processing ${chalk.magentaBright("albums")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}`, ); const results = await ctx.db @@ -55,7 +56,7 @@ async function createArtists() { .then(([row]) => row.value); for (let i = 0; i < total; i += size) { const skip = i; - console.log( + consola.info( `Processing ${chalk.magentaBright("artists")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}`, ); const results = await ctx.db @@ -79,7 +80,7 @@ async function createTracks() { .then(([row]) => row.value); for (let i = 0; i < total; i += size) { const skip = i; - console.log( + consola.info( `Processing ${chalk.magentaBright("tracks")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}`, ); const results = await ctx.db @@ -104,7 +105,7 @@ async function createUsers() { for (let i = 0; i < total; i += size) { const skip = i; - console.log( + consola.info( `Processing ${chalk.magentaBright("users")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}`, ); const results = await ctx.db diff --git a/apps/api/src/scripts/seed-feed.ts b/apps/api/src/scripts/seed-feed.ts index a9b3424d..9f0b9f34 100644 --- a/apps/api/src/scripts/seed-feed.ts +++ b/apps/api/src/scripts/seed-feed.ts @@ -1,17 +1,18 @@ import type { Agent } from "@atproto/api"; import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; +import { eq } from "drizzle-orm"; import { createAgent } from "lib/agent"; import * as FeedGenerator from "lexicon/types/app/rocksky/feed/generator"; import tables from "schema"; import type { InsertFeed } from "schema/feeds"; -import { eq } from "drizzle-orm"; const args = process.argv.slice(2); if (args.length === 0) { - console.error("Please provide user author identifier (handle or DID)."); - console.log(`Usage: ${chalk.cyan("npm run seed:feed -- ")}`); + consola.error("Please provide user author identifier (handle or DID)."); + consola.info(`Usage: ${chalk.cyan("npm run seed:feed -- ")}`); process.exit(1); } @@ -57,7 +58,7 @@ for (const feed of feeds) { } satisfies InsertFeed) .onConflictDoNothing() .execute(); - console.log( + consola.info( `Feed ${chalk.cyanBright(feed.value.displayName)} seeded successfully.`, ); } diff --git a/apps/api/src/scripts/spotify.ts b/apps/api/src/scripts/spotify.ts index d52edc62..86e1d1bb 100644 --- a/apps/api/src/scripts/spotify.ts +++ b/apps/api/src/scripts/spotify.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import { encrypt } from "lib/crypto"; import { env } from "lib/env"; @@ -9,10 +10,10 @@ const clientId = args[0]; const clientSecret = args[1]; if (!clientId || !clientSecret) { - console.error( + consola.error( "Please provide Spotify Client ID and Client Secret as command line arguments", ); - console.log( + consola.info( chalk.greenBright("Usage: ts-node spotify.ts "), ); process.exit(1); diff --git a/apps/api/src/scripts/sync-library.ts b/apps/api/src/scripts/sync-library.ts index 923f38e9..fde87965 100644 --- a/apps/api/src/scripts/sync-library.ts +++ b/apps/api/src/scripts/sync-library.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import { and, count, eq } from "drizzle-orm"; import tables from "schema"; @@ -11,11 +12,11 @@ const total = await ctx.db .execute() .then(([row]) => row.value); -console.log(`Total tracks to process: ${chalk.magentaBright(total)}`); +consola.info(`Total tracks to process: ${chalk.magentaBright(total)}`); for (let i = 0; i < total; i += size) { const skip = i; - console.log( + consola.info( `Processing ${chalk.magentaBright("tracks")}: ${chalk.magentaBright(skip)} to ${chalk.magentaBright(skip + size)}`, ); const results = await ctx.db @@ -27,11 +28,11 @@ for (let i = 0; i < total; i += size) { for (const track of results) { if (!track.artistUri || !track.albumUri) { - console.log( - `Skipping track ${chalk.cyan(track.title)} due to missing artist or album URI`, + consola.info( + `Deleting album-track relationship for track: ${chalk.redBright(track.uri)}`, ); - console.log("artistUri", track.artistUri); - console.log("albumUri", track.albumUri); + consola.info("artistUri", track.artistUri); + consola.info("albumUri", track.albumUri); continue; } @@ -57,7 +58,9 @@ for (let i = 0; i < total; i += size) { .then((rows) => rows.length > 0); if (!found) { - console.log(`Creating artist-album relationship for track: ${track.uri}`); + consola.info( + `Creating artist-album relationship for track: ${track.uri}`, + ); const [artist, album] = await Promise.all([ ctx.db .select() @@ -76,11 +79,11 @@ for (let i = 0; i < total; i += size) { ]); if (!artist || !album) { - console.error( - `Artist or album not found for track: ${track.uri}. Skipping...`, + consola.error( + `Artist-album relationship already exists for track: ${chalk.redBright(track.uri)}`, ); - console.log("artist", artist); - console.log("album", album); + consola.info("artist", artist); + consola.info("album", album); continue; } diff --git a/apps/api/src/scripts/sync.ts b/apps/api/src/scripts/sync.ts index d08b8cb8..7b04a5d7 100644 --- a/apps/api/src/scripts/sync.ts +++ b/apps/api/src/scripts/sync.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import { desc, eq, or } from "drizzle-orm"; import { createHash } from "node:crypto"; @@ -38,7 +39,7 @@ async function updateUris(did: string) { .then((rows) => rows[0]); if (existingTrack && !existingTrack.albumUri) { - console.log(`Updating album uri for ${chalk.cyan(track.id)} ...`); + consola.info(`Updating album uri for ${chalk.cyan(track.id)} ...`); const albumHash = createHash("sha256") .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) @@ -60,7 +61,7 @@ async function updateUris(did: string) { } if (existingTrack && !existingTrack.artistUri) { - console.log(`Updating artist uri for ${chalk.cyan(track.id)} ...`); + consola.info(`Updating artist uri for ${chalk.cyan(track.id)} ...`); const artistHash = createHash("sha256") .update(track.albumArtist.toLowerCase()) @@ -93,7 +94,7 @@ async function updateUris(did: string) { .then((rows) => rows[0]); if (existingTrack && album && !album.artistUri) { - console.log(`Updating artist uri for ${chalk.cyan(album.id)} ...`); + consola.info(`Updating artist uri for ${chalk.cyan(album.id)} ...`); const artistHash = createHash("sha256") .update(track.albumArtist.toLowerCase()) @@ -117,13 +118,13 @@ async function updateUris(did: string) { } if (args.includes("--background")) { - console.log("Wait for new scrobbles to sync ..."); + consola.info("Wait for new scrobbles to sync ..."); const sub = ctx.nc.subscribe("rocksky.user.scrobble.sync"); for await (const m of sub) { const did = new TextDecoder().decode(m.data); // wait for 15 seconds to ensure the scrobble is fully created await new Promise((resolve) => setTimeout(resolve, 15000)); - console.log(`Syncing scrobbles ${chalk.magenta(did)} ...`); + consola.info(`Syncing scrobbles ${chalk.magenta(did)} ...`); await updateUris(did); const records = await ctx.db @@ -137,11 +138,11 @@ if (args.includes("--background")) { .limit(5); for (const { scrobble } of records) { - console.log(`Syncing scrobble ${chalk.cyan(scrobble.id)} ...`); + consola.info(`Syncing scrobble ${chalk.cyan(scrobble.id)} ...`); try { await publishScrobble(ctx, scrobble.id); } catch (err) { - console.error( + consola.error( `Failed to sync scrobble ${chalk.cyan(scrobble.id)}:`, err, ); @@ -152,7 +153,7 @@ if (args.includes("--background")) { } for (const arg of args) { - console.log(`Syncing scrobbles ${chalk.magenta(arg)} ...`); + consola.info(`Syncing scrobbles ${chalk.magenta(arg)} ...`); await updateUris(arg); const records = await ctx.db @@ -166,14 +167,14 @@ for (const arg of args) { .limit(process.env.SYNC_SIZE ? parseInt(process.env.SYNC_SIZE, 10) : 20); for (const { scrobble } of records) { - console.log(`Syncing scrobble ${chalk.cyan(scrobble.id)} ...`); + consola.info(`Syncing scrobble ${chalk.cyan(scrobble.id)} ...`); try { await publishScrobble(ctx, scrobble.id); } catch (err) { - console.error(`Failed to sync scrobble ${chalk.cyan(scrobble.id)}:`, err); + consola.error(`Failed to sync scrobble ${chalk.cyan(scrobble.id)}:`, err); } } - console.log(`Synced ${chalk.greenBright(records.length)} scrobbles`); + consola.info(`Synced ${chalk.greenBright(records.length)} scrobbles`); } process.exit(0); diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index 7bdc6263..3ae1e669 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -1,3 +1,4 @@ +import { consola } from "consola"; import { ctx } from "context"; import cors from "cors"; import type { Request, Response } from "express"; @@ -30,7 +31,7 @@ app.use(server.xrpc.router); app.use(proxyMiddleware); app.listen(process.env.ROCKSKY_XPRC_PORT || 3004, () => { - console.log( + consola.info( `Rocksky XRPC API is running on port ${process.env.ROCKSKY_XRPC_PORT || 3004}`, ); }); diff --git a/apps/api/src/shouts/shouts.service.ts b/apps/api/src/shouts/shouts.service.ts index 77a6ca14..fdff2b44 100644 --- a/apps/api/src/shouts/shouts.service.ts +++ b/apps/api/src/shouts/shouts.service.ts @@ -1,4 +1,5 @@ import { type Agent, AtpAgent } from "@atproto/api"; +import { consola } from "consola"; import { TID } from "@atproto/common"; import type { Context } from "context"; import { and, eq } from "drizzle-orm"; @@ -98,7 +99,7 @@ export async function createShout( cid: subjectRecord.data.cid, }); if (!subjectRef.success) { - console.log(subjectRef); + consola.info(subjectRef); throw new Error("Invalid ref"); } @@ -111,7 +112,7 @@ export async function createShout( }; if (!ShoutLexicon.validateRecord(record).success) { - console.log(ShoutLexicon.validateRecord(record)); + consola.info(ShoutLexicon.validateRecord(record)); throw new Error("[shout] invalid record"); } @@ -125,7 +126,7 @@ export async function createShout( }); const uri = res.data.uri; - console.log(`Shout record created at: ${uri}`); + consola.info(`Shout record created at: ${uri}`); const createdShout = await ctx.db .insert(shouts) @@ -148,7 +149,7 @@ export async function createShout( }); } } catch (e) { - console.error(`Error creating shout record: ${e.message}`); + consola.error(`Error creating shout record: ${e.message}`); } } @@ -269,7 +270,7 @@ export async function replyShout( }; if (!ShoutLexicon.validateRecord(record).success) { - console.log(ShoutLexicon.validateRecord(record)); + consola.info(ShoutLexicon.validateRecord(record)); throw new Error("Invalid record"); } @@ -283,7 +284,7 @@ export async function replyShout( }); const uri = res.data.uri; - console.log(`Reply record created at: ${uri}`); + consola.info(`Reply record created at: ${uri}`); const createdShout = await ctx.db .insert(shouts) @@ -314,7 +315,7 @@ export async function replyShout( }); } } catch (e) { - console.error(`Error creating reply record: ${e.message}`); + consola.error(`Error creating reply record: ${e.message}`); } } @@ -370,7 +371,7 @@ export async function likeShout( }; if (!LikeLexicon.validateRecord(record).success) { - console.log(LikeLexicon.validateRecord(record)); + consola.info(LikeLexicon.validateRecord(record)); throw new Error("Invalid record"); } @@ -383,7 +384,7 @@ export async function likeShout( validate: false, }); const uri = res.data.uri; - console.log(`Like record created at: ${uri}`); + consola.info(`Like record created at: ${uri}`); const shout = await ctx.db .select() @@ -402,7 +403,7 @@ export async function likeShout( uri, }); } catch (e) { - console.error(`Error creating like record: ${e.message}`); + consola.error(`Error creating like record: ${e.message}`); } } diff --git a/apps/api/src/spotify/app.ts b/apps/api/src/spotify/app.ts index 3be6abc0..936c0663 100644 --- a/apps/api/src/spotify/app.ts +++ b/apps/api/src/spotify/app.ts @@ -1,3 +1,4 @@ +import { consola } from "consola"; import { ctx } from "context"; import { and, eq, or, sql } from "drizzle-orm"; import { Hono } from "hono"; @@ -249,7 +250,7 @@ app.post("/join", async (c) => { }); } catch (e) { if (!e.message.includes("duplicate key value violates unique constraint")) { - console.error(e.message); + consola.error(e.message); } else { throw e; } diff --git a/apps/api/src/subscribers/index.ts b/apps/api/src/subscribers/index.ts index 2f01c4a3..da418dba 100644 --- a/apps/api/src/subscribers/index.ts +++ b/apps/api/src/subscribers/index.ts @@ -2,9 +2,11 @@ import type { Context } from "context"; import { onNewPlaylist } from "./playlist"; import { onNewTrack } from "./track"; import { onNewUser } from "./user"; +import { onNewScrobble } from "./scrobble"; export default function subscribe(ctx: Context) { onNewPlaylist(ctx); onNewTrack(ctx); onNewUser(ctx); + onNewScrobble(ctx); } diff --git a/apps/api/src/subscribers/playlist.ts b/apps/api/src/subscribers/playlist.ts index 39d69394..4e80cfa7 100644 --- a/apps/api/src/subscribers/playlist.ts +++ b/apps/api/src/subscribers/playlist.ts @@ -1,4 +1,5 @@ import { TID } from "@atproto/common"; +import { consola } from "consola"; import chalk from "chalk"; import type { Context } from "context"; import { eq } from "drizzle-orm"; @@ -16,7 +17,7 @@ export function onNewPlaylist(ctx: Context) { id: string; did: string; } = JSON.parse(sc.decode(m.data)); - console.log( + consola.info( `New playlist: ${chalk.cyan(payload.did)} - ${chalk.greenBright(payload.id)}`, ); await putPlaylistRecord(ctx, payload); @@ -31,7 +32,7 @@ async function putPlaylistRecord( const agent = await createAgent(ctx.oauthClient, payload.did); if (!agent) { - console.error( + consola.error( `Failed to create agent, skipping playlist: ${chalk.cyan(payload.id)} for ${chalk.greenBright(payload.did)}`, ); return; @@ -69,7 +70,7 @@ async function putPlaylistRecord( }; if (!Playlist.validateRecord(record)) { - console.error(`Invalid record: ${chalk.redBright(JSON.stringify(record))}`); + consola.error(`Invalid record: ${chalk.redBright(JSON.stringify(record))}`); return; } @@ -82,14 +83,14 @@ async function putPlaylistRecord( validate: false, }); const uri = res.data.uri; - console.log(`Playlist record created: ${chalk.greenBright(uri)}`); + consola.info(`Playlist record created: ${chalk.greenBright(uri)}`); await ctx.db .update(tables.playlists) .set({ uri }) .where(eq(tables.playlists.id, payload.id)) .execute(); } catch (e) { - console.error(`Failed to put record: ${chalk.redBright(e.message)}`); + consola.error(`Failed to put record: ${chalk.redBright(e.message)}`); } const [updatedPlaylist] = await ctx.db diff --git a/apps/api/src/subscribers/scrobble.ts b/apps/api/src/subscribers/scrobble.ts new file mode 100644 index 00000000..f479f13a --- /dev/null +++ b/apps/api/src/subscribers/scrobble.ts @@ -0,0 +1,209 @@ +import { consola } from "consola"; +import type { Context } from "context"; +import { eq } from "drizzle-orm"; +import _ from "lodash"; +import { StringCodec } from "nats"; +import tables from "schema"; + +export function onNewScrobble(ctx: Context) { + const sc = StringCodec(); + const sub = ctx.nc.subscribe("rocksky.scrobble.new"); + (async () => { + for await (const m of sub) { + const scrobbleId = sc.decode(m.data); + const result = await ctx.db + .select() + .from(tables.scrobbles) + .where(eq(tables.scrobbles.id, scrobbleId)) + .execute() + .then((rows) => rows[0]); + + if (!result) { + consola.info(`Scrobble with ID ${scrobbleId} not found, skipping`); + } + } + })(); +} + +/* +import chalk from "chalk"; +import { ctx } from "context"; +import { desc, eq, or } from "drizzle-orm"; +import { createHash } from "node:crypto"; +import { publishScrobble } from "nowplaying/nowplaying.service"; +import albums from "../schema/albums"; +import artists from "../schema/artists"; +import scrobbles from "../schema/scrobbles"; +import tracks from "../schema/tracks"; +import users from "../schema/users"; + +const args = process.argv.slice(2); + +async function updateUris(did: string) { + // Get scrobbles with track and user data + const records = await ctx.db + .select({ + track: tracks, + user: users, + }) + .from(scrobbles) + .innerJoin(tracks, eq(scrobbles.trackId, tracks.id)) + .innerJoin(users, eq(scrobbles.userId, users.id)) + .where(or(eq(users.did, did), eq(users.handle, did))) + .orderBy(desc(scrobbles.createdAt)) + .limit(process.env.SYNC_SIZE ? parseInt(process.env.SYNC_SIZE, 10) : 20); + + for (const { track } of records) { + const trackHash = createHash("sha256") + .update(`${track.title} - ${track.artist} - ${track.album}`.toLowerCase()) + .digest("hex"); + + const existingTrack = await ctx.db + .select() + .from(tracks) + .where(eq(tracks.sha256, trackHash)) + .limit(1) + .then((rows) => rows[0]); + + if (existingTrack && !existingTrack.albumUri) { + consola.info(`Updating album uri for ${chalk.cyan(track.id)} ...`); + + const albumHash = createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex"); + + const album = await ctx.db + .select() + .from(albums) + .where(eq(albums.sha256, albumHash)) + .limit(1) + .then((rows) => rows[0]); + + if (album) { + await ctx.db + .update(tracks) + .set({ albumUri: album.uri }) + .where(eq(tracks.id, existingTrack.id)); + } + } + + if (existingTrack && !existingTrack.artistUri) { + consola.info(`Updating artist uri for ${chalk.cyan(track.id)} ...`); + + const artistHash = createHash("sha256") + .update(track.albumArtist.toLowerCase()) + .digest("hex"); + + const artist = await ctx.db + .select() + .from(artists) + .where(eq(artists.sha256, artistHash)) + .limit(1) + .then((rows) => rows[0]); + + if (artist) { + await ctx.db + .update(tracks) + .set({ artistUri: artist.uri }) + .where(eq(tracks.id, existingTrack.id)); + } + } + + const albumHash = createHash("sha256") + .update(`${track.album} - ${track.albumArtist}`.toLowerCase()) + .digest("hex"); + + const album = await ctx.db + .select() + .from(albums) + .where(eq(albums.sha256, albumHash)) + .limit(1) + .then((rows) => rows[0]); + + if (existingTrack && album && !album.artistUri) { + consola.info(`Updating artist uri for ${chalk.cyan(album.id)} ...`); + + const artistHash = createHash("sha256") + .update(track.albumArtist.toLowerCase()) + .digest("hex"); + + const artist = await ctx.db + .select() + .from(artists) + .where(eq(artists.sha256, artistHash)) + .limit(1) + .then((rows) => rows[0]); + + if (artist) { + await ctx.db + .update(albums) + .set({ artistUri: artist.uri }) + .where(eq(albums.id, album.id)); + } + } + } +} + +if (args.includes("--background")) { + consola.info("Wait for new scrobbles to sync ..."); + const sub = ctx.nc.subscribe("rocksky.user.scrobble.sync"); + for await (const m of sub) { + const did = new TextDecoder().decode(m.data); + // wait for 15 seconds to ensure the scrobble is fully created + await new Promise((resolve) => setTimeout(resolve, 15000)); + consola.info(`Syncing scrobbles ${chalk.magenta(did)} ...`); + await updateUris(did); + + const records = await ctx.db + .select({ + scrobble: scrobbles, + }) + .from(scrobbles) + .innerJoin(users, eq(scrobbles.userId, users.id)) + .where(or(eq(users.did, did), eq(users.handle, did))) + .orderBy(desc(scrobbles.createdAt)) + .limit(5); + + for (const { scrobble } of records) { + consola.info(`Syncing scrobble ${chalk.cyan(scrobble.id)} ...`); + try { + await publishScrobble(ctx, scrobble.id); + } catch (err) { + consola.error( + `Failed to sync scrobble ${chalk.cyan(scrobble.id)}:`, + err, + ); + } + } + } + process.exit(0); +} + +for (const arg of args) { + consola.info(`Syncing scrobbles ${chalk.magenta(arg)} ...`); + await updateUris(arg); + + const records = await ctx.db + .select({ + scrobble: scrobbles, + }) + .from(scrobbles) + .innerJoin(users, eq(scrobbles.userId, users.id)) + .where(or(eq(users.did, arg), eq(users.handle, arg))) + .orderBy(desc(scrobbles.createdAt)) + .limit(process.env.SYNC_SIZE ? parseInt(process.env.SYNC_SIZE, 10) : 20); + + for (const { scrobble } of records) { + consola.info(`Syncing scrobble ${chalk.cyan(scrobble.id)} ...`); + try { + await publishScrobble(ctx, scrobble.id); + } catch (err) { + consola.error(`Failed to sync scrobble ${chalk.cyan(scrobble.id)}:`, err); + } + } + consola.info(`Synced ${chalk.greenBright(records.length)} scrobbles`); +} + +process.exit(0); + +*/ diff --git a/apps/api/src/subscribers/track.ts b/apps/api/src/subscribers/track.ts index 48e27a05..308ca745 100644 --- a/apps/api/src/subscribers/track.ts +++ b/apps/api/src/subscribers/track.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import _ from "lodash"; @@ -36,7 +37,7 @@ export function onNewTrack(ctx: Context) { .execute(), ]); - console.log(`New track: ${chalk.cyan(_.get(tracks, "0.title"))}`); + consola.info(`New track: ${chalk.cyan(_.get(tracks, "0.title"))}`); await Promise.all([ ctx.meilisearch.post(`indexes/albums/documents?primaryKey=id`, albums), diff --git a/apps/api/src/subscribers/user.ts b/apps/api/src/subscribers/user.ts index 86a86496..e1fcb171 100644 --- a/apps/api/src/subscribers/user.ts +++ b/apps/api/src/subscribers/user.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import _ from "lodash"; @@ -19,7 +20,7 @@ export function onNewUser(ctx: Context) { .where(eq(tables.users.id, payload.xata_id)) .execute(); - console.log(`New user: ${chalk.cyan(_.get(results, "0.handle"))}`); + consola.info(`New user: ${chalk.cyan(_.get(results, "0.handle"))}`); await ctx.meilisearch.post( `/indexes/users/documents?primaryKey=id`, diff --git a/apps/api/src/tealfm/index.ts b/apps/api/src/tealfm/index.ts index 8dbd8891..ed58ed7a 100644 --- a/apps/api/src/tealfm/index.ts +++ b/apps/api/src/tealfm/index.ts @@ -1,6 +1,7 @@ import type { Agent } from "@atproto/api"; import { TID } from "@atproto/common"; import chalk from "chalk"; +import { consola } from "consola"; import type * as Status from "lexicon/types/fm/teal/alpha/actor/status"; import type { PlayView } from "lexicon/types/fm/teal/alpha/feed/defs"; import * as Play from "lexicon/types/fm/teal/alpha/feed/play"; @@ -24,7 +25,9 @@ async function publishPlayingNow( duration: number, ) { if (env.DISABLED_TEALFM.includes(agent.assertDid)) { - console.log(`teal.fm is disabled for ${chalk.cyanBright(agent.assertDid)}`); + consola.info( + `teal.fm is disabled for ${chalk.cyanBright(agent.assertDid)}`, + ); return; } @@ -47,7 +50,7 @@ async function publishPlayingNow( ); }); if (alreadyPlayed) { - console.log( + consola.info( `Track ${chalk.cyan(track.name)} by ${chalk.cyan( track.artist.map((a) => a.name).join(", "), )} already played recently. Skipping...`, @@ -72,8 +75,8 @@ async function publishPlayingNow( }; if (!Play.validateRecord(record).success) { - console.log(Play.validateRecord(record)); - console.log(chalk.cyan(JSON.stringify(record, null, 2))); + consola.info(Play.validateRecord(record)); + consola.info(chalk.cyan(JSON.stringify(record, null, 2))); throw new Error("Invalid record"); } @@ -85,11 +88,11 @@ async function publishPlayingNow( validate: false, }); const uri = res.data.uri; - console.log(`tealfm Play record created at ${uri}`); + consola.info(`tealfm Play record created at ${uri}`); await publishStatus(agent, track, duration); } catch (error) { - console.error("Error publishing teal.fm record:", error); + consola.error("Error publishing teal.fm record:", error); } } @@ -127,7 +130,7 @@ async function publishStatus( record, swapRecord, }); - console.log(`tealfm Status record published at ${res.data.uri}`); + consola.info(`tealfm Status record published at ${res.data.uri}`); } async function getStatusSwapRecord(agent: Agent): Promise { diff --git a/apps/api/src/tracks/tracks.service.ts b/apps/api/src/tracks/tracks.service.ts index e92d43c8..14bcf02a 100644 --- a/apps/api/src/tracks/tracks.service.ts +++ b/apps/api/src/tracks/tracks.service.ts @@ -1,4 +1,5 @@ import type { Agent } from "@atproto/api"; +import { consola } from "consola"; import type { Context } from "context"; import { and, eq } from "drizzle-orm"; import { deepSnakeCaseKeys } from "lib"; @@ -130,7 +131,7 @@ export async function saveTrack(ctx: Context, track: Track, agent: Agent) { .then((results) => results[0]); if (!track_id || !album_id || !artist_id) { - console.log( + consola.info( "Track not yet saved (uri not saved), retrying...", tries + 1, ); @@ -218,7 +219,7 @@ export async function saveTrack(ctx: Context, track: Track, agent: Agent) { track_id.albumUri && track_id.artistUri ) { - console.log("Track saved successfully after", tries + 1, "tries"); + consola.info("Track saved successfully after", tries + 1, "tries"); const message = JSON.stringify( deepSnakeCaseKeys({ @@ -275,23 +276,23 @@ export async function saveTrack(ctx: Context, track: Track, agent: Agent) { } tries += 1; - console.log("Track not yet saved, retrying...", tries + 1); + consola.info("Track not yet saved, retrying...", tries + 1); if (tries === 15) { - console.log(">>>"); - console.log(album_track); - console.log(artist_track); - console.log(artist_album); - console.log(artist_id); - console.log(album_id); - console.log(track_id); - console.log(track_id.albumUri); - console.log(track_id.artistUri); - console.log("<<<"); + consola.info(">>>"); + consola.info(album_track); + consola.info(artist_track); + consola.info(artist_album); + consola.info(artist_id); + consola.info(album_id); + consola.info(track_id); + consola.info(track_id.albumUri); + consola.info(track_id.artistUri); + consola.info("<<<"); } await new Promise((resolve) => setTimeout(resolve, 1000)); } if (tries === 15) { - console.log("Failed to save track after 15 tries"); + consola.info("Failed to save track after 15 tries"); } } diff --git a/apps/api/src/websocket/handler.ts b/apps/api/src/websocket/handler.ts index 4a74e7e5..e3dfce7c 100644 --- a/apps/api/src/websocket/handler.ts +++ b/apps/api/src/websocket/handler.ts @@ -1,4 +1,5 @@ import chalk from "chalk"; +import { consola } from "consola"; import { ctx } from "context"; import { and, eq } from "drizzle-orm"; import type { Context } from "hono"; @@ -174,7 +175,7 @@ function handleWebsocket(c: Context) { const { did } = jwt.verify(token, env.JWT_SECRET, { ignoreExpiration: true, }); - console.log( + consola.info( `Control message: ${chalk.greenBright(type)}, ${chalk.greenBright(target)}, ${chalk.greenBright(action)}, ${chalk.greenBright(args)}, ${chalk.greenBright("***")}`, ); // Handle control message @@ -183,31 +184,31 @@ function handleWebsocket(c: Context) { const targetDevice = devices[deviceId]; if (targetDevice) { targetDevice.send(JSON.stringify({ type, action, args })); - console.log( + consola.info( `Control message sent to device: ${chalk.greenBright(deviceId)}, ${chalk.greenBright(target)}`, ); return; } - console.error(`Device not found: ${target}`); + consola.error(`Device not found: ${target}`); return; } userDevices[did]?.forEach((id) => { const targetDevice = devices[id]; if (targetDevice) { targetDevice.send(JSON.stringify({ type, action, args })); - console.log( + consola.info( `Control message sent to all devices: ${chalk.greenBright(id)}, ${chalk.greenBright(target)}`, ); } }); - console.error(`Device ID not found for target: ${target}`); + consola.error(`Device ID not found for target: ${target}`); return; } if (registerMessage.success) { const { type, clientName, token } = registerMessage.data; - console.log( + consola.info( `Register message: ${chalk.greenBright(type)}, ${chalk.greenBright(clientName)}, ${chalk.greenBright("****")}`, ); // Handle register Message @@ -220,7 +221,7 @@ function handleWebsocket(c: Context) { devices[deviceId] = ws; deviceNames[deviceId] = clientName; userDevices[did] = [...(userDevices[did] || []), deviceId]; - console.log( + consola.info( `Device registered: ${chalk.greenBright(deviceId)}, ${chalk.greenBright(clientName)}`, ); @@ -244,17 +245,17 @@ function handleWebsocket(c: Context) { return; } } catch (e) { - console.error("Error parsing message:", e); + consola.error("Error parsing message:", e); } }, onClose: (_, ws) => { - console.log("Connection closed"); + consola.info("Connection closed"); // remove device from devices const deviceId = ws.deviceId; const did = ws.did; if (deviceId && devices[deviceId]) { delete devices[deviceId]; - console.log(`Device removed: ${chalk.redBright(deviceId)}`); + consola.info(`Device removed: ${chalk.redBright(deviceId)}`); } if (did && userDevices[did]) { userDevices[did] = userDevices[did].filter((id) => id !== deviceId); @@ -265,7 +266,7 @@ function handleWebsocket(c: Context) { if (deviceId && deviceNames[deviceId]) { const clientName = deviceNames[deviceId]; delete deviceNames[deviceId]; - console.log( + consola.info( `Device name removed: ${chalk.redBright(deviceId)}, ${chalk.redBright(clientName)}`, ); } diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts index 7ec662bc..374808ae 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorAlbums.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { QueryParams } from "lexicon/types/app/rocksky/actor/getActorAlbums"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ artists: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts index babd1cb8..b53e5d5b 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorArtists.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { QueryParams } from "lexicon/types/app/rocksky/actor/getActorArtists"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ artists: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorCompatibility.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorCompatibility.ts index f4c58118..69965419 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorCompatibility.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorCompatibility.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { QueryParams } from "lexicon/types/app/rocksky/actor/getActorCompatibility"; @@ -17,7 +18,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ comptibility: null }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorLovedSongs.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorLovedSongs.ts index 69e5423f..c8bd04ff 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorLovedSongs.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorLovedSongs.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { and, desc, eq, isNotNull, not, or } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -16,7 +17,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ tracks: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorNeighbours.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorNeighbours.ts index 7f40e3ad..cc95b18c 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorNeighbours.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorNeighbours.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { QueryParams } from "lexicon/types/app/rocksky/actor/getActorNeighbours"; @@ -16,7 +17,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ neighbours: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorPlaylists.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorPlaylists.ts index b2ed8252..f958ca0d 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorPlaylists.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorPlaylists.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { eq, or, sql } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -16,7 +17,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ playlists: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorScrobbles.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorScrobbles.ts index cd0ce7d1..432d5267 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorScrobbles.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorScrobbles.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { QueryParams } from "lexicon/types/app/rocksky/actor/getActorScrobbles"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ scrobbles: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts b/apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts index df7ebf97..00102b84 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getActorSongs.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { QueryParams } from "lexicon/types/app/rocksky/actor/getActorSongs"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ tracks: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/actor/getProfile.ts b/apps/api/src/xrpc/app/rocksky/actor/getProfile.ts index b5d9e9ca..c0f08cfb 100644 --- a/apps/api/src/xrpc/app/rocksky/actor/getProfile.ts +++ b/apps/api/src/xrpc/app/rocksky/actor/getProfile.ts @@ -1,4 +1,5 @@ import { type Agent, AtpAgent } from "@atproto/api"; +import { consola } from "consola"; import type { OutputSchema } from "@atproto/api/dist/client/types/com/atproto/repo/getRecord"; import type { HandlerAuth } from "@atproto/xrpc-server"; import type { Context } from "context"; @@ -31,7 +32,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -139,7 +140,7 @@ const withUser = ({ }: WithAgent): Effect.Effect => { return Effect.tryPromise({ try: async () => { - console.log(">> did", did); + consola.info(">> did", did); return ctx.db .select() .from(tables.users) diff --git a/apps/api/src/xrpc/app/rocksky/album/getAlbum.ts b/apps/api/src/xrpc/app/rocksky/album/getAlbum.ts index fa24c75c..90b63924 100644 --- a/apps/api/src/xrpc/app/rocksky/album/getAlbum.ts +++ b/apps/api/src/xrpc/app/rocksky/album/getAlbum.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { asc, count, eq, or } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -19,7 +20,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -91,7 +92,7 @@ const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { ]); }, catch: (error) => { - console.log("Error retrieving album:", error); + consola.info("Error retrieving album:", error); return new Error(`Failed to retrieve album: ${error}`); }, }); diff --git a/apps/api/src/xrpc/app/rocksky/album/getAlbumTracks.ts b/apps/api/src/xrpc/app/rocksky/album/getAlbumTracks.ts index 66233091..8d3fece6 100644 --- a/apps/api/src/xrpc/app/rocksky/album/getAlbumTracks.ts +++ b/apps/api/src/xrpc/app/rocksky/album/getAlbumTracks.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { asc, eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -17,7 +18,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/album/getAlbums.ts b/apps/api/src/xrpc/app/rocksky/album/getAlbums.ts index 6b28dbc9..967c459f 100644 --- a/apps/api/src/xrpc/app/rocksky/album/getAlbums.ts +++ b/apps/api/src/xrpc/app/rocksky/album/getAlbums.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { AlbumViewBasic } from "lexicon/types/app/rocksky/album/defs"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ albums: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/apikey/createApikey.ts b/apps/api/src/xrpc/app/rocksky/apikey/createApikey.ts index dfceea12..fa246707 100644 --- a/apps/api/src/xrpc/app/rocksky/apikey/createApikey.ts +++ b/apps/api/src/xrpc/app/rocksky/apikey/createApikey.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/apikey/getApikeys.ts b/apps/api/src/xrpc/app/rocksky/apikey/getApikeys.ts index b7cc4035..9da94072 100644 --- a/apps/api/src/xrpc/app/rocksky/apikey/getApikeys.ts +++ b/apps/api/src/xrpc/app/rocksky/apikey/getApikeys.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -12,7 +13,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/apikey/removeApikey.ts b/apps/api/src/xrpc/app/rocksky/apikey/removeApikey.ts index c086ce25..291edd45 100644 --- a/apps/api/src/xrpc/app/rocksky/apikey/removeApikey.ts +++ b/apps/api/src/xrpc/app/rocksky/apikey/removeApikey.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/apikey/updateApikey.ts b/apps/api/src/xrpc/app/rocksky/apikey/updateApikey.ts index 1093a163..e8347455 100644 --- a/apps/api/src/xrpc/app/rocksky/apikey/updateApikey.ts +++ b/apps/api/src/xrpc/app/rocksky/apikey/updateApikey.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtist.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtist.ts index 49b40502..7a367a34 100644 --- a/apps/api/src/xrpc/app/rocksky/artist/getArtist.ts +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtist.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { count, eq, or } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -16,7 +17,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtistAlbums.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtistAlbums.ts index 43245eef..b955c4d8 100644 --- a/apps/api/src/xrpc/app/rocksky/artist/getArtistAlbums.ts +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtistAlbums.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { AlbumViewBasic } from "lexicon/types/app/rocksky/album/defs"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ albums: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtistListeners.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtistListeners.ts index 7d55880e..9bbad716 100644 --- a/apps/api/src/xrpc/app/rocksky/artist/getArtistListeners.ts +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtistListeners.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { ListenerViewBasic } from "lexicon/types/app/rocksky/artist/defs"; @@ -13,7 +14,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ listeners: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtistTracks.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtistTracks.ts index 94fb93e1..a8a5069b 100644 --- a/apps/api/src/xrpc/app/rocksky/artist/getArtistTracks.ts +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtistTracks.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { QueryParams } from "lexicon/types/app/rocksky/artist/getArtistTracks"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ tracks: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/artist/getArtists.ts b/apps/api/src/xrpc/app/rocksky/artist/getArtists.ts index 5a367d93..0fe06f16 100644 --- a/apps/api/src/xrpc/app/rocksky/artist/getArtists.ts +++ b/apps/api/src/xrpc/app/rocksky/artist/getArtists.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { ArtistViewBasic } from "lexicon/types/app/rocksky/artist/defs"; @@ -17,7 +18,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ artists: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/charts/getScrobblesChart.ts b/apps/api/src/xrpc/app/rocksky/charts/getScrobblesChart.ts index b6372883..ceaaec56 100644 --- a/apps/api/src/xrpc/app/rocksky/charts/getScrobblesChart.ts +++ b/apps/api/src/xrpc/app/rocksky/charts/getScrobblesChart.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { eq } from "drizzle-orm"; import { Effect, Match, pipe, Cache, Duration } from "effect"; import type { Server } from "lexicon"; @@ -25,7 +26,7 @@ export default function (server: Server, ctx: Context) { getScrobblesCache, Effect.flatMap((cache) => cache.get(params)), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ scrobbles: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/dropbox/getFiles.ts b/apps/api/src/xrpc/app/rocksky/dropbox/getFiles.ts index 3fca9087..bcc6f83a 100644 --- a/apps/api/src/xrpc/app/rocksky/dropbox/getFiles.ts +++ b/apps/api/src/xrpc/app/rocksky/dropbox/getFiles.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { and, asc, eq, or } from "drizzle-orm"; import { alias } from "drizzle-orm/pg-core"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ files: [], directories: [] }); }), ); @@ -105,7 +106,7 @@ const retrieve = ({ ]); }, catch: (error) => { - console.error("Failed to retrieve files:", error); + consola.error("Failed to retrieve files:", error); return new Error(`Failed to retrieve files: ${error}`); }, }); diff --git a/apps/api/src/xrpc/app/rocksky/feed/getFeed.ts b/apps/api/src/xrpc/app/rocksky/feed/getFeed.ts index 8e93ad60..a86ee845 100644 --- a/apps/api/src/xrpc/app/rocksky/feed/getFeed.ts +++ b/apps/api/src/xrpc/app/rocksky/feed/getFeed.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { desc, eq, inArray } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -23,7 +24,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error("Error retrieving scrobbles:", err); + consola.error("Error retrieving scrobbles:", err); return Effect.succeed({ scrobbles: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/feed/getNowPlayings.ts b/apps/api/src/xrpc/app/rocksky/feed/getNowPlayings.ts index 21b293a0..6632e158 100644 --- a/apps/api/src/xrpc/app/rocksky/feed/getNowPlayings.ts +++ b/apps/api/src/xrpc/app/rocksky/feed/getNowPlayings.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { desc, eq, sql } from "drizzle-orm"; import { Cache, Duration, Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -30,7 +31,7 @@ export default function (server: Server, ctx: Context) { nowPlayingCache, Effect.flatMap((cache) => cache.get(params)), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/googledrive/getFiles.ts b/apps/api/src/xrpc/app/rocksky/googledrive/getFiles.ts index 55680e8c..c31b1845 100644 --- a/apps/api/src/xrpc/app/rocksky/googledrive/getFiles.ts +++ b/apps/api/src/xrpc/app/rocksky/googledrive/getFiles.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { and, asc, eq, or } from "drizzle-orm"; import { alias } from "drizzle-orm/pg-core"; import { Effect, pipe } from "effect"; @@ -17,7 +18,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ files: [], directories: [] }); }), ); @@ -113,7 +114,7 @@ const retrieve = ({ ]); }, catch: (error) => { - console.error("Failed to retrieve files:", error); + consola.error("Failed to retrieve files:", error); return new Error(`Failed to retrieve albums: ${error}`); }, }); diff --git a/apps/api/src/xrpc/app/rocksky/graph/followAccount.ts b/apps/api/src/xrpc/app/rocksky/graph/followAccount.ts index 73b96083..b04f1577 100644 --- a/apps/api/src/xrpc/app/rocksky/graph/followAccount.ts +++ b/apps/api/src/xrpc/app/rocksky/graph/followAccount.ts @@ -1,4 +1,5 @@ import { TID } from "@atproto/common"; +import { consola } from "consola"; import type { HandlerAuth } from "@atproto/xrpc-server"; import type { Context } from "context"; import { and, eq, desc } from "drizzle-orm"; @@ -20,7 +21,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ subject: {} satisfies ProfileViewBasic, followers: [], @@ -75,7 +76,7 @@ const handleFollow = ({ }; if (!FollowLexicon.validateRecord(record).success) { - console.log(FollowLexicon.validateRecord(record)); + consola.info(FollowLexicon.validateRecord(record)); throw new Error("Invalid record"); } @@ -87,7 +88,7 @@ const handleFollow = ({ validate: false, }); const uri = res.data.uri; - console.log(`Follow record created at: ${uri}`); + consola.info(`Follow record created at: ${uri}`); await ctx.db .insert(tables.follows) diff --git a/apps/api/src/xrpc/app/rocksky/graph/getFollowers.ts b/apps/api/src/xrpc/app/rocksky/graph/getFollowers.ts index 1f22caf7..a3c7b996 100644 --- a/apps/api/src/xrpc/app/rocksky/graph/getFollowers.ts +++ b/apps/api/src/xrpc/app/rocksky/graph/getFollowers.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { eq, desc, and, lt, inArray, count } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -16,7 +17,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ subject: {} satisfies ProfileViewBasic, followers: [] as ProfileViewBasic[], diff --git a/apps/api/src/xrpc/app/rocksky/graph/getFollows.ts b/apps/api/src/xrpc/app/rocksky/graph/getFollows.ts index de1070cf..30c80b23 100644 --- a/apps/api/src/xrpc/app/rocksky/graph/getFollows.ts +++ b/apps/api/src/xrpc/app/rocksky/graph/getFollows.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { eq, desc, and, lt, inArray, count } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ subject: undefined, follows: [], diff --git a/apps/api/src/xrpc/app/rocksky/graph/getKnownFollowers.ts b/apps/api/src/xrpc/app/rocksky/graph/getKnownFollowers.ts index 9f387f68..0f8002fa 100644 --- a/apps/api/src/xrpc/app/rocksky/graph/getKnownFollowers.ts +++ b/apps/api/src/xrpc/app/rocksky/graph/getKnownFollowers.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { and, eq, sql, desc, lt } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -17,7 +18,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error("getKnownFollowers error:", err); + consola.error("getKnownFollowers error:", err); return Effect.succeed({ subject: {} satisfies ProfileViewBasic, followers: [] as ProfileViewBasic[], diff --git a/apps/api/src/xrpc/app/rocksky/graph/unfollowAccount.ts b/apps/api/src/xrpc/app/rocksky/graph/unfollowAccount.ts index 4aae39c7..9766eec8 100644 --- a/apps/api/src/xrpc/app/rocksky/graph/unfollowAccount.ts +++ b/apps/api/src/xrpc/app/rocksky/graph/unfollowAccount.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { and, eq, desc } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ subject: {} satisfies ProfileViewBasic, followers: [], diff --git a/apps/api/src/xrpc/app/rocksky/player/addItemsToQueue.ts b/apps/api/src/xrpc/app/rocksky/player/addItemsToQueue.ts index 52c1da4e..3b20aa45 100644 --- a/apps/api/src/xrpc/app/rocksky/player/addItemsToQueue.ts +++ b/apps/api/src/xrpc/app/rocksky/player/addItemsToQueue.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { inArray } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -20,7 +21,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -79,7 +80,7 @@ const handleAddItemsToQueue = ({ }); }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/player/getCurrentlyPlaying.ts b/apps/api/src/xrpc/app/rocksky/player/getCurrentlyPlaying.ts index b307ae44..7930adef 100644 --- a/apps/api/src/xrpc/app/rocksky/player/getCurrentlyPlaying.ts +++ b/apps/api/src/xrpc/app/rocksky/player/getCurrentlyPlaying.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/player/getPlaybackQueue.ts b/apps/api/src/xrpc/app/rocksky/player/getPlaybackQueue.ts index cad77663..03fc45a0 100644 --- a/apps/api/src/xrpc/app/rocksky/player/getPlaybackQueue.ts +++ b/apps/api/src/xrpc/app/rocksky/player/getPlaybackQueue.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -49,7 +50,7 @@ const retrieve = ({ // Logic to retrieve the playback queue would go here }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/player/next.ts b/apps/api/src/xrpc/app/rocksky/player/next.ts index f10e3af8..1da60e9f 100644 --- a/apps/api/src/xrpc/app/rocksky/player/next.ts +++ b/apps/api/src/xrpc/app/rocksky/player/next.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/player/pause.ts b/apps/api/src/xrpc/app/rocksky/player/pause.ts index ffcc0523..cc33f2ca 100644 --- a/apps/api/src/xrpc/app/rocksky/player/pause.ts +++ b/apps/api/src/xrpc/app/rocksky/player/pause.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/player/play.ts b/apps/api/src/xrpc/app/rocksky/player/play.ts index ae21093c..d15eb41a 100644 --- a/apps/api/src/xrpc/app/rocksky/player/play.ts +++ b/apps/api/src/xrpc/app/rocksky/player/play.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/player/playDirectory.ts b/apps/api/src/xrpc/app/rocksky/player/playDirectory.ts index a16f28dc..605fb40c 100644 --- a/apps/api/src/xrpc/app/rocksky/player/playDirectory.ts +++ b/apps/api/src/xrpc/app/rocksky/player/playDirectory.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -47,7 +48,7 @@ const handlePlayDirectory = ({ }); }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/player/playFile.ts b/apps/api/src/xrpc/app/rocksky/player/playFile.ts index 2cc9ac13..2058de0f 100644 --- a/apps/api/src/xrpc/app/rocksky/player/playFile.ts +++ b/apps/api/src/xrpc/app/rocksky/player/playFile.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -47,7 +48,7 @@ const handlePlayFile = ({ }); }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/player/previous.ts b/apps/api/src/xrpc/app/rocksky/player/previous.ts index fe32f43b..42716470 100644 --- a/apps/api/src/xrpc/app/rocksky/player/previous.ts +++ b/apps/api/src/xrpc/app/rocksky/player/previous.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/player/seek.ts b/apps/api/src/xrpc/app/rocksky/player/seek.ts index 44d63e53..da468839 100644 --- a/apps/api/src/xrpc/app/rocksky/player/seek.ts +++ b/apps/api/src/xrpc/app/rocksky/player/seek.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/playlist/createPlaylist.ts b/apps/api/src/xrpc/app/rocksky/playlist/createPlaylist.ts index 3cd92a3a..a07610bd 100644 --- a/apps/api/src/xrpc/app/rocksky/playlist/createPlaylist.ts +++ b/apps/api/src/xrpc/app/rocksky/playlist/createPlaylist.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -44,7 +45,7 @@ const create = ({ await ctx.db.select().from(tables.playlists).execute(); }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/playlist/getPlaylist.ts b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylist.ts index 1f5389c4..c24f6b56 100644 --- a/apps/api/src/xrpc/app/rocksky/playlist/getPlaylist.ts +++ b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylist.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { asc, eq, sql } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -19,7 +20,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/playlist/getPlaylists.ts b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylists.ts index 86c183f5..95d986b3 100644 --- a/apps/api/src/xrpc/app/rocksky/playlist/getPlaylists.ts +++ b/apps/api/src/xrpc/app/rocksky/playlist/getPlaylists.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { desc, eq, sql } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ playlists: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/playlist/insertDirectory.ts b/apps/api/src/xrpc/app/rocksky/playlist/insertDirectory.ts index 7521952d..237e781c 100644 --- a/apps/api/src/xrpc/app/rocksky/playlist/insertDirectory.ts +++ b/apps/api/src/xrpc/app/rocksky/playlist/insertDirectory.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -46,7 +47,7 @@ const insert = ({ }); }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/playlist/insertFiles.ts b/apps/api/src/xrpc/app/rocksky/playlist/insertFiles.ts index d61c0aa7..2ad08d0d 100644 --- a/apps/api/src/xrpc/app/rocksky/playlist/insertFiles.ts +++ b/apps/api/src/xrpc/app/rocksky/playlist/insertFiles.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -47,7 +48,7 @@ const insert = ({ }); }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/playlist/removePlaylist.ts b/apps/api/src/xrpc/app/rocksky/playlist/removePlaylist.ts index aba136a8..c98b9195 100644 --- a/apps/api/src/xrpc/app/rocksky/playlist/removePlaylist.ts +++ b/apps/api/src/xrpc/app/rocksky/playlist/removePlaylist.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -45,7 +46,7 @@ const remove = ({ // Logic to remove the playlist would go here }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/playlist/startPlaylist.ts b/apps/api/src/xrpc/app/rocksky/playlist/startPlaylist.ts index 6a49a774..c7787e44 100644 --- a/apps/api/src/xrpc/app/rocksky/playlist/startPlaylist.ts +++ b/apps/api/src/xrpc/app/rocksky/playlist/startPlaylist.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -47,7 +48,7 @@ const start = ({ }); }, catch: (err) => { - console.error(err); + consola.error(err); return {}; }, }); diff --git a/apps/api/src/xrpc/app/rocksky/scrobble/createScrobble.ts b/apps/api/src/xrpc/app/rocksky/scrobble/createScrobble.ts index cece1427..f2caba89 100644 --- a/apps/api/src/xrpc/app/rocksky/scrobble/createScrobble.ts +++ b/apps/api/src/xrpc/app/rocksky/scrobble/createScrobble.ts @@ -1,4 +1,5 @@ import type { Agent } from "@atproto/api"; +import { consola } from "consola"; import { TID } from "@atproto/common"; import type { HandlerAuth } from "@atproto/xrpc-server"; import chalk from "chalk"; @@ -45,7 +46,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("600 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -153,7 +154,7 @@ const putRecord = ( ), ), Effect.catchAll((error) => { - console.error(`Error creating ${collection} record`, error); + consola.error(`Error creating ${collection} record`, error); return Effect.succeed(null); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/scrobble/getScrobble.ts b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobble.ts index 41b9370f..3d748ce4 100644 --- a/apps/api/src/xrpc/app/rocksky/scrobble/getScrobble.ts +++ b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobble.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { count, countDistinct, eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -20,7 +21,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error("Error retrieving scrobble:", err); + consola.error("Error retrieving scrobble:", err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts index 8baabc02..7d5150a4 100644 --- a/apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts +++ b/apps/api/src/xrpc/app/rocksky/scrobble/getScrobbles.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { desc, eq, inArray } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -19,7 +20,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error("Error retrieving scrobbles:", err); + consola.error("Error retrieving scrobbles:", err); return Effect.succeed({ scrobbles: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/createShout.ts b/apps/api/src/xrpc/app/rocksky/shout/createShout.ts index fee1262d..bb3f52cb 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/createShout.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/createShout.ts @@ -1,4 +1,5 @@ import type { Agent } from "@atproto/api"; +import { consola } from "consola"; import type { HandlerAuth } from "@atproto/xrpc-server"; import type { Context } from "context"; import { eq } from "drizzle-orm"; @@ -21,7 +22,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/getAlbumShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getAlbumShouts.ts index 9a629a46..8b001e8f 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/getAlbumShouts.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/getAlbumShouts.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { count, desc, eq } from "drizzle-orm"; import { sql } from "drizzle-orm/sql"; @@ -19,7 +20,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ shouts: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/getArtistShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getArtistShouts.ts index 44942386..c83d8f7b 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/getArtistShouts.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/getArtistShouts.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { count, desc, eq, sql } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -18,7 +19,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ shouts: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/getProfileShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getProfileShouts.ts index e94f943f..27254d51 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/getProfileShouts.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/getProfileShouts.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { aliasedTable, count, desc, eq, or, sql } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ shouts: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/getShoutReplies.ts b/apps/api/src/xrpc/app/rocksky/shout/getShoutReplies.ts index 32fb1c3a..97cbb05b 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/getShoutReplies.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/getShoutReplies.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { asc, eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -17,7 +18,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ shouts: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/getTrackShouts.ts b/apps/api/src/xrpc/app/rocksky/shout/getTrackShouts.ts index 581b03eb..83cbf8c7 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/getTrackShouts.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/getTrackShouts.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { count, desc, eq, sql } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ shouts: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/removeShout.ts b/apps/api/src/xrpc/app/rocksky/shout/removeShout.ts index 2486151c..239d445a 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/removeShout.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/removeShout.ts @@ -1,4 +1,5 @@ import type { Agent } from "@atproto/api"; +import { consola } from "consola"; import type { HandlerAuth } from "@atproto/xrpc-server"; import type { Context } from "context"; import { Effect, pipe } from "effect"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/replyShout.ts b/apps/api/src/xrpc/app/rocksky/shout/replyShout.ts index 2dc5e3d0..6bba287e 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/replyShout.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/replyShout.ts @@ -1,5 +1,6 @@ import type { Agent } from "@atproto/api"; import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -15,7 +16,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ albums: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/shout/reportShout.ts b/apps/api/src/xrpc/app/rocksky/shout/reportShout.ts index e4d532a5..48c98960 100644 --- a/apps/api/src/xrpc/app/rocksky/shout/reportShout.ts +++ b/apps/api/src/xrpc/app/rocksky/shout/reportShout.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -12,7 +13,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/song/createSong.ts b/apps/api/src/xrpc/app/rocksky/song/createSong.ts index 6e6f3e25..3e16c4a3 100644 --- a/apps/api/src/xrpc/app/rocksky/song/createSong.ts +++ b/apps/api/src/xrpc/app/rocksky/song/createSong.ts @@ -1,4 +1,5 @@ import type { Agent } from "@atproto/api"; +import { consola } from "consola"; import { TID } from "@atproto/common"; import type { HandlerAuth } from "@atproto/xrpc-server"; import chalk from "chalk"; @@ -41,7 +42,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("120 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -213,7 +214,7 @@ const putRecord = ( ), ), Effect.catchAll((error) => { - console.error(`Error creating ${collection} record`, error); + consola.error(`Error creating ${collection} record`, error); return Effect.fail(error); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/song/getSong.ts b/apps/api/src/xrpc/app/rocksky/song/getSong.ts index 6b15d5f1..7b4c7c35 100644 --- a/apps/api/src/xrpc/app/rocksky/song/getSong.ts +++ b/apps/api/src/xrpc/app/rocksky/song/getSong.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { count, eq, or } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -16,7 +17,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/song/getSongs.ts b/apps/api/src/xrpc/app/rocksky/song/getSongs.ts index 98d5873f..6dae950f 100644 --- a/apps/api/src/xrpc/app/rocksky/song/getSongs.ts +++ b/apps/api/src/xrpc/app/rocksky/song/getSongs.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; import type { SongViewBasic } from "lexicon/types/app/rocksky/song/defs"; @@ -14,7 +15,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({ songs: [] }); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/song/matchSong.ts b/apps/api/src/xrpc/app/rocksky/song/matchSong.ts index e163f1f8..f89e3853 100644 --- a/apps/api/src/xrpc/app/rocksky/song/matchSong.ts +++ b/apps/api/src/xrpc/app/rocksky/song/matchSong.ts @@ -1,4 +1,5 @@ import type { Context } from "context"; +import { consola } from "consola"; import { and, count, eq, or, sql } from "drizzle-orm"; import { Effect, pipe } from "effect"; import type { Server } from "lexicon"; @@ -8,14 +9,14 @@ import { decrypt } from "lib/crypto"; import { env } from "lib/env"; import tables from "schema"; import type { SelectTrack } from "schema/tracks"; -import { +import type { Album, Artist, MusicBrainzArtist, SearchResponse, Track, } from "./types"; -import { MusicbrainzTrack } from "types/track"; +import type { MusicbrainzTrack } from "types/track"; export default function (server: Server, ctx: Context) { const matchSong = (params: QueryParams) => @@ -26,7 +27,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -44,7 +45,7 @@ export default function (server: Server, ctx: Context) { const retrieve = ({ params, ctx }: { params: QueryParams; ctx: Context }) => { return Effect.tryPromise({ try: async () => { - let record = await ctx.db + const record = await ctx.db .select() .from(tables.tracks) .leftJoin( @@ -227,7 +228,7 @@ const searchOnSpotify = async ( .execute(); if (!spotifyTokens || spotifyTokens.length === 0) { - console.warn("No Spotify tokens available for beta users"); + consola.warn("No Spotify tokens available for beta users"); return undefined; } @@ -235,7 +236,7 @@ const searchOnSpotify = async ( spotifyTokens[Math.floor(Math.random() * spotifyTokens.length)]; if (!spotify_tokens || !spotify_apps) { - console.warn("Invalid Spotify token or app data"); + consola.warn("Invalid Spotify token or app data"); return undefined; } @@ -339,7 +340,7 @@ const searchOnMusicBrainz = async (ctx: Context, track: SelectTrack) => { artists, }; } catch (error) { - console.error("Error fetching MusicBrainz data"); + consola.error("Error fetching MusicBrainz data"); } return { diff --git a/apps/api/src/xrpc/app/rocksky/spotify/getCurrentlyPlaying.ts b/apps/api/src/xrpc/app/rocksky/spotify/getCurrentlyPlaying.ts index ec918e69..bc28e32b 100644 --- a/apps/api/src/xrpc/app/rocksky/spotify/getCurrentlyPlaying.ts +++ b/apps/api/src/xrpc/app/rocksky/spotify/getCurrentlyPlaying.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { and, eq, or } from "drizzle-orm"; import { Effect, Match, pipe } from "effect"; @@ -21,7 +22,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); diff --git a/apps/api/src/xrpc/app/rocksky/spotify/next.ts b/apps/api/src/xrpc/app/rocksky/spotify/next.ts index 6265f319..5bd73263 100644 --- a/apps/api/src/xrpc/app/rocksky/spotify/next.ts +++ b/apps/api/src/xrpc/app/rocksky/spotify/next.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -21,7 +22,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -143,6 +144,6 @@ const handleNext = (accessToken: string) => { const presentation = (result): Effect.Effect<{}, never> => { // Logic to format the result for presentation - console.log("Next action result:", result); + consola.info("Next action result:", result); return Effect.sync(() => ({})); }; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/pause.ts b/apps/api/src/xrpc/app/rocksky/spotify/pause.ts index 08651994..a9d47f77 100644 --- a/apps/api/src/xrpc/app/rocksky/spotify/pause.ts +++ b/apps/api/src/xrpc/app/rocksky/spotify/pause.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -21,7 +22,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -143,6 +144,6 @@ const handlePause = (accessToken: string) => { const presentation = (result): Effect.Effect<{}, never> => { // Logic to format the result for presentation - console.log("Pause action result:", result); + consola.info("Pause action result:", result); return Effect.sync(() => ({})); }; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/play.ts b/apps/api/src/xrpc/app/rocksky/spotify/play.ts index 1808ad73..6a311fa6 100644 --- a/apps/api/src/xrpc/app/rocksky/spotify/play.ts +++ b/apps/api/src/xrpc/app/rocksky/spotify/play.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -21,7 +22,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -142,6 +143,6 @@ const handlePlay = (accessToken: string) => { }; const presentation = (result) => { - console.log("Play action result:", result); + consola.info("Play action result:", result); return Effect.sync(() => ({})); }; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/previous.ts b/apps/api/src/xrpc/app/rocksky/spotify/previous.ts index ad632908..a367987b 100644 --- a/apps/api/src/xrpc/app/rocksky/spotify/previous.ts +++ b/apps/api/src/xrpc/app/rocksky/spotify/previous.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -21,7 +22,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -143,6 +144,6 @@ const handlePrevious = (accessToken: string) => { const presentation = (result) => { // Logic to format the result for presentation - console.log("Previous action result:", result); + consola.info("Previous action result:", result); return Effect.sync(() => ({})); }; diff --git a/apps/api/src/xrpc/app/rocksky/spotify/seek.ts b/apps/api/src/xrpc/app/rocksky/spotify/seek.ts index 141fcbe7..ca722171 100644 --- a/apps/api/src/xrpc/app/rocksky/spotify/seek.ts +++ b/apps/api/src/xrpc/app/rocksky/spotify/seek.ts @@ -1,4 +1,5 @@ import type { HandlerAuth } from "@atproto/xrpc-server"; +import { consola } from "consola"; import type { Context } from "context"; import { eq } from "drizzle-orm"; import { Effect, pipe } from "effect"; @@ -21,7 +22,7 @@ export default function (server: Server, ctx: Context) { Effect.retry({ times: 3 }), Effect.timeout("10 seconds"), Effect.catchAll((err) => { - console.error(err); + consola.error(err); return Effect.succeed({}); }), ); @@ -161,6 +162,6 @@ const handleSeek = ({ const presentation = (result) => { // Logic to format the result for presentation - console.log("Seek action result:", result); + consola.info("Seek action result:", result); return Effect.sync(() => ({})); }; diff --git a/bun.lock b/bun.lock index 7c0d8f56..f16ded7b 100644 --- a/bun.lock +++ b/bun.lock @@ -41,6 +41,7 @@ "better-sqlite3": "^12.4.1", "chalk": "^5.4.1", "chanfana": "^2.0.2", + "consola": "^3.4.2", "cors": "^2.8.5", "dayjs": "^1.11.13", "dotenv": "^16.4.7", @@ -1573,6 +1574,8 @@ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], @@ -1757,7 +1760,7 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "effect": ["effect@3.18.4", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA=="], + "effect": ["effect@3.19.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="], "electron-to-chromium": ["electron-to-chromium@1.5.234", "", {}, "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg=="], @@ -3083,8 +3086,6 @@ "@rocksky/cli/drizzle-orm": ["drizzle-orm@0.45.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA=="], - "@rocksky/cli/effect": ["effect@3.19.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="], - "@rocksky/doc/vitest": ["vitest@2.1.9", "", { "dependencies": { "@vitest/expect": "2.1.9", "@vitest/mocker": "2.1.9", "@vitest/pretty-format": "^2.1.9", "@vitest/runner": "2.1.9", "@vitest/snapshot": "2.1.9", "@vitest/spy": "2.1.9", "@vitest/utils": "2.1.9", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", "magic-string": "^0.30.12", "pathe": "^1.1.2", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", "vite-node": "2.1.9", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", "@vitest/browser": "2.1.9", "@vitest/ui": "2.1.9", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q=="], "@rocksky/spotify-proxy/@cloudflare/vitest-pool-workers": ["@cloudflare/vitest-pool-workers@0.8.71", "", { "dependencies": { "birpc": "0.2.14", "cjs-module-lexer": "^1.2.3", "devalue": "^5.3.2", "miniflare": "4.20250906.0", "semver": "^7.7.1", "wrangler": "4.35.0", "zod": "^3.22.3" }, "peerDependencies": { "@vitest/runner": "2.0.x - 3.2.x", "@vitest/snapshot": "2.0.x - 3.2.x", "vitest": "2.0.x - 3.2.x" } }, "sha512-keu2HCLQfRNwbmLBCDXJgCFpANTaYnQpE01fBOo4CNwiWHUT7SZGN7w64RKiSWRHyYppStXBuE5Ng7F42+flpg=="], @@ -3095,8 +3096,6 @@ "@rocksky/web/@types/ramda": ["@types/ramda@0.31.1", "", { "dependencies": { "types-ramda": "^0.31.0" } }, "sha512-Vt6sFXnuRpzaEj+yeutA0q3bcAsK7wdPuASIzR9LXqL4gJPyFw8im9qchlbp4ltuf3kDEIRmPJTD/Fkg60dn7g=="], - "@rocksky/web/effect": ["effect@3.19.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="], - "@rocksky/web/ramda": ["ramda@0.32.0", "", {}, "sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ=="], "@rocksky/web/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],