Merge pull request #11 from deldesir/cover
fix(img): generate cover upon uploading picture
This commit is contained in:
commit
2210ebf76e
|
@ -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):
|
||||
|
|
|
@ -147,7 +147,34 @@
|
|||
<a target="_blank" href="{{ url_for('web.read_book', book_id=entry.id, book_format=entry.video_entries[0]) }}" id="listenbtn" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-film"></span> {{ _('Watch in Browser') }} - {{ entry.video_entries[0] }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% elif entry.image_entries|length > 0 and current_user.role_viewer() %}
|
||||
<div class="btn-group" role="group">
|
||||
{% if entry.image_entries|length > 1 %}
|
||||
<button id="listen-in-browser" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<span class="glyphicon glyphicon-picture"></span> {{ _('View in Browser') }}
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" aria-labelledby="listen-in-browser">
|
||||
{% for format in entry.reader_list %}
|
||||
<li><a target="_blank" href="{{ url_for('web.read_book', book_id=entry.id, book_format=format) }}">{{ format }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<ul class="dropdown-menu" aria-labelledby="listen-in-browser">
|
||||
|
||||
{% for format in entry.data %}
|
||||
{% if format.format|lower in entry.image_entries %}
|
||||
<li><a target="_blank"
|
||||
href="{{ url_for('web.read_book', book_id=entry.id, book_format=format.format|lower) }}">{{ format.format|lower }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<a target="_blank" href="{{ url_for('web.read_book', book_id=entry.id, book_format=entry.image_entries[0]) }}" id="listenbtn" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-picture"></span> {{ _('View in Browser') }} - {{ entry.image_entries[0] }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<h2 id="title">{{ entry.title }}</h2>
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue