import requests
import json
import time
import os

# 🔹 CONFIGURATION 🔹
API_KEY = "lUCRvOPYXci0DOVAz61u"  # 🔑 Clé API AllDebrid
PROXY = "http://lClXMfmYmiIMtc2:8ww25795ye6RYjO@46.203.211.10:45803"  # 🔹 Proxy
MAGNET_FILE = "magnets.txt"  # 📂 Fichier contenant les magnets
OUTPUT_FILE = "magnets_files.json"  # 📂 Liens sauvegardés

# 🔹 URLs API AllDebrid 🔹
API_MAGNET_UPLOAD = "https://api.alldebrid.com/v4/magnet/upload"
API_MAGNET_STATUS = "https://api.alldebrid.com/v4.1/magnet/status"
API_MAGNET_FILES = "https://api.alldebrid.com/v4/magnet/files"
API_LINKS_SAVE = "https://api.alldebrid.com/v4/user/links/save"
API_MAGNET_DELETE = "https://api.alldebrid.com/v4/magnet/delete"

# 🔹 Configurer le proxy 🔹
PROXIES = {"http": PROXY, "https": PROXY}
DEBUG = True  # 🔍 Mode Debugging

# 🔹 Extensions vidéo valides 🔹
VIDEO_EXTENSIONS = {".mkv", ".mp4", ".avi"}

# 🔹 Lire le fichier magnets.txt par blocs de 30 🔹
def read_magnets_by_chunks(filename, chunk_size=30):
    with open(filename, "r", encoding="utf-8") as f:
        chunk = []
        for line in f:
            parts = line.strip().split(" | ")
            if len(parts) == 3:
                _, _, magnet_link = parts
                chunk.append(magnet_link)

            if len(chunk) == chunk_size:
                yield chunk
                chunk = []

        if chunk:
            yield chunk

# 🔹 Envoyer un batch de magnets à AllDebrid 🔹
def upload_magnet_batch(magnet_links):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    response = requests.post(API_MAGNET_UPLOAD, headers=headers, proxies=PROXIES, data={"magnets[]": magnet_links})
    data = response.json()

    if DEBUG:
        print("\n🔍 **Réponse API Upload :**", json.dumps(data, indent=4))

    uploaded_ids = []
    if data.get("status") == "success":
        for item in data["data"]["magnets"]:
            if "id" in item:
                uploaded_ids.append(item["id"])
            else:
                print(f"⚠️ Magnet ignoré (pas d'ID) : {item}")

    return uploaded_ids

# 🔹 Vérifier le statut des magnets 🔹
def check_magnet_status():
    headers = {"Authorization": f"Bearer {API_KEY}"}
    response = requests.post(API_MAGNET_STATUS, headers=headers, proxies=PROXIES)
    data = response.json()

    if DEBUG:
        print("\n🔍 **Réponse API Statut Magnets :**", json.dumps(data, indent=4))

    ready_magnets = []
    all_magnets = []

    if data.get("status") == "success" and "magnets" in data["data"]:
        for magnet in data["data"]["magnets"]:
            all_magnets.append(magnet["id"])
            if magnet["status"] == "Ready":
                ready_magnets.append(magnet)

    return ready_magnets, all_magnets

# 🔹 Récupérer les fichiers des magnets 🔹
def fetch_magnet_files(magnet_ids):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    response = requests.post(API_MAGNET_FILES, headers=headers, proxies=PROXIES, data={"id[]": magnet_ids})
    data = response.json()

    if DEBUG:
        print("\n🔍 **Réponse API Fichiers :**", json.dumps(data, indent=4))

    if not data or "data" not in data or "magnets" not in data["data"]:
        return []

    return data["data"]["magnets"]

# 🔹 Extraire les liens vidéo 🔹
def extract_and_save_files(files_data):
    all_files = []

    def parse_tree(tree):
        for item in tree:
            if "e" in item:
                parse_tree(item["e"])
            else:
                file_ext = os.path.splitext(item["n"])[1].lower()
                if file_ext in VIDEO_EXTENSIONS:
                    all_files.append({"filename": item["n"], "size": round(item["s"] / (1024 * 1024 * 1024), 2), "url": item["l"]})

    for file_data in files_data:
        if "files" in file_data:
            parse_tree(file_data["files"])

    return all_files

# 🔹 Enregistrer les liens sur AllDebrid 🔹
def save_links_to_alldebrid(links):
    if not links:
        return False

    headers = {"Authorization": f"Bearer {API_KEY}"}
    response = requests.post(API_LINKS_SAVE, headers=headers, proxies=PROXIES, data={"links[]": links})
    data = response.json()

    if DEBUG:
        print("\n🔍 **Réponse API Enregistrement Liens :**", json.dumps(data, indent=4))

    return data.get("status") == "success"

# 🔹 Supprimer un batch de magnets 🔹
def delete_magnets(magnet_ids):
    headers = {"Authorization": f"Bearer {API_KEY}"}
    for magnet_id in magnet_ids:
        if not magnet_id:
            continue

        response = requests.post(API_MAGNET_DELETE, headers=headers, proxies=PROXIES, data={"id": magnet_id})
        data = response.json()

        if DEBUG:
            print("\n🔍 **Réponse API Suppression Magnet :**", json.dumps(data, indent=4))

# 🔹 Processus par batch de 30 🔹
def process_magnets():
    all_uploaded_ids = []

    for magnet_batch in read_magnets_by_chunks(MAGNET_FILE, 30):
        uploaded_ids = upload_magnet_batch(magnet_batch)
        all_uploaded_ids.extend(uploaded_ids)

        if not uploaded_ids:
            continue  

        time.sleep(10)

        ready_magnets, all_magnets = check_magnet_status()

        if ready_magnets:
            files_data = fetch_magnet_files([m["id"] for m in ready_magnets])
            extracted_files = extract_and_save_files(files_data)

            if extracted_files:
                with open(OUTPUT_FILE, "a", encoding="utf-8") as f:
                    json.dump(extracted_files, f, indent=4, ensure_ascii=False)

                links_to_save = [file["url"] for file in extracted_files]
                save_links_to_alldebrid(links_to_save)

        delete_magnets(all_magnets)

    delete_magnets(all_uploaded_ids)

# 🔹 Exécuter le script 🔹
if __name__ == "__main__":
    process_magnets()
