From 81b4c6389261a9272136c461460e3b321218a883 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Tue, 15 Feb 2022 10:42:40 +0000 Subject: [PATCH 1/2] rework download logic --- GoGoDownloader.py | 12 ++++++++++-- backend.py | 47 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/GoGoDownloader.py b/GoGoDownloader.py index a0e3a42..b6f3e44 100644 --- a/GoGoDownloader.py +++ b/GoGoDownloader.py @@ -146,11 +146,19 @@ def gogodownloader(config): dl_links = [] episode_links = gogo.get_links(source) - + print(f"{OK}Scraping Links") for link in episode_links: dl_links.append(gogo.get_download_link(link)) - gogo.file_downloader(dl_links) + result = gogo.file_downloader(dl_links) + if len(result.errors) > 0: + while len(result.errors) > 0: + print(f"{ERR}{len(result.errors)} links failed retrying.") + episode_links = gogo.get_links(source) + print(f"{OK}Re-Scraping Links") + for link in episode_links: + dl_links.append(gogo.get_download_link(link)) + result = gogo.file_downloader(dl_links, overwrite_downloads=0) use_again = input(f"{IN}Do you want to use the app again? (y|n) > ").lower() if use_again == "y": diff --git a/backend.py b/backend.py index cf71814..42e0efb 100644 --- a/backend.py +++ b/backend.py @@ -1,3 +1,4 @@ +import re import requests import json import os @@ -120,17 +121,42 @@ class gogoanime: url, cookies=dict(auth=gogoanime.get_gogoanime_auth_cookie(self)), ) - + quality_arr = ["1080", "720", "640", "480"] soup = BeautifulSoup(page.content, "html.parser") - - for link in soup.find_all("a", href=True): - if self.episode_quality in link.text: + try: + for link in soup.find_all( + "a", href=True, string=re.compile(self.episode_quality) + ): return link["href"] + else: + ep_num = url.rsplit("-", 1)[1] + print( + f"{self.episode_quality} not found for ep{ep_num} checking for next best" + ) + for q in quality_arr: + for link in soup.find_all("a", href=True, string=re.compile(q)): + print(f"{q} found.") + return link["href"] + except: + print("No matching download found") - def file_downloader(self, file_list: dict): + def file_downloader(self, file_list: dict, overwrite_downloads: bool = None): + """[summary] + + Args: + file_list (dict): [description] + overwrite_downloads (bool, optional): [description]. Defaults to None. + + Returns: + [type]: [description] + """ + if overwrite_downloads is None: + overwrite = self.config["OverwriteDownloads"] + else: + overwrite = overwrite_downloads dl = Downloader( max_conn=max_concurrent_downloads(self.config["MaxConcurrentDownloads"]), - overwrite=self.config["OverwriteDownloads"], + overwrite=overwrite, headers=dict( [ ( @@ -147,10 +173,11 @@ class gogoanime: ) for link in file_list: - dl.enqueue_file( - link, - path=f"./{self.title}", - ) + if link is not None: + dl.enqueue_file( + link, + path=f"./{self.title}", + ) files = dl.download() return files From 7bfc18383dad0a161e7e79fbba13dac14aeb1973 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Thu, 17 Feb 2022 13:59:44 +0000 Subject: [PATCH 2/2] long winded working retry logic --- GoGoDownloader.py | 1 + img/gogo_icon.ico | Bin 0 -> 31962 bytes version.txt | 1 + 3 files changed, 2 insertions(+) create mode 100644 img/gogo_icon.ico create mode 100644 version.txt diff --git a/GoGoDownloader.py b/GoGoDownloader.py index b6f3e44..a79d75d 100644 --- a/GoGoDownloader.py +++ b/GoGoDownloader.py @@ -156,6 +156,7 @@ def gogodownloader(config): print(f"{ERR}{len(result.errors)} links failed retrying.") episode_links = gogo.get_links(source) print(f"{OK}Re-Scraping Links") + dl_links.clear() for link in episode_links: dl_links.append(gogo.get_download_link(link)) result = gogo.file_downloader(dl_links, overwrite_downloads=0) diff --git a/img/gogo_icon.ico b/img/gogo_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d3f9b53be611de2d63a29efec3e5ce6da3263473 GIT binary patch literal 31962 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 aQT{*LyXzi5-PQX50000