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 » :

Menu principal de PeerTube

Un formulaire de recherche permet de spécifier l’ancienneté minimale de la dernière visualisation :

Formulaire de recherche

Les vidéos correspondant aux critères de recherche sont affichées et pré-sélectionnées pour une suppression en masse :

Vidéos anciennes à supprimer


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