Changeset ca260d1 in Klonkt for src/services/music/index.js


Ignore:
Timestamp:
09/30/2026 08:08:44 AM (3 hours ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
76bd53c
Parents:
19e28ce
Message:

Fedi open audio per track, vanuit de mediamanager

Robin, 30-9: "Fedi open audio ook per track aan kunnen zetten in de media
manager."

De vlag was altijd al per track (audio_tracks.fedi_open): hij opent het
bestand en maakt er een echte Audio-bijlage van, met een speler in Mastodon en
consorten. Aanzetten kon alleen per POST, met het vinkje in de editor, dat elke
track in die post opende. Nu staat er in de mediamanager, tab Audio, per track
een wereldbol.

EENRICHTINGS, net als in de editor. Dicht is het een gedimde knop die eerst
vraagt of het zeker is, want terug kan niet; open is het een slotje in de
accentkleur en geen knop meer. Een bestand dat al gefedereerd is staat op andere
servers, en het hier weer afschermen zou schijnveiligheid zijn. Ook de algemene
bijwerk-API van een track neemt fedi_open niet aan; een toets bewaakt dat.

Alleen bij een track met een eigen bestand: een track die alleen een link is,
heeft niets om te openen. Een formulier en geen fetch, dus het werkt zonder
JavaScript, en data-confirm uit shell.ejs stelt de vraag.

EN DE POSTS GAAN OPNIEUW DE DEUR UIT. Het vinkje in de editor werkt zichtbaar
omdat het opslaan van de post een Update stuurt, met de audio erin. Een knop
die alleen de vlag zet, laat elke post die al verstuurd is zonder speler staan
tot iemand hem bewerkt. Dus hier dezelfde Update, voor elke gepubliceerde post
van deze site waar de track in staat: rechtstreeks, via een playlist of via zijn
album. postsEmbeddingTrack in music/index.js zoekt die op; trackHostPosts kiest
per track maar een post, voor de bibliotheek. De bibliotheek zelf hoeft niets,
die wordt opgehaald en een open track staat er meteen in.

Getoetst: openen zet de vlag en stuurt precies de drie posts (geen concept,
geen post zonder de track, geen post van een andere site); nog eens openen doet
niets; een link-track en een track van een andere site blijven dicht; de route;
geen weg terug via de API; de knop alleen waar het kan, met bevestiging; en de
hulpfunctie rechtstreeks. Tegenproef per zaak. Eentje ving eerst niets: het
sitefilter zit dubbel, want openen haalt elke post nog eens op met site_id. De
hulpfunctie is los te gebruiken, dus die wordt nu ook rechtstreeks getoetst.
Volledige suite 1301 groen.

Nagekeken in de gerenderde mediamanager met de echte stylesheet: open in de
accentkleur, dicht gedimd, geen wereldbol bij een link-track, dezelfde maat als
de andere knoppen in de rij.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/music/index.js

    r19e28ce rca260d1  
    134134  for (const r of rijen) if (!uit.has(r.tid)) uit.set(r.tid, { id: r.post_id, slug: r.post_slug });
    135135  return uit;
     136}
     137
     138/**
     139 * Elke GEPUBLICEERDE post waar deze track in staat, op welke manier ook:
     140 * rechtstreeks ([[track:id]]), via een playlist of via zijn albumnaam.
     141 *
     142 * Voor iets anders dan trackHostPosts, dat per track EEN post kiest voor de
     143 * bibliotheek. Opent de mediamanager een track (shaer, 30-9), dan moeten ALLE
     144 * posts met die track opnieuw de deur uit, anders krijgt een volger de speler
     145 * pas bij de volgende bewerking van die post.
     146 *
     147 * Alleen posts van deze site: playlists.id is een globale sleutel, en het
     148 * filter hoort op de post en de track, niet op de playlist (zie de
     149 * tenancy-toets bij setAudioFediOpen).
     150 */
     151export function postsEmbeddingTrack(siteId, trackId) {
     152  const t = db.prepare('SELECT id, album FROM audio_tracks WHERE id = ? AND site_id = ?').get(trackId, siteId);
     153  if (!t) return [];
     154  const rows = db.prepare(`
     155    SELECT p.id FROM posts p
     156     WHERE p.site_id = ? AND p.status = 'published'
     157       AND p.content LIKE '%[[track:' || ? || ']]%'
     158    UNION
     159    SELECT p.id FROM playlist_tracks pt
     160      JOIN posts p ON p.site_id = ? AND p.status = 'published'
     161                  AND p.content LIKE '%[[playlist:' || pt.playlist_id || ']]%'
     162     WHERE pt.track_id = ?
     163    UNION
     164    SELECT p.id FROM posts p
     165     WHERE p.site_id = ? AND p.status = 'published'
     166       AND ? IS NOT NULL AND ? <> ''
     167       AND p.content LIKE '%[[album:' || ? || ']]%'
     168  `).all(siteId, t.id, siteId, t.id, siteId, t.album, t.album, t.album);
     169  return rows.map((r) => r.id);
    136170}
    137171
Note: See TracChangeset for help on using the changeset viewer.