From 16540ce08440cef49543ad5240e47e6876233170 Mon Sep 17 00:00:00 2001 From: sh1nobu Date: Wed, 1 Sep 2021 16:34:08 +0800 Subject: [PATCH] first commit --- .gitignore | 141 +++++++++++++++++++++++++++++++++++++++ README.md | 54 +++++++++++++++ images/ba-logo.png | Bin 0 -> 26718 bytes images/ba-screenshot.PNG | Bin 0 -> 21705 bytes requirements.txt | Bin 0 -> 356 bytes src/backend.py | 68 +++++++++++++++++++ src/bitanime.py | 114 +++++++++++++++++++++++++++++++ 7 files changed, 377 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 images/ba-logo.png create mode 100644 images/ba-screenshot.PNG create mode 100644 requirements.txt create mode 100644 src/backend.py create mode 100644 src/bitanime.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d85d89c --- /dev/null +++ b/.gitignore @@ -0,0 +1,141 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# Executable files +exe/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..622b02e --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +
+ BitAnime +

BitAnime

+

+ A Python script that allows you to download all of an anime's episodes at once. +

+ · Download executable version · +
+ +## About BitAnime + +**BitAnime** is a python script that allows you to download anime in large batches. It can also be used to download anime films. **BitAnime** gets its content from [gogoanime](https://gogoanime.pe/). If you get a **404** error, please look up the correct anime name on [gogoanime](https://gogoanime.pe/). This application can only download **1**-**99** episodes at the time. At the moment, the quality of the episodes that will be downloaded is different for every anime. For **older anime**, the quality will be **360p** to **480p**, for **newer anime** the quality will be **720p** to **1080p**. + +## Installation + +```console +git clone https://github.com/sh1nobuu/BitAnime.git +``` + +## Screenshot + +
+ BitAnime Screenshot +
+ +## Dependencies + +**BitAnime** is highly reliant on the python modules `requests`, `colorama`, `tqdm`, and `BeautifulSoup`. + +```console +pip install -r requirements.txt +``` + +## Usage + +The anime name is separated by "-". You can either type it manually, or go to [gogoanime.pe](https://gogoanime.pe/) and search for the anime you want to download and copy the name from the URL. + +### Examples + +##### One word title + +- https://gogoanime.pe/category/bakemonogatari >> bakemonogatari +- https://gogoanime.pe/category/steinsgate >> steinsgate + +##### Multiple word title + +- https://gogoanime.pe/category/shadows-house >> shadows-house +- https://gogoanime.pe/category/kono-subarashii-sekai-ni-shukufuku-wo- >> kono-subarashii-sekai-ni-shukufuku-wo- diff --git a/images/ba-logo.png b/images/ba-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8d0e6c3e5d85b20ea3c564622c12bf742fb283 GIT binary patch literal 26718 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 XLWGb%qdTOz00000NkvXXu0mjfP)sv0 literal 0 HcmV?d00001 diff --git a/images/ba-screenshot.PNG b/images/ba-screenshot.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ec13c2b573b4217bbac4e14112ec67865678ffaa GIT binary patch literal 21705 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 WB;&a6UIF>hk6fKEIhCFBrTzu}=W`SQ literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..079fb68d2f3b2dd4dd8089528ab6882d9d87e7de GIT binary patch literal 356 zcmYL_-3o$G5QOJC=ur|on$SfLqj@61vi#|yhp)a}m5}AY?CgBIem|9>N=+Ko=)&7- zP{;dFt`lFbL`N#qRvT4xXFWx;+Pi)xrC%}{p9^#Y-9!hUP8Z)5T2D&Ez0)05uNztm z|LrM84NH2yOm+0lS-RI8#>sW=w3=`t}w7$Q*X_OelPdAJm#N@Bjb+ literal 0 HcmV?d00001 diff --git a/src/backend.py b/src/backend.py new file mode 100644 index 0000000..5ac4bfa --- /dev/null +++ b/src/backend.py @@ -0,0 +1,68 @@ +import requests +import os +import shutil +from bs4 import BeautifulSoup + +folder_path = "" + + +def get_path(folder): + global folder_path + folder_path = folder + + +def get_links(name, episode_number, source=None): + if source is not None: + source_ep = f"https://gogoanime.pe/{name}-episode-" + episode_links = [f"{source_ep}{i}" for i in range(1, int(episode_number) + 1)] + episode_links.insert(0, source) + else: + source_ep = f"https://gogoanime.pe/{name}-episode-" + episode_links = [f"{source_ep}{i}" for i in range(1, int(episode_number) + 1)] + return episode_links + + +def get_download_links(episode_links): + download_links = [] + for episode_link in episode_links: + episode_link_resp = requests.get(episode_link) + soup = BeautifulSoup(episode_link_resp.content, "html.parser") + links = soup.find("li", {"class": "dowloads"}) + for link in links: + link = link.get("href") + download_links.append(link) + return download_links + + +def get_download_urls(download_links, bool): + download_urls = [] + for link in download_links: + link = requests.get(link) + soup = BeautifulSoup(link.content, "html.parser") + download_link = soup.find_all("div", {"class": "dowload"}) + download_urls.append(download_link[0].a.get("href")) + if bool: + conv_download_urls = { + episode_title: url for episode_title, url in enumerate(download_urls) + } + else: + conv_download_urls = { + episode_title + 1: url + for episode_title, url in enumerate(download_urls) + } + conv_download_urls = sorted(set(conv_download_urls.items())) + return conv_download_urls + + +def download_episodes(url): + 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", + } + url_resp = requests.get(url[1], headers=header, stream=True) + file_name = os.path.join(folder_path, f"{url[0]}.mp4") + with open(file_name, "wb") as file: + shutil.copyfileobj(url_resp.raw, file) diff --git a/src/bitanime.py b/src/bitanime.py new file mode 100644 index 0000000..998da4d --- /dev/null +++ b/src/bitanime.py @@ -0,0 +1,114 @@ +# Dependencies + +import requests +import ctypes +import os +import backend as bd +import colorama +from tqdm.contrib.concurrent import thread_map +from bs4 import BeautifulSoup +from colorama import Fore + +colorama.init(autoreset=True) +ctypes.windll.kernel32.SetConsoleTitleW("BitAnime") + + +def bitanime(): + again = True + while again: + print( + f""" {Fore.LIGHTBLUE_EX} + ____ _ _ _ _ + | __ )(_) |_ / \ _ __ (_)_ __ ___ ___ + | _ \| | __| / _ \ | '_ \| | '_ ` _ \ / _ \\ + | |_) | | |_ / ___ \| | | | | | | | | | __/ + |____/|_|\__/_/ \_\_| |_|_|_| |_| |_|\___| + {Fore.LIGHTYELLOW_EX} + By: sh1nobu + Github: https://github.com/sh1nobuu/BitAnime + """ + ) + """ + Ask user for input and then check if the anime provided exists or if not, loop + """ + check = True + while check: + name = input(f"Enter anime name >> ").lower() + if "-" in name: + title = name.replace("-", " ").title().strip() + else: + title = name.title().strip() + source = f"https://gogoanime.pe/category/{name}" + resp = requests.get(source) + if resp.status_code == 200: + print(f"{Fore.LIGHTGREEN_EX}====================================") + check = False + else: + print( + f"{Fore.LIGHTRED_EX}Error 404: Anime not found. Please try again." + ) + check = True + """ + Get how many episode/s the anime has + """ + soup = BeautifulSoup(resp.content, "html.parser") + episode_number = soup.find("ul", {"id": "episode_page"}) + episode_number = episode_number.get_text().split("-")[1].strip() + """ + Print the anime name, episode, and the link of the anime + """ + print(f"Title: {Fore.LIGHTCYAN_EX}{title}") + print(f"Episode/s: {Fore.LIGHTCYAN_EX}{episode_number}") + print(f"Link: {Fore.LIGHTCYAN_EX}{source}") + print(f"{Fore.LIGHTGREEN_EX}====================================") + """ + Create a download folder for the anime + """ + folder = os.path.join(os.getcwd(), title) + if not os.path.exists(folder): + os.mkdir(folder) + """ + Check if the anime has episode 0 or not + """ + source = f"https://gogoanime.pe/{name}" + resp = requests.get(source) + soup = BeautifulSoup(resp.content, "html.parser") + episode_zero = soup.find("h1", {"class": "entry-title"}) + if episode_zero is None: + # Episode 0 does exist + episode_links = bd.get_links(name, episode_number, source) + download_links = bd.get_download_links(episode_links) + download_urls = bd.get_download_urls(download_links, True) + print(f"Downloading {Fore.LIGHTCYAN_EX}{len(download_urls)} episode/s") + print(f"{Fore.LIGHTGREEN_EX}====================================") + print(download_urls) + bd.get_path(folder) + thread_map( + bd.download_episodes, download_urls, ncols=75, total=len(download_urls) + ) + os.startfile(folder) + + else: + # Episode 0 does not exist + episode_links = bd.get_links(name, episode_number) + download_links = bd.get_download_links(episode_links) + download_urls = bd.get_download_urls(download_links, False) + print( + f"Downloading {Fore.LIGHTCYAN_EX}{len(download_urls)}{Fore.RESET} episode/s" + ) + print(f"{Fore.LIGHTGREEN_EX}====================================") + bd.get_path(folder) + thread_map( + bd.download_episodes, download_urls, ncols=75, total=len(download_urls) + ) + os.startfile(folder) + use_again = input("Do you want to download other anime? (y|n) >> ").lower() + if use_again == "y": + again = True + os.system("cls") + else: + again = False + + +if __name__ == "__main__": + bitanime()