manga-dlp/mangadexdlp/main.py
Ivan Schaller 249e269e2d
All checks were successful
continuous-integration/drone/push Build is passing
add support for volumes
2021-12-20 14:29:40 +01:00

173 lines
5.8 KiB
Python

from pathlib import Path
import mangadexdlp.api as MdApi
import mangadexdlp.utils as MdUtils
import mangadexdlp.downloader as MdDownloader
import mangadexdlp.database as MdDb
def mangadex_dlp(md_url='',
md_chapters=None,
md_dest='downloads',
md_lang='en',
md_list_chapters=False,
md_nocbz=False,
md_forcevol=False,
verbose=False):
'''Download Mangas from Mangadex.org\n
Args:\n
url (str) -- Manga URL to Download. No defaults\n
chapter (str/int) -- Chapters to download "all" for every chapter available. Defaults to none\n
dest (str) -- Folder to save mangas to. Defaults to "downloads"\n
lang (str) -- Language to download chapters in. Defaults to "en" -> english\n
list (bool) -- If it should only list all available chapters. Defaults to False\n
nocbz (bool) -- If the downloaded images should not be packed into a .cbz archive. Defaults to false\n
verbose (bool) -- If verbose logging is enabled. Defaults to false\n
Returns:\n
nothing\n
'''
# check if md_list_chapters is true, if not check if chapters to download were specified
if not md_list_chapters and md_chapters == None:
# no chapters to download were given
print(f'You need to specify one or more chapters to download. To see all chapters use "--list"')
exit(1)
# get uuid and manga name of url
manga_uuid = MdApi.get_manga_uuid(md_url)
manga_title = MdApi.get_manga_title(manga_uuid, md_lang)
print('\n=========================================')
print(f'Manga Name: {manga_title}')
print(f'UUID: {manga_uuid}')
# get chapters
manga_chapter_data = MdApi.get_manga_chapters(manga_uuid, md_lang)
# [0][0] = Volume Number
# [0][1] = Chapter number/oneshot
# [0][2] = Chapter UUID
# [0][3] = Chapter Hash
# [0][4] = Chapter Name
# [0][5] = Chapter Image Data
# crate chapter list
manga_chapter_list = []
for chap in manga_chapter_data:
volume_number = chap[0]
chapter_number = chap[1]
if md_forcevol:
manga_chapter_list.append(f'{volume_number}:{chapter_number}')
else:
manga_chapter_list.append(chapter_number)
# sort chapter list for volumes
if md_forcevol:
manga_chapter_list.sort(key=lambda x: x.split(':')[0])
# list chapters if md_list_chapters is true
if md_list_chapters:
print(f'Available Chapters:\n{", ".join(manga_chapter_list)}')
print('=========================================\n')
exit(0)
# check chapters to download if it not all
chapters_to_download = []
if md_chapters.lower() == 'all':
chapters_to_download = manga_chapter_list
else:
chapters_to_download = MdUtils.get_chapter_list(md_chapters)
# show chapters to download
print(f'Chapters selected:\n{", ".join(chapters_to_download)}')
print('=========================================\n')
# create manga folder
manga_path = Path(f'{md_dest}/{manga_title}')
manga_path.mkdir(parents=True, exist_ok=True)
# main download loop
for chapter in chapters_to_download:
# get index of chapter
if md_forcevol:
chapter_index = next(c for c in manga_chapter_data if f'{c[0]}:{c[1]}' == chapter)
else:
chapter_index = next(c for c in manga_chapter_data if c[1] == chapter)
chapter_vol = chapter_index[0]
chapter_num = chapter_index[1]
chapter_uuid = chapter_index[2]
chapter_hash = chapter_index[3]
chapter_name = chapter_index[4]
chapter_img_data = chapter_index[5]
image_urls = MdUtils.get_img_urls(chapter_img_data, chapter_hash)
# filename for chapter
if chapter_name == 'Oneshot' or chapter_num == 'Oneshot':
chapter_filename = 'Oneshot'
elif not chapter_name and md_forcevol:
chapter_filename = f'Vol. {chapter_vol} Ch. {chapter_num}'
elif not chapter_name:
chapter_filename = f'Ch. {chapter_num}'
elif md_forcevol:
chapter_filename = f'Vol. {chapter_vol} Ch. {chapter_num} - {chapter_name}'
else:
chapter_filename = f'Ch. {chapter_num} - {chapter_name}'
chapter_path = manga_path / chapter_filename
# check if chapter already exists
if md_nocbz and chapter_path.exists():
if md_forcevol:
print(f'- Vol {chapter_vol} Chapter {chapter_num} already exists. Skipping\n')
else:
print(f'- Chapter {chapter_num} already exists. Skipping\n')
continue
elif Path(chapter_path.parent / (chapter_path.name + '.cbz')).exists():
if md_forcevol:
print(f'- Vol {chapter_vol} Chapter {chapter_num} already exists. Skipping\n')
else:
print(f'- Chapter {chapter_num} already exists. Skipping\n')
continue
# create chapter folder
chapter_path.mkdir(parents=True, exist_ok=True)
# verbose output
if verbose:
print(f'Filename: {chapter_path}\n')
print(f'Image URLS: {image_urls}')
print(f'DEBUG: Downloading Volume {chapter_vol}')
# download images
if md_forcevol:
print(f'+ Downloading Volume {chapter_vol} Chapter {chapter_num}')
else:
print(f'+ Downloading Chapter {chapter_num}')
try:
MdDownloader.download_chapter(image_urls, chapter_path, verbose)
except:
if md_forcevol:
print(f'Cant download volume {chapter_vol} chapter {chapter_num}. Exiting')
else:
print(f'Cant download chapter {chapter_num}. Exiting')
exit(1)
else:
# Done with chapter
if md_forcevol:
print(f'Successfully downloaded volume {chapter_vol} chapter {chapter_num}')
else:
print(f'Successfully downloaded chapter {chapter_num}')
# make cbz of folder
if not md_nocbz:
print('\n+ Creating .cbz archive')
try:
MdUtils.make_archive(chapter_path)
except:
print('Could not make cbz archive')
exit(1)
# done with chapter
print('Done')
print('------------------------------\n')