| 1 | #!/usr/bin/env node
|
|---|
| 2 | /**
|
|---|
| 3 | * Zet bestaande type=audio posts om naar album of playlist. (shaer-cyg)
|
|---|
| 4 | *
|
|---|
| 5 | * Audio is geen keuze meer: alles wat muziek is landt op album of playlist. Wat
|
|---|
| 6 | * er al staat moet daar dus heen, en dat is een migratie en geen hernoeming --
|
|---|
| 7 | * welke van de twee het wordt hangt af van wat er IN de post zit. Die afleiding
|
|---|
| 8 | * staat in music/postMusicType en wordt hier alleen toegepast.
|
|---|
| 9 | *
|
|---|
| 10 | * node scripts/backfill-post-types.mjs # laat zien wat er zou gebeuren
|
|---|
| 11 | * node scripts/backfill-post-types.mjs --doen # en voert het uit
|
|---|
| 12 | *
|
|---|
| 13 | * Idempotent: kijkt alleen naar type='audio', dus een tweede run doet niets.
|
|---|
| 14 | * Posts waar de afleiding geen album of playlist van maakt (twee collecties,
|
|---|
| 15 | * een onvindbare playlist, of helemaal geen muziek meer) blijven met rust
|
|---|
| 16 | * gelaten en worden apart gemeld -- die verdienen een blik en geen gok.
|
|---|
| 17 | */
|
|---|
| 18 | import db from '../src/config/database.js';
|
|---|
| 19 | import { postMusicType } from '../src/services/music/index.js';
|
|---|
| 20 |
|
|---|
| 21 | const DOEN = process.argv.includes('--doen');
|
|---|
| 22 |
|
|---|
| 23 | const posts = db.prepare(`
|
|---|
| 24 | SELECT p.id, p.site_id, p.slug, p.title, p.content, s.slug AS site_slug
|
|---|
| 25 | FROM posts p JOIN sites s ON s.id = p.site_id
|
|---|
| 26 | WHERE p.type = 'audio'
|
|---|
| 27 | ORDER BY p.created_at
|
|---|
| 28 | `).all();
|
|---|
| 29 |
|
|---|
| 30 | console.log(`[backfill-post-types] ${posts.length} post(s) met type=audio${DOEN ? '' : ' (proefdraai — geef --doen om te schrijven)'}`);
|
|---|
| 31 |
|
|---|
| 32 | const update = db.prepare('UPDATE posts SET type = ? WHERE id = ?');
|
|---|
| 33 | const telling = { album: 0, playlist: 0 };
|
|---|
| 34 | const overgeslagen = [];
|
|---|
| 35 |
|
|---|
| 36 | for (const p of posts) {
|
|---|
| 37 | const r = postMusicType(p.content, p.site_id);
|
|---|
| 38 | const naam = `${p.site_slug}/${p.slug}`;
|
|---|
| 39 |
|
|---|
| 40 | if (!r || (r.type !== 'album' && r.type !== 'playlist')) {
|
|---|
| 41 | const reden = !r ? 'geen muziek meer in de post'
|
|---|
| 42 | : r.onbekend?.length ? `playlist niet gevonden: ${r.onbekend.join(', ')}`
|
|---|
| 43 | : `${r.collecties?.length ?? 0} collecties — de post blijft een post`;
|
|---|
| 44 | overgeslagen.push({ naam, reden });
|
|---|
| 45 | continue;
|
|---|
| 46 | }
|
|---|
| 47 |
|
|---|
| 48 | telling[r.type]++;
|
|---|
| 49 | const bonus = r.bonus?.length ? `, ${r.bonus.length} bonus-track(s)` : '';
|
|---|
| 50 | console.log(` ${r.type.padEnd(8)} ${naam}${bonus}`);
|
|---|
| 51 | if (DOEN) update.run(r.type, p.id);
|
|---|
| 52 | }
|
|---|
| 53 |
|
|---|
| 54 | console.log(`\n album: ${telling.album}`);
|
|---|
| 55 | console.log(` playlist: ${telling.playlist}`);
|
|---|
| 56 |
|
|---|
| 57 | if (overgeslagen.length) {
|
|---|
| 58 | console.log(`\n overgeslagen (${overgeslagen.length}) — deze blijven type=audio:`);
|
|---|
| 59 | for (const o of overgeslagen) console.log(` ${o.naam}: ${o.reden}`);
|
|---|
| 60 | }
|
|---|
| 61 |
|
|---|
| 62 | if (!DOEN && (telling.album || telling.playlist)) {
|
|---|
| 63 | console.log('\nNiets geschreven. Draai opnieuw met --doen als dit klopt.');
|
|---|
| 64 | }
|
|---|