# Dependencies import requests as req import shutil import re import os from bs4 import BeautifulSoup from dataclasses import dataclass @dataclass(init=True) class Download: name: str episode_quality: str folder: str all_episodes: int episode_start: int episode_end: int def get_links(self, source) -> list[str]: if source is not None: source_ep = f"https://gogoanime.pe/{self.name}-episode-" episode_links = [ f"{source_ep}{i}" for i in range(self.episode_start, self.episode_end + 1) ] episode_links.insert(0, source) else: source_ep = f"https://gogoanime.pe/{self.name}-episode-" episode_links = [ f"{source_ep}{i}" for i in range(self.episode_start, self.episode_end + 1) ] return episode_links def get_download_links(self, episode_link) -> list[str]: with req.get(episode_link) as res: soup = BeautifulSoup(res.content, "html.parser") exist = soup.find("h1", {"class": "entry-title"}) if exist is None: # Episode link == 200 episode_link = soup.find("li", {"class": "dowloads"}) return episode_link.a.get("href") else: # Episode link == 404 episode_link = f"{episode_link}-" with req.get(episode_link) as res: soup = BeautifulSoup(res.content, "html.parser") exist = soup.find("h1", {"class": "entry-title"}) if exist is None: episode_link = soup.find("li", {"class": "dowloads"}) return episode_link.a.get("href") else: return None def get_download_urls(self, download_link) -> list[str]: 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"}, ) if link is None: link = soup.find("div", {"class": "mirror_link"}).find( "div", {"class": "dowload"} ) # episode_name: int, episode_link: str return [download_link.split("+")[-1], link.a.get("href")] 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", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "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) @dataclass(init=True) class CustomError(Exception): """Custom exception that will accept message as a parameter and it will print it on the console.""" message: str def print_error(self) -> str: print(self.message)