import { BaseCommand, flags } from '@adonisjs/core/ace' import { CommandOptions } from '@adonisjs/core/types/ace' import db from '@adonisjs/lucid/services/db' import NntpService from '#services/NntpService' import SpotService from '#services/SpotService' /** * Imported spots whose files sit in a release that isn't the spot's own * (another source, or another name): their NZB is read again, which moves * the files into the spot's release under its title (CONCEPT.md D29). */ export default class SpotReimport extends BaseCommand { public static commandName = 'spot:reimport' public static description = "Moves imported spots' files into their own release, named after the spot." public static options: CommandOptions = { startApp: true, } @flags.boolean({ description: 'Only count them' }) declare dryRun: boolean public async run() { const spots = await db .from('spots as s') .join('releases as r', 'r.id', 's.release_id') .where('s.status', 'imported') .where((q) => q.whereNot('r.source', 'spot').orWhereRaw('r.name <> s.title')) .orderBy('s.posted_at', 'desc') .select('s.*', 'r.name as release_name') this.logger.info(`${spots.length} imported spots are in a release that isn't their own.`) if (this.dryRun) return let moved = 0 let failed = 0 try { for (const spot of spots) { try { const releaseId = await SpotService.reimport(spot) if (releaseId) moved++ else failed++ } catch (error: any) { failed++ this.logger.warning(`${spot.title}: ${error.message}`) } } } finally { await NntpService.shutdown() } this.logger.info(`${moved} spots re-imported, ${failed} without a usable NZB (dummy, gone) or failed.`) } }