# -*- coding: utf-8 -*- # Copyright 2015-2019 Mike Fährmann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. """Extract images from https://hitomi.la/""" from .common import ChapterExtractor from .. import text, util import string class HitomiGalleryExtractor(ChapterExtractor): """Extractor for image galleries from hitomi.la""" category = "hitomi" subcategory = "gallery" directory_fmt = ("{category}", "{gallery_id} {title}") filename_fmt = "{category}_{gallery_id}_{page:>03}_{name}.{extension}" archive_fmt = "{gallery_id}_{page}" pattern = r"(?:https?://)?hitomi\.la/(?:galleries|reader)/(\d+)" test = ( ("https://hitomi.la/galleries/867789.html", { "url": "cb759868d090fe0e2655c3e29ebf146054322b6d", "keyword": "85e453d01ee7f137669e75a764ccdc65ca092ad2", }), ("https://hitomi.la/galleries/1036181.html", { # "aa" subdomain for gallery-id ending in 1 (#142) "pattern": r"https://aa\.hitomi\.la/", }), ("https://hitomi.la/reader/867789.html"), ) def __init__(self, match): self.gid = text.parse_int(match.group(1)) url = "https://hitomi.la/galleries/{}.html".format(self.gid) ChapterExtractor.__init__(self, match, url) def get_metadata(self, page, extr=text.extract): pos = page.index('

', '<', pos) artist, pos = extr(page, '

', '

', pos) group , pos = extr(page, 'Group', '', pos) gtype , pos = extr(page, 'Type', '', pos) lang , pos = extr(page, 'Language', '', pos) series, pos = extr(page, 'Series', '', pos) chars , pos = extr(page, 'Characters', '', pos) tags , pos = extr(page, 'Tags', '', pos) date , pos = extr(page, '', '', pos) lang = None if lang == "N/A" else text.remove_html(lang) return { "gallery_id": self.gid, "title": text.unescape(" ".join(title.split())), "artist": self._prepare(artist), "group": self._prepare(group), "type": text.remove_html(gtype).capitalize(), "lang": util.language_to_code(lang), "language": lang, "date": date, "series": self._prepare(series), "characters": self._prepare(chars), "tags": self._prepare(tags), } def get_images(self, page): # see https://ltn.hitomi.la/common.js frontends = 2 offset = self.gid % frontends if self.gid % 10 != 1 else 0 subdomain = chr(97 + offset) + "a" base = "https://" + subdomain + ".hitomi.la/galleries/" return [ (base + urlpart, None) for urlpart in text.extract_iter( page, "'//tn.hitomi.la/smalltn/", ".jpg'," ) ] @staticmethod def _prepare(value): if not value or "