diff --git a/src/core/data/scrapers/provider/gofile.py b/src/core/data/scrapers/provider/gofile.py index ed5dea6..08b7c39 100644 --- a/src/core/data/scrapers/provider/gofile.py +++ b/src/core/data/scrapers/provider/gofile.py @@ -8,24 +8,33 @@ def scrape_gofile(url): filetoken = re.findall(r"(?<=https...gofile.io\/d\/).*", url)[0] session = requests.Session() - acc = session.post("https://api.gofile.io/accounts") - token = acc.json()["data"]["token"] - headers = { - "Authorization": f"Bearer {token}", - "X-Website-Token": "4fd6sg89d7s6", # Maybe make this dynamic in the future + "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", + "Accept": "*/*", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br, zstd", + "Referer": "https://gofile.io/", + "Authorization": f"Bearer lUUtRAccOuRUoZhelNSslDFSlpOgKLDj", + "X-Website-Token": "ffd9ffa831c50b9e68ca5e65cbbbd1a50e9a32e63022e17c7c6748388a1ed73b", + "X-BL": "en-US", + "Origin": "https://gofile.io", + "Sec-GPC": "1", + "Connection": "keep-alive", + "TE": "trailers" } r = session.get( f"https://api.gofile.io/contents/{filetoken}", headers=headers, ) + try: temp: dict = r.json()["data"]["children"] child = [key for key in temp.keys()] - return temp[child[0]]["link"] + link = temp[child[0]]["link"] + return link, headers except: consoleLog("GoFile Authorisation failed, if the Issue persists, please open an Issue on GitHub") diff --git a/src/core/data/scrapers/steamrip.py b/src/core/data/scrapers/steamrip.py index fbf0dcf..24c0165 100644 --- a/src/core/data/scrapers/steamrip.py +++ b/src/core/data/scrapers/steamrip.py @@ -69,10 +69,6 @@ def scrape_steamrip_game_downloads(gamelink): download_links[0] = "https:" + pure if pure[2] == "g": download_links[1] = "https:" + pure - if pure[2] == "v": - download_links[2] = "https:" + pure - if pure[2] == "m": - download_links[3] = "https:" + pure ret = [] @@ -94,13 +90,15 @@ def get_download_link(post: Dict): break if links.index(best) == 0: - return scrape_buzzheavier(best) + link = scrape_buzzheavier(best) + return link elif links.index(best) == 1: - return scrape_gofile(best) + link, headers = scrape_gofile(best) + return link, headers else: consoleLog("Unable to retrieve download link due to captcha, launching browser...") webbrowser.open(best) - return None + return None, None def filter_steamrip(query: str): games = scrape_steamrip_links() @@ -121,4 +119,4 @@ Metadata = { } def init_steamrip(): - state.trackers.update({Metadata["name"] : Metadata}) \ No newline at end of file + state.trackers.update({Metadata["name"] : Metadata}) diff --git a/src/core/network/direct_download/__init__.py b/src/core/network/direct_download/__init__.py index 18d1916..fdbc305 100644 --- a/src/core/network/direct_download/__init__.py +++ b/src/core/network/direct_download/__init__.py @@ -9,7 +9,7 @@ from .utils import ( detect_filename_from_headers, ) -def add_direct_download(url: str, title: str, dl_path: Optional[str] = None): +def add_direct_download(url: str, title: str, dl_path: Optional[str] = None, headers: Optional[dict] = None, single_threaded: bool = False): if dl_path is None: dl_path = state.download_path @@ -24,7 +24,7 @@ def add_direct_download(url: str, title: str, dl_path: Optional[str] = None): or sanitize_filename(title) + ".zip" ) - handle = DirectDownloadHandle(url, filename, dl_path) + handle = DirectDownloadHandle(url, filename, dl_path, headers, single_threaded) state.active_downloads[url] = handle add_download_log(title, url, "", False) handle.start() diff --git a/src/core/network/direct_download/handle.py b/src/core/network/direct_download/handle.py index b223ce5..759c0a2 100644 --- a/src/core/network/direct_download/handle.py +++ b/src/core/network/direct_download/handle.py @@ -58,7 +58,7 @@ class DirectDownloadHandle: "Chrome/125.0.0.0 Safari/537.36" ) - def __init__(self, url: str, name: str, save_path: str): + def __init__(self, url: str, name: str, save_path: str, headers: Optional[dict] = None, single_threaded: bool = False): self.url = url self._name = name self._save_path = save_path @@ -69,6 +69,8 @@ class DirectDownloadHandle: self._thread: Optional[threading.Thread] = None self._session: Optional[requests.Session] = None self._supports_range = False + self._custom_headers = headers + self._single_threaded = single_threaded state_dir = os.path.join(state.settings_path, "direct_downloads") os.makedirs(state_dir, exist_ok=True) @@ -151,6 +153,8 @@ class DirectDownloadHandle: def _build_session(self) -> requests.Session: session = requests.Session() session.headers.update({"User-Agent": self.USER_AGENT}) + if self._custom_headers is not None: + session.headers.update(self._custom_headers) adapter = requests.adapters.HTTPAdapter( max_retries=0, pool_connections=self.NUM_THREADS, @@ -194,6 +198,7 @@ class DirectDownloadHandle: use_multithreaded = ( self._supports_range and total_size > self.MIN_CHUNK_SIZE * 2 + and not self._single_threaded ) if use_multithreaded: @@ -204,7 +209,7 @@ class DirectDownloadHandle: self._preallocate_file(total_size) self._multithreaded_download(total_size) else: - reason = "no range support" if not self._supports_range else "file too small" + reason = "no range support" if not self._supports_range else "file too small or single-threaded mode" consoleLog(f"Single-threaded download ({reason}): {self._name}") self._single_threaded_download() diff --git a/src/core/utils/network/download.py b/src/core/utils/network/download.py index fd9623b..5ea18fb 100644 --- a/src/core/utils/network/download.py +++ b/src/core/utils/network/download.py @@ -7,11 +7,11 @@ from PySide6.QtWidgets import QTableWidgetItem from core.utils.logging.logs import consoleLog from core.utils.data.state import state from PySide6.QtCore import Qt +from typing import Optional import threading - def download_selected(items: list[QTableWidgetItem]): if not items: consoleLog("No item selected for download.") @@ -30,16 +30,19 @@ def download_selected(items: list[QTableWidgetItem]): consoleLog(f"Downloading {post.get('title', 'Unknown')}") run_thread(threading.Thread(target=run_download, args=(post,))) -def run_download(post): +def run_download(post, headers: Optional[dict] = None): linkfunc = state.trackers[state.currenttracker]["linkFunc"] ismagnet = state.trackers[state.currenttracker]["isMagnet"] - link = linkfunc(post) + result = linkfunc(post) if ismagnet: + link = result add_magnet(link) add_download_log(post.get("title", "Unknown"), "", link, False) else: - add_direct_download(link, post.get("title", "Unknown")) + link, link_headers = result if isinstance(result, tuple) else (result, None) + final_headers = headers or link_headers + add_direct_download(link, post.get("title", "Unknown"), headers=final_headers, single_threaded=final_headers is not None) def run_download_direct(magnet_uri, title="Direct Download"): consoleLog(f"Magnet: {title}")