import subprocess, re, time, base64, requests
from pathlib import Path
from IPython.display import display, HTML, clear_output

class Aria2Setup:
    def __init__(self, download_dir):
        self.output_dir = f"/content/drive/MyDrive/{download_dir}"
        self.tunnel_url = None
        Path(self.output_dir).mkdir(parents=True, exist_ok=True)
        
    def run_silent(self, cmd):
        return subprocess.run(cmd, shell=True, capture_output=True, text=True)
    
    def get_trackers(self):
        try:
            res = requests.get("https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt", timeout=5)
            return res.text.strip().replace('\n\n', ',').replace('\n', ',') if res.ok else ""
        except:
            return ""
    
    def setup_aria2(self):
        print("⚙️ Setting up aria2...")
        self.run_silent("wget -q https://github.com/aria2/aria2/releases/download/release-1.37.0/aria2-1.37.0.tar.gz -O a.tgz && tar xf a.tgz && mv aria2c /usr/local/bin/ && rm a.tgz")
        
        trackers = self.get_trackers()
        cmd = (
            f"aria2c --enable-rpc --rpc-listen-port=6800 --rpc-secret=88888888 "
            f"--rpc-allow-origin-all=true -D -d {self.output_dir} -j 20 -c "
            f"{'--bt-tracker=' + trackers + ' ' if trackers else ''}"
            f"--bt-request-peer-speed-limit=0 --bt-max-peers=0 --seed-ratio=0.0 "
            f"--max-connection-per-server=10 --min-split-size=10M --follow-torrent=mem "
            f"--disable-ipv6=true --file-allocation=falloc --http-accept-gzip=true "
            f"--user-agent='Transmission/2.77' --peer-agent='Transmission/2.77' "
            f"--peer-id-prefix=-TR2770- --split=20"
        )
        subprocess.Popen(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        time.sleep(2)
    
    def setup_cloudflared(self):
        
        print("🌐 Setting up tunnel...")
        self.run_silent("wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && dpkg -i cloudflared-linux-amd64.deb 2>/dev/null && rm cloudflared-linux-amd64.deb")
    
    def start_tunnel(self):
       
        process = subprocess.Popen(
            "cloudflared tunnel --url localhost:6800",
            shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
        )
        
        url_pattern = re.compile(r'https://[a-z0-9-]+\.trycloudflare\.com')
        for _ in range(30):
            line = process.stderr.readline()
            match = url_pattern.search(line)
            if match:
                self.tunnel_url = match.group(0)
                break
            time.sleep(1)
        return process
    
    def get_ariang_url(self):
       
        if not self.tunnel_url:
            return None
        hostname = self.tunnel_url.replace('https://', '')
        secret = base64.b64encode("88888888".encode()).decode()
        return f"https://ariang.mayswind.net/latest/#!/settings/rpc/set?protocol=wss&host={hostname}&port=443&interface=jsonrpc&secret={secret}"
    
    def display_result(self):
       
        ariang_url = self.get_ariang_url()
        if not ariang_url:
            print("❌ Failed to get tunnel URL")
            return
        
        clear_output(wait=True)
        display(HTML(f'''
        
Open AriaNg
''')) def run(self): """Main execution""" try: self.setup_aria2() self.setup_cloudflared() process = self.start_tunnel() self.display_result() process.wait() except KeyboardInterrupt: clear_output() print("🛑 Stopped") except Exception as e: print(f"❌ Error: {e}") if __name__ == "__main__": DOWNLOAD_DIR = input("Enter download directory name: ") setup = Aria2Setup(DOWNLOAD_DIR) setup.run()