# -*- 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
Select the files you want to download
"""
code_page = """
Torrent Code Checker
* 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="", 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()