diff --git a/src/core/data/scrapers/monkrus.py b/src/core/data/scrapers/monkrus.py index 81913b4..e48a5df 100644 --- a/src/core/data/scrapers/monkrus.py +++ b/src/core/data/scrapers/monkrus.py @@ -35,7 +35,7 @@ def _get_telegram_posts(): for bubble in bubbles: post_txt = bubble.find("div", class_="tgme_widget_message_text js-message_text") - if not post_txt or not post_txt.b: + if not post_txt is None or not post_txt.b is None: continue title = post_txt.b.text @@ -75,13 +75,14 @@ def scrape_m0nkrus(query): def get_magnet(post: Dict): _, post_links, _, _, _ = format_data([post]) - return post_links[0] + return get_magnet_link(post_links[0]) Metadata = { "name" : "m0nkrus", "headers" : ["Post Title", "Author"], "scrapeFunc" : scrape_m0nkrus, - "" + "linkFunc" : get_magnet, + "isMagnet" : True, } def init_m0nkrus(): diff --git a/src/core/data/scrapers/provider/gofile.py b/src/core/data/scrapers/provider/gofile.py index 7ee9ddf..42574af 100644 --- a/src/core/data/scrapers/provider/gofile.py +++ b/src/core/data/scrapers/provider/gofile.py @@ -1,5 +1,6 @@ import requests import re +from core.utils.logging.loghandler import consoleLog def scrape_gofile(url): @@ -18,13 +19,12 @@ def scrape_gofile(url): f"https://api.gofile.io/contents/{filetoken}", headers=headers, ) + try: - temp: dict = r.json()["data"]["children"] - child = [key for key in temp.keys()] + temp: dict = r.json()["data"]["children"] + child = [key for key in temp.keys()] + return temp[child[0]]["link"] + except: + consoleLog("gofile didnt auth you, either the api has changed\n or you sent to many requests, please try again later.\n If it still doesnt work please open an issue on Github.") - return temp[child[0]]["link"] - - -out = scrape_gofile("https://gofile.io/d/tvvzAD") -print(out) diff --git a/src/core/data/scrapers/rutracker.py b/src/core/data/scrapers/rutracker.py index 23d1e57..ab235ef 100644 --- a/src/core/data/scrapers/rutracker.py +++ b/src/core/data/scrapers/rutracker.py @@ -1,6 +1,7 @@ import requests from core.utils.data.state import state from core.utils.logging.logs import consoleLog +from core.utils.data.tracker import get_magnet_link from core.utils.network.jsonhandler import split_data, format_data from typing import Dict @@ -30,15 +31,15 @@ def scrape_rutracker(query): return [] -def get_magnet_link(post: Dict): +def get_magnet(post: Dict): _, post_links, _, _, _ = format_data([post]) - return post_links[0] + return get_magnet_link(post_links[0]) Metadata = { "name" : "rutracker", "headers" : ["Post Title", "Author", "Seeders", "Leechers"], "scrapeFunc" : scrape_rutracker, - "linkFunc" : get_magnet_link, + "linkFunc" : get_magnet, "isMagnet" : True, } diff --git a/src/core/data/scrapers/steamrip.py b/src/core/data/scrapers/steamrip.py index 8bfafe2..65c29dc 100644 --- a/src/core/data/scrapers/steamrip.py +++ b/src/core/data/scrapers/steamrip.py @@ -1,12 +1,13 @@ -import os from bs4 import BeautifulSoup from fuzzyfinder.main import fuzzyfinder import requests import re import time import webbrowser -from typing import Generator +from core.data.scrapers.provider.buzzheavier import scrape_buzzheavier +from core.data.scrapers.provider.gofile import scrape_gofile +from typing import Generator, Dict from core.utils.data.state import state from core.utils.logging.logs import consoleLog @@ -94,12 +95,14 @@ def get_download_link(post: Dict): links = scrape_steamrip_game_downloads(url) best = "" for link in links: - if link[0] != "h": + if link[0] == "h": best = link break - if links.index(best) < 2: - return best + if links.index(best) == 0: + return scrape_buzzheavier(best) + elif links.index(best) == 1: + return scrape_gofile(best) else: consoleLog("cant scrape this cuz of captcha... opening in the browser") webbrowser.open(best) @@ -118,6 +121,8 @@ Metadata = { "name" : "steamrip", "headers" : ["Game"], "scrapeFunc" : filter_steamrip, + "linkFunc" : get_download_link, + "isMagnet" : False, } def init_steamrip(): diff --git a/src/core/data/scrapers/uztracker.py b/src/core/data/scrapers/uztracker.py index 8be0b3b..f6395ef 100644 --- a/src/core/data/scrapers/uztracker.py +++ b/src/core/data/scrapers/uztracker.py @@ -3,6 +3,7 @@ from bs4 import BeautifulSoup from urllib.parse import urljoin from core.utils.logging.logs import consoleLog from core.utils.data.state import state +from core.utils.data.tracker import get_magnet_link from typing import Dict @@ -39,16 +40,17 @@ def scrape_uztracker(query): consoleLog(f"Failed to fetch {search_url}: {e}") return None +def get_magnet(post: Dict): + item = "https://uztracker.net/" + post["url"].lstrip("./") + return get_magnet_link(item) + Metadata = { "name" : "uztracker", "headers" : ["Post Title", "Author"], - "searchkey" : None, "scrapeFunc" : scrape_uztracker, - "scrapeSearches" : True, + "linkFunc" : get_magnet, + "isMagnet" : True, } -def get_magnet_link(post: Dict): - item = "https://uztracker.net/" + post["url"].lstrip("./") - return item def init_uztracker(): state.trackers.update({Metadata["name"] : Metadata}) diff --git a/src/core/interface/gui.py b/src/core/interface/gui.py index dea7146..6b7f127 100644 --- a/src/core/interface/gui.py +++ b/src/core/interface/gui.py @@ -540,9 +540,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.downloadList.setItemDelegateForColumn(0, delegate) delegate.clicked.connect(on_pause_resume_clicked) - #! FIX THIS - - self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(state.trackertable.currentItem(), state.posts)))) + self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(state.trackertable.selectedItems(),)))) container.setLayout(containerLayout) self.setCentralWidget(container) diff --git a/src/core/utils/network/download.py b/src/core/utils/network/download.py index 9f043e0..fcba5a2 100644 --- a/src/core/utils/network/download.py +++ b/src/core/utils/network/download.py @@ -1,12 +1,15 @@ from PySide6.QtWidgets import QTableWidgetItem from core.utils.logging.logs import consoleLog -from core.utils.data.tracker import get_magnet_link -from core.network.libtorrent_wrapper import add_download +from core.network.libtorrent_wrapper import add_magnet from core.utils.general.wrappers import run_thread from core.utils.logging.logs import add_download_log from core.network.libtorrent_int import add_seed from core.utils.data.state import state +from urllib.parse import urlparse, unquote import threading +import re +import requests +import random def download_selected(items: list[QTableWidgetItem]): @@ -21,19 +24,52 @@ def download_selected(items: list[QTableWidgetItem]): if text != "" and text not in seen: seen.add(text) consoleLog(f"Downloading {text}") - run_thread(threading.Thread(target=run_download, args=(text, state.posts[item.row()]))) + run_thread(threading.Thread(target=run_download, args=(state.posts[item.row()],))) -def run_download(item, posts, post_titles): - post_url = get_item_url(item, posts, post_titles) - consoleLog(f"Selected URL: {post_url}") - magnet_uri = get_magnet_link(post_url) +def get_direct_filename(url: str, headers) -> str: + cd = headers.get('content-disposition', '') + if cd: + match = re.search(r'filename\*=UTF-8\'\'(.+)', cd) # RFC 5987 encoded + if match: + return unquote(match.group(1)) + match = re.search(r'filename="?([^";\n]+)"?', cd) + if match: + return match.group(1).strip() - if add_download(magnet_uri): - add_download_log(item, post_url, magnet_uri, False) + path = urlparse(url).path + name = path.split('/')[-1] + if name: + return unquote(name) + + return f"download{random.randint(1,9999)}" #avoid collision + +def filedownload(url): + try: + with requests.get(url, stream=True, timeout=30) as r: + r.raise_for_status() + name = get_direct_filename(url, r.headers) + + with open(state.download_path + f"/{name}", 'wb') as f: + for chunk in r.iter_content(chunk_size=8192): + f.write(chunk) + + consoleLog(f"Finished downloading {name}") + except Exception as e: + consoleLog(f"Error downloading: {e}") + +def run_download(post): + linkfunc = state.trackers[state.currenttracker]["linkFunc"] + ismagnet = state.trackers[state.currenttracker]["isMagnet"] + link = linkfunc(post) + + if ismagnet: + add_magnet(link) + else: + filedownload(link) def run_download_direct(magnet_uri): consoleLog(f"Direct download: {magnet_uri[:60]}") - add_download(magnet_uri) + add_magnet(magnet_uri) add_download_log("Direct Download", "", magnet_uri, False) def seed_magnet(magnet_uri, file_path):