GoGoDownloader/src/backend.py
Arctic4161 fbf352579c
Update backend.py
Added refer to get around 403 forbidden error
2021-10-11 16:44:48 -05:00

114 lines
4.2 KiB
Python

# Dependencies
import requests as req
import shutil
import re
import os
from bs4 import BeautifulSoup
from dataclasses import dataclass
from colorama import Fore
@dataclass(init=True)
class Download:
name: str
episode_quality: str
folder: str
all_episodes: int
episode_start: int
episode_end: int
printed: bool = False
def get_links(self, source=None) -> 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"}
)
if not self.printed:
CustomMessage(None, self.episode_quality).qual_not_found()
self.episode_quality = link.text.split()[1][1:]
CustomMessage(None, self.episode_quality).use_default_qual()
self.printed = True
return [
download_link.split("+")[-1],
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",
"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)
@dataclass(init=True)
class CustomMessage(Exception):
"""Custom message that will accept message as a parameter and it will print it on the console."""
message: str = None
episode_quality: str = None
def print_error(self) -> str:
print(self.message)
def qual_not_found(self) -> str:
print(
f"[{Fore.RED}-{Fore.RESET}] {Fore.LIGHTCYAN_EX}{self.episode_quality}{Fore.RESET} quality not found."
)
def use_default_qual(self) -> str:
print(
f"[{Fore.GREEN}+{Fore.RESET}] Using {Fore.LIGHTCYAN_EX}{self.episode_quality}{Fore.RESET} as a default quality."
)