Réserver ses droits sur la fouille de textes et données
22 December 2024 | 12:05 pm

Cela n’aura échappé à personne depuis quelques années, mais l’intelligence artificielle est désormais sur toutes les lèvres et tous les claviers. Ce qu’on appelle communément ainsi en ce moment, ou IA, ce sont avant tout des modèles de machine learning entraînés sur des jeux de données dans le but de répondre à une problématique. De nos jours, c’est surtout l’IA générative (GenAI) qui est au cœur de toutes les discussions. Nous parlons notamment ici des grands modèles language (LLM) pour produire du texte ou encore des modèles de diffusion pour générer de l’image.

Pour fonctionner, ces modèles ont besoin de données. Beaucoup de données. Énormément de données. Les acteurs du marché ont donc collecté à peu près tout ce qui était disponible publiquement, voire non public mais ça c’est une autre histoire, pour faire tourner leurs entraînements. Et on ne peut pas dire qu’ils y sont allé avec le dos de la cuillère, et en mode commando avec comme mot d’ordre Ask for forgiveness, not permission (“Demandez pardon, pas la permission”).

Le problème est qu’en matière de propriété intellectuelle, ça peut poser des soucis. Un auteur n’a pas forcément envie que son contenu serve à entraîner un modèle de langage qui va ensuite écrire des bouquins vendus sur Amazon KDP et donc le concurrencer. De même pour un illustrateur. Je caricature, mais ça fait partie des alertes de la part du monde de la création contre l’IA générative.

Si aux USA le débat juridique est encore ouvert via des procédures comme celle du New York Times contre OpenAI et Microsoft, en Europe le cadre est déjà défini. C’est l’objet de ce billet.

Contexte légal

La DAMUN

Il existe en Europe une législation relative au droit d’auteur et à la collecte de données. Il s’agit de la directive 2019/790 sur le droit d’auteur et les droits voisins dans le marché unique numérique, ou DAMUN. La DAMUN a été transposée en droit français dans le code de la propriété intellectuelle.

Cette directive a introduit de nouvelles exceptions au droit d’auteur motivées par l’intérêt général dans l’Union Européenne :

  • L’exception pédagogique : pour permettre la réutilisation d’extraits d’oeuvres protégées dans le cadre de l’enseignement ou de la formation professionnelle
  • Le fouille de textes et de données : pour permettre à un auteur de s’opposer à la collecte de ses contenus, sauf pour la recherche scientifique
  • La conservation du patrimoine culturel : pour concéder à des organismes culturels des licences d’exploitation des oeuvres dans le cadre de leurs missions

La directive dispose ainsi que les contenus librement accessibles sur Internet peuvent faire l’objet de collecte et de fouilles (ou TDM, pour text and data mining), sauf si l’auteur manifeste son opposition à celle-ci (principe de l’opt-out ). Par contre, l’auteur ne peut interdire la collecte à but scientifique ou de conservation du patrimoine culturel. Ces deux cas sont définis par l’article 1 de la DAMUN. Si une entreprise commerciale de l’IA, par exemple, collecte les contenus de l’auteur malgré ce refus, elle pourra faire l’objet d’une plainte pour contrefaçon.

L’auteur peut indiquer son opposition par plusieurs moyens, tels que des conditions d’utilisation à destination d’un humain, mais aussi par document technique qui sera lu par une machine.

La DAMUN a été éprouvée pour la première fois en octobre 2024 dans l’affaire Kneschke contre LAION. Le photographe Allemand avait attaqué l’organisation LAION à cause de présence de liens vers ses clichés dans leurs datasets. Dans le cas présent, LAION étant un organisme de recherche scientifique à but non lucratif, le tribunal de Hamburg a tranché en leur faveur, car conforme à l’exception pour la recherche.

Et les licences Creative Commons ?

Creative Commons a communiqué sa position quant à la compatibilité de son cadre de licence avec la directive DAMUN.

