Le plugin “Cleanup Unviewed Videos” pour PeerTube permet d’identifier facilement les vidéos qui n’ont pas été vues récemment afin de les supprimer. Son code est disponible sur le Github de Worteks.
Cet article présente le plugin ainsi que les méthodes de développement et d’installation.
⚠️ PeerTube impose des règles de nommage à ses plugins. Elles sont détaillées dans la documentation en ligne.
Fonctionnement général
Le plugin est accessible depuis le menu principal lorsqu’on est connecté avec un compte ayant le rôle « Administrateur » :
Un formulaire de recherche permet de spécifier l’ancienneté minimale de la dernière visualisation :
Les vidéos correspondant aux critères de recherche sont affichées et pré-sélectionnées pour une suppression en masse :
Architecture et code du plugin
PeerTube est développé en TypeScript (sur-couche à JavaScript apportant le typage statique) et son interface est basée sur le framework Angular.
Compte tenu de la simplicité du plugin, le choix d’utiliser TypeScript et Angular a été écarté. Le plugin est donc écrit en « Vanilla » JavaScript et CSS.
La structure du plugin est décrite dans le fichier package.json
. Ce contenu
sera exploité par PeerTube lors de l’installation et du démarrage du plugin
(extrait) :
{
"library": "./main.js",
"staticDirs": {
"images": "public/images"
},
"css": ["assets/style.css"],
"clientScripts": [
{
"script": "client/common-client-plugin.js",
"scopes": ["common"]
}
],
"translations": {
"fr": "./languages/fr.json"
}
}
La clé library
renseigne sur le code qui sera exécuté côté serveur.
Les clés clientScripts
, staticDirs
et css
renseignent sur le code et les
chemins qui seront utilisés côté interface (client).
Enfin, on déclare les langues supportées et les fichiers de traduction associés
dans la clé translations
.
Côté client comme serveur, le code exécuté par PeerTube est celui exporté sous
le nom register
.
Code serveur
Pour ce plugin, le code serveur se résume à déclarer les préférences du plugin pour qu’elles apparaissent sur une page de paramètres associée au plugin (extrait) :
registerSetting({
name: "enable-deletion",
label: "Enable deletion",
type: "input-checkbox",
descriptionHTML: "When this disabled, videos won't be actually deleted.",
private: false,
});
La gestion des préférences dans PeerTube est très simple. Les clés déclarées sont présentées dans l’interface de paramétrage, la valeur saisie est enregistrée dans la base de données.
Aucun ménage n’est fait dans les paramètres stockés en base de données lorsque le plugin évolue ou bien qu’il est désinstallé. Ce comportement peut être utilisé à notre avantage lors du développement car il sera parfois nécessaire de désinstaller le plugin puis de le réinstaller.
Code client
Le code client déclare deux « handlers » pour des « hooks » :
- ajout d’un élément de menu menant au plugin
- affichage/masquage de l’élément de menu en fonction du rôle du compte connecté
// Add our menu entry
registerHook({
target: "filter:left-menu.links.create.result",
handler: async (menu_entries) => {
// ...
},
});
// Toggle menu visibility according to connected user role
registerHook({
target: "action:auth-user.information-loaded",
handler: ({ user }) => {
// ...
},
});
});
Enfin, il enregistre une nouvelle route permettant d’accéder à l’interface du plugin :
/**
* Register route
*/
registerClientRoute({
route: "cleanup-unviewed-videos",
title: await helpers.translate("Cleanup Unviewed Videos"),
onMount: ({ rootEl }) => {
// ...
},
La fonction exécutée lorsqu’on navigue sur la route /p/cleanup-unviewed-videos
associée au plugin réalise les opérations suivantes :
- création du formulaire de recherche
- appel à l’API PeerTube pour rechercher les vidéos correspondant aux critères demandés
- affichage des résultats dans une liste
- appel à l’API pour suppression des vidéos sélectionnées
Création de l’interface
Pour préserver la légèreté du plugin, le choix s’est porté sur l’utilisation de « Template literals » JavaScript (extrait) :
rootEl.innerHTML = `
<div class="cleanup-unviewed-videos-main">
<h1>${await helpers.translate("Cleanup Unviewed Videos")}</h1>
<form id="${prefix}-form" class="pt-two-cols mt-4">
<div class="title-col">
<h2>${await helpers.translate("Last view age")}</h2>
</div>
<!-- ... -->
</form>
</div>`;
Recherche des vidéos
Le plugin s’exécutant principalement côté client, l’accès aux fonctions propres
au serveur n’est pas disponible. La recherche des vidéos se fait donc en
interrogeant l’API HTTP de PeerTube, comme on pourrait le faire avec curl
ou
manuellement en forgeant des URL dans un navigateur :
while (has_more_data) {
const json = await request_api(
`/api/v1/videos?isLocal=true&privacyOneOf=1&privacyOneOf=4&privacyOneOf=3&privacyOneOf=2&privacyOneOf=5&start=${page++ * pagination_count}&count=${pagination_count}`,
);
has_more_data = json.data.length === pagination_count;
// ...
}
La recherche du nombre de vues sur la période de référence se fait, également par interrogation de l’API HTTP :
const json = await request_api(
`/api/v1/videos/${uuid}/stats/overall?startDate=${ref_date.toISOString()}`,
);
La suppression se fait, là encore, en envoyant des requêtes HTTP au serveur :
await request_api(`/api/v1/videos/${uuid}`, "DELETE");
L’architecture de PeerTube permet de déclarer des routes côté serveur. On pourrait donc imaginer une autre architecture ici et bénéficier d’une plus grande efficacité dans la recherche et la suppression.
Publication du plugin
La publication consiste à déposer l’archive du plugin sur le dépôt NPM.
Cette tâche est grandement simplifiée par l’écosystème NPM. Il est nécessaire d’avoir un compte sur le dépôt NPM. La publication de l’archive se fait alors simplement par la commande suivante :
npm publish
Installation du plugin
Selon l’état d’avancement du développement, deux méthodes d’installation différentes seront utilisées :
- pendant les phases de développement
- après la publication
Pendant les phases de développement
Pendant les phases de développement, l’installation du plugin est plus efficace en ligne de commande.
Pour ce faire, il est nécessaire de copier l’arborescence du plugin dans un dossier accessible au serveur PeerTube. Dans le cas d’une exécution en conteneur (type Docker), il faudra donc déposer le plugin dans un dossier monté en volume dans le conteneur.
L’installation du plugin se fait par la commande peertube-cli
. Si cette
commande n’est pas disponible sur le serveur PeerTube, alors il faut l’installer :
npm install -g @peertube/peertube-cli
Bien qu’elle soit exécutée sur le serveur lui-même, la commande va lancer des requêtes HTTP. Il est donc nécessaire de s’authentifier :
PEERTUBE_HOST=...
LOGIN=...
PASSWORD=...
peertube-cli auth add -u "https://${PEERTUBE_HOST}" -U "$LOGIN" --password "$PASSWORD"
L’installation du plugin se fait alors en passant le chemin d’accès au dossier contenant l’arborescence du plugin :
PATH_TO_PLUGIN_DIR=...
peertube-cli plugins install --path "$PATH_TO_PLUGIN_DIR"
💡 Lors des phases de développement, notamment pendant la mise en place du CSS, il peut être nécessaire de désinstaller le plugin avant de déployer une nouvelle version. Le CSS des anciennes versions n’étant pas correctement nettoyé, les modifications apportées au code sont parfois surchargées par les versions antérieures.
La suppression du plugin se fait via la commande npm
suivante :
PLUGIN_NAME=...
npm run plugin:uninstall -- --npm-name "$PLUGIN_NAME"
Après la publication du plugin
Une fois le plugin publié sur NPM, l’installation peut se faire de deux manières :
- en ligne de commande, sans nécessité de copier l’arborescence du plugin sur le serveur au préalable
- via l’interface de gestion des plugins
L’installation en ligne de commande se fait par la commande peertube-cli
, mais
cette fois, il n’est pas nécessaire de la lancer depuis le serveur puisque le
plugin est disponible en ligne. On peut donc lancer la commande suivante depuis
le poste de travail :
PEERTUBE_HOST=...
peertube-cli plugins install -u "https://${PEERTUBE_HOST}" -n "peertube-plugin-cleanup-unviewed-videos"
L’installation depuis l’interface nécessite quant à elle que le plugin soit référencé sur le site de l’annuaire de plugins. Ce référencement se fait automatiquement. Un délai d’un jour est nécessaire entre la publication et l’apparition du plugin dans l’annuaire.
ℹ️ Le plugin
peertube-plugin-cleanup-unviewed-videos
n’est pas encore disponible sur l’annuaire de plugins du fait d’une incompatibilité technique relative au nommage (ticket associé){: target=”_blank”}).
Mise à jour du plugin
La mise à jour du plugin pourra se faire depuis l’interface de gestion des plugins.
Conclusion
Le développement de ce plugin constitue une bonne entrée en matière dans le monde de PeerTube. Il met en œuvre différents concepts dans un cadre relativement simple en vue de répondre à un besoin fonctionnel pertinent.
Le code de ce plugin couvre les aspects suivants :
- référencement dans le menu
- rôle du compte utilisateur
- création d’une route
- interrogation de l’API HTTP
- traduction de l’interface
Selon la popularité qu’il obtiendra, il pourra être nécessaire d’envisager une modification d’architecture afin de déporter certains traitements côté serveur et gagner en efficacité.