"""
Script Name: 
Description: 获取 u9a9 数据， prompt:
    我们需要访问 https://u9a9.org/?type=2&search={q}&p=4 这个地址，并返回数据，以下是需求详细描述：
    q 参数，我们有一个数组，分别是 qlist = ['[BD', '合集2'] 
    p 参数，是要访问的页码，它通常从1开始。

    我们循环遍历 qlist，对每一个值，从 p=1 开始，组成一个访问的 URL， 获取该 URL 的内容，它是一个页面，页面结构简化之后，就是我刚才发给你的内容。我们需要做的是：
    解析 tbody 标签中的若干个 tr，对每个 tr，获取第二个 td 中的 title 文本，并去掉 [BD/{}] 的部分，记为title；
        获取第三个td中的第一个链接，它是一个 .torrent 文件，我们下载它，命名为 {title}..torrent ;
    然后我们解析 <div class="center"> 中的内容，它是一个页码导航，我们只需要关注 li 中文本为 >> 的这一行，解析出 href 字段，并取出 p 值，这个值与上面的URL拼起来，就是我们要访问的下一页。如果没有 匹配到这一行，那就代表访问结束了。

    请你理解上面的需求，并写出相应的 python脚本。

Author: [Your Name]
Created Date: YYYY-MM-DD
Last Modified: YYYY-MM-DD
Version: 1.0


Modification History:
    - YYYY-MM-DD [Your Name]: 
    - YYYY-MM-DD [Your Name]: 
    - YYYY-MM-DD [Your Name]: 
"""

import requests
from bs4 import BeautifulSoup
import re
import os
import time

# 模拟头部，避免被认为是爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'
}

# 定义搜索词数组
qlist = ['[BD']

# 定义下载路径
download_path = "./torrents/"
if not os.path.exists(download_path):
    os.makedirs(download_path)

def download_torrent(torrent_url, title):
    try:
        # 获取 .torrent 文件
        response = requests.get(torrent_url, headers=headers, stream=True)
        torrent_file_name = f"{title}.torrent"
        torrent_path = os.path.join(download_path, torrent_file_name)
        
        # 保存文件
        with open(torrent_path, 'wb') as f:
            f.write(response.content)
        print(f"Downloaded: {torrent_file_name}")
    except Exception as e:
        print(f"Error downloading {torrent_url}: {str(e)}")

# 解析页面内容
def parse_page(html_content):
    soup = BeautifulSoup(html_content, 'html.parser')
    
    # 获取 tbody 标签中的所有 tr 行
    tbody = soup.find('tbody')
    rows = tbody.find_all('tr', class_='default')

    for row in rows:
        # 获取第二个td中的标题文本，并去掉 [BD/{}] 部分
        title_td = row.find_all('td')[1]
        raw_title = title_td.find('a')['title'].strip()
        #title = re.sub(r'\[BD/\d+\.\d+G\]', '', raw_title).strip()
        title = re.sub(r'\[.*?\]', '', raw_title).strip()
        
        # 获取第三个td中的第一个链接
        magnet_td = row.find_all('td')[2]
        torrent_link = magnet_td.find('a', href=re.compile(r'.torrent'))['href']
        # 拼接完整的链接并移除 host 中的 '-'
        full_torrent_link = f"https:{torrent_link}".replace('-', '')
        
        # 下载 torrent 文件
        download_torrent(full_torrent_link, title)
        time.sleep(3)  # 避免请求过快
    
    # 解析页码导航，获取下一页链接
    pagination = soup.find('div', class_='center').find('nav').find('ul', class_='pagination')
    next_page = pagination.find('a', text='»')
    
    if next_page:
        next_page_url = next_page['href']
        next_p_value = re.search(r'p=(\d+)', next_page_url).group(1)
        return next_p_value
    return None

# 爬取指定 q 和 p 的页面
def scrape(q, start_p=1):
    p = start_p
    while True:
        url = f"https://u9a9.org/?type=2&search={q}&p={p}"
        print(f"Fetching URL: {url}")
        response = requests.get(url, headers=headers)

        if response.status_code != 200:
            print(f"Failed to fetch {url}")
            break

        next_p = parse_page(response.text)

        if next_p:
            p = next_p
        else:
            print(f"No more pages for query {q}.")
            break

# 循环遍历 qlist
for q in qlist:
    scrape(q, start_p=1)