import requests
from bs4 import BeautifulSoup
import re
import os
import json
from requests import Session
from urllib.parse import unquote, urlparse

# خوندن کوکی ورود
try:
    with open('logedin.txt', 'r') as f:
        logedin = f.readline().strip()
except FileNotFoundError:
    print("Error: logedin.txt not found!")
    exit()

# پاک کردن linkss.txt قبلی
if os.path.exists('linkss.txt'):
    os.remove('linkss.txt')

# تنظیمات اولیه برای درخواست‌ها
session = Session()
cookies = {'wordpress_logged_in_7a04687845b0293923d85c8b5afee67b': logedin}
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}

def clean_mp4_url(url):
    """لینک mp4 را تمیز می‌کند اما کوئری استرینگ را حذف نمی‌کند."""
    if "url=" in url:
        try:
            m = re.search(r'url=([^&]+)', url)
            if m:
                decoded = unquote(m.group(1))
                return decoded  # کوئری‌ها حفظ می‌شوند
        except:
            pass
    return url  # کوئری‌ها حفظ می‌شوند

def get_content_info(id):
    """گرفتن نام و IMDb از صفحه اطلاعات"""
    url_info = f'https://zhomis.info/?p={id}'
    try:
        response = session.get(url_info, cookies=cookies, headers=headers, timeout=20)
        if response.status_code != 200:
            print(f"Skip info {id}: Status {response.status_code}")
            return None, None
        
        soup = BeautifulSoup(response.text, 'html.parser')
        title_tag = soup.find('title')
        if title_tag:
            raw_title = title_tag.text.strip()
            print(f"Raw title for ID {id}: {raw_title}")
            name = re.sub(r' - .*?$', '', raw_title)
            name = re.sub(r'tt\d+', '', name).strip()
        else:
            name = "Unknown"
        
        imdb = ''
        for a in soup.find_all('a', href=True):
            if '/title/' in a['href'] and 'imdb.com' in a['href']:
                imdb = a['href'].split('/')[-2].strip()
                break
        print(f"Extracted name for ID {id}: {name}, IMDb: {imdb}")
        return name, imdb
    except requests.RequestException as e:
        print(f"Skip info {id}: {e}")
        return None, None

def get_links_movie(id, name, imdb):
    """گرفتن لینک‌های فیلم (با حذف اضافات جدید سایت)"""
    url_play = f'https://zhomis.info/play/{id}/'
    try:
        response = session.get(url_play, cookies=cookies, headers=headers, timeout=20)
        if response.status_code != 200:
            print(f"Skip movie {id}: Status {response.status_code}")
            return

        html = response.text

        mp4s = re.findall(r'https://[^\s"\'<>]+?\.mp4(?:\?[^\s"\'<>]+)?', html)
        vtts = re.findall(r'https://[^\s"\'<>]+?\.vtt(?:\?[^\s"\'<>]+)?', html)

        # حذف تکراری‌ها
        mp4s = list(set(mp4s))
        vtts = list(set(vtts))

        # فیلتر برای حذف لینک‌های ناقص یا عبارات تکراری بعد از .mp4
        mp4s = [x.strip().replace('",', '').replace('"}', '') for x in mp4s if x.startswith('https://')]
        vtts = [x.strip().replace('",', '').replace('"}', '') for x in vtts if x.startswith('https://')]

        if not mp4s and not vtts:
            print(f"No valid movie links for ID {id}")
            return

        with open('linkss.txt', 'a', encoding='utf-8') as add:
            for link in mp4s:
                final_link = clean_mp4_url(link)
                add.write(f'{id};{name};{imdb};{final_link}\n')

            # فقط زیرنویس فارسی (Dubbed حذف بشه)
            for link_srt in vtts:
                if 'Dubbed' not in link_srt:
                    final_link = clean_mp4_url(link_srt)
                    add.write(f'{id};{name};{imdb};{final_link}\n')

    except requests.RequestException as e:
        print(f"Skip movie {id}: {e}")

def get_links_serial(id, name, imdb):
    """گرفتن لینک‌های سریال"""
    url_play = f'https://zhomis.info/play/{id}/'
    try:
        response = session.get(url_play, cookies=cookies, headers=headers, timeout=20)
        if response.status_code != 200:
            print(f"Skip serial {id}: Status {response.status_code}")
            return

        if '"file"' not in response.text:
            print(f"No serial data for ID {id}")
            return

        json_data = re.findall(r'"file"(.*?)}', response.text.replace('\/', '/'))
        if not json_data:
            print(f"No valid serial data for ID {id}")
            return

        with open('linkss.txt', 'a', encoding='utf-8') as add:
            for x in json_data:
                try:
                    json_loaded = json.loads('{"file"'+x+'}')
                    file = clean_mp4_url(json_loaded['file'])
                    fa_vtt = ''
                    if json_loaded.get('fa_vtt'):
                        fa_vtt = json_loaded['fa_vtt']  # هیچ‌چیز حذف نمی‌شود (query string حفظ می‌شود)
                    season = str(int(json_loaded['season']) + 1)
                    part = str(int(json_loaded['part']) + 1)
                    add.write(f'{id};{name};{part};{season};{imdb};{fa_vtt};{file}\n')
                except Exception as e:
                    print(f"Skip serial data {id}: {e}")
    except requests.RequestException as e:
        print(f"Skip serial {id}: {e}")

# خوندن IDها
try:
    with open('zarfilm_ids.txt', 'r', encoding='utf-8') as f:
        ids_list = [line.strip().split(';')[0] for line in f if line.strip()]
except FileNotFoundError:
    print("Error: zarfilm_ids.txt not found!")
    exit()

# بررسی و پردازش IDها
for id in ids_list:
    try:
        if not id.isdigit():
            print(f"Invalid ID: {id}. Skipping...")
            continue
        
        print(f"Processing ID: {id}")
        name, imdb = get_content_info(id)
        if not name or not imdb:
            print(f"Skipping ID {id}: No info found")
            continue

        get_links_movie(id, name, imdb)
        get_links_serial(id, name, imdb)
        print(f"Processed ID: {id}")
    except Exception as e:
        print(f"Error ID {id}: {e}")
