From 4d456ba9b9e511292c275d8b04a5097e3619b53b Mon Sep 17 00:00:00 2001 From: Arctic4161 <64910295+Arctic4161@users.noreply.github.com> Date: Thu, 14 Oct 2021 09:22:02 -0500 Subject: [PATCH] Update backend.py Fixed quality selection and website from slowing down the download due to multiple requests at once. --- src/backend.py | 76 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/src/backend.py b/src/backend.py index bb6283b..62ea094 100644 --- a/src/backend.py +++ b/src/backend.py @@ -6,6 +6,9 @@ import os from bs4 import BeautifulSoup from dataclasses import dataclass from colorama import Fore +from random import choice +import time + @dataclass(init=True) @@ -18,7 +21,7 @@ class Download: episode_end: int printed: bool = False - def get_links(self, source=None) -> list[str]: + def get_links(self, source=None): if source is not None: source_ep = f"https://gogoanime.pe/{self.name}-episode-" episode_links = [ @@ -34,7 +37,7 @@ class Download: ] return episode_links - def get_download_links(self, episode_link) -> list[str]: + def get_download_links(self, episode_link): with req.get(episode_link) as res: soup = BeautifulSoup(res.content, "html.parser") exist = soup.find("h1", {"class": "entry-title"}) @@ -54,19 +57,23 @@ class Download: else: return None - def get_download_urls(self, download_link) -> list[str]: + def get_download_urls(self, download_link): + episode_quality = self.episode_quality + if episode_quality == "FullHDP": + episode_quality = "1080P" + elif episode_quality == "HDP": + episode_quality = "720P" + elif episode_quality == "SDP": + episode_quality = "360P" with req.get(download_link) as res: soup = BeautifulSoup(res.content, "html.parser") - link = soup.find("div", {"class": "mirror_link"}).find( - "div", - text=re.compile(fr"\b{self.episode_quality}\b"), - attrs={"class": "dowload"}, - ) + link = soup.find("div", {"class": "dowload"},text=re.compile(episode_quality)) if link is None: - link = soup.find("div", {"class": "mirror_link"}).find( - "div", {"class": "dowload"} - ) - if not self.printed: + episode_quality = "720P" + link = soup.find("div", {"class": "dowload"},text=re.compile(episode_quality)) + if link is None: + episode_quality = "360P" + link = soup.find("div", {"class": "dowload"},text=re.compile(episode_quality)) CustomMessage(None, self.episode_quality).qual_not_found() self.episode_quality = link.text.split()[1][1:] CustomMessage(None, self.episode_quality).use_default_qual() @@ -76,20 +83,29 @@ class Download: link.a.get("href"), ] # episode_name: str, episode_link: str - def download_episodes(self, url) -> object: - header = { - "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + def random_headers(self): + desktop_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14', + 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', + 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'] + return {'User-Agent': choice(desktop_agents),"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", - "Accept-Encoding": "gzip, deflate", - "Referer": "https://gogoanime.pe/", - "Connection": "close", - } - with req.get(url[1], headers=header, stream=True) as res: - episode_name = f"EP.{url[0]}.mp4" - file_loc = os.path.join(self.folder, episode_name) - with open(file_loc, "wb") as file: - shutil.copyfileobj(res.raw, file, 8192) + "Accept-Encoding": "gzip, deflate, br", + "Referer" : "https://goload.one/", + "Connection": "keep-alive"} + + def download_episodes(self, url): + with req.get(url[1], headers=self.random_headers(), stream=True) as res: + episode_name = f"EP.{url[0]}.mp4" + file_loc = os.path.join(self.folder, episode_name) + with open(file_loc, "wb") as file: + shutil.copyfileobj(res.raw, file, 8192) @dataclass(init=True) @@ -99,15 +115,15 @@ class CustomMessage(Exception): message: str = None episode_quality: str = None - def print_error(self) -> str: + def print_error(self): print(self.message) - def qual_not_found(self) -> str: + def qual_not_found(self): print( - f"[{Fore.RED}-{Fore.RESET}] {Fore.LIGHTCYAN_EX}{self.episode_quality}{Fore.RESET} quality not found." + f"[{Fore.RESET}{Fore.RED}-{Fore.RESET}] {Fore.LIGHTCYAN_EX}{self.episode_quality}{Fore.RESET} quality not found." ) - def use_default_qual(self) -> str: + def use_default_qual(self): print( - f"[{Fore.GREEN}+{Fore.RESET}] Using {Fore.LIGHTCYAN_EX}{self.episode_quality}{Fore.RESET} as a default quality." + f"[{Fore.RESET}{Fore.GREEN}+{Fore.RESET}] Using {Fore.LIGHTCYAN_EX}{self.episode_quality}{Fore.RESET} as a default quality." )