diff --git a/src/core/data/scrapers/monkrus.py b/src/core/data/scrapers/monkrus.py index e3757b4..81913b4 100644 --- a/src/core/data/scrapers/monkrus.py +++ b/src/core/data/scrapers/monkrus.py @@ -2,10 +2,9 @@ from bs4 import BeautifulSoup import requests import time from core.utils.data.state import state - - -def get_Metadata(): - return Metadata +from core.utils.network.jsonhandler import format_data +from core.utils.data.tracker import get_magnet_link +from typing import Dict cache = { "data": [], @@ -74,13 +73,15 @@ def scrape_m0nkrus(query): return filtered_posts +def get_magnet(post: Dict): + _, post_links, _, _, _ = format_data([post]) + return post_links[0] Metadata = { "name" : "m0nkrus", "headers" : ["Post Title", "Author"], - "searchkey" : None, "scrapeFunc" : scrape_m0nkrus, - "scrapeSearches" : True, + "" } def init_m0nkrus(): diff --git a/src/core/data/scrapers/rutracker.py b/src/core/data/scrapers/rutracker.py index 32be176..23d1e57 100644 --- a/src/core/data/scrapers/rutracker.py +++ b/src/core/data/scrapers/rutracker.py @@ -1,8 +1,8 @@ import requests from core.utils.data.state import state from core.utils.logging.logs import consoleLog -from core.utils.network.jsonhandler import split_data - +from core.utils.network.jsonhandler import split_data, format_data +from typing import Dict def scrape_rutracker(query): search = requests.get(f"{state.api_url}/search?q={query}") @@ -28,13 +28,18 @@ def scrape_rutracker(query): else: consoleLog("[core.data.scrapers.rutracker] No search Text, returning nothing") return [] - + + +def get_magnet_link(post: Dict): + _, post_links, _, _, _ = format_data([post]) + return post_links[0] + Metadata = { "name" : "rutracker", "headers" : ["Post Title", "Author", "Seeders", "Leechers"], - "searchkey" : None, "scrapeFunc" : scrape_rutracker, - "scrapeSearches" : True, + "linkFunc" : get_magnet_link, + "isMagnet" : True, } diff --git a/src/core/data/scrapers/steamrip.py b/src/core/data/scrapers/steamrip.py index 96621a9..8bfafe2 100644 --- a/src/core/data/scrapers/steamrip.py +++ b/src/core/data/scrapers/steamrip.py @@ -1,11 +1,14 @@ +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.utils.data.state import state +from core.utils.logging.logs import consoleLog cache = { @@ -86,6 +89,21 @@ def scrape_steamrip_game_downloads(gamelink): return ret +def get_download_link(post: Dict): + url = post["link"] + links = scrape_steamrip_game_downloads(url) + best = "" + for link in links: + if link[0] != "h": + best = link + break + + if links.index(best) < 2: + return best + else: + consoleLog("cant scrape this cuz of captcha... opening in the browser") + webbrowser.open(best) + return None def filter_steamrip(query: str): diff --git a/src/core/data/scrapers/uztracker.py b/src/core/data/scrapers/uztracker.py index 43c3baa..8be0b3b 100644 --- a/src/core/data/scrapers/uztracker.py +++ b/src/core/data/scrapers/uztracker.py @@ -3,11 +3,9 @@ from bs4 import BeautifulSoup from urllib.parse import urljoin from core.utils.logging.logs import consoleLog from core.utils.data.state import state +from typing import Dict -def get_Metadata(): - return Metadata - def scrape_uztracker(query): base_url="https://uztracker.net/" search_url = f"{base_url.rstrip('/')}/tracker.php?nm={query}" @@ -48,6 +46,9 @@ Metadata = { "scrapeFunc" : scrape_uztracker, "scrapeSearches" : 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 1815954..f831cc8 100644 --- a/src/core/interface/gui.py +++ b/src/core/interface/gui.py @@ -187,6 +187,15 @@ def download_update(latest_version): def windowCloseHelper(): QGuiApplication.quit() +class TrackerHoverDelegate(QStyledItemDelegate): + def paint(self, painter, option, index): + if index.row() == MainWindow._instance._tracker_hovered_row: + painter.save() + painter.fillRect(option.rect, _theme_colors()["hover"]) + painter.restore() + super().paint(painter, option, index) + + class MainWindow(QtWidgets.QMainWindow, QWidget): log_signal = Signal(str) # Thread-safe signal for logging search_results_signal = Signal(list) # and searching @@ -281,15 +290,13 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): model.dataChanged.disconnect() state.trackertable.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) - class TrackerHoverDelegate(QStyledItemDelegate): - def paint(self, painter, option, index): - if index.row() == MainWindow._instance._tracker_hovered_row: - painter.save() - painter.fillRect(option.rect, _theme_colors()["hover"]) - painter.restore() - super().paint(painter, option, index) + state.trackertable.setStyleSheet(_table_stylesheet("QTableWidget")) + + state.trackertable.setItemDelegate(TrackerHoverDelegate(state.trackertable)) state.trackertable.viewport().installEventFilter(self) + state.trackertable.setMouseTracking(True) + state.trackertable.viewport().setMouseTracking(True) container = QWidget() containerLayout = QVBoxLayout() @@ -526,7 +533,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): #! FIX THIS - self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(state.trackertable.currentItem(), state.posts, state.trackers[state.currenttracker]["headers"])))) + self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(state.trackertable.currentItem(), state.posts)))) container.setLayout(containerLayout) self.setCentralWidget(container) @@ -695,6 +702,8 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.show_empty_results(False) self.searchbar.setEnabled(True) self.searchbar.setFocus() + state.trackertable.setItemDelegate(TrackerHoverDelegate(state.trackertable)) + state.trackertable.viewport().installEventFilter(self) def update_image_overlay(self, new_image_path): self.image = QImage(new_image_path) diff --git a/src/core/utils/data/tracker.py b/src/core/utils/data/tracker.py index 79ed98f..f70756b 100644 --- a/src/core/utils/data/tracker.py +++ b/src/core/utils/data/tracker.py @@ -1,31 +1,6 @@ import requests from bs4 import BeautifulSoup -from core.utils.data.state import state from core.utils.logging.logs import consoleLog -from core.utils.network.jsonhandler import format_data - - - -def get_item_url(item, posts, post_titles): # softwarelist currentitem, post list (dict), post titles list - post_index = post_titles.index(item) - if 0 <= post_index < len(post_titles): - if state.tracker == "uztracker": - item = "https://uztracker.net/" + state.post_urls[post_index].lstrip("./") - consoleLog(f"Found post URL: {item}") - return item - if state.tracker == "rutracker": - item_dict = posts[post_index] - _, post_links, _, _, _ = format_data([item_dict]) - consoleLog(f"Found post URL: {post_links[0]}") - return post_links[0] - if state.tracker == "m0nkrus": - item_dict = posts[post_index] - _, post_links, _, _, _,= format_data([item_dict]) - consoleLog(f"Found post URL: {post_links[0]}") - return post_links[0] - - return None - def get_magnet_link(post_url): diff --git a/src/core/utils/network/download.py b/src/core/utils/network/download.py index 66cdb17..9f043e0 100644 --- a/src/core/utils/network/download.py +++ b/src/core/utils/network/download.py @@ -1,14 +1,15 @@ +from PySide6.QtWidgets import QTableWidgetItem from core.utils.logging.logs import consoleLog -from core.utils.data.tracker import get_item_url from core.utils.data.tracker import get_magnet_link from core.network.libtorrent_wrapper import add_download 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 import threading -def download_selected(items, posts, post_titles): +def download_selected(items: list[QTableWidgetItem]): if not items: consoleLog("No item selected for download.") return @@ -17,10 +18,10 @@ def download_selected(items, posts, post_titles): if item.column() != 0: continue text = item.text() - if text and text not in seen: + if text != "" and text not in seen: seen.add(text) consoleLog(f"Downloading {text}") - run_thread(threading.Thread(target=run_download, args=(text, posts, post_titles))) + run_thread(threading.Thread(target=run_download, args=(text, state.posts[item.row()]))) def run_download(item, posts, post_titles): post_url = get_item_url(item, posts, post_titles)