En résumé, les termes des licences CC et notamment les restrictions Non-Commercial et Non-Derivative ne constituent pas une réservation des droits selon l’article 4 de la DAMUN. C’est donc insuffisant, car elle n’empêchera pas le TDM à but non commercial. L’auteur doit donc expliciter les termes de son opt-out.

Déclarer son opposition sur son site

Un site web peut indiquer la réservation des droits de fouille de plusieurs façons.

Clause dans les conditions d’utilisation

Cette possibilité est principalement à destination d’un humain. Il s’agit d’indiquer dans les mentions légales d’un site web que l’auteur réserve les droits de fouille et de collecte.

Le Syndicat National de l’Édition propose une clause type dans ce but. Vous pouvez consulter celles de mon blog ou celles de mon site d’auteur pour voir un exemple d’utilisation de ce modèle.

Implémenter le TDM Reservation Protocol

Le TDM Reservation Protocol (TDMRep) est une proposition d’EDRLab adoubée par le W3C pour formaliser sa clause de réservation d’une manière “lisible par une machine” comme prévu par l’article 4 de la DAMUN. Vous pouvez l’implémenter de trois façons sur un site web.

Balises HTML meta

Le TDMRep peut être déclaré dans les balises meta de votre site web, situées dans les entêtes. Elles indiquent si le contenu est réservé et peuvent renvoyer vers la politique.

Vous devez d’abord indiquer l’état de la tdm-reservation. Le protocole considère 0 pour autoriser la collecte (le droit par défaut), et 1 pour réserver. Cela donne la balise meta suivante :

<meta name="tdm-reservation" content="1">

Ensuite, vous pouvez faire pointer vers la politique de réservation. Celle-ci doit être formalisée en JSON suivant le modèle ODRL déposé sur votre serveur. Vous n’y comprenez rien ? Pas de panique, je vous donnerai un exemple avec le mien.

<meta name="tdm-policy" content="https://example.com/policies/policy.json">

Bien évidemment, adaptez l’adresse avec la réelle. Voici ce que donne le code dans son contexte :

<!DOCTYPE html>
<html lang="fr">
	<head>
		<meta name="tdm-reservation" content="1">
		<meta name="tdm-policy" content="https://example.com/policies/policy.json">
		<title>My Website</title>
	</head>
	<body>
		(...)
	</body>
</html>

Par entêtes HTTP

De la même manière que les balises meta, vous pouvez utiliser des headers pour indiquer la politique de réservation. Tout va dépendre du langage dans lequel votre site est développé et je ne saurais donc vous donner des exemples exhaustifs. Référez-vous à la façon dont votre langage renvoie des entêtes HTTP.

Les entêtes attendues sont les mêmes que pour du HTML :

  • tdm-reservation : 0 ou 1
  • tdm-policy : https://example.com/policies/policy.json

Cette méthode est principalement pour les fichiers non HTML, comme des images, pour ajouter des entêtes dans la requête HTTP.

Par fichier JSON sur le serveur

Vous pouvez présenter la politique de réservation grâce à un fichier nommé tdmrep.json sur votre serveur. Celui-ci doit se trouver dans le dossier .well-known, à la racine.

Exemple : https://www.example.com/.well-known/tdmrep.json

Si vous utilisez le générateur de sites statique Hugo comme moi, vous pouvez procéder en créant le dossier et le fichier .well-known/tdmrep.json dans static/. Il sera automatiquement ajouté à la génération du public.

static
├── .well-known
│   └── tdmrep.json

Le contenu attendu par le fichier est le suivant :

[
	{
		"location""/",
		"tdm-reservation"1,
		"tdm-policy":"https://example.com/policies/policy.json"
	}
]

Vous noterez la présence d’une clé en plus : location. Celle-ci permet d’indiquer si tout votre site (symbolisé par la racine /) est couvert par la réservation ou seulement une partie. Par exemple, vous ne souhaitez réserver vos droits que sur les fichiers pdf :

