mirror of
https://github.com/karl0ss/GoGoDownloader.git
synced 2025-04-26 19:49:23 +01:00
114 lines
4.2 KiB
Python
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."
|
|
)
|