diff --git a/cps/constants.py b/cps/constants.py index bbede0a7b..e1330e1e6 100644 --- a/cps/constants.py +++ b/cps/constants.py @@ -143,7 +143,8 @@ del env_CALIBRE_PORT EXTENSIONS_AUDIO = {'mp3', 'ogg', 'opus', 'wav', 'flac', 'm4a', 'm4b'} -EXTENSIONS_VIDEO = {'mp4', 'avi', 'mkv', 'webm', 'm4v', 'mov', 'wmv', 'mpg', 'mpeg', 'flv', '3gp', '3g2', 'ogv'} +EXTENSIONS_VIDEO = {'mp4', 'webm', 'avi', 'mkv', 'm4v', 'mpg', 'mpeg', 'ogv'} +EXTENSIONS_IMAGE = {'jpg', 'jpeg', 'png', 'gif', 'svg', 'webp'} EXTENSIONS_CONVERT_FROM = ['pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'htmlz', 'rtf', 'odt', 'cbz', 'cbr'] EXTENSIONS_CONVERT_TO = ['pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', @@ -151,7 +152,7 @@ EXTENSIONS_CONVERT_TO = ['pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'kepub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'djv', 'prc', 'doc', 'docx', 'fb2', 'html', 'rtf', 'lit', 'odt', 'mp3', 'mp4', 'ogg', 'opus', 'wav', 'flac', 'm4a', 'm4b', "avi", "mkv", "webm", "m4v", "mov", "wmv", "mpg", - "mpeg", "flv", "3gp", "3g2", "ogv", "jpg", "jpeg", "png", "gif", "bmp", "tif", "tiff"} + "mpeg", "flv", "3gp", "3g2", "ogv", "jpg", "jpeg", "png", "gif", "svg", "webp"} def has_flag(value, bit_flag): diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 4aacb9f43..b5ba15564 100755 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -147,7 +147,34 @@ {{ _('Watch in Browser') }} - {{ entry.video_entries[0] }} {% endif %} - {% endif %} + {% elif entry.image_entries|length > 0 and current_user.role_viewer() %} +
+ {% if entry.image_entries|length > 1 %} + + + + {% else %} + {{ _('View in Browser') }} - {{ entry.image_entries[0] }} + {% endif %} +
+ {% endif %}

{{ entry.title }}

diff --git a/cps/uploader.py b/cps/uploader.py index a15524155..871449aa4 100644 --- a/cps/uploader.py +++ b/cps/uploader.py @@ -18,12 +18,13 @@ import os import hashlib +import shutil import subprocess from tempfile import gettempdir from flask_babel import gettext as _ from . import logger, comic, isoLanguages -from .constants import BookMeta +from .constants import BookMeta, EXTENSIONS_IMAGE, EXTENSIONS_VIDEO from .helper import split_authors log = logger.create() @@ -85,8 +86,10 @@ def process(tmp_file_path, original_file_name, original_file_extension, rarExecu original_file_name, original_file_extension, rarExecutable) - elif ".WEBM" == extension_upper or ".MP4" == extension_upper: + elif extension_upper in ['.MP4', '.WEBM', '.AVI', '.MKV', '.M4V', '.MPG', '.MPEG','.OGV']: meta = video_metadata(tmp_file_path, original_file_name, original_file_extension) + elif extension_upper in ['.JPG', '.JPEG', '.PNG', '.GIF', '.SVG', '.WEBP']: + meta = image_metadata(tmp_file_path, original_file_name, original_file_extension) except Exception as ex: log.warning('cannot parse metadata, using default: %s', ex) @@ -265,13 +268,31 @@ def video_cover(tmp_file_path): ffmpeg_executable = os.getenv('FFMPEG_PATH', 'ffmpeg') try: subprocess.call([ffmpeg_executable, '-i', tmp_file_path, '-vframes', '1', '-y', os.path.splitext(tmp_file_path)[0] + '.cover.jpg']) - tmp_file_path = os.path.splitext(tmp_file_path)[0] + '.cover.jpg' - return tmp_file_path + return None except Exception as ex: log.warning('Cannot extract cover image, using default: %s', ex) return None - - + + +def image_metadata(tmp_file_path, original_file_name, original_file_extension): + shutil.copyfile(tmp_file_path, os.path.splitext(tmp_file_path)[0] + '.cover.jpg') + meta = BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=original_file_name, + author='Unknown', + cover=os.path.splitext(tmp_file_path)[0] + '.cover.jpg', + description='', + tags='', + series="", + series_id="", + languages="", + publisher="", + pubdate="", + identifiers=[]) + return meta + + def get_magick_version(): ret = dict() if not use_generic_pdf_cover: diff --git a/cps/web.py b/cps/web.py index 63d099155..bd2b4b912 100755 --- a/cps/web.py +++ b/cps/web.py @@ -1551,6 +1551,11 @@ def read_book(book_id, book_format): log.debug("Start mp3 listening for %d", book_id) return render_title_template('listenmp3.html', mp3file=book_id, audioformat=book_format.lower(), entry=entries, bookmark=bookmark) + for fileExt in constants.EXTENSIONS_IMAGE: + if book_format.lower() == fileExt: + entries = calibre_db.get_filtered_book(book_id) + log.debug("Start image viewing for %d", book_id) + return serve_book.__closure__[0].cell_contents(book_id, book_format.lower(), anyname="") for fileExt in constants.EXTENSIONS_VIDEO: if book_format.lower() == fileExt: entries = calibre_db.get_filtered_book(book_id) @@ -1601,11 +1606,14 @@ def show_book(book_id): entry.audio_entries = [] entry.video_entries = [] + entry.image_entries = [] for media_format in entry.data: if media_format.format.lower() in constants.EXTENSIONS_AUDIO: entry.audio_entries.append(media_format.format.lower()) if media_format.format.lower() in constants.EXTENSIONS_VIDEO: entry.video_entries.append(media_format.format.lower()) + if media_format.format.lower() in constants.EXTENSIONS_IMAGE: + entry.image_entries.append(media_format.format.lower()) return render_title_template('detail.html', entry=entry,