[
	{
		"location""/*.pdf$",
		"tdm-reservation"1,
		"tdm-policy":"https://example.com/policies/policy.json"
	}
]

Ou encore, vous avez une politique spécifique pour les PDF et les EPUB :

[
	{
		"location""/",
		"tdm-reservation"0,
		"tdm-policy":"https://example.com/policies/policy.json"
	},
	{
		"location""/*.pdf$",
		"tdm-reservation"1,
		"tdm-policy":"https://example.com/policies/policy-pdf.json"
	},
	{
		"location""/*.epub$",
		"tdm-reservation"1,
		"tdm-policy":"https://example.com/policies/policy-epub.json"
	},
]

Dans ce dernier exemple, l’auteur indique ne pas s’opposer à la collecte de ses contenus sur son site, à l’exception des pdf et epub qui ont chacun leur propre politique.

Il est maintenant temps de regarder ce qu’est censé contenir ce fameux fichier policy.json !

Le fichier policy.json

Comme dit précédemment, le fichier policy.json (que vous pouvez appeler comme vous voulez en réalité) doit être conforme au modèle ODRL, pour Open Digital Rights Language. Cette spécification étant un peu complexe, je vous propose un exemple avec le mien.

{
    "@context": [
        "http://www.w3.org/ns/odrl.jsonld",
        {
            "tdm": "http://www.w3.org/ns/tdmrep#"
        }
    ],
    "@type": "Offer",
    "profile": "http://www.w3.org/ns/tdmrep",
    "uid": "https://zedas.fr/policies/policy.json",
    "assigner": {
        "uid": "https://zedas.fr",
        "vcard:fn": "Seb",
        "vcard:hasEmail": "mailto:tdm@zedas.fr",
        "vcard:hasAddress": {
            "vcard:locality": "Lille",
            "vcard:country-name": "France"
        },
        "vcard:hasURL": "https://zedas.fr/about/"
    },
    "permission": [
        {
            "target": "https://zedas.fr/",
            "action": "tdm:mine",
            "duty": [
                {
                    "action": "obtainConsent"
                }
            ]
        }
    ]
}

Décryptons ce fichier :

  • @context, @type et profile correspondent aux métadonnées de l’offre ODRL. Elles indiquent au système qui va le lire qu’il s’agit d’un fichier de ce type.
  • uid : l’identifiant unique de la politique. Il s’agit de l’URL du fichier.
  • assigner : des informations concernant l’auteur de la politique. L’identifiant unique est ici le site Web, et j’y ai mis mon pseudo ainsi qu’une adresse e-mail dédiée. J’ai précisé des informations de localité basiques.
  • vcard:hasURL : vous pouvez indiquer ici le lien vers la politique en version “lisible par un humain”. Il s’agit de vos mentions légales vues au début.
  • permission : les droits accordés pour le text and data mining. Ici, sur la cible qui est mon site web, j’indiquer que l’action mine (collecte) requiert mon consentement.

Déclarer son opposition dans ses oeuvres

Outre des documents Web, les données disponibles en ligne peuvent aussi être des PDF, des EPUB, des images, et j’en passe. C’est le cas, par exemple, de ma nouvelle Bienvenue à Exiatis-4 disponible en accès libre. Ces fichiers peuvent eux aussi faire l’objet d’une déclaration de réservation du TDM de manière individuelle.

Clause dans les mentions obligatoires de l’oeuvre

En France, une publication papier ou numérique doit porter certaines mentions obligatoires. Il s’agit à minima de l’ISBN ainsi que du nom ou la raison sociale de l’éditeur, et son adresse dans le cas d’un e-book. La version papier exige plus de détails, mais ce n’est pas le sujet.

Vous pouvez profiter de ces mentions légales pour indiquer votre opposition à la collecte de texte. Faute d’avoir trouvé un exemple concret pour ce domaine, je me suis permis d’improviser une déclaration en m’inspirant du modèle du SNE cité précédemment.

