#!/usr/bin/env python3
"""
Test de téléchargement d'une vidéo Instagram avec yt-dlp
"""

import subprocess
import json
import logging
import os
import time

# Configuration du logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def download_instagram_video(url, cdn_url=None, output_dir="downloads"):
    """Télécharge une vidéo Instagram via yt-dlp ou directement depuis le CDN"""
    
    logger.info(f"🔄 Téléchargement depuis Instagram: {url}")
    
    # Si on a une URL CDN, on l'utilise directement
    if cdn_url:
        logger.info("Utilisation de l'URL CDN directe")
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
            
        output_file = os.path.join(output_dir, f"video_{int(time.time())}.mp4")
        
        # Headers pour simuler un navigateur Instagram
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
            'Accept': 'video/webm,video/mp4,video/*;q=0.9',
            'Accept-Language': 'en-US,en;q=0.5',
            'Range': 'bytes=0-',
            'DNT': '1',
            'Connection': 'keep-alive',
            'Referer': 'https://www.instagram.com/',
            'Sec-Fetch-Dest': 'video',
            'Sec-Fetch-Mode': 'no-cors',
            'Sec-Fetch-Site': 'cross-site',
            'Pragma': 'no-cache',
            'Cache-Control': 'no-cache',
        }
        
        try:
            # Télécharger directement depuis le CDN
            cmd = [
                'curl',
                cdn_url,
                '-L',  # Suivre les redirections
                '-o', output_file,
                '--retry', '3',  # Réessayer 3 fois en cas d'erreur
                '--retry-delay', '2',  # Attendre 2 secondes entre les essais
            ]
            
            # Ajouter les headers
            for header, value in headers.items():
                cmd.extend(['-H', f'{header}: {value}'])
                
            logger.debug(f"Commande curl: {' '.join(cmd)}")
            
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            stdout, stderr = process.communicate()
            
            if process.returncode == 0 and os.path.exists(output_file):
                # Vérifier que le fichier n'est pas vide
                if os.path.getsize(output_file) > 0:
                    logger.info(f"✅ Vidéo téléchargée: {output_file}")
                    return output_file
                else:
                    logger.error("❌ Fichier téléchargé vide")
                    os.remove(output_file)
                    return None
            else:
                logger.error(f"❌ Erreur lors du téléchargement: {stderr.decode()}")
                return None
                
        except Exception as e:
            logger.error(f"❌ Erreur: {str(e)}")
            return None
            
    # Sinon on utilise yt-dlp
    try:
        process = subprocess.Popen(
            ['yt-dlp', '--version'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        stdout, stderr = process.communicate()
        
        if process.returncode != 0:
            logger.info("Installation de yt-dlp...")
            install_process = subprocess.Popen(
                ['pip', 'install', 'yt-dlp'],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
            stdout, stderr = install_process.communicate()
            
            if install_process.returncode != 0:
                logger.error("❌ Erreur lors de l'installation de yt-dlp")
                logger.error(stderr.decode())
                return None
    except FileNotFoundError:
        logger.info("Installation de yt-dlp...")
        install_process = subprocess.Popen(
            ['pip', 'install', 'yt-dlp'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        stdout, stderr = install_process.communicate()
        
        if install_process.returncode != 0:
            logger.error("❌ Erreur lors de l'installation de yt-dlp")
            logger.error(stderr.decode())
            return None
    
    # Créer le dossier de téléchargement s'il n'existe pas
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    try:
        # Construire le nom du fichier de sortie
        output_file = os.path.join(output_dir, f"video_{int(time.time())}.%(ext)s")
        
        # Télécharger la vidéo avec yt-dlp
        logger.info("🔄 Téléchargement de la vidéo...")
        download_cmd = [
            'yt-dlp',
            url,
            '--format', 'best',  # Meilleure qualité disponible
            '-o', output_file,
            '--no-warnings',
            '--no-progress',
            '--no-playlist',
            '--extract-audio',  # Extraire l'audio aussi
            '--keep-video',
            '--retries', '3'
        ]
        
        process = subprocess.Popen(
            download_cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        stdout, stderr = process.communicate()
        
        if process.returncode != 0:
            logger.error(f"❌ Erreur lors du téléchargement: {stderr.decode()}")
            return None
            
        # Trouver le fichier téléchargé
        downloaded_file = None
        base_filename = f"video_{int(time.time())}"
        for file in os.listdir(output_dir):
            if file.startswith(base_filename):
                downloaded_file = os.path.join(output_dir, file)
                break
                
        if downloaded_file and os.path.exists(downloaded_file):
            logger.info(f"✅ Vidéo téléchargée: {downloaded_file}")
            return downloaded_file
        else:
            logger.error("❌ Fichier vidéo non trouvé après le téléchargement")
            return None
            
    except Exception as e:
        logger.error(f"❌ Erreur: {str(e)}")
        return None

if __name__ == "__main__":
    url = "https://www.instagram.com/reel/C2_Kh6mPmGl/"
    cdn_url = "https://scontent.cdninstagram.com/o1/v/t16/f2/m86/AQMWKOVUFLAB1b3xqxHkF3luW51rOU5fNHg-CcmCXpDXeSoqlF2xWs1ey1g-bzGwRjty8wnLCDt7-AugOR1N177Ji3ki52EREpw276M.mp4?stp=dst-mp4&efg=eyJxZV9ncm91cHMiOiJbXCJpZ193ZWJfZGVsaXZlcnlfdnRzX290ZlwiXSIsInZlbmNvZGVfdGFnIjoidnRzX3ZvZF91cmxnZW4uY2xpcHMuYzIuNzIwLmJhc2VsaW5lIn0&_nc_cat=110&vs=1296922772053032_1227529525&_nc_vs=HBksFQIYUmlnX3hwdl9yZWVsc19wZXJtYW5lbnRfc3JfcHJvZC84NDQ2OEQwMTVDREIyRTFFQTdFOUY0Rjc3N0VGNEQ5Ml92aWRlb19kYXNoaW5pdC5tcDQVAALIARIAFQIYOnBhc3N0aHJvdWdoX2V2ZXJzdG9yZS9HT1NGVmgtc09GVHhxdGtEQVAwT2IxTnYxaFpHYnFfRUFBQUYVAgLIARIAKAAYABsAFQAAJtqz%2B4%2BtlsY%2FFQIoAkMzLBdAQNHrhR64UhgSZGFzaF9iYXNlbGluZV8xX3YxEQB1%2Fgdl5p0BAA%3D%3D&_nc_rid=207af63a66&ccb=9-4&oh=00_AfVxf3VemOcJq4eOfGRxZiYV3B3SOUuS2le76aocHNG3GQ&oe=6893E2E8&_nc_sid=10d13b"
    result = download_instagram_video(url, cdn_url=cdn_url)
    
    if result:
        print(f"\n✅ Vidéo téléchargée avec succès: {result}")
    else:
        print("\n❌ Échec du téléchargement")
