Add duplicate detection with fuzzy matching and fix artist metadata extraction
This commit is contained in:
@@ -3,6 +3,7 @@ import { PrismaClient } from '@prisma/client';
|
||||
import { writeFile, unlink } from 'fs/promises';
|
||||
import path from 'path';
|
||||
import { parseBuffer } from 'music-metadata';
|
||||
import { isDuplicateSong } from '@/lib/fuzzyMatch';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
@@ -72,8 +73,16 @@ export async function POST(request: Request) {
|
||||
if (metadata.common.title) {
|
||||
title = metadata.common.title;
|
||||
}
|
||||
if (metadata.common.artist) {
|
||||
|
||||
// Handle artist - prefer artists array if available
|
||||
if (metadata.common.artists && metadata.common.artists.length > 0) {
|
||||
// Join multiple artists with '/'
|
||||
artist = metadata.common.artists.join('/');
|
||||
} else if (metadata.common.artist) {
|
||||
artist = metadata.common.artist;
|
||||
} else if (metadata.common.albumartist) {
|
||||
// Fallback to album artist
|
||||
artist = metadata.common.albumartist;
|
||||
}
|
||||
|
||||
// Validation info
|
||||
@@ -114,6 +123,28 @@ export async function POST(request: Request) {
|
||||
if (!title) title = 'Unknown Title';
|
||||
if (!artist) artist = 'Unknown Artist';
|
||||
|
||||
// Check for duplicates
|
||||
const existingSongs = await prisma.song.findMany({
|
||||
select: { id: true, title: true, artist: true, filename: true }
|
||||
});
|
||||
|
||||
for (const existing of existingSongs) {
|
||||
if (isDuplicateSong(artist, title, existing.artist, existing.title)) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
error: 'Duplicate song detected',
|
||||
duplicate: {
|
||||
id: existing.id,
|
||||
title: existing.title,
|
||||
artist: existing.artist,
|
||||
filename: existing.filename
|
||||
}
|
||||
},
|
||||
{ status: 409 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Create URL-safe filename
|
||||
const originalName = file.name.replace(/\.mp3$/i, '');
|
||||
const sanitizedName = originalName
|
||||
|
||||
Reference in New Issue
Block a user