# -*- coding: utf-8 -*- # (c) YashDK [yash-dk@github] # Redesigned By - @bipuldey19 (https://github.com/SlamDevs/slam-mirrorbot/commit/1e572f4fa3625ecceb953ce6d3e7cf7334a4d542#diff-c3d91f56f4c5d8b5af3d856d15a76bd5f00aa38d712691b91501734940761bdd) import os import time import logging import qbittorrentapi as qba import asyncio from aiohttp import web import nodes logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler('log.txt'), logging.StreamHandler()], level=logging.INFO) LOGGER = logging.getLogger(__name__) routes = web.RouteTableDef() page = """ Torrent File Selector
logo

slam-mirrorbot

Select the files you want to download

{My_content}
""" code_page = """ Torrent Code Checker
logo

slam-mirrorbot

* Dont mess around. Your download will get messed up.
""" @routes.get('/slam/files/{hash_id}') async def list_torrent_contents(request): torr = request.match_info["hash_id"] gets = request.query if "pin_code" not in gets.keys(): rend_page = code_page.replace("{form_url}", f"/slam/files/{torr}") return web.Response(text=rend_page, content_type='text/html') client = qba.Client(host="localhost", port="8090", username="admin", password="adminadmin") client.auth_log_in() try: res = client.torrents_files(torrent_hash=torr) except qba.NotFound404Error: raise web.HTTPNotFound() count = 0 passw = "" for n in str(torr): if n.isdigit(): passw += str(n) count += 1 if count == 4: break if isinstance(passw, bool): raise web.HTTPNotFound() pincode = passw if gets["pin_code"] != pincode: return web.Response(text="Incorrect pin code") par = nodes.make_tree(res) cont = ["", 0] nodes.create_list(par, cont) rend_page = page.replace("{My_content}", cont[0]) rend_page = rend_page.replace( "{form_url}", f"/slam/files/{torr}?pin_code={pincode}") client.auth_log_out() return web.Response(text=rend_page, content_type='text/html') async def re_verfiy(paused, resumed, client, torr): paused = paused.strip() resumed = resumed.strip() if paused: paused = paused.split("|") if resumed: resumed = resumed.split("|") k = 0 while True: res = client.torrents_files(torrent_hash=torr) verify = True for i in res: if str(i.id) in paused: if i.priority == 0: continue verify = False break if str(i.id) in resumed and i.priority == 0: verify = False break if verify: break LOGGER.info("Reverification Failed: correcting stuff...") client.auth_log_out() client = qba.Client(host="localhost", port="8090", username="admin", password="adminadmin") client.auth_log_in() try: client.torrents_file_priority( torrent_hash=torr, file_ids=paused, priority=0) except: LOGGER.error("Errored in reverification paused") try: client.torrents_file_priority( torrent_hash=torr, file_ids=resumed, priority=1) except: LOGGER.error("Errored in reverification resumed") client.auth_log_out() k += 1 if k > 4: return False LOGGER.info("Verified") return True @routes.post('/slam/files/{hash_id}') async def set_priority(request): torr = request.match_info["hash_id"] client = qba.Client(host="localhost", port="8090", username="admin", password="adminadmin") client.auth_log_in() data = await request.post() resume = "" pause = "" data = dict(data) for i, value in data.items(): if i.find("filenode") != -1: node_no = i.split("_")[-1] if value == "on": resume += f"{node_no}|" else: pause += f"{node_no}|" pause = pause.strip("|") resume = resume.strip("|") try: client.torrents_file_priority( torrent_hash=torr, file_ids=pause, priority=0) except qba.NotFound404Error: raise web.HTTPNotFound() except: LOGGER.error("Errored in paused") try: client.torrents_file_priority( torrent_hash=torr, file_ids=resume, priority=1) except qba.NotFound404Error: raise web.HTTPNotFound() except: LOGGER.error("Errored in resumed") await asyncio.sleep(2) if not await re_verfiy(pause, resume, client, torr): LOGGER.error("Verification Failed") client.auth_log_out() return await list_torrent_contents(request) @routes.get('/') async def homepage(request): return web.Response(text="

See slam-mirrorbot @GitHub By SlamDevs

", content_type="text/html") async def e404_middleware(app, handler): async def middleware_handler(request): try: response = await handler(request) if response.status == 404: return web.Response(text="

404: Page not found


slam-mirrorbot

", content_type="text/html") return response except web.HTTPException as ex: if ex.status == 404: return web.Response(text="

404: Page not found


slam-mirrorbot

", content_type="text/html") raise return middleware_handler async def start_server(): app = web.Application(middlewares=[e404_middleware]) app.add_routes(routes) return app async def start_server_async(port=80): app = web.Application(middlewares=[e404_middleware]) app.add_routes(routes) runner = web.AppRunner(app) await runner.setup() await web.TCPSite(runner, "0.0.0.0", port).start()