95 lines
3.2 KiB
TypeScript
95 lines
3.2 KiB
TypeScript
import { PrismaClient } from '@prisma/client';
|
|
import { parseFile } from 'music-metadata';
|
|
import path from 'path';
|
|
import fs from 'fs/promises';
|
|
|
|
const prisma = new PrismaClient();
|
|
const UPLOADS_DIR = path.join(process.cwd(), 'public/uploads');
|
|
|
|
async function restoreSongs() {
|
|
console.log('Starting song restoration...');
|
|
|
|
try {
|
|
const files = await fs.readdir(UPLOADS_DIR);
|
|
const mp3Files = files.filter(f => f.endsWith('.mp3'));
|
|
|
|
console.log(`Found ${mp3Files.length} MP3 files.`);
|
|
|
|
for (const filename of mp3Files) {
|
|
// Check if song already exists
|
|
const existing = await prisma.song.findFirst({
|
|
where: { filename }
|
|
});
|
|
|
|
if (existing) {
|
|
console.log(`Skipping ${filename} (already exists)`);
|
|
continue;
|
|
}
|
|
|
|
const filePath = path.join(UPLOADS_DIR, filename);
|
|
|
|
try {
|
|
const metadata = await parseFile(filePath);
|
|
|
|
const title = metadata.common.title || 'Unknown Title';
|
|
const artist = metadata.common.artist || 'Unknown Artist';
|
|
const genres = metadata.common.genre || [];
|
|
|
|
// Create or find genres
|
|
const genreConnect = [];
|
|
for (const genreName of genres) {
|
|
if (!genreName) continue;
|
|
|
|
// Simple normalization
|
|
const normalizedGenre = genreName.trim();
|
|
|
|
// Find genre by checking all genres (name is now JSON)
|
|
const allGenres = await prisma.genre.findMany();
|
|
let genre = allGenres.find(g => {
|
|
const name = g.name as any;
|
|
return (typeof name === 'string' && name === normalizedGenre) ||
|
|
(typeof name === 'object' && (name.de === normalizedGenre || name.en === normalizedGenre));
|
|
});
|
|
|
|
if (!genre) {
|
|
// Create with JSON structure
|
|
genre = await prisma.genre.create({
|
|
data: {
|
|
name: { de: normalizedGenre, en: normalizedGenre },
|
|
active: true
|
|
}
|
|
});
|
|
console.log(`Created genre: ${normalizedGenre}`);
|
|
}
|
|
genreConnect.push({ id: genre.id });
|
|
}
|
|
|
|
await prisma.song.create({
|
|
data: {
|
|
title,
|
|
artist,
|
|
filename,
|
|
genres: {
|
|
connect: genreConnect
|
|
}
|
|
}
|
|
});
|
|
|
|
console.log(`Restored: ${title} - ${artist}`);
|
|
|
|
} catch (e) {
|
|
console.error(`Failed to process ${filename}:`, e);
|
|
}
|
|
}
|
|
|
|
console.log('Restoration complete.');
|
|
|
|
} catch (e) {
|
|
console.error('Error reading uploads directory:', e);
|
|
} finally {
|
|
await prisma.$disconnect();
|
|
}
|
|
}
|
|
|
|
restoreSongs();
|