diff --git a/public/placeholder.svg b/public/placeholder.svg new file mode 100644 index 0000000..104593e --- /dev/null +++ b/public/placeholder.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/server/src/scripts/import.ts b/server/src/scripts/import.ts index 6b8d8a1..227b146 100644 --- a/server/src/scripts/import.ts +++ b/server/src/scripts/import.ts @@ -49,26 +49,26 @@ const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); // Genre name in our app -> tag to search for in MusicBrainz -const GENRE_SEARCH_TAGS: Record = { - Pop: 'pop', - Rock: 'rock', - HipHop: 'hip hop', - Jazz: 'jazz', - Electronic: 'electronic', - Indie: 'indie', - Soul: 'soul', - Funk: 'funk', - Country: 'country', - Metal: 'metal', - Blues: 'blues', - Tekno: 'techno', - Kpop: 'k-pop', - Classic: 'classical', - RnB: 'rnb', +const GENRE_SEARCH_TAGS: Record = { + Pop: ['pop'], + Rock: ['rock'], + HipHop: ['hip hop', 'hip-hop', 'rap'], + Jazz: ['jazz'], + Electronic: ['electronic', 'electronica'], + Tekno: ['techno'], + Indie: ['indie', 'indie rock', 'indie pop'], + Soul: ['soul'], + Kpop: ['k-pop', 'kpop'], + Funk: ['funk'], + Country: ['country'], + Classic: ['classical', 'classics'], + Metal: ['metal', 'heavy metal'], + RnB: ['rnb', 'r&b', 'contemporary r&b', 'rhythm and blues'], + Blues: ['blues'], }; const QUOTA_PER_GENRE = parseInt(process.argv[3], 10) || 10; -const MIN_RELEASES = parseInt(process.argv[4], 10) || 3; +const MIN_RELEASES = parseInt(process.argv[4], 10) || 1; async function mbFetch(url: string): Promise { for (let attempt = 1; attempt <= 4; attempt++) { @@ -171,15 +171,16 @@ async function importDecade(startYear: number) { const endYear = startYear + 9; console.log(`\n=== Import for ${startYear}-${endYear} (kvote ${QUOTA_PER_GENRE}/sjanger, min ${MIN_RELEASES} utgaver) ===`); - for (const [genreName, tag] of Object.entries(GENRE_SEARCH_TAGS)) { - console.log(`\n--- ${genreName} (${startYear}-${endYear}) ---`); - - const query = - `primarytype:album AND NOT secondarytype:* AND tag:"${tag}" ` + - `AND firstreleasedate:[${startYear} TO ${endYear}]` + - `AND releases:[${MIN_RELEASES} TO *]`; - - +for (const [genreName, tags] of Object.entries(GENRE_SEARCH_TAGS)) { + console.log(`\n--- ${genreName} (${startYear}-${endYear}) ---`); + + const tagQuery = tags.map((t) => `"${t}"`).join(' OR '); + const query = + `primarytype:album AND NOT secondarytype:* AND tag:(${tagQuery}) ` + + `AND firstreleasedate:[${startYear} TO ${endYear}] ` + + `AND releases:[${MIN_RELEASES} TO *]`; + + let imported = 0; let offset = 0; let total = Infinity; // updated after the first response @@ -191,7 +192,7 @@ async function importDecade(startYear: number) { const page = await mbFetch(url); if (!page) { - console.warn(`⚠️ Søket feilet for ${genreName} ved offset ${offset}. Går videre til neste sjanger.`); + console.warn(`Søket feilet for ${genreName} ved offset ${offset}. Går videre til neste sjanger.`); break; } @@ -222,7 +223,7 @@ async function downloadCover(mbid: string, title: string): Promise