YGGTorrent est mort. Longue vie à UTOPEER.
Il y a quelques semaines, j'ai voulu configurer YGG dans Prowlarr. Simple, non ? Pas vraiment.
yggapi.eu, l'API non-officielle qui faisait tourner la plupart des indexeurs Prowlarr/Jackett pour YGG, était morte avec le site original. Les gists GitHub qui traînent encore pointent vers des domaines fantômes. Les forums donnent des conseils pour un écosystème qui n'existe plus. Et ygg.gratis, le “nouveau” YGG, répondait 404 sur tous les chemins d'API que j'essayais.
C'est là que j'ai compris que je cherchais la mauvaise chose.
Ce que ygg.gratis n'est pas
ygg.gratis n'est pas un site de torrents avec une API de scraping. Ce n'est pas non plus un clone de yggapi.eu avec un nouveau domaine.
C'est l'interface publique d'UTOPEER (ou U2P), un projet qui repose sur Nostr — un protocole de messages décentralisé. Les torrents sur ygg.gratis ne sont pas stockés dans une base de données centrale. Ils circulent comme des événements sur un réseau de relays.
Pour comprendre pourquoi ça change tout, il faut deux minutes sur Nostr.
Nostr en deux minutes (vraiment)
Nostr, c'est un protocole de publication décentralisé. Chaque contenu est un “événement” signé par une clé privée (comme une clé GPG), publié sur des “relays” — des serveurs WebSocket qui stockent et redistribuent ces événements.
N'importe qui peut lire, n'importe qui peut publier. Les relays sont interchangeables. Si un relay ferme, les événements qu'il hébergeait peuvent exister ailleurs. L'identité d'un auteur n'est pas liée à un serveur.
Le projet a surtout été utilisé pour les réseaux sociaux décentralisés (c'est une alternative à Mastodon, dans l'esprit). Mais le protocole est agnostique sur le contenu. Une spec appelée NIP-35 définit un format d'événement spécifiquement pour les métadonnées de torrents : infohash, nom, taille, trackers, tout ça.
UTOPEER publie les torrents YGG comme des événements NIP-35 sur un relay Nostr (relay.ygg.gratis). ygg.gratis est juste l'interface web qui connecte à ce relay pour le rendre browsable.
Pourquoi ça compte pour Prowlarr
Le problème avec les APIs de scraping comme yggapi.eu, c'est qu'elles dépendaient d'un site central. Quand le site ferme ou change sa structure HTML, l'API meurt avec lui.
Le modèle Nostr est différent. Le “bot” qui publie les torrents YGG est une clé publique. Tant que cette clé publie sur un relay accessible, n'importe qui peut s'y abonner et indexer le contenu. Le relay peut changer, le front-end peut changer, la clé publique reste.
C'est aussi là que ça devient plus compliqué pour l'intégration Prowlarr : il n'existe pas d'endpoint Torznab public sur ygg.gratis. La spec le dit clairement — U2P expose une API Torznab, mais c'est une instance que tu fais tourner toi-même, qui connecte le relay Nostr et te sert les résultats localement.
L'architecture complète
relay.ygg.gratis (Nostr)
↓
Lighthouse ← tu héberges ça chez toi
(indexeur local)
↓
Prowlarr
↓
Sonarr / Radarr
↓
Transmission
Lighthouse est un indexeur Nostr open-source qui se connecte à un relay, indexe les événements NIP-35 dans une base SQLite locale, et expose une API Torznab standard. Prowlarr le voit comme n'importe quel autre indexeur.
Installation
Prérequis
- Docker et Docker Compose
- Prowlarr déjà en place
1. Créer les répertoires
mkdir -p /data/lighthouse/data /data/lighthouse/config
chown -R 1000:1000 /data/lighthouse
2. Créer le fichier de service
Lighthouse n'a pas d'image Docker publique — il faut la builder depuis les sources. Docker le fait directement depuis GitHub :
# services/lighthouse.yml
services:
lighthouse:
build:
context: https://github.com/gmonarque/lighthouse.git
dockerfile: Dockerfile
image: lighthouse:local
container_name: lighthouse
environment:
- TZ=Europe/Paris
volumes:
- /data/lighthouse/data:/app/data
- /data/lighthouse/config:/app/config
networks:
- proxy-tier # même réseau que Prowlarr
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:9999/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
proxy-tier:
external: true
Lighthouse est un service interne — il n'a pas besoin d'être exposé sur Internet. Prowlarr l'appelle via le nom Docker lighthouse:9999.
3. Créer la configuration
# /data/lighthouse/config/config.yaml
server:
host: "0.0.0.0"
port: 9999
database:
path: "/app/data/lighthouse.db"
nostr:
relays:
- url: "wss://relay.ygg.gratis"
name: "YGG Relay"
preset: "private"
enabled: true
trust:
depth: 1
enrichment:
enabled: false
4. Builder et démarrer
docker compose -f docker-compose.yml -f services/lighthouse.yml \
build lighthouse
docker compose -f docker-compose.yml -f services/lighthouse.yml \
up -d lighthouse
Le build prend 3-5 minutes (Go + Node.js compilés depuis les sources).
5. Compléter le setup via l'API
Au premier démarrage, Lighthouse attend qu'une “identité Nostr” soit générée. Sans ça, il ne se connecte pas au relay. L'interface web est accessible sur le port 9999, mais si Lighthouse est un service interne sans port exposé, voici comment le faire depuis la machine hôte :
# Récupérer l'IP du conteneur
LIGHTHOUSE_IP=$(docker inspect lighthouse \
--format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}')
# Générer une identité Nostr
curl -s -X POST \
"http://$LIGHTHOUSE_IP:9999/api/settings/identity/generate" \
-H "Content-Type: application/json" -d '{}'
# Valider le setup
curl -s -X POST \
"http://$LIGHTHOUSE_IP:9999/api/setup/complete" \
-H "Content-Type: application/json" -d '{}'
Récupère l'API key générée au démarrage — elle apparaît dans les logs :
docker logs lighthouse 2>&1 | grep "API Key"
# → API Key (first 8 chars) api_key=...
L'API key complète est dans /data/lighthouse/config/config.yaml sous server.api_key.
6. Connecter le relay et démarrer l'indexeur
API_KEY="<ta-clé-complète>"
# Démarrer la connexion au relay
curl -s -X POST "http://$LIGHTHOUSE_IP:9999/api/relays/1/connect" \
-H "X-Api-Key: $API_KEY"
# Démarrer l'indexeur
curl -s -X POST "http://$LIGHTHOUSE_IP:9999/api/indexer/start" \
-H "X-Api-Key: $API_KEY"
À ce stade, docker logs lighthouse montre des torrents qui arrivent. Mais probablement zéro.
7. Ajouter le bot YGG à la whitelist
C'est le truc que j'ai mis du temps à comprendre. Lighthouse filtre les événements Nostr selon un système de “Web of Trust” — il n'indexe que les torrents publiés par des comptes de confiance. Avec une identité fraîchement générée sans abonnements, la liste des comptes de confiance est vide.
Le bot YGG a un seul pubkey sur le relay : 6aeb55064ea8b777591055e5704612e0e863fcc00bb211741781be299473c54e
En npub : npub1dt442pjw4zmhwkgs2hjhq3sjur5x8lxqpwepzaqhsxlzn9rnc48q5ezkq2
curl -s -X POST "http://$LIGHTHOUSE_IP:9999/api/trust/whitelist" \
-H "X-Api-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"npub": "npub1dt442pjw4zmhwkgs2hjhq3sjur5x8lxqpwepzaqhsxlzn9rnc48q5ezkq2",
"alias": "YGG Bot"
}'
# Relancer l'indexeur pour prendre en compte la whitelist
curl -s -X POST "http://$LIGHTHOUSE_IP:9999/api/indexer/stop" \
-H "X-Api-Key: $API_KEY"
curl -s -X POST "http://$LIGHTHOUSE_IP:9999/api/indexer/start" \
-H "X-Api-Key: $API_KEY"
Les logs montrent maintenant les torrents qui s'indexent.
8. Ajouter dans Prowlarr
Dans Prowlarr → Settings → Indexers → + Add → Generic Torznab :
- URL :
http://lighthouse:9999 - API Path :
/api/torznab - API Key : ta clé Lighthouse
- Categories : sélectionne ce qui t'intéresse (Movies, TV, etc.)
Clique sur Test — si tout est en place, Prowlarr valide la connexion. L'indexeur se synchronise ensuite automatiquement avec Radarr et Sonarr.
Ce qui fonctionne, ce qui ne fonctionne pas encore
Le contenu sur le relay ygg.gratis au moment où j'écris ça est clairement en phase de démarrage. Les 500 premiers événements indexés dans ma session étaient surtout des journaux PDF français, des BD et quelques films récents en FRENCH. Le catalogue est loin d'égaler ce qu'était YGGTorrent à son apogée.
C'est logique : la migration vers Nostr est récente. Les utilisateurs qui publiaient sur YGG doivent adopter le nouveau workflow. Le relay grossit progressivement.
La recherche Torznab fonctionne. Les résultats remontaient dans Prowlarr sans problème lors de mes tests. Les métadonnées (taille, seeders) sont présentes sur les torrents bien formatés.
Ce qui manque : un mécanisme pour découvrir automatiquement de nouveaux publishers de confiance sur le relay. Pour l'instant c'est manuel — si quelqu'un d'autre publie du contenu de qualité sur relay.ygg.gratis, il faut ajouter son npub à la whitelist à la main. La spec U2P mentionne un “Import Servarr” en cours de développement, qui devrait automatiser une partie de ça.
Pourquoi j'aime l'idée même si c'est encore chantier
La fragilité des anciens systèmes était structurelle. yggapi.eu existait parce que quelqu'un maintenait un scraper et un serveur. Quand cette personne a arrêté, tout est mort d'un coup. Ce n'est pas un reproche — c'est juste ce que ça coûte de faire tourner une infrastructure comme ça gratuitement sur le long terme.
Le modèle Nostr déplace la dépendance. Il n'y a plus de scraper central à maintenir. Le contenu existe tant que des relays l'hébergent et que des gens le publient. Lighthouse peut être remplacé par un autre client. Le relay peut migrer. La clé publique du bot YGG, elle, reste la même.
Est-ce que ça va tenir ? Je ne sais pas. La décentralisation en pratique produit souvent des systèmes plus fragiles que promis, juste pour des raisons différentes. Mais l'architecture est saine, et le fait qu'UTOPEER soit open-source avec une implémentation Torznab complète change la dynamique par rapport aux solutions précédentes.
Pour l'instant ça tourne chez moi, Prowlarr remonte des résultats, et le relay grossit. C'est suffisant pour que ce soit utile.