Ignore:
Timestamp:
08/14/2026 12:03:55 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
eb071a7
Parents:
9529d7b
Message:

Hoezen en playlists reisden nog niet mee

Robin, na de vorige ronde: "de audio tracks hadden images, die zijn niet
meegegaan, de playlists zijn ook nog niet meegegaan via peer to peer."

Allebei terecht, en de eerste is dezelfde fout als bij de audio zelf, een laag
hoger. cover_url ging wel mee als STRING en het bestand niet. Dus kwam een
nummer aan met een verwijzing naar een plaatje dat er niet was: precies de
halve waarheid die deze hele reeks moest opruimen, en ik liep er zelf opnieuw
in.

De playlists gingen wel via de zip en niet via de ophaalknop. Die liep de
tracks-collectie af en de playlist-collectie niet, en dan heb je alle muziek
en geen enkele plaat. De volgorde staat nergens anders.

Wat er nog meer boven kwam bij het naspelen: over AP komt de duur als
ISO-8601 ("PT212S") binnen en de database wil seconden, en de artiest zit in
summary, niet in een artist-veld. Zonder die twee kwamen nummers naamloos en
zonder duur aan.

En de bronkant moest ook hier open: playlistOpenTracks filtert op fedi_open,
dus de doel-actor kreeg een plaat met gaten. Nu geldt daar dezelfde regel als
bij de outbox en de tracks.

Bewezen op twee draaiende instanties, 3 nummers met hoes plus een plaat in de
volgorde c-a-b:

peer to peer mp3 2503b, hoes 74b, artiest, duur, plaat C -> A -> B
zip idem, plus kind=album

Changed files:
src/services/ArchiveExportService.js

  • hoesToevoegen(): de BYTES van een hoes in het archief, voor tracks en playlists, met shaer:coverFile ernaast

src/services/ArchiveImportService.js

  • hoesTerug(): de hoes op schijf en cover_url daarheen; geen bestand betekent geen cover_url, liever niets dan een img die 404't

src/services/MigrationService.js

  • de ingest haalt de hoes op uit icon/image, ONDERTEKEND
  • de playlists erbij, met hun volgorde en een kaart bron-URI -> nieuw id
  • duurSeconden(): PT212S naar 212; artiest uit summary

src/services/music/index.js

  • playlistOpenTracks({ alles }) voor de doel-actor van een Move

src/routes/activitypub.js

  • de playlist-route geeft die doel-actor de volledige plaat

remarks: over AP komt kind (album/playlist) niet mee, want de AP-collectie
draagt dat veld niet; via de zip wel. Klein verschil, apart te repareren als het
hindert.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ArchiveImportService.js

    r9529d7b r98acb97  
    135135 * (en bij een droogloop dus niet, maar het verslag klopt wel)
    136136 */
     137/**
     138 * Een hoes uit het archief terugzetten. Geeft het nieuwe /media-pad terug, of
     139 * null als het bestand er niet in zat: dan liever GEEN cover_url dan een
     140 * verwijzing naar niets.
     141 */
     142function hoesTerug(files, bestand, werk) {
     143  if (!bestand) return null;
     144  const bytes = files.get(bestand);
     145  if (!bytes || !bytes.length) return null;
     146  const naam = path.basename(String(bestand));
     147  if (!naam || naam.includes('/') || naam.includes('\\') || naam.startsWith('.')) return null;
     148  const urlPad = `/media/archief/${naam}`;
     149  const doel = veiligMediaPad(urlPad);
     150  if (!doel) return null;
     151  werk.push({ soort: 'media', doel, bytes });
     152  return urlPad;
     153}
     154
    137155function tracksTerug(files, site, rapport) {
    138156  const buf = files.get('tracks.json');
     
    160178      continue;
    161179    }
    162     werk.push({ soort: 'track', doel: path.join(path.resolve(AUDIO_ROOT), naam), bytes, id, t, naam });
     180    const hoes = hoesTerug(files, t['shaer:coverFile'], werk);
     181    werk.push({ soort: 'track', doel: path.join(path.resolve(AUDIO_ROOT), naam), bytes, id, t, naam, hoes });
    163182    rapport.tracks += 1;
    164183  }
     
    182201    const kwijt = (p['shaer:tracks'] || []).length - items.length;
    183202    if (kwijt) rapport.waarschuwingen.push(`playlist ${p.name || id}: ${kwijt} nummer(s) ontbreken en zijn eruit gelaten`);
    184     werk.push({ soort: 'playlist', p, id, items });
     203    const hoes = hoesTerug(files, p['shaer:coverFile'], werk);
     204    werk.push({ soort: 'playlist', p, id, items, hoes });
    185205    rapport.playlists += 1;
    186206  }
     
    395415          .run(s.id, site.id, s.t.name || 'zonder titel', s.t.artist || null, s.t.album || null,
    396416            s.t.duration || null, mediaId, s.t.position ?? null, s.t.credit || null, s.t.license || null,
    397             s.t['shaer:coverUrl'] || null, s.t['shaer:downloadable'] ? 1 : 0, s.t['shaer:fediOpen'] ? 1 : 0,
     417            s.hoes || null, s.t['shaer:downloadable'] ? 1 : 0, s.t['shaer:fediOpen'] ? 1 : 0,
    398418            link('spotify'), link('youtube'), link('soundcloud'));
    399419        continue;
     
    403423                    VALUES (?,?,?,?,?,?,?)`)
    404424          .run(s.id, site.id, s.p.name || 'zonder titel', s.p.artist || null, s.p.year || null,
    405             s.p['shaer:coverUrl'] || null, s.p['shaer:kind'] || null);
     425            s.hoes || null, s.p['shaer:kind'] || null);
    406426        db.prepare('DELETE FROM playlist_tracks WHERE playlist_id = ?').run(s.id);
    407427        const insPT = db.prepare('INSERT OR IGNORE INTO playlist_tracks (playlist_id, track_id, position) VALUES (?,?,?)');
Note: See TracChangeset for help on using the changeset viewer.