#!/usr/bin/env python3
"""
Test de téléchargement d'une vidéo Instagram en utilisant l'API mobile
"""

import subprocess
import json
import logging
import os
import time
import re
from urllib.parse import urlencode

# Configuration du logging
logging.basicConfig(level=logging.DEBUG)  # Passer en mode DEBUG
logger = logging.getLogger(__name__)

def extract_post_id(url):
    """Extrait l'ID du post Instagram depuis l'URL"""
    patterns = [
        r'instagram\.com/p/([^/]+)',
        r'instagram\.com/reel/([^/]+)',
    ]
    for pattern in patterns:
        match = re.search(pattern, url)
        if match:
            return match.group(1).split('/')[0]  # Enlever les paramètres d'URL
    return None

def download_instagram_video(url, output_dir="downloads"):
    """Télécharge une vidéo Instagram via l'API mobile"""
    
    logger.info(f"🔄 Téléchargement depuis Instagram: {url}")
    
    # Créer le dossier de téléchargement s'il n'existe pas
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # Extraire l'ID du post
    post_id = extract_post_id(url)
    if not post_id:
        logger.error("❌ URL Instagram invalide")
        return None
        
    try:
        # Headers pour les requêtes (simulation d'un client mobile)
        headers = {
            'User-Agent': 'Instagram 219.0.0.12.117 Android',
            'Accept': '*/*',
            'Accept-Language': 'en-US',
            'Accept-Encoding': 'gzip, deflate',
            'X-IG-Capabilities': '3brTvw==',
            'X-IG-Connection-Type': 'WIFI',
            'X-IG-App-ID': '936619743392459',
            'X-IG-WWW-Claim': '0',
        }
        
        # D'abord, récupérer les informations via l'API mobile
        logger.info("Récupération des informations via l'API mobile...")
        api_url = f"https://i.instagram.com/api/v1/media/{post_id}/info/"
        
        api_cmd = [
            'curl',
            api_url,
            '-H', f'User-Agent: {headers["User-Agent"]}',
            '-H', f'Accept: {headers["Accept"]}',
            '-H', f'Accept-Language: {headers["Accept-Language"]}',
            '-H', f'X-IG-App-ID: {headers["X-IG-App-ID"]}',
            '-H', f'X-IG-WWW-Claim: {headers["X-IG-WWW-Claim"]}',
            '-H', f'X-IG-Capabilities: {headers["X-IG-Capabilities"]}',
            '-H', f'X-IG-Connection-Type: {headers["X-IG-Connection-Type"]}',
            '--compressed',
            '-s'  # Mode silencieux
        ]
        
        # Debug: afficher la commande
        logger.debug(f"Commande API: {' '.join(api_cmd)}")
        
        process = subprocess.Popen(api_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = process.communicate()
        
        if process.returncode != 0:
            logger.error(f"❌ Erreur lors de la requête API: {stderr.decode()}")
            return None
            
        # Debug: afficher la réponse
        logger.debug(f"Réponse API: {stdout.decode()}")
            
        try:
            response_data = json.loads(stdout)
            
            if 'items' not in response_data or not response_data['items']:
                logger.error("❌ Pas de données dans la réponse API")
                return None
                
            media = response_data['items'][0]
            
            if 'video_versions' not in media:
                logger.error("❌ Ce post n'est pas une vidéo")
                return None
                
            # Prendre la meilleure qualité
            video_url = media['video_versions'][0]['url']
            
            # Télécharger la vidéo
            output_file = os.path.join(output_dir, f"video_{int(time.time())}.mp4")
            logger.info("🔄 Téléchargement de la vidéo...")
            
            download_cmd = [
                'curl',
                video_url,
                '-L',  # Suivre les redirections
                '-o', output_file,
                '-H', f'User-Agent: {headers["User-Agent"]}',
                '--compressed',
                '-s'  # Mode silencieux
            ]
            
            # Debug: afficher la commande de téléchargement
            logger.debug(f"Commande de téléchargement: {' '.join(download_cmd)}")
            
            download_process = subprocess.Popen(download_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout, stderr = download_process.communicate()
            
            if download_process.returncode == 0 and os.path.exists(output_file):
                logger.info(f"✅ Vidéo téléchargée: {output_file}")
                return output_file
            else:
                logger.error(f"❌ Erreur lors du téléchargement: {stderr.decode()}")
                return None
                
        except json.JSONDecodeError:
            logger.error("❌ Erreur de décodage JSON de la réponse API")
            logger.error(f"Réponse reçue: {stdout.decode()}")
            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/"
    result = download_instagram_video(url)
    
    if result:
        print(f"\n✅ Vidéo téléchargée avec succès: {result}")
    else:
        print("\n❌ Échec du téléchargement")
