GoGoDownloader/GoGoDownloader.py
2023-08-08 15:44:12 +01:00

177 lines
6.5 KiB
Python

import requests
import ctypes
import os
from backend import gogoanime, CustomMessage, config_check
from bs4 import BeautifulSoup
from colorama import Fore
import logging
OK = f"{Fore.RESET}[{Fore.GREEN}+{Fore.RESET}] "
ERR = f"{Fore.RESET}[{Fore.RED}-{Fore.RESET}] "
IN = f"{Fore.RESET}[{Fore.LIGHTBLUE_EX}>{Fore.RESET}] "
try:
ctypes.windll.kernel32.SetConsoleTitleW("GoGo Downloader")
except AttributeError:
pass
def gogodownloader(config):
CURRENT_URL = config["CurrentGoGoAnimeURL"]
os.system("cls" if os.name == "nt" else "clear")
while True:
print(
f""" {Fore.LIGHTBLUE_EX}
______ ______
/ ____/___ / ____/___
/ / __/ __ \/ / __/ __ \
/ /_/ / /_/ / /_/ / /_/ /
\__________/\____/\____/ __ __
/ __ \____ _ ______ / /___ ____ _____/ /__ _____
/ / / / __ \ | /| / / __ \/ / __ \/ __ `/ __ / _ \/ ___/
/ /_/ / /_/ / |/ |/ / / / / / /_/ / /_/ / /_/ / __/ /
/_____/\____/|__/|__/_/ /_/_/\____/\__,_/\__,_/\___/_/
{Fore.RED}
By: Karl0ss
Forked From: sh1nobuu
Github: https://github.com/karl0ss/GoGoDownloader
"""
)
while True:
name = input(f"{IN}Enter anime name > ").lower()
logging.info("episode searched for " + name)
if "-" in name:
title = name.replace("-", " ").title().strip()
else:
title = name.title().strip()
source = f"https://{CURRENT_URL}/category/{name}"
with requests.get(source) as res:
if res.status_code == 200:
soup = BeautifulSoup(res.content, "html.parser")
all_episodes = soup.find("ul", {"id": "episode_page"})
all_episodes = int(list(filter(None, "-".join(all_episodes.get_text().splitlines()).split("-")))[-1].strip())
break
else:
print(f"{ERR}Error 404: Anime not found. Please try again.")
while True:
quality = input(
f"{IN}Enter episode quality (1.SD/360P|2.SD/480P|3.HD/720P|4.FULLHD/1080P) > "
)
if quality == "1" or quality == "":
episode_quality = "360"
break
elif quality == "2":
episode_quality = "480"
break
elif quality == "3":
episode_quality = "720"
break
elif quality == "4":
episode_quality = "1080"
break
else:
print(f"{ERR}Invalid input. Please try again.")
logging.info("quality selected " + episode_quality)
print(f"{OK}Title: {Fore.LIGHTCYAN_EX}{title}")
print(f"{OK}Episode/s: {Fore.LIGHTCYAN_EX}{all_episodes}")
print(f"{OK}Quality: {Fore.LIGHTCYAN_EX}{episode_quality}")
print(f"{OK}Link: {Fore.LIGHTCYAN_EX}{source}")
folder = os.path.join(os.getcwd(), title)
if not os.path.exists(folder):
os.mkdir(folder)
choice = "y"
if all_episodes != 1:
while True:
choice = input(
f"{IN}Do you want to download all episode? (y/n) > "
).lower()
if choice in ["y", "n"]:
break
else:
print(f"{ERR}Invalid input. Please try again.")
episode_start = None
episode_end = None
if choice == "n":
while True:
try:
episode_start = int(input(f"{IN}Episode start > "))
episode_end = int(input(f"{IN}Episode end > "))
if episode_start <= 0 or episode_end <= 0:
CustomMessage(
f"{ERR}episode_start or episode_end cannot be less than or equal to 0"
).print_error()
elif episode_start >= all_episodes or episode_end > all_episodes:
CustomMessage(
f"{ERR}episode_start or episode_end cannot be more than {all_episodes}"
).print_error()
elif episode_end < episode_start:
CustomMessage(
f"{ERR}episode_end cannot be less than episode_start"
).print_error()
else:
break
except ValueError:
print(f"{ERR}Invalid input. Please try again.")
if episode_start is not None:
pass
else:
episode_start = 1
if episode_end is not None:
pass
else:
episode_end = all_episodes
gogo = gogoanime(
config,
name,
episode_quality,
folder,
all_episodes,
episode_start,
episode_end,
title,
)
gogo.user_logged_in_check()
source = f"https://{CURRENT_URL}/{name}"
with requests.get(source) as res:
soup = BeautifulSoup(res.content, "html.parser")
episode_zero = soup.find("h1", {"class": "entry-title"}) # value: 404
if choice == "n" or episode_zero is not None:
source = None
dl_links = []
episode_links = gogo.get_links(source)
print(f"{OK}Scraping Links")
for link in episode_links:
dl_links.append(gogo.get_download_link(link))
result = gogo.file_downloader(dl_links)
if len(result.errors) > 0:
while len(result.errors) > 0:
print(f"{ERR}{len(result.errors)} links failed retrying.")
episode_links = gogo.get_links(source)
print(f"{OK}Re-Scraping Links")
dl_links.clear()
for link in episode_links:
dl_links.append(gogo.get_download_link(link))
result = gogo.file_downloader(dl_links, overwrite_downloads=0)
use_again = input(f"{IN}Do you want to use the app again? (y|n) > ").lower()
if use_again == "y":
os.system("cls" if os.name == "nt" else "clear")
else:
break
if __name__ == "__main__":
config = config_check()
gogodownloader(config)