npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

peertube-plugin-video-lifecycle

v0.1.0

Published

PeerTube video lifecycle: minors-present declaration, validity period, low-visibility handling and automated deletion.

Downloads

70

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 registerSettings dans server/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 suppression

Le 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.