diff --git a/nhentai/serializer.py b/nhentai/serializer.py index 8e7db1d..fc33cda 100644 --- a/nhentai/serializer.py +++ b/nhentai/serializer.py @@ -1,9 +1,11 @@ # coding: utf-8 import json import os +from iso8601 import parse_date +from xml.sax.saxutils import escape -def serialize(doujinshi, dir): +def serialize_json(doujinshi, dir): metadata = {'title': doujinshi.name, 'subtitle': doujinshi.info.subtitle} if doujinshi.info.date: @@ -28,6 +30,48 @@ def serialize(doujinshi, dir): json.dump(metadata, f, separators=','':') +def serialize_comicxml(doujinshi, dir): + with open(os.path.join(dir, 'ComicInfo.xml'), 'w') as f: + f.write('\n') + f.write('\n') + + xml_write_simple_tag(f, 'Manga', 'Yes') + + xml_write_simple_tag(f, 'Title', doujinshi.name) + xml_write_simple_tag(f, 'Summary', doujinshi.info.subtitle) + xml_write_simple_tag(f, 'PageCount', doujinshi.pages) + xml_write_simple_tag(f, 'URL', doujinshi.url) + xml_write_simple_tag(f, 'NhentaiId', doujinshi.id) + xml_write_simple_tag(f, 'Genre', doujinshi.info.categories) + + xml_write_simple_tag(f, 'BlackAndWhite', 'No' if doujinshi.info.tags and 'full color' in doujinshi.info.tags else 'Yes') + + if doujinshi.info.date: + dt = parse_date(doujinshi.info.date) + xml_write_simple_tag(f, 'Year', dt.year) + xml_write_simple_tag(f, 'Month', dt.month) + xml_write_simple_tag(f, 'Day', dt.day) + if doujinshi.info.parodies: + xml_write_simple_tag(f, 'Series', doujinshi.info.parodies) + if doujinshi.info.characters: + xml_write_simple_tag(f, 'Characters', doujinshi.info.characters) + if doujinshi.info.tags: + xml_write_simple_tag(f, 'Tags', doujinshi.info.tags) + if doujinshi.info.artists: + xml_write_simple_tag(f, 'Writer', ' & '.join([i.strip() for i in doujinshi.info.artists.split(',')])) + # if doujinshi.info.groups: + # metadata['group'] = [i.strip() for i in doujinshi.info.groups.split(',')] + if doujinshi.info.languages: + languages = [i.strip() for i in doujinshi.info.languages.split(',')] + xml_write_simple_tag(f, 'Translated', 'Yes' if 'translated' in languages else 'No') + [xml_write_simple_tag(f, 'Language', i) for i in languages if i != 'translated'] + + f.write('') + + +def xml_write_simple_tag(f, name, val, indent=1): + f.write(f'{" " * indent}<{name}>{escape(str(val))}\n') + def merge_json(): lst = [] output_dir = "./" diff --git a/nhentai/utils.py b/nhentai/utils.py index f9f5946..421abb8 100644 --- a/nhentai/utils.py +++ b/nhentai/utils.py @@ -12,7 +12,7 @@ import sqlite3 from nhentai import constant from nhentai.logger import logger -from nhentai.serializer import serialize, set_js_database +from nhentai.serializer import serialize_json, serialize_comicxml, set_js_database def request(method, url, **kwargs): @@ -86,7 +86,7 @@ def generate_html(output_dir='.', doujinshi_obj=None): js = readfile('viewer/scripts.js') if doujinshi_obj is not None: - serialize(doujinshi_obj, doujinshi_dir) + serialize_json(doujinshi_obj, doujinshi_dir) name = doujinshi_obj.name if sys.version_info < (3, 0): name = doujinshi_obj.name.encode('utf-8') @@ -102,9 +102,9 @@ def generate_html(output_dir='.', doujinshi_obj=None): with open(os.path.join(doujinshi_dir, 'index.html'), 'wb') as f: f.write(data.encode('utf-8')) - logger.log(15, 'HTML Viewer has been write to \'{0}\''.format(os.path.join(doujinshi_dir, 'index.html'))) + logger.log(15, 'HTML Viewer has been written to \'{0}\''.format(os.path.join(doujinshi_dir, 'index.html'))) except Exception as e: - logger.warning('Writen HTML Viewer failed ({})'.format(str(e))) + logger.warning('Writing HTML Viewer failed ({})'.format(str(e))) def generate_main_html(output_dir='./'): @@ -150,7 +150,7 @@ def generate_main_html(output_dir='./'): image_html += element.format(FOLDER=folder, IMAGE=image, TITLE=title) if image_html == '': - logger.warning('None index.html found, --gen-main paused.') + logger.warning('No index.html found, --gen-main paused.') return try: data = main.format(STYLES=css, SCRIPTS=js, PICTURE=image_html) @@ -163,14 +163,15 @@ def generate_main_html(output_dir='./'): shutil.copy(os.path.dirname(__file__)+'/viewer/logo.png', './') set_js_database() logger.log( - 15, 'Main Viewer has been write to \'{0}main.html\''.format(output_dir)) + 15, 'Main Viewer has been written to \'{0}main.html\''.format(output_dir)) except Exception as e: - logger.warning('Writen Main Viewer failed ({})'.format(str(e))) + logger.warning('Writing Main Viewer failed ({})'.format(str(e))) def generate_cbz(output_dir='.', doujinshi_obj=None, rm_origin_dir=False): if doujinshi_obj is not None: doujinshi_dir = os.path.join(output_dir, doujinshi_obj.filename) + serialize_comicxml(doujinshi_obj, doujinshi_dir) cbz_filename = os.path.join(os.path.join(doujinshi_dir, '..'), '{}.cbz'.format(doujinshi_obj.filename)) else: cbz_filename = './doujinshi.cbz' @@ -188,7 +189,7 @@ def generate_cbz(output_dir='.', doujinshi_obj=None, rm_origin_dir=False): if rm_origin_dir: shutil.rmtree(doujinshi_dir, ignore_errors=True) - logger.log(15, 'Comic Book CBZ file has been write to \'{0}\''.format(doujinshi_dir)) + logger.log(15, 'Comic Book CBZ file has been written to \'{0}\''.format(doujinshi_dir)) def format_filename(s): diff --git a/requirements.txt b/requirements.txt index 2b55b04..3fbad9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ BeautifulSoup4>=4.0.0 threadpool>=1.2.7 tabulate>=0.7.5 future>=0.15.2 +iso8601 >= 0.1