From 7ab27db0dd38e70531be139ef8a016d0ad6f7edf Mon Sep 17 00:00:00 2001 From: j Date: Fri, 1 Feb 2019 18:46:07 +0530 Subject: [PATCH 1/3] cover fallback --- oml/item/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oml/item/models.py b/oml/item/models.py index 72d6b8e..149a678 100644 --- a/oml/item/models.py +++ b/oml/item/models.py @@ -837,13 +837,13 @@ def update_sort_table(): def download_cover(id): key = 'cover:%s' % id + cover = None with db.session(): i = Item.get(id) if i: url = i.meta.get('cover') else: url = None - cover = None logger.debug('download cover %s %s', id, url) ratio = None From 9ef5c012350e09685da61dc986dfc29d28989533 Mon Sep 17 00:00:00 2001 From: j Date: Fri, 1 Feb 2019 19:19:16 +0530 Subject: [PATCH 2/3] merge cbr/cbz cover extraction --- oml/media/cbr.py | 47 ++++++++++++++++++++++++++++++++++++++++++++--- oml/media/cbz.py | 35 +---------------------------------- 2 files changed, 45 insertions(+), 37 deletions(-) diff --git a/oml/media/cbr.py b/oml/media/cbr.py index a1840a3..244ee67 100644 --- a/oml/media/cbr.py +++ b/oml/media/cbr.py @@ -1,19 +1,39 @@ # -*- coding: utf-8 -*- import logging import os +import zipfile import ox logger = logging.getLogger(__name__) - IMAGE_EXTENSIONS = ['.jpg', '.png', '.gif'] + def filter_images(files): - return [f for f in files if os.path.splitext(f)[-1] in IMAGE_EXTENSION] + return [f for f in files if os.path.splitext(f)[-1].lower() in IMAGE_EXTENSIONS] + +def detect_format(path): + with open(path, 'rb') as fd: + head = fd.read(10) + if head[:2] == b'PK': + return 'cbz' + if head[:3] == b'Rar': + return 'cbr' + logger.debug('unknown cbr/cbz file %s - %s', head, path) + return 'unknown' def cover(path): + format = detect_format(path) + if format == 'cbz': + cover = cover_cbz(path) + elif format == 'cbr': + cover = cover_cbr(path) + else: + cover = None + return cover + +def cover_cbr(path): data = None - #open rar file and extract first page here try: from unrar import rarfile rar = rarfile.RarFile(path) @@ -23,9 +43,30 @@ def cover(path): cover = ox.sorted_strings(files)[0] data = rar.read(cover) except: + logger.debug('invalid cbr file %s', path) data = None return data +def cover_cbz(path): + data = None + logger.debug('cover %s', path) + data = None + try: + z = zipfile.ZipFile(path) + except zipfile.BadZipFile: + logger.debug('invalid cbz file %s', path) + return data + files = [f.filename for f in z.filelist] + files = filter_images(files) + if files: + cover = ox.sorted_strings(files)[0] + try: + data = z.read(cover) + except: + data = None + return data + + def info(path): data = {} data['title'] = os.path.splitext(os.path.basename(path))[0] diff --git a/oml/media/cbz.py b/oml/media/cbz.py index 0e71475..1428292 100644 --- a/oml/media/cbz.py +++ b/oml/media/cbz.py @@ -1,36 +1,3 @@ # -*- coding: utf-8 -*- -import logging -import os -import zipfile - -import ox - -from .cbr import filter_images - -logger = logging.getLogger(__name__) - -def cover(path): - data = None - logger.debug('cover %s', path) - data = None - try: - z = zipfile.ZipFile(path) - except zipfile.BadZipFile: - logger.debug('invalid zbc file %s', path) - return data - files = [f.filename for f in z.filelist] - files = filter_images(files) - if files: - cover = ox.sorted_strings(files)[0] - try: - data = z.read(cover) - except: - data = None - return data - -def info(path): - data = {} - data['title'] = os.path.splitext(os.path.basename(path))[0] - #data['pages'] = fixme read rar to count pages - return data +from .cbr import cover, info From 148b41087fcff4097c7e3ee38a8c3de8ce41e260 Mon Sep 17 00:00:00 2001 From: j Date: Fri, 1 Feb 2019 19:24:34 +0530 Subject: [PATCH 3/3] extract pages from cbr/cbz --- oml/media/cbr.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/oml/media/cbr.py b/oml/media/cbr.py index 244ee67..0735d32 100644 --- a/oml/media/cbr.py +++ b/oml/media/cbr.py @@ -66,10 +66,30 @@ def cover_cbz(path): data = None return data +def get_pages(path): + files = [] + format = detect_format(path) + if format == 'cbz': + try: + z = zipfile.ZipFile(path) + except zipfile.BadZipFile: + logger.debug('invalid cbz file %s', path) + return data + files = [f.filename for f in z.filelist] + elif format == 'cbr': + try: + from unrar import rarfile + rar = rarfile.RarFile(path) + files = rar.namelist() + except: + pass + files = filter_images(files) + return len(files) + def info(path): data = {} data['title'] = os.path.splitext(os.path.basename(path))[0] - #data['pages'] = fixme read rar to count pages + data['pages'] = get_pages(path) return data