Index: src/routes/admin-audio.js
===================================================================
--- src/routes/admin-audio.js	(revision fbc86280a47b904b8ae4a50f846e11f213172604)
+++ src/routes/admin-audio.js	(revision 91094a44a78eaba7694534a039a5d0843f451e10)
@@ -78,5 +78,5 @@
   const rows = db.prepare(`
     SELECT t.id, t.title, t.artist, t.album, t.duration, t.cover_url,
-           t.position, t.created_at, m.filename, m.size, m.mime_type
+           t.position, t.created_at, t.downloadable, m.filename, m.size, m.mime_type
     FROM audio_tracks t
     LEFT JOIN media m ON m.id = t.media_id
@@ -241,4 +241,17 @@
     });
   });
+});
+
+// Download-voor-email per track aan/uit (premium #2). Zonder-JS toggle vanaf de
+// audio-beheerlijst → flip + terug.
+router.post('/:id/downloadable', requireGod, (req, res) => {
+  const site = res.locals.site;
+  if (!site) return res.status(404).send('Site required');
+  const row = db.prepare('SELECT downloadable FROM audio_tracks WHERE id = ? AND site_id = ?').get(req.params.id, site.id);
+  if (row) {
+    db.prepare('UPDATE audio_tracks SET downloadable = ? WHERE id = ? AND site_id = ?')
+      .run(row.downloadable ? 0 : 1, req.params.id, site.id);
+  }
+  res.redirect('/admin/audio');
 });
 
@@ -413,4 +426,8 @@
   }
 
+  if (Object.prototype.hasOwnProperty.call(body, 'downloadable')) {
+    fields.push('downloadable = ?'); values.push(body.downloadable ? 1 : 0);
+  }
+
   if (fields.length === 0) {
     return res.status(400).json({ error: 'Niks om te updaten' });