L’auteur s’oppose à toutes opérations de moissonnage et fouilles de texte et des données au sens de l’article L. 122-5-3 du code de la propriété intellectuelle et de la Directive UE 2019/790 pour la présente publication.

Implémenter le TDM Reservation Protocol dans EPUB3

Le format EPUB n’étant rien d’autre qu’une archive contenant des documents HTML, il est parfaitement possible d’implémenter sa déclaration de réservation TDM Rep dedans.

Pour se faire, il faudra éditer le fichier EPUB avec l’aide d’un logiciel comme Calibre qui propose un outil dédié. Il s’agit de la même balise meta que dans le cas d’un site Web, mais avec une petite différence :

<meta name="tdm:reservation" content="1">
<meta name="tdm:policy" content="https://example.com/policies/policy.json">

Notez bien les : au lieu de - dans tdm:reservation. Ces balises peuvent être mises dans le fichier EPUB. Pour ma part, je la met dans la page de couverture.

tdm reservation epub

Le protocole peut également être implémenté dans un fichier PDF.

Conclusion

Ce petit tutoriel vous a indiqué comment mentionner la réservation des droits de collecte des données et textes que vous publiez librement sur le Web. Et maintenant ? Pas grand chose de différent, en fait. Ces éléments ne protègent pas de manière active et si une entreprise peu éthique désire exploiter vos contenus, elle le fera.

Donc, ça ne sert à rien ?

On pourrait croire ça. Néanmoins, si vous n’aviez pas fait ceci, vous auriez rendu leur exploitation légale dans tous les cas. Avec cette indication, vous la rendez illicite (sauf pour la recherche scientifique, n’oubliez pas) et pouvez demander réparation. Il faut donc voir cela comme un premier pas.


The Expanse (Livre 1 à 4)
8 December 2024 | 4:15 pm

The Expanse est une série de livres science fiction écrite par James S.A. Corey, nom de plume utilisé par ses deux auteurs, Daniel Abraham et Ty Franck. La saga a débuté en 2011 et s’est achevée en 2021 avec neuf tomes. Elle fit l’objet d’une adaptation en série télévisée par SyFy qui fut annulée au bout de trois saisons. Les droits de la série furent repris par Amazon qui produisit trois autres.

L’univers de The Expanse se situe dans un futur non daté où l’humanité s’est étendue dans l’espace grâce au moteur Epstein, un réacteur à fusion doté d’un très haut rendement capable de produire une accélération continue. Les colonies humaines se sont développées dans le système solaire : la Lune, Mars et son projet de terraformation, d’autres satellites naturels comme Titan ou Ganymède, mais aussi les astéroïdes Cérès et Eros sur lesquels des cités spatiales ont vu le jour.

La géopolitique de cette expansion est tout sauf stable. Les Nations Unies de la Terre et le gouvernement Martien sont en constante rivalité militaire. Quant aux habitants des colonies spatiales, appelés les Ceinturiens, ils se sentent exploités et laissés pour compte par les deux superpuissances. Les Ceinturiens ont fini par développer une culture qui leur est propre, notamment en raison de leurs différences physiques causées par le développement en gravité nulle ou faible, ainsi qu’une langue créole influencée par l’Allemand et le Chinois. Pour ajouter une pièce à l’échiquier politique tendu, la Ceinture a formé une organisation politique, l’Alliance des Planètes Extérieures (APE), qui oeuvre pour l’indépendance des Ceinturiens. Cette dernière reste vue comme une organisation terroriste par les planètes intérieures.

J’ai découvert l’univers avec la série TV il y a quelques années, mais je ne l’ai jamais terminée. Avec son rythme de production espacé sur les années, j’avais fini par décrocher. Dommage, j’aimais bien. Depuis, j’étais à la recherche de quelques nouvelles lectures de science fiction et on m’avait recommandé cette saga. Neuf volumes d’une moyenne de cinq cent pages, j’en avais pour toute une vie au vu de mon rythme de lecture ! En réalité, j’ai rapidement dévoré chacun d’entre eux, car ils se lisent très vite grâce à un bon rythme de narration. J’ai commencé aux alentours de l’été 2024 et j’en suis actuellement au cinquième au moment où ce billet est publié. Au final, j’ai presque rattrapé là où j’en étais arrivé avec la série TV.

