# 🐍 Agora 
> [!IMPORTANT]
> Merci de bien lire tout ça avant de déployer le server  
> Si vous êtes débutant(e) cette vidéo devrait répondre à vos questions  
[Vidéo tutoriel + DB](https://gofile.io/d/3CA4rk)

![Agora Logo](public/images/logo_svg.svg)

> "Un immense merci à l'équipe technique d'Hydracker pour sa générosité. On a trouvé votre API tellement 'ouverte d'esprit' qu'on s'est permis de l'aider à partager ses liens sans les contraintes futiles d'un navigateur ou d'un abonnement. C'est presque trop facile, mais comme on dit : c'est l'intention qui compte." 💅

---

## 🚀 Présentation

**Agora** est une solution complète (Serveur API + Interface Web) pour crawler, rechercher et télécharger du contenu depuis plusieurs sources :
- 🆓 **Zone-Telechargement (ZT)** : Source principale, 100% gratuite et sans token (films et séries). Les affiches et titres sont automatiquement enrichis par TMDB.
- 📰 **ZTNews** : Source secondaire gratuite (Zone-Téléchargement News) pour des exclusivités et nouveaux ajouts.
- ⚡ **FreeTélécharger (FreeTel)** : Source alternative gratuite avec de multiples miroirs.
- 🍿 **FS24** : Source spécialisée pour des films, séries et animés via streaming/téléchargement direct communautaire (nécessite un compte).
- 🎬 **FlixArt** : Source communautaire avec liens DDL, qualités et langues détaillées (nécessite un compte).
- 📦 **Loadix** : Source communautaire avec une API JSON propre — tendances, récents, recherche et qualités (pas de compte requis).
- 🎥 **Movix** : Source alternative gratuite de films et séries.
- 🗄️ **LocalDB** : Base de données locale intégrée pour des recherches hors-ligne instantanées (Films, Séries, Jeux, Logiciels, Musique, etc.).
- 🛡️ **Hydracker** : Source premium secondaire (nécessite un token et une configuration).

> [!IMPORTANT]
> **Nouveauté 1.5.2 :** Ajout du plugin FS24 avec support des tendances et ajouts récents, correction de l'enrichissement TMDB pour ZT, et sécurisation des paramètres utilisateurs (qui sont désormais stockés dans `database/config.json` et n'écrasent plus votre fichier `.env`). 
> **Nouveauté 1.5.4 :** Petite correction d'urgence concernant un encodage d'URL qui faisait planter les appels à l'API Hydracker (Erreur 401 Unauthorized sur les channels et titles).
> **Nouveauté 1.5.5 :** 
> - **Hydracker** : Correction de l'erreur 403 sur l'accès aux liens en utilisant l'endpoint `/download` pour les films et les séries. Les saisons sont désormais récupérées directement via la fiche du titre, et les liens de séries s'obtiennent en itérant sur les épisodes.
> - **FreeTélécharger** : Mise à jour de l'expression régulière du domaine pour supporter le nouveau TLD `.biz` (et tout autre changement de TLD futur pour `liens.free-telecharger.*`).
>
> **Nouveauté 1.5.6 :**
> - **Loadix** : Nouveau plugin communautaire avec recherche, tendances, ajouts récents et affichage détaillé des qualités/langues/tailles. Les liens sont protégés par Cloudflare Turnstile — l'utilisateur est redirigé vers le site pour résoudre le captcha manuellement.
> - **FlixArt** : Nettoyage complet du plugin — suppression de toute la logique Turnstile embarquée (impossible à résoudre en local). L'utilisateur est désormais redirigé vers le site source.
> - **Architecture** : Toutes les URLs sont désormais 100% dynamiques via `database/config.json` — plus aucun lien en dur dans le code source.
>
> La db locale (LocalDB) est au même endroit que la vidéo tuto ;) au dessus.

## ✨ Fonctionnalités

- 🔍 **Recherche & Tendances** : Chercher vos films et séries ou récupérer les tendances.
- 🗄️ **Base de Données Locale** : Recherche instantanée et hors-ligne grâce au plugin natif LocalDB.
- 💻 **Interface web** : Interface web moderne et responsive (Dark Mode, animations fluides).
- 🔗 **Affichage des liens** : Copier-coller le lien final s'affiche en un clic. 
- ⚡ **Intégration JDownloader** : Envoi automatique des liens vers votre instance JDownloader (si activé dans les paramètres).

## 🔑 Ce qui nécessite (ou pas) un token

| Fonctionnalité | 100% gratuit |
|---|---|
| 🔍 Recherche | ✅ Gratuit (ZT / LocalDB) |
| 🔥 Tendances | ✅ Gratuit (ZT) |
| 🎬 Films (liens 1fichier) | ✅ Gratuit (ZT / LocalDB) |
| 🖼️ Affiches (posters) | ✅ Gratuit (proxy intégré) |
| 📺 Séries (liens 1fichier) | ✅ Gratuit (ZT / LocalDB) |
| 🎮 Jeux / Logiciels / Ebooks | ✅ Gratuit (LocalDB uniquement) |


---

## 📸 Screenshots

### Interface Web

![Screenshot](images/screenshot_tendances.png)

### Qualités

![Screenshot](images/screenshot_quality.png)


---
## 🛠️ Installation

### 🐳 Via Docker (Recommandé)

C'est la méthode la plus simple pour garder un environnement propre. Nous utilisons désormais une image pré-construite qui se met à jour automatiquement.

