Update backend.py

Fixed quality selection and website from slowing down the download due to multiple requests at once.
This commit is contained in:
Arctic4161 2021-10-14 09:22:02 -05:00 committed by GitHub
parent fbf352579c
commit 4d456ba9b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,6 +6,9 @@ import os
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from dataclasses import dataclass from dataclasses import dataclass
from colorama import Fore from colorama import Fore
from random import choice
import time
@dataclass(init=True) @dataclass(init=True)
@ -18,7 +21,7 @@ class Download:
episode_end: int episode_end: int
printed: bool = False printed: bool = False
def get_links(self, source=None) -> list[str]: def get_links(self, source=None):
if source is not None: if source is not None:
source_ep = f"https://gogoanime.pe/{self.name}-episode-" source_ep = f"https://gogoanime.pe/{self.name}-episode-"
episode_links = [ episode_links = [
@ -34,7 +37,7 @@ class Download:
] ]
return episode_links 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: with req.get(episode_link) as res:
soup = BeautifulSoup(res.content, "html.parser") soup = BeautifulSoup(res.content, "html.parser")
exist = soup.find("h1", {"class": "entry-title"}) exist = soup.find("h1", {"class": "entry-title"})
@ -54,19 +57,23 @@ class Download:
else: else:
return None 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: with req.get(download_link) as res:
soup = BeautifulSoup(res.content, "html.parser") soup = BeautifulSoup(res.content, "html.parser")
link = soup.find("div", {"class": "mirror_link"}).find( link = soup.find("div", {"class": "dowload"},text=re.compile(episode_quality))
"div",
text=re.compile(fr"\b{self.episode_quality}\b"),
attrs={"class": "dowload"},
)
if link is None: if link is None:
link = soup.find("div", {"class": "mirror_link"}).find( episode_quality = "720P"
"div", {"class": "dowload"} link = soup.find("div", {"class": "dowload"},text=re.compile(episode_quality))
) if link is None:
if not self.printed: episode_quality = "360P"
link = soup.find("div", {"class": "dowload"},text=re.compile(episode_quality))
CustomMessage(None, self.episode_quality).qual_not_found() CustomMessage(None, self.episode_quality).qual_not_found()
self.episode_quality = link.text.split()[1][1:] self.episode_quality = link.text.split()[1][1:]
CustomMessage(None, self.episode_quality).use_default_qual() CustomMessage(None, self.episode_quality).use_default_qual()
@ -76,20 +83,29 @@ class Download:
link.a.get("href"), link.a.get("href"),
] # episode_name: str, episode_link: str ] # episode_name: str, episode_link: str
def download_episodes(self, url) -> object: def random_headers(self):
header = { desktop_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0", 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", '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-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate", "Accept-Encoding": "gzip, deflate, br",
"Referer": "https://gogoanime.pe/", "Referer" : "https://goload.one/",
"Connection": "close", "Connection": "keep-alive"}
}
with req.get(url[1], headers=header, stream=True) as res: def download_episodes(self, url):
episode_name = f"EP.{url[0]}.mp4" with req.get(url[1], headers=self.random_headers(), stream=True) as res:
file_loc = os.path.join(self.folder, episode_name) episode_name = f"EP.{url[0]}.mp4"
with open(file_loc, "wb") as file: file_loc = os.path.join(self.folder, episode_name)
shutil.copyfileobj(res.raw, file, 8192) with open(file_loc, "wb") as file:
shutil.copyfileobj(res.raw, file, 8192)
@dataclass(init=True) @dataclass(init=True)
@ -99,15 +115,15 @@ class CustomMessage(Exception):
message: str = None message: str = None
episode_quality: str = None episode_quality: str = None
def print_error(self) -> str: def print_error(self):
print(self.message) print(self.message)
def qual_not_found(self) -> str: def qual_not_found(self):
print( 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( 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."
) )