L’un des éléments que j’ai le plus apprécié dans The Expanse, c’est sa narration. Elle est d’une grande fluidité et dynamique tout en étant capable de donner de nombreux détails sur son contexte. Les chapitres sont racontés du point de vue interne des protagonistes. Ainsi, le premier volume est un ping pong entre deux les protagonistes Holden et Miller. Les livres suivants exploitent la même méthode, mais en ajoutant une pluralité de personnages. L’univers a su développer une intrigue politique complexe avec des machinations à tous les étages qui constitue une véritable poudrière. Il ajoute à cela la découverte d’une technologie extraterrestre qui vient changer la donne et semer plus de chaos dans cet ensemble fragile.

Je vous propose une revue des quatre premiers volumes.

The Expanse 1 : L’éveil du Léviathan

Dans le système solaire, les installations humaines sont désormais une véritable fourmilière de mines et de centres névralgiques économiques. Les voyages au sein de celui-ci sont toujours longs, mais rendus supportables grâce au moteur Epstein.

James Holden, né sur Terre, ancien de la flotte terrienne, oeuvre en tant que commandant en second à bord du Canterbury, un vaisseau de transport de glace ravitaillant Cérès. L’appareil capte un message de détresse envoyé depuis le Scopuli, une unité Ceinturienne. Malgré les craintes d’un piège tendu par des pirates, Holden décide de monter une expédition pour porter secours à ce vaisseau en perdition, comme l’exige la loi.

Josephus Miller, Ceinturien vivant sur Cérès, est inspecteur pour la société de sécurité privée Hélice Étoile, filiale d’un conglomérat terrien. Il fait équipe avec Dmitri Havelock, un terrien subissant la xénophobie des Ceinturiens à son égard. La police privée a tendance à laisser proliférer les petites mafias locales et s’occupe à ne pas faire trop de vagues tout en maintenant un semblant d’ordre. Cependant, Miller se voit un jour approché pour retrouver et ramener Julie Mao, l’héritière de la famille Mao à la tête d’une entreprise figurant dans le top 50 interplanétaire.

Le premier volume de The Expanse est un ping pong entre les deux personnages principaux. On y retrouve deux personnages très différents avec Holden qui est un boy-scout idéaliste tandis que Miller est un flic désabusé à la gâchette facile. Les deux histoires convergent pour atteindre une série d’événements qui mettront en danger le système solaire entier avec une menace inédite d’origine extraterrestre.

The Expanse utilise beaucoup les thèmes liés à la xenophobie et au communautarisme. Malgré une expansion dans l’espace, les humains continuent de se regrouper et haïr ce qui est différent. L’équipage du vaisseau Rossinante de Holden est un des rares assemblages de multiples origines montrant l’efficacité de la collaboration entre les personnes, avec deux Terriens, une Ceinturienne, et un Martien.

The Expanse 2 : La Guerre de Caliban

Le second volume de The Expanse commence sur Ganymède, le grenier de la Ceinture. Cette colonie abrite la plus grande production agricole permettant de nourrir l’humanité. En raison de la série d’événements du premier volume et celui d’Éros, la tension entre la Terre et Mars est à son paroxysme. Les deux factions se tiennent mutuellement en joue au dessus des dômes du satellite de Jupiter. Tout en supervisant les activités étranges de l’organisme extraterrestre appelé “protomolécule” qui manigance on ne sait quels plans dans l’atmosphère opaque de Vénus.

