- Timestamp:
- 08/21/2026 04:57:20 PM (3 weeks ago)
- Branches:
- main
- Children:
- b0ccd0d
- Parents:
- 4e5fe29
- Location:
- src
- Files:
-
- 3 edited
-
routes/admin-audio.js (modified) (3 diffs)
-
services/ActivityPubService.js (modified) (4 diffs)
-
services/music/index.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/admin-audio.js
r4e5fe29 r8ed36de 23 23 import { audioUrl } from '../services/AudioStreamService.js'; 24 24 import { mediaDir } from '../config/paths.js'; 25 import * as ActivityPubService from '../services/ActivityPubService.js'; 25 26 26 27 const __dirname = path.dirname(fileURLToPath(import.meta.url)); … … 301 302 if (!track) return res.redirect('/admin/audio?error=Not+found'); 302 303 304 // Zeg de fediverse dat de track weg is, VOOR de rij verdwijnt -- zelfde 305 // volgorde en zelfde reden als bij een post (posts.js). Zonder dit blijft 306 // elke server die hem indexeerde ernaar wijzen terwijl het object 404 geeft; 307 // op de hub stond daardoor op 21-8 een track met een dode link. 308 ActivityPubService.deliverTrackDelete(site, track.track_id).catch(() => { /* best-effort */ }); 309 303 310 db.prepare('DELETE FROM audio_tracks WHERE id = ?').run(track.track_id); 304 311 if (track.media_id) { … … 371 378 if (o.media_id) db.prepare('DELETE FROM media WHERE id = ?').run(o.media_id); 372 379 }); 373 for (const o of orphans) deleteOne(o); 380 for (const o of orphans) { 381 // Ook hier aankondigen. Een wees is voor ONS een track zonder bestand, maar 382 // voor de buitenwereld was het een gewoon Audio-object dat zij hebben 383 // opgeslagen; stil weggooien laat hun kopie staan. 384 ActivityPubService.deliverTrackDelete(site, o.track_id).catch(() => { /* best-effort */ }); 385 deleteOne(o); 386 } 374 387 375 388 res.json({ ok: true, deleted: orphans.length }); -
src/services/ActivityPubService.js
r4e5fe29 r8ed36de 37 37 import { TRACK_KOLOMMEN, 38 38 playlistOpenTracks, siteOpenTracks, openTrack, trackHostPosts, 39 buildTrackAudio, buildTrackCollection, buildTrackCreate, 39 buildTrackAudio, buildTrackCollection, buildTrackCreate, trackUri, 40 40 buildPlaylistCollection, listPlaylistsAP, playlistLinkTags, 41 41 buildPostTrackCollection, uitgavePost, … … 3107 3107 3108 3108 // Tell followers a post is gone (Delete + Tombstone) so it's removed from their feeds. 3109 export async function deliverDelete(site, post) { 3109 /** 3110 * Delete(Tombstone) voor een van onze EIGEN objecten, naar alle volgers. 3111 * 3112 * De romp staat apart omdat een post niet het enige is dat wij de draad op 3113 * sturen. Een track is een eersterangs Audio-object met een eigen id 3114 * (shaer-0nh), en die werd bij verwijderen nergens aangekondigd: de rij ging 3115 * weg, het object ging 404 en elke server die hem had geindexeerd hield hem 3116 * voor altijd. Op de hub kwam dat op 21-8 aan het licht als een track die naar 3117 * een dode URL wees. 3118 * 3119 * Het object-id komt van de aanroeper. Dat moet ook wel: bij verwijderen is de 3120 * rij vaak al weg, dus er valt niets meer op te zoeken. 3121 */ 3122 export async function deliverObjectDelete(site, objectId) { 3110 3123 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 3111 if (!base || !site || !site.slug || ! post || !post.id) return;3124 if (!base || !site || !site.slug || !objectId) return; 3112 3125 const followers = fStmts().list.all(site.slug); 3113 3126 if (!followers.length) return; … … 3115 3128 const keys = getOrCreateKeys(site.slug); 3116 3129 const me = actorId(base, site.slug); 3117 const nid = noteId(base, post.id);3118 3130 const del = { 3119 3131 '@context': AP_CONTEXT, 3120 id: `${ nid}#delete-${Date.now()}-${rid()}`,3132 id: `${objectId}#delete-${Date.now()}-${rid()}`, 3121 3133 type: 'Delete', 3122 3134 actor: me, 3123 3135 to: [PUBLIC], 3124 object: { id: nid, type: 'Tombstone' },3136 object: { id: objectId, type: 'Tombstone' }, 3125 3137 }; 3126 3138 for (const inbox of inboxes) deliverWithRetry(site.slug, inbox, del, `${me}#main-key`, keys.private_pem); 3139 } 3140 3141 export async function deliverDelete(site, post) { 3142 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 3143 if (!base || !post || !post.id) return; 3144 return deliverObjectDelete(site, noteId(base, post.id)); 3145 } 3146 3147 /** 3148 * Zelfde voor een track. Roep dit aan VOOR het verwijderen van de rij, net als 3149 * bij een post: daarna is `id` er nog wel maar de context niet meer. 3150 */ 3151 export async function deliverTrackDelete(site, trackId) { 3152 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 3153 if (!base || !site || !site.slug || !trackId) return; 3154 return deliverObjectDelete(site, trackUri(base, site, trackId)); 3127 3155 } 3128 3156 … … 6966 6994 buildPostTrackCollection, uitgavePost, 6967 6995 buildLibrary, libraryId, 6968 followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliver Update, deliverActorUpdate, resyncFeaturedPins,6996 followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverObjectDelete, deliverTrackDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins, 6969 6997 feedCursor, feedChangesSince, waitForFeedChange, 6970 6998 getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, buildReplyNote, getOutboxNote, getSentNotes, deliverReply, resolveRemoteNote, noteAudience, mayReadNote, -
src/services/music/index.js
r4e5fe29 r8ed36de 165 165 } 166 166 167 /** 168 * De identiteit van een track op de draad. 169 * 170 * Staat apart omdat hij op TWEE momenten nodig is die ver uit elkaar liggen: 171 * bij het bouwen van het Audio-object, en bij het verwijderen ervan, wanneer de 172 * rij al weg is en er dus niets meer te bouwen valt. Toen dit nog inline stond, 173 * kende alleen de bouwkant de vorm en ging er bij verwijderen geen Delete uit -- 174 * elke server die de track had geindexeerd hield hem voor altijd (21-8). 175 */ 176 export function trackUri(base, site, id) { 177 return `${actorId(base, site.slug)}/tracks/${encodeURIComponent(id)}`; 178 } 179 167 180 export function buildTrackAudio(base, site, r, opts = {}) { 168 181 const abs = (u) => !u ? null : (/^https?:/i.test(u) ? u : `${base}${u.startsWith('/') ? '' : '/'}${u}`); … … 187 200 const a = { 188 201 ...(opts.standalone ? { '@context': AP_CONTEXT } : {}), 189 id: `${actorId(base, site.slug)}/tracks/${encodeURIComponent(r.id)}`,202 id: trackUri(base, site, r.id), 190 203 type: 'Audio', 191 204 name: r.title || 'Audio',
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)