```bash
# 1. Cloner le projet (si ce n'est pas déjà fait)
git clone https://github.com/NoNoBzH22/Agora

# 2. Préparer la configuration
cp .env.example .env

# 3. Lancer l'application
docker compose up -d
```
📍 Accès : `http://localhost:3067`

> [!TIP]
> L'application utilise l'image `ghcr.io/nonobzh22/Agora:latest`. Elle est reconstruite automatiquement à chaque mise à jour, vous n'avez plus besoin de compiler localement.

---

### 💻 Installation Manuelle
Pour ceux qui préfèrent une installation classique.

**Prérequis :** [Node.js](https://nodejs.org/) v20+

```bash
# 1. Préparer la configuration
cp .env.example .env

# 2. Installer les dépendances
npm install

# 3. Lancer l'application (compiler et démarrer)
npm run build && npm start
```

> [!TIP]
> Si vous avez `make` installé, vous pouvez simplifier les commandes :
> - `make start` : Installe, compile et lance l'application.
> - `make dev` : Développement avec rechargement automatique (ou `npm run dev`).


📍 Accès : `http://localhost:3067`

---

### ⚙️ Configuration (.env)

Créez un fichier `.env` à la racine du projet et configurez les variables suivantes :

| Variable | Type | Description |
|---|---|---|
| `ZT_URL` | **Requis** | URL complète du site Zone-Telechargement. |
| `ZTNEWS_URL` | Optionnel | URL complète de la source ZTNews. |
| `FT_URL` | Optionnel | URL complète de la source FreeTélécharger. |
| `HYDRACKER_URL` | Optionnel | URL complète de votre instance Hydracker (nécessaire si plugin actif). |
| `HYDRACKER_API_KEY` | Optionnel | Votre token Hydracker. |
| `FS24_URL` | Optionnel | URL complète de FS24. |
| `FS24_USERNAME` | Optionnel | Identifiant FS24. |
| `FS24_PASSWORD` | Optionnel | Mot de passe FS24. |
| `MOVIX_URL` | Optionnel | URL complète de Movix. |
| `FLIXART_URL` | Optionnel | URL complète de FlixArt. |
| `FLIXART_USERNAME` | Optionnel | Identifiant FlixArt. |
| `FLIXART_PASSWORD` | Optionnel | Mot de passe FlixArt. |
| `LOADIX_URL` | Optionnel | URL complète de Loadix. |
| `SECRET` | **Requis** | Clé secrète pour les sessions. |
| `PORT` | Optionnel | Port de l'application (Défaut : `3067`). |
| `DB_PATH` | Optionnel | Chemin vers la base locale (Défaut : `./database/darkiworld.db`). |
| `JD_HOST` | Optionnel | IP/Hôte de JDownloader. |
| `JD_API_PORT` | Optionnel | Port API de JDownloader (Défaut : `3128`). |

> [!WARNING]
> **Les URLs des sites sources** ne sont volontairement pas renseignées par défaut. Vous devez les remplir vous-même avec les URLs des sites sources respectifs.

> [!TIP]
> **Comment obtenir ma `HYDRACKER_API_KEY` ?**
> Connectez-vous sur votre instance Hydracker, cherchez la page **Paramètres du compte** et descendez jusqu'à **Jetons d'accès API**. 
> Cliquez sur **Créer un jeton** et copiez le token généré dans le champ `HYDRACKER_API_KEY` de votre `.env`.


## 🧩 Créer un nouveau Plugin

L'architecture d'Agora est modulaire. Vous pouvez facilement ajouter une nouvelle source en créant un plugin qui implémente l'interface `ISource`.

### 1. Structure
Créez un dossier dans `plugins/[NomDeVotreSource]/`. Vous aurez généralement besoin de :
- `index.ts` : Point d'entrée et implémentation de la classe.
- `api.ts` : Fonctions d'appels réseau.
- `parser.ts` : Logique d'extraction des données (Cheerio, JSON, etc.).

### 2. Implémentation
Votre classe doit implémenter `ISource` (`src/types/source.ts`) :

```typescript
export interface ISource {
    name: string;
    healthCheck(): Promise<boolean>;
    search(query: string, mediaType?: MediaType): Promise<SearchResult[]>;
    getTrending(mediaType: MediaType): Promise<SearchResult[]>;
    getSelection(identifier: string, type?: string, seasonValue?: string | number): Promise<SelectionData>;
    resolveLink?(linkId: string): Promise<string | null>; // Optionnel
}
```

### 3. Enregistrement
À la fin de votre fichier `index.ts`, enregistrez votre source :
```typescript
sourceRegistry.register(new VotrePluginAPI(CONFIG.VOTRE_URL));
```

Le serveur découvrira et chargera automatiquement votre plugin au démarrage.

## 🤝 Un Projet Communautaire
**Agora** est un projet fait par la communauté, pour la communauté. Parce que le savoir (et les liens de téléchargement) ne devrait jamais être prisonnier derrière des murs de paye ou des scripts de sécurité mal conçus. 
Chaque Pull Request est la bienvenue, tant qu'elle contribue à rendre l'accès encore plus fluide et... disons, "généreux".

## Note Liminaire
Cet outil est une preuve de concept destinée à la recherche et à l'apprentissage. Son auteur ne cautionne aucun usage abusif ni aucune violation de droits tiers. Il appartient à chaque utilisateur de s'assurer que ses activités restent conformes à la législation ; la responsabilité de l'usage incombe exclusivement à l'utilisateur final.

## 📜 Licence
Projet sous licence MIT. Faites-en bon usage (ou pas, on ne juge pas).