La poudrière explose au moment où un assaillant d’origine inconnue élimine les troupes terriennes en poste sur Ganymède avant de faire de même avec celles de Mars. Roberta - Bobbie - Draper, une Marine de Mars, est l’unique survivante de cet assaut et tentera d’exposer sa version des faits. Ni Mars, ni la Terre n’ont attaquées selon elle. C’était une créature inconnue capable de tordre les plus puissants alliages et abattre les soldats malgré leurs armures. La sous-secrétaire des Nations Unies, Chrisjen Avasarala, décidera d’employer Bobbie pour en savoir plus. Pendant ce temps, l’APE envoie James Holden et son équipage sur Ganymède pour enquêter de leur côté. Ils sauveront un agronome, Praxidike - Prax - Meng, à la recherche de sa fille enlevée peu de temps avant l’éclatement du conflit.

Le second volume propose une narration sur plusieurs échelles avec deux duos de personnages. Nous suivons donc l’histoire du point de vue de Holden et de Prax qui se lancent à la recherche de sa fille. De l’autre côté, c’est celui d’Avasarala et Bobbie qui développe toute la machination politique et l’implication de conglomérat privés dans la militarisation de la protomolécule extraterrestre.

The Expanse 3 : La Porte d’Abbadon

Après avoir colonisé Vénus, la protomolécule finit par passer à l’action entre envoyant dans l’espace d’une superstructure à la forme d’un anneau, au delà de l’orbite d’Uranus. Les superpuissances de l’humanité, la Terre, Mars, et l’APE représentant les Ceinturiens, y installèrent des camps et des flottes pour s’observer et se viser mutuellement. Les scientifiques découvrent rapidement que l’anneau est un passage pour un trou de ver à la destination inconnue. Une contrainte s’impose cependant à tout objet le franchissant : il se retrouve ralenti à l’extrême s’il dépasse une vitesse limite. Une démonstration fut faite sans le vouloir par un Ceinturien lancé dans un challenge de vitesse qui se transforma en bouillie au moment où son appareil improvisé fut stoppé net.

James Holden et son équipage sont devenus, sans le savoir, la cible de Clarissa Mao, déterminée à venger le déshonneur subit par sa famille à cause de l’emprisonnement à perpétuité de son père en raison de son implication dans l’usage militaire de la protomolécule. Sa conspiration obligera le Rossinante à fuir au travers de l’anneau. Ils seront suivis par les trois factions, jusqu’à ce que la zone appelée zone lente ne décide de ralentir encore plus et provoquer des pertes considérables parmi toutes les factions en présence. Holden est, quant à lui, hanté par Miller qui lui apparaît et semble étrangement lié à la protomolécule et à la station se situant à l’intérieur de l’anneau.

Ce troisième volume prend la tournure d’un huis clôt en mettant l’action principalement à bord du Behemot, l’immense vaisseau générationnel Mormon transformé en bâtiment de guerre par l’APE. L’histoire est racontée selon le point de vue de Holden, mais aussi de Carlos de Bacca, dit Bull, lieutenant d’origine terrienne chef de la sécurité à bord du Behemot. S’ajoute à cela celui de Clarissa Mao, cherchant à venger sa famille des actions de Holden et oeuvrant sous le pseudonyme Melba Koh. Et pour finir, Anna Volovodov, une pasteur évangéliste membre d’une congrégation envoyée pour étudier l’anneau en prenant en compte l’aspect spirituel.

J’ai trouvé que cet épisode dans la série a réussi à donner beaucoup plus de points de vue variés grâce à ces différents personnages. Cela joue bien avec le fait que l’histoire se déroule dans un endroit plus confiné que les précédents.

The Expanse 4 : Les feux de Cibola

L’anneau installé par la protomolécule à proximité d’Uranus est désormais ouvert et donne sur une multitude de nouveaux mondes prêts à être explorés et colonisés par les humains. C’est chose faite avec la planète Ilus, baptisée ainsi par un premier groupe de colons issus de réfugiés de Ganymède. Le désespoir des Ceinturiens a poussé certains à quitter leur maison, par envie ou par la force des choses, pour aller là où manger, boire et respirer ne sont pas des challenges du quotidien.

