Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
Something went wrong. Try again.
3.1 kB · 86 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586import type { SqliteDatabase, Migration } from 'sqlite-up';import type { MigrateBaseContext } from '../appMigrator.ts';import { queueStates } from '../drizzle/schema/schema.ts';import { eq } from 'drizzle-orm';
export const up: Migration<MigrateBaseContext>['up'] = async (db: SqliteDatabase, ctx: MigrateBaseContext | undefined): Promise<void> => { if(ctx === undefined) { throw new Error('Context must be defined'); } ctx.logger.info('Beginning queue entities consolidation.');
ctx.logger.verbose('Deleting (now) unused completed queue states...');
ctx.db.delete(queueStates).where(eq(queueStates.queueStatus,'completed'));
ctx.logger.verbose('Done with completed queue state deletions');
ctx.logger.info('Converting dead queue states to ingress states with failure + retries...');
let more = true; let offset = 0, updated = 0; while (more) { const plays = await ctx.db.query.plays.findMany({ where: { queueStates: { queueName: 'dead' } }, with: { queueStates: true }, limit: 100, offset });
for(const p of plays) { const ingress = p.queueStates.find(x => x.queueName === 'ingress'); const dead = p.queueStates.find(x => x.queueName === 'dead'); if(dead === undefined) { // should not happen since query only returns plays with a dead queue state continue; }
if(ingress === undefined) { if(p.componentId === null) { ctx.logger.warn(`Play ${p.id} has a dead queue state but no component, cannot create an ingress queue state for it`); continue; } await ctx.db.insert(queueStates).values([{ componentId: p.componentId, playId: p.id, queueName: 'ingress', queueStatus: 'failed', retries: dead.retries, error: dead.error, createdAt: dead.updatedAt, updatedAt: dead.updatedAt }]); } else { await ctx.db.update(queueStates).set({ queueStatus: 'failed', retries: dead.retries, error: dead.error, updatedAt: dead.updatedAt}).where(eq(queueStates.id, ingress.id)); } updated++; await ctx.db.delete(queueStates).where(eq(queueStates.id, dead.id)); }
offset += 100; ctx.logger.verbose(`Conversion Progress: Updated ${updated}`); if (plays.length < 100) { more = false; } }
ctx.logger.info('Done.');};
export const down: Migration<MigrateBaseContext>['down'] = async (db: SqliteDatabase, ctx: MigrateBaseContext | undefined): Promise<void> => { // Rollback code here // context is passed as ctx};