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() %}
+
+ {% 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,