Le dépôt officiel d'extensions pour Watchtower Regarder · Lire · Écouter · Jouer — tout en un
- Ajouter le dépôt à Watchtower
- Ajouter le dépôt via Live Container
- Ajouter manuellement
- Dépôts disponibles par app
- Architecture du dépôt
- Créer une extension
- Créer son propre dépôt
- Contribuer
Chaque extension doit continuer à exposer getSourcePreferences(), même
lorsqu'elle ne propose aucun réglage local (return []). Watchtower ajoute
automatiquement les réglages communs à partir des métadonnées de la source :
- qualité vidéo par défaut et qualité de secours (supérieure ou inférieure) ;
- langues préférées lorsque l'extension en publie plusieurs ;
- conservation de la session, partagée entre les requêtes HTTP et le WebView.
Les extensions doivent déclarer les qualités réellement supportées dans leur manifeste quand elles sont connues :
const watchtowerSources = [{
// ...
"videoQualities": ["2160p", "1080p", "720p", "480p", "360p"]
}];Les qualités déclarées ne servent pas à fabriquer des URLs : Watchtower les
utilise uniquement pour choisir une vidéo retournée par getVideoList().
Si une qualité exacte n'existe pas pour un épisode, le réglage de secours
choisit la voisine supérieure ou inférieure disponible.
Watchtower — ouvre l'app → Plus → Paramètres → Browse
Clique sur l'un des boutons ci-dessous pour ajouter le ou les dépôts correspondants :
| Type | Bouton |
|---|---|
| 📺 Watch — Anime, Films, Séries | |
| 📖 Manga — Manga, Manhwa, Comics | |
| 📚 Novel — Webnovels, Light novels | |
| 🎵 Music — Streaming musical | |
| 🎮 Game — ROMs & émulation |
Si tu as installé l'app via Live Container, utilise ces boutons à la place :
| Type | Bouton |
|---|---|
| 📺 Watch | |
| 📖 Manga | |
| 📚 Novel | |
| 🎵 Music | |
| 🎮 Game |
Ouvre l'app → Plus → Paramètres → Browse → Dépôts d'extensions → +
Colle l'URL correspondante :
# Dépôt principal (auto-détecte tous les types)
https://raw.githubusercontent.com/ferelking242/watchtower-extensions/main/repo.json
# Watch (Anime, Films, Séries)
https://raw.githubusercontent.com/ferelking242/watchtower-extensions/main/index/watch.json
# Manga & Comics
https://raw.githubusercontent.com/ferelking242/watchtower-extensions/main/index/manga.json
# Novels
https://raw.githubusercontent.com/ferelking242/watchtower-extensions/main/index/novel.json
# Musique
https://raw.githubusercontent.com/ferelking242/watchtower-extensions/main/index/music.json
# Jeux / ROMs
https://raw.githubusercontent.com/ferelking242/watchtower-extensions/main/index/game.json
Ces URLs sont compatibles avec plusieurs apps basées sur le même moteur.
📺 Watchtower — app principale
| Bouton | URL |
|---|---|
watchtower://add-repo?url=…/repo.json |
|
watchtower://add-repo?url=…/index/manga.json |
|
watchtower://add-repo?url=…/index/novel.json |
🦊 Mangayomi — fork upstream
| Bouton | URL |
|---|---|
mangayomi://add-repo?url=…/index/manga.json |
|
mangayomi://add-repo?url=…/index/novel.json |
📦 Live Container — installation sandboxée iOS
| Bouton | URL |
|---|---|
livecontainer://add-repo?url=…/repo.json |
|
livecontainer://add-repo?url=…/index/manga.json |
|
livecontainer://add-repo?url=…/index/novel.json |
watchtower-extensions/
│
├── 📁 src/ ← Code source des extensions (.js)
│ │
│ ├── 📁 watch/ ← Sources vidéo (anime, films, séries)
│ │ ├── 📁 multi/ ← Extensions multi-langues (1 fichier = N langues)
│ │ ├── 📁 en/ ← Sources anglophones uniquement
│ │ ├── 📁 fr/ ← Sources francophones uniquement
│ │ ├── 📁 de/ es/ zh/ … ← Autres langues
│ │ └── 📁 nsfw/ ← Contenu adulte (désactivé par défaut)
│ │ ├── 📁 en/
│ │ ├── 📁 ja/ ← JAV & sources japonaises
│ │ └── 📁 multi/
│ │
│ ├── 📁 manga/ ← Sources manga, manhwa, comics
│ │ ├── 📁 multi/ ← MangaDex, Comick, Webtoons, Mangafire…
│ │ ├── 📁 en/ fr/ ar/ … ← Sources langue-spécifiques
│ │ └── 📁 nsfw/multi/ ← MangaDex Unlocked
│ │
│ ├── 📁 novel/en/ ← RoyalRoad, WuxiaWorld, NovelFire…
│ ├── 📁 game/en/ ← Sources ROM / émulation
│ ├── 📁 music/ ← SoundCloud, Deezer, YouTube Music…
│ └── 📁 plugins/ ← Plugins système (téléchargeurs, sync…)
│
├── 📁 index/ ← Index JSON générés (lus par l'app)
│ ├── watch.json ← Index Watch
│ ├── manga.json ← Index Manga
│ ├── novel.json ← Index Novel
│ ├── game.json ← Index Game
│ └── music.json ← Index Music
│
├── 📁 docs/ ← Site web GitHub Pages
├── 📁 tools/ ← Scripts de build et de test
├── 📁 local_sources/ ← Templates pour sources personnelles
├── 📄 repo.json ← Point d'entrée principal
└── 📄 README.md
Pourquoi
multi/? MangaDex supporte 45 langues avec un seul fichier. L'ancienne structure créait 42 entrées identiques dans la marketplace. Maintenant : 1 entrée, toutes les langues.
Voir le guide complet
Une extension = un fichier JS qui exporte watchtowerSources :
const watchtowerSources = [{
"name": "Ma Source",
"lang": "en", // ou "multi" si plusieurs langues
"baseUrl": "https://monsite.com",
"iconUrl": "https://monsite.com/favicon.ico",
"typeSource": "single",
"itemType": 1, // 0=manga 1=watch 2=novel 4=game
"isManga": false,
"isNsfw": false,
"hasCloudflare": false,
"version": "1.0.0",
"appMinVerReq": "0.5.0",
"sourceCodeLanguage": 1, // 1=JavaScript
}];
async function search(query, page) {
const url = `${source.baseUrl}/search?q=${encodeURIComponent(query)}&page=${page}`;
const res = await fetch(url);
const $ = await parseHtml(await res.text());
return {
list: $('.item').toArray().map(el => ({
name: $(el).find('.title').text().trim(),
imageUrl: $(el).find('img').attr('src'),
link: $(el).find('a').attr('href'),
})),
hasNextPage: !!$('.next-page').length,
};
}
async function getDetail(url) { /* … */ }
async function getVideoList(url) { /* … */ } // pour watch
async function getPageList(url) { /* … */ } // pour mangaLes index sont affichés comme un catalogue mobile. Pour obtenir une fiche complète dans Watchtower, chaque entrée peut aussi fournir les champs suivants :
| Champ | Type | Utilisation |
|---|---|---|
notes ou description |
string | Résumé court affiché sous le nom |
sizeBytes |
number | Poids du fichier JavaScript téléchargé |
rating |
number | Note entre 0 et 5 |
reviewCount |
number | Nombre d'avis associés à la note |
Ces champs sont optionnels pour rester compatibles avec les dépôts existants. Watchtower conserve une description et une taille lisibles lorsqu'un index ancien ne les renseigne pas. Les notes doivent rester basées sur la qualité réelle de la source : disponibilité, stabilité, couverture et qualité des résultats, pas sur le nombre de téléchargements.
| Valeur | Type |
|---|---|
0 |
Manga / Comic |
1 |
Watch / Anime / Vidéo |
2 |
Novel / Ebook |
4 |
Game / ROM |
| API | Description |
|---|---|
fetch(url, options?) |
HTTP avec support cookies |
parseHtml(html) |
Sélecteur Cheerio-like |
source |
Config de la source courante |
btoa / atob |
Base64 |
CryptoJS |
AES, MD5, etc. |
Si ta source supporte plusieurs langues, utilise "lang": "multi" et le champ "langs" :
const watchtowerSources = [{
"lang": "multi",
"langs": ["en", "fr", "de", "ja"],
"ids": {
"en": 810342358,
"fr": 545017689,
// …
}
}];Cela crée une seule entrée dans la marketplace avec un sélecteur de langue intégré.
// Dans le fichier source :
"isNsfw": true
// Placement dans le repo :
src/nsfw/watch/en/masource.js
src/nsfw/manga/multi/masource.jsLe contenu NSFW est masqué par défaut — l'utilisateur doit l'activer dans Paramètres → Browse.
Guide pas à pas
mon-depot/
├── repo.json
├── index/
│ └── manga.json
└── src/
└── manga/
└── en/
└── masource.js
{
"name": "Mon Dépôt",
"website": "https://github.com/moncompte/mon-depot",
"watchJsonUrl": "https://raw.githubusercontent.com/moncompte/mon-depot/main/index/watch.json",
"mangaJsonUrl": "https://raw.githubusercontent.com/moncompte/mon-depot/main/index/manga.json",
"novelJsonUrl": "https://raw.githubusercontent.com/moncompte/mon-depot/main/index/novel.json"
}[
{
"name": "Ma Source",
"id": 9000000001,
"baseUrl": "https://monsite.com",
"lang": "en",
"typeSource": "single",
"iconUrl": "https://monsite.com/favicon.ico",
"isNsfw": false,
"hasCloudflare": false,
"sourceCodeUrl": "https://raw.githubusercontent.com/moncompte/mon-depot/main/src/manga/en/masource.js",
"version": "1.0.0",
"isManga": true,
"itemType": 0,
"appMinVerReq": "0.5.0",
"sourceCodeLanguage": 1
}
]ID unique : commence à
9000000001pour éviter les collisions avec ce dépôt officiel.
Rends le repo GitHub public, puis partage l'URL :
https://raw.githubusercontent.com/moncompte/mon-depot/main/repo.json
À chaque modification d'un fichier JS, incrémente le champ version dans l'index JSON. Watchtower affiche alors le badge « Mettre à jour » dans la marketplace.
- Fork ce dépôt
- Place ton fichier JS dans
src/<type>/<lang>/masource.js - Ajoute une entrée dans
index/<type>.json - Si c'est une mise à jour, bump la version dans l'index
- Ouvre une Pull Request — titre :
[manga/en] Add MonSite v1.0.0
- ✅ Sources NSFW →
isNsfw: true+ placées danssrc/nsfw/<type>/<lang>/ - ✅ Version SemVer :
MAJOR.MINOR.PATCH - ✅
appMinVerReqdoit correspondre à la version Watchtower minimum requise - ❌ Pas de code malveillant ou de tracking utilisateur
- ❌ Pas de clés API hardcodées
MIT License · Watchtower · Signaler un bug