# 🐍 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/icone-192.png)

> "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).
- 📰 **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.
- 🗄️ **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é :** La recherche, les tendances, les films ET les séries sont désormais **100% gratuits et sans aucun token** par défaut grâce aux plugins ZT, ZTNews et FreeTel.   
> 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). |
| `API_PASSWORD` | **Requis** | Mot de passe pour l'écran de connexion initial. |
| `SECRET` | **Requis** | Clé secrète pour les sessions. |
| `HYDRACKER_API_KEY` | Optionnel | Votre token Hydracker. |
| `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.

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

## 🤝 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).
