Index: src/routes/admin-audio.js
===================================================================
--- src/routes/admin-audio.js	(revision 8f6225cbfb7a439454829f7dec26b0891f4163f0)
+++ src/routes/admin-audio.js	(revision 0d7acdfd541ca8374f3adc7a5f67f2ca00f4f4ef)
@@ -20,5 +20,5 @@
 import { toWebp } from '../services/ImageWebpService.js';
 import { requireGod } from '../middleware/auth.js';
-import { transcodeToMp3 } from '../services/AudioTranscoder.js';
+import { transcodeToMp3, retagMp3 } from '../services/AudioTranscoder.js';
 import { audioUrl } from '../services/AudioStreamService.js';
 
@@ -168,4 +168,8 @@
     const finalArtist = artist?.trim() || null;
     const finalAlbum  = album?.trim() || null;
+    // Eigenaarschap/licentie. credit valt terug op de artiest; deze gaan zowel de
+    // DB in als de ID3-tags van de mp3 (copyright + comment).
+    const finalCredit  = (req.body.credit  || '').trim() || finalArtist || null;
+    const finalLicense = (req.body.license || '').trim() || null;
 
     console.log('[admin-audio] upload received:', {
@@ -186,4 +190,6 @@
           artist: finalArtist || undefined,
           album: finalAlbum || undefined,
+          copyright: finalCredit || undefined,
+          comment: finalLicense || undefined,
         },
       });
@@ -216,6 +222,6 @@
       console.log('[admin-audio] inserting audio_tracks row (duration=' + finalDuration + ')');
       db.prepare(`
-        INSERT INTO audio_tracks (id, site_id, title, artist, album, duration, cover_url, media_id, position)
-        VALUES (?, ?, ?, ?, ?, ?, ?, ?, COALESCE(
+        INSERT INTO audio_tracks (id, site_id, title, artist, album, duration, cover_url, credit, license, media_id, position)
+        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, COALESCE(
           (SELECT MAX(position) + 1 FROM audio_tracks WHERE site_id = ?),
           0
@@ -226,4 +232,5 @@
         finalDuration,
         coverUrl,
+        finalCredit, finalLicense,
         mediaId, site.id
       );
@@ -371,5 +378,5 @@
   const t = db.prepare(`
     SELECT t.id, t.title, t.artist, t.album, t.duration, t.cover_url,
-           t.position, t.created_at, m.filename
+           t.credit, t.license, t.position, t.created_at, m.filename
     FROM audio_tracks t LEFT JOIN media m ON m.id = t.media_id
     WHERE t.id = ? AND t.site_id = ?
@@ -388,5 +395,5 @@
  * fallback keeps working.
  */
-router.post('/api/:id', requireGod, express.json(), (req, res) => {
+router.post('/api/:id', requireGod, express.json(), async (req, res) => {
   const site = res.locals.site;
   if (!site) return res.status(404).json({ error: 'Site required' });
@@ -433,4 +440,10 @@
     fields.push('downloadable = ?'); values.push(body.downloadable ? 1 : 0);
   }
+  if (Object.prototype.hasOwnProperty.call(body, 'credit')) {
+    fields.push('credit = ?'); values.push(String(body.credit || '').trim() || null);
+  }
+  if (Object.prototype.hasOwnProperty.call(body, 'license')) {
+    fields.push('license = ?'); values.push(String(body.license || '').trim() || null);
+  }
 
   if (fields.length === 0) {
@@ -445,10 +458,29 @@
   }
 
-  // Return fresh row so the caller can update its UI without reloading
+  // Verse rij + (als tag-velden wijzigden) de mp3 her-taggen, zodat de eigenaar/
+  // licentie ook IN het bestand staat (ID3) en meereist bij een download.
   const fresh = db.prepare(`
-    SELECT id, title, artist, album, duration, cover_url
-    FROM audio_tracks WHERE id = ? AND site_id = ?
+    SELECT t.id, t.title, t.artist, t.album, t.duration, t.cover_url, t.credit, t.license, m.storage_path
+    FROM audio_tracks t LEFT JOIN media m ON m.id = t.media_id
+    WHERE t.id = ? AND t.site_id = ?
   `).get(req.params.id, site.id);
-  res.json({ ok: true, track: fresh });
+
+  const tagsChanged = ['title', 'artist', 'album', 'credit', 'license']
+    .some((f) => Object.prototype.hasOwnProperty.call(body, f));
+  if (fresh && fresh.storage_path && tagsChanged) {
+    try {
+      await retagMp3({ filePath: fresh.storage_path, tags: {
+        title: fresh.title || undefined,
+        artist: fresh.artist || undefined,
+        album: fresh.album || undefined,
+        copyright: fresh.credit || undefined,
+        comment: fresh.license || undefined,
+      } });
+    } catch (e) {
+      console.warn('[admin-audio] ID3 her-taggen mislukt (DB is wel bijgewerkt):', e.message);
+    }
+  }
+  const { storage_path, ...trackOut } = fresh || {};
+  res.json({ ok: true, track: trackOut });
 });
 
