Changeset ca260d1 in Klonkt for src/routes


Ignore:
Timestamp:
09/30/2026 08:08:44 AM (6 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/routes/admin-audio.js

    r19e28ce rca260d1  
    2424import { mediaDir } from '../config/paths.js';
    2525import * as ActivityPubService from '../services/ActivityPubService.js';
     26import { postsEmbeddingTrack } from '../services/music/index.js';
     27import { t as i18nT, resolveLang } from '../services/i18n.js';
    2628
    2729const __dirname = path.dirname(fileURLToPath(import.meta.url));
    … …  
    9698  const rows = db.prepare(`
    9799    SELECT t.id, t.title, t.artist, t.album, t.duration, t.cover_url,
    98            t.position, t.created_at, t.downloadable, m.filename, m.size, m.mime_type
     100           t.position, t.created_at, t.downloadable, t.fedi_open, t.media_id,
     101           m.filename, m.size, m.mime_type
    99102    FROM audio_tracks t
    100103    LEFT JOIN media m ON m.id = t.media_id
    … …  
    290293});
    291294
     295/**
     296 * Een track openbaar op de fediverse zetten, vanuit de mediamanager (Robin,
     297 * 30-9: "Fedi open audio ook per track aan kunnen zetten").
     298 *
     299 * Tot nu toe kon dat alleen per POST, met het vinkje in de editor, dat elke
     300 * track in die post opende. De vlag zelf was altijd al per track
     301 * (audio_tracks.fedi_open): hij opent het BESTAND en maakt er een echte
     302 * Audio-bijlage van. Dit is dezelfde vlag, met een eigen knop.
     303 *
     304 * EENRICHTINGS, net als in de editor. Een bestand dat al gefedereerd is, staat
     305 * op andere servers; het hier weer afschermen zou schijnveiligheid zijn. Er is
     306 * dus geen weg terug, en die bouwen we ook niet.
     307 *
     308 * EN DE POSTS GAAN OPNIEUW DE DEUR UIT. Het vinkje in de editor werkt zichtbaar
     309 * omdat het opslaan van de post een Update stuurt, met de audio erin. Een knop
     310 * die alleen de vlag zet, laat elke post die al verstuurd is zonder speler
     311 * staan tot iemand hem bewerkt. Dus hier dezelfde Update, voor elke
     312 * gepubliceerde post waar de track in staat -- rechtstreeks, via een playlist of
     313 * via zijn album. De bibliotheek (Funkwhale) hoeft niets: die wordt opgehaald,
     314 * en een open track staat er meteen in.
     315 *
     316 * Alleen een track met een eigen BESTAND: een track die alleen een link is heeft
     317 * niets om te openen.
     318 *
     319 * `deliver` is er voor de toetsen; de route gebruikt de echte deliverUpdate.
     320 */
     321export function openTrackOnFediverse(site, trackId, { deliver = (s, p) => ActivityPubService.deliverUpdate(s, p) } = {}) {
     322  const t = db.prepare('SELECT id, media_id, fedi_open FROM audio_tracks WHERE id = ? AND site_id = ?').get(trackId, site.id);
     323  if (!t) return { ok: false, reason: 'not_found' };
     324  if (!t.media_id) return { ok: false, reason: 'no_file' };
     325  if (t.fedi_open) return { ok: true, changed: false, updated: 0 };
     326  db.prepare('UPDATE audio_tracks SET fedi_open = 1 WHERE id = ? AND site_id = ?').run(trackId, site.id);
     327  const postIds = postsEmbeddingTrack(site.id, trackId);
     328  for (const id of postIds) {
     329    const post = db.prepare('SELECT * FROM posts WHERE id = ? AND site_id = ?').get(id, site.id);
     330    if (!post) continue;
     331    // Op de achtergrond: een trage volger houdt de knop niet vast.
     332    Promise.resolve()
     333      .then(() => deliver(site, post))
     334      .catch((e) => console.warn('[admin-audio] Update na openen mislukt:', post.id, e.message));
     335  }
     336  return { ok: true, changed: true, updated: postIds.length };
     337}
     338
     339router.post('/:id/fedi-open', requireGod, (req, res) => {
     340  const site = res.locals.site;
     341  if (!site) return res.status(404).send('Site required');
     342  const lang = resolveLang(req, { userLang: req.session?.user?.lang });
     343  const r = openTrackOnFediverse(site, req.params.id);
     344  if (!r.ok) {
     345    const msg = r.reason === 'no_file' ? i18nT(lang, 'aaud.fedi_no_file') : 'Not found';
     346    return res.redirect('/admin/audio?error=' + encodeURIComponent(msg));
     347  }
     348  res.redirect('/admin/audio?success=' + encodeURIComponent(i18nT(lang, 'aaud.fedi_opened', { n: r.updated })));
     349});
     350
    292351router.post('/:id/delete', requireGod, (req, res) => {
    293352  const site = res.locals.site;
Note: See TracChangeset for help on using the changeset viewer.