dl/commands/pygg.py
Michel Roux 785b0a4a8b
All checks were successful
continuous-integration/drone/push Build is passing
No empty params
2023-01-06 01:11:43 +01:00

154 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import os
import re
import urllib
import bs4
import requests
YGG_DOMAIN = "www6.yggtorrent.lol"
YGG_IP = os.getenv("YGG_IP")
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--uploader", action="append")
parser.add_argument("-b", "--blacklist", action="append", default=["dvd", "iso"])
parser.add_argument("-y", "--year", type=int)
parser.add_argument("-s", "--size", type=int, default=10)
parser.add_argument("-d", "--downloads", type=int, default=20)
parser.add_argument("query")
args = parser.parse_args()
def parse_size(size):
units = {"o": 1, "Ko": 10**3, "Mo": 10**6, "Go": 10**9, "To": 10**12}
match = re.search("([0-9.]+)([^0-9]+)", size)
number = match.group(1).strip()
unit = match.group(2).strip()
return int(float(number) * units[unit])
def check_files(id):
req = requests.get(
f"http://{YGG_IP}/engine/get_files",
params={"torrent": id},
headers={"Host": YGG_DOMAIN},
)
res = req.json()
html = bs4.BeautifulSoup(res["html"], "html.parser")
trs = html.select("tr")
return len(trs) == 1 and "mkv" in trs[0].get_text().lower()
def search_ygg(query, multi, full):
ygg_params = {
"name": query,
"category": "2145",
"sub_category": "2183",
"do": "search",
"order": "asc",
"sort": "publish_date",
}
if full and args.year:
ygg_params["name"] += f" {args.year}"
if multi:
ygg_params["option_langue:multiple[]"] = "4"
req = requests.get(
f"http://{YGG_IP}/engine/search",
params=ygg_params,
headers={"Host": YGG_DOMAIN},
)
html = bs4.BeautifulSoup(
req.text,
"html.parser",
)
trs = html.select("table.table tr")
if len(trs) > 1:
for i, tr in enumerate(trs):
if not i:
continue
tds = tr.find_all("td")
size = tds[5].get_text()
downloads = tds[6].get_text()
name = tds[1].get_text().lower().strip()
if parse_size(size) > parse_size(f"{args.size}Go"):
continue
if int(downloads) < args.downloads:
continue
if any(word.lower() in name for word in args.blacklist):
continue
if args.year and str(args.year) not in name:
continue
if args.uploader and not any(
uploader.lower() in name for uploader in args.uploader
):
continue
link = tds[1].a["href"]
id = link.split("/")[-1].split("-")[0]
if not check_files(id):
continue
print(f"{name} {link}")
exit(0)
query_string = {"query": args.query, "filters": "type:movie"}
if args.year:
query_string["filters"] += f" AND year:{args.year}"
tvdb = requests.post(
"https://tvshowtime-dsn.algolia.net/1/indexes/TVDB/query",
params={
"x-algolia-application-id": "tvshowtime",
"x-algolia-api-key": "c9d5ec1316cec12f093754c69dd879d3",
},
json={"params": urllib.parse.urlencode(query_string)},
)
tvdata = tvdb.json()
if not tvdata["nbHits"] > 0:
print("Can't find query on TheTVDB")
exit(1)
eng = tvdata["hits"][0]["name"]
fra = (
tvdata["hits"][0]["translations"]["fra"]
if "fra" in tvdata["hits"][0]["translations"]
else args.query
)
search_ygg(args.query, True, True)
search_ygg(fra, True, True)
search_ygg(eng, True, True)
search_ygg(args.query, False, True)
search_ygg(fra, False, True)
search_ygg(eng, False, True)
if args.year:
search_ygg(args.query, True, False)
search_ygg(fra, True, False)
search_ygg(eng, True, False)
search_ygg(args.query, False, False)
search_ygg(fra, False, False)
search_ygg(eng, False, False)
print("No results :(")