peertube-plugin-video-lifecycle
v0.1.0
Published
PeerTube video lifecycle: minors-present declaration, validity period, low-visibility handling and automated deletion.
Downloads
70
Maintainers
Readme
peertube-plugin-video-lifecycle
Plugin PeerTube de cycle de vie des vidéos pour apps.education.fr.
⚠️ État : squelette. La structure, les réglages et le câblage des hooks sont en place ; la logique de transition (notifications, période de grâce, suppression effective) reste à implémenter (voir les
TODO).
Périmètre
- Présence de mineurs : champ déclaratif à l'upload, durée de validité paramétrable (12 mois par défaut), suppression automatisée à échéance, affichage public de la date de suppression.
- Faible visibilité : seuil de vues et fenêtre d'observation paramétrables, notification du propriétaire, période de grâce (3 mois par défaut), puis suppression définitive.
La suppression porte uniquement sur l'instance (hors backups / archives). La qualification légale du contenu reste de la responsabilité du déposant.
Réglages
| Réglage | Défaut | Description |
| --- | --- | --- |
| minors-validity-months | 12 | Validité d'une vidéo déclarée « mineurs ». |
| low-visibility-enabled | vrai | Active la gestion de la faible visibilité. |
| low-visibility-views-threshold | 0 | Seuil de vues. |
| low-visibility-window-months | 12 | Fenêtre d'observation des vues. |
| low-visibility-grace-months | 3 | Période de grâce avant suppression. |
| scan-interval-hours | 24 | Fréquence du contrôle périodique. |
Ces réglages sont temporairement masqués (non enregistrés) : le plugin ne publie pour l'instant que le champ déclaratif. La logique tourne sur les valeurs par défaut ci-dessus ; réactiver via
registerSettingsdansserver/index.ts.
Architecture
src/
├── shared/ # constantes, types, utilitaires purs (testés)
├── server/ # register/unregister, settings, hooks, storage, scheduler, routes
└── client/ # champ déclaratif + affichage public de la date de suppressionLe serveur est compilé en CJS (dist/server/index.cjs, chargé par le cœur
PeerTube via require) et le client en ESM (dist/client/index.js), via
tsdown (Rolldown).
Lire / filtrer les vidéos selon la présence de mineurs
La réponse déclarée est exposée sur le détail d'une vidéo, sous
pluginData.containsMinors ("yes" | "no"), via le hook
filter:api.video.get.result :
// GET /api/v1/videos/:id
{ "id": 2, "name": "…", "pluginData": { "containsMinors": "yes" } }⚠️ PeerTube n'indexe pas pluginData : ni la recherche
(/api/v1/search/videos) ni la liste (/api/v1/videos) ne renvoient ce
champ ou ne savent filtrer dessus — seul le détail l'expose. Pour obtenir
l'ensemble des vidéos « mineurs », il faut donc paginer la liste puis lire le
détail de chaque vidéo (N+1) :
// Pseudo-code — un appel détail par vidéo : coûteux à grande échelle.
// Authentification admin requise pour voir toutes les vidéos (toutes privacités).
async function videosWithMinors(api) {
const ids = []
for (let start = 0; ; start += 100) {
const { data, total } = await api.get('/api/v1/videos', { start, count: 100 })
for (const v of data) {
const detail = await api.get(`/api/v1/videos/${v.id}`)
if (detail.pluginData?.containsMinors === 'yes') ids.push(v.id)
}
if (start + 100 >= total) break
}
return ids
}Pour une seule vidéo, la route du plugin renvoie les métadonnées complètes
(containsMinors, expiresAt, status…) :
GET /plugins/video-lifecycle/<version>/router/videos/:id/lifecycle.
Pour un usage à grande échelle (inventaire, purge), prévoir une route de
listing dédiée côté plugin (lecture directe du stockage video-lifecycle:<id>)
plutôt que ce parcours N+1 — non implémenté à ce jour.
Développement
pnpm --filter peertube-plugin-video-lifecycle build # build tsdown
pnpm --filter peertube-plugin-video-lifecycle dev # build watch
pnpm --filter peertube-plugin-video-lifecycle typecheck # tsc --noEmit
pnpm test # vitest (monorepo)Licence
EUPL-1.2.
