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