Même si elles sont dépassées par tout ceci, les grandes puissances tentent de maintenir leur pouvoir. La Terre a confié à la Royal Charter Energy (RCE) un contrat d’exclusivité pour exploiter les immenses gisements de lithium de New Terra, qui n’est autre que la planète Ilus colonisée par les Ceinturiens. Ces derniers craignent de se faire déloger par ce que l’entreprise appelle des “squatters”. Tout bascule lorsque le premier groupe de la RCE débarquant sur Ilus/New Terra est visé par un attentat terroriste qui détruit le pas de tir et fait s’écraser leur navette. Les survivants seront sauvés par le reste de la colonie, mais le mal a été fait.

Face à cette nouvelle poudrière, la sous-secrétaire des Nations Unies Chrisjen Avasarala missionne James Holden comme médiateur entre les colons d’Ilus et la RCE.

Le quatrième volume poursuit l’histoire autour de la protomolécule et de ses créateurs en visitant le monde d’un autre système solaire. L’histoire est racontée du point de vue de cinq personnages principaux : James Holden, embauché comme médiateur dans l’espoir que son idéalisme arrange les choses. Basia Merton, un colon originaire de Ganymède qui a fui avec sa famille les événements du tome 2. Elvi Okoye, une biologiste de la RCE voulant découvrir une nouvelle biosphère. Adolphus Murty, l’intransigeant responsable de la sécurité de la RCE. Et Dmitri Havelock, l’ancien coéquipier de Miller sur Cérès, depuis employé par la RCE, second de Murty qui restera en charge de la sécurité en orbite.

Outre les machinations et la violence de la RCE dans l’affaire, tout en rappelant que les colons ont tiré les premiers, l’histoire se focalise aussi sur l’impuissance des humains face à un nouveau monde inconnu. Les créateurs de la protomolécule étaient capables de grands prodiges technologiques, et ceux-ci dépassent les personnages. La planète Ilus se révèle rapidement être tout sauf un paradis. Le récit met également en place quelques éléments pour les prochains volumes, avec notamment la raison officieuse de la présence de Holden comme médiateur. Il me semble conclure l’arc sur la protomolécule.


Et voilà pour cette première série de revues de la série The Expanse. Je suis actuellement en train de lire le cinquième volume. Celui-ci couvre les événements de la dernière saison que j’ai regardée de la série. Après ça, ce sera de l’inédit pour moi. J’ai beaucoup apprécié redécouvrir cet univers en lisant les livres d’origine. Une fois la saga terminée, je compte me refaire la série.


Plex, Youtube Video and Discord
7 September 2024 | 7:20 pm

In my precedent article, I’ve proposed a way to subscribe to your favorite Youtube videos with the RSS feed and download them to a Plex media server. But, a possible use-case that came later in my case was : OK, but if I want to fetch a unitary video ? Or if when I receive some friend at home they want to play from their smartphone similar to a Chromecast or equivalent ?

I don’t have a Chromecast, or Firestick, or whatever else like this. The Plex smartphone app supports streaming to one of these device, and they even support it on the Plex HTPC application for desktop. I use it at home when I want to stream a playlist from the smartphone app (because playing directly with the app on Bluetooth is just crap, the playlist fail after some titles, don’t understand why…).

So, I’ve thinked to a solution with the following constraints :

  1. I don’t want to maintain a web service with all the security equired
  2. I want it to be simple and stupid
  3. I want to to be accessible to friends the same way they can connect to a Chromecast

The idea came out : why not making a Discord bot that will just run the yt-dlp command and add the video on the Plex server ? Because my friends are using Discord, the simple part is checked. And I’ve experimented some integration with Sonarr and Radarr on a Discord server. I was hoping it to notify me when new episodes of series came out or using their built-in calendar to remind me a movie I want to see, but the notification works only if you download them. I don’t do that, so it was basically useless and I was just notified when the application got updated.

