GoGoDownloader/src/bitanime.py

154 lines
5.7 KiB
Python
Raw Normal View History

import requests as req
2021-09-01 16:34:08 +08:00
import ctypes
import os
import colorama
import concurrent.futures
2021-09-22 17:46:42 +08:00
from backend import Download, CustomMessage
2021-09-01 16:34:08 +08:00
from tqdm.contrib.concurrent import thread_map
from bs4 import BeautifulSoup
from colorama import Fore
colorama.init(autoreset=True)
2021-09-22 17:46:42 +08:00
OK = f"[{Fore.GREEN}+{Fore.RESET}] "
ERR = f"[{Fore.RED}-{Fore.RESET}] "
IN = f"[{Fore.LIGHTBLUE_EX}>{Fore.RESET}] "
2021-09-01 16:23:47 +02:00
try:
ctypes.windll.kernel32.SetConsoleTitleW("BitAnime")
2021-09-02 15:25:21 +08:00
except (AttributeError):
2021-09-01 16:23:47 +02:00
pass
2021-09-01 16:34:08 +08:00
2021-09-02 15:25:21 +08:00
2021-09-01 16:34:08 +08:00
def bitanime():
while True:
2021-09-01 16:34:08 +08:00
print(
f""" {Fore.LIGHTBLUE_EX}
____ _ _ _ _
| __ )(_) |_ / \ _ __ (_)_ __ ___ ___
| _ \| | __| / _ \ | '_ \| | '_ ` _ \ / _ \\
| |_) | | |_ / ___ \| | | | | | | | | | __/
|____/|_|\__/_/ \_\_| |_|_|_| |_| |_|\___|
{Fore.LIGHTYELLOW_EX}
By: sh1nobu
Github: https://github.com/sh1nobuu/BitAnime
"""
)
while True:
2021-09-22 17:46:42 +08:00
name = input(f"{IN}Enter anime name > ").lower()
2021-09-01 16:34:08 +08:00
if "-" in name:
title = name.replace("-", " ").title().strip()
else:
title = name.title().strip()
source = f"https://gogoanime.pe/category/{name}"
with req.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(all_episodes.get_text().split("-")[-1].strip())
break
else:
2021-09-22 17:46:42 +08:00
print(f"{ERR}Error 404: Anime not found. Please try again.")
while True:
quality = input(
2021-09-22 17:46:42 +08:00
f"{IN}Enter episode quality (1.SD/360P|2.HD/720P|3.FULLHD/1080P) > "
)
if quality == "1" or quality == "":
episode_quality = "SDP"
break
elif quality == "2":
episode_quality = "HDP"
break
elif quality == "3":
episode_quality = "FullHDP"
break
else:
2021-09-22 17:46:42 +08:00
print(f"{ERR}Invalid input. Please try again.")
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}")
2021-09-01 16:34:08 +08:00
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(
2021-09-22 17:46:42 +08:00
f"{IN}Do you want to download all episode? (y/n) > "
).lower()
if choice in ["y", "n"]:
break
else:
2021-09-22 17:46:42 +08:00
print(f"{ERR}Invalid input. Please try again.")
episode_start = None
episode_end = None
if choice == "n":
while True:
try:
2021-09-22 17:46:42 +08:00
episode_start = int(input(f"{IN}Episode start > "))
episode_end = int(input(f"{IN}Episode end > "))
if episode_start <= 0 or episode_end <= 0:
2021-09-22 17:46:42 +08:00
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:
2021-09-22 17:46:42 +08:00
CustomMessage(
f"{ERR}episode_start or episode_end cannot be more than {all_episodes}"
).print_error()
elif episode_end <= episode_start:
2021-09-22 17:46:42 +08:00
CustomMessage(
f"{ERR}episode_end cannot be less than or equal to episode_start"
).print_error()
else:
break
except ValueError:
2021-09-22 17:46:42 +08:00
print(f"{ERR}Invalid input. Please try again.")
episode_start = episode_start if episode_start is not None else 1
episode_end = episode_end if episode_end is not None else all_episodes
download = Download(
name, episode_quality, folder, all_episodes, episode_start, episode_end
)
2021-09-01 16:34:08 +08:00
source = f"https://gogoanime.pe/{name}"
with req.get(source) as res:
soup = BeautifulSoup(res.content, "html.parser")
2021-09-22 17:46:42 +08:00
episode_zero = soup.find("h1", {"class": "entry-title"}) # value: 404
if choice == "n" or episode_zero is not None:
source = None
episode_links = download.get_links(source)
with concurrent.futures.ThreadPoolExecutor() as exec:
download_links = list(exec.map(download.get_download_links, episode_links))
download_urls = list(exec.map(download.get_download_urls, download_links))
print(
2021-09-22 17:46:42 +08:00
f"{OK}Downloading {Fore.LIGHTCYAN_EX}{len(download_urls)}{Fore.RESET} episode/s"
)
thread_map(
download.download_episodes,
download_urls,
ncols=75,
total=len(download_urls),
)
try:
os.startfile(folder)
except (AttributeError):
import sys, subprocess
2021-09-01 16:23:47 +02:00
opener = "open" if sys.platform == "darwin" else "xdg-open"
subprocess.call([opener, folder])
2021-09-22 17:46:42 +08:00
use_again = input(f"{IN}Do you want to use the app again? (y|n) > ").lower()
2021-09-01 16:34:08 +08:00
if use_again == "y":
os.system("cls")
else:
break
2021-09-01 16:34:08 +08:00
if __name__ == "__main__":
bitanime()