For the last item, Discord is available anywhere and I don’t have to maintain the Web part, because the bot is a program that connects and authenticates itself on Discord too.

Create the Discord bot

First, you need to connect to the Discord developer portal to setup the whole thing.

Then, you create a new application. I’ve kept the default parameters.

discord1.png

Following that, go the the Bot settings. You can customise the bot name, but the most important thing is to enable “Message content intent”. I must admit I don’t really remember the permissions calculated below, but The numeric value was 68672 (read messages, add reaction, and something else).

discord1.png

Then, the last part is to add your bot to the server you want. For this, I’ve been in the Installation part and copied the Discord provided link. Append the URL with the permissions and scope : https://discord.com/oauth2/authorize?client_id=<clientID>&permissions=68672&scope=bot%20applications.commands

Activate it on your server and the Bot should now be listed in the members.

discord1.png

The bot’s code

Integrating our app in Discord was cool, but so far it does nothing. Basically, we’ve just setup the authentication. Now, we need to code our bot. And here is the one I’ve made (with some AI help, I must admit, I don’t really know the Discord SDK).

Just like the previous one, I won’t put it on GitHub.

import discord
import subprocess
import os

# A bot that will listen a link an launch yt-dlp
# Released under MIT license
# Copyright 2024 Seb - https://zedas.fr

# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# The discord token
TOKEN = 'YOURTOKEN'
filepath = '/path/to/plex/youtube'

intents = discord.Intents.default()
intents.message_content = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')
    print(f'Connected to the following guilds: {[guild.name for guild in client.guilds]}')

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    print(message.content)
    action = message.content.split(' ', 1)[1]
    print(action)
    if action.startswith('https'):
        await message.add_reaction('👍')
        thread = await message.create_thread(name='Work in progress !')
        try:
            command = f'yt-dlp -v -o "{filepath}/%(uploader)s/%(uploader)s - %(title)s - %(id)s.%(ext)s" --sponsorblock-mark all --embed-metadata --parse-metadata "%(uploader|)s:%(meta_artist)s" "{action}"'
            subprocess.run(command, shell=True)
            await thread.send('Done !')
            await message.add_reaction('👍')
        except subprocess.CalledProcessError as e:
            await thread.send(f'Fail : {e}')
            await message.add_reaction('😵')

    else:
        await message.channel.send('Hello ! Just send me a message with the link and let the magic be done !')
client.run(TOKEN)

So, what this little thing do ?

First, it authenticates on Discord using the Token you can generate on the Bot page. Yes it’s crappy to do it like this, but it’s a simple idea. Then, it joins the server and listen the messages. If you notify the bot on Discord, it will use the content of the message and pass it to yt-dlp if it’s a link starting with https. Or answer some help.

Well, actually, the @bot doesn’t really work. The bot will read all messages and answer or put a stack in the script output even if you don’t address directly. So far, I don’t really care. In fact, the code will just split the message you send using space as a separator, and use the second part.

If it’s a link, the bot will thumb-up your message to notify it’s been taken into account. Then, it will open a thread saying “work in progress”. Once the video is downloaded, it will confirm it by answering “Done” in the thread, so you will have the notification. The yt-dlp command is similar to the one for the RSS subscription, so it will automatically create a folder for the Youtuber and put the video inside with a naming convention.

Create a requirement.txt file with discord as a dependency.

Now, we need to start the bot, I’ve made a basic shell script :

#!/usr/bin/env bash

# A bot that will listen a link an launch yt-dlp
# Released under MIT license
# Copyright 2024 Seb - https://zedas.fr

# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

if [ -d venv ]; then
    rm -rf venv
fi

virtualenv venv

source venv/bin/activate
pip install -r requirements.txt

python ./bot.py > bot.log 2>&1 &

And now, it will work in background. Now you should see your bot online on the server. You can check its activity in the log file.

Et voilà, simple and stupid, but it works fine. Feel free to enhance it if you want :)



More News from this Feed See Full Web Site