auto select format if only one

pull/435/head
Andriy Zasypkin 7 years ago
parent e66068d699
commit 28dac34119
No known key found for this signature in database
GPG Key ID: BF7FE58155F2A3E4

@ -43,20 +43,33 @@
<a href="{{url_for('send_to_kindle', book_id=entry.id)}}" id="sendbtn" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-send"></span> {{_('Send to Kindle')}}</a> <a href="{{url_for('send_to_kindle', book_id=entry.id)}}" id="sendbtn" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-send"></span> {{_('Send to Kindle')}}</a>
{% endif %} {% endif %}
{% if (g.user.role_download() and g.user.is_anonymous) or g.user.is_authenticated %} {% if (g.user.role_download() and g.user.is_anonymous) or g.user.is_authenticated %}
{% with formats = entry.data|select('canread')|list %}
{% if formats|length == 1 %}
{% set format = formats|first %}
<div class="btn-group" role="group">
<a target="_blank" class="btn btn-primary" href="{{ url_for('read_book', book_id=entry.id, book_format=format.format|lower) }}">{{format.format}}
<span class="glyphicon glyphicon-eye-open"></span> {{_('Read in browser')}}
</a>
</div>
{% elif formats|length > 1 %}
<div class="btn-group" role="group"> <div class="btn-group" role="group">
<button id="read-in-browser" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button id="read-in-browser" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-eye-open"></span> {{_('Read in browser')}} <span class="glyphicon glyphicon-eye-open"></span> {{_('Read in browser')}}
<span class="caret"></span> <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu" aria-labelledby="read-in-browser"> <ul class="dropdown-menu" aria-labelledby="read-in-browser">
{% for format in entry.data %} {% for format in formats %}
{%if format.format|lower == 'epub' or format.format|lower == 'txt' or format.format|lower == 'pdf' or ( format.format|lower == 'cbr' and rarsupport ) or format.format|lower == 'cbt' or format.format|lower == 'cbz' %} {%if format.format|lower|canread %}
<li><a target="_blank" href="{{ url_for('read_book', book_id=entry.id, book_format=format.format|lower) }}">{{format.format}}</a></li> <li><a target="_blank" href="{{ url_for('read_book', book_id=entry.id, book_format=format.format|lower) }}">{{format.format}}</a></li>
{% endif %} {% endif %}
{%endfor%} {%endfor%}
</ul> </ul>
</div> </div>
{% endif %} {%else%}
{{formats|length}}
{%endif%}
{%endwith%}
{%endif%}
</div> </div>
</div> </div>
<h2>{{entry.title}}</h2> <h2>{{entry.title}}</h2>

@ -116,6 +116,7 @@ gdrive_watch_callback_token = 'target=calibreweb-watch_files'
global_task = None global_task = None
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', 'fb2']) ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', 'fb2'])
READER_EXTENSIONS = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt'] + (['rar','cbr'] if rar_support else []))
def md5(fname): def md5(fname):
hash_md5 = hashlib.md5() hash_md5 = hashlib.md5()
@ -473,6 +474,14 @@ def yesno(value, yes, no):
return yes if value else no return yes if value else no
@app.template_filter('canread')
@app.template_test('canread')
def canread(ext):
if type(ext) == db.Data:
ext = ext.format
return ext.lower() in READER_EXTENSIONS
def admin_required(f): def admin_required(f):
""" """
Checks if current_user.role == 1 Checks if current_user.role == 1
@ -937,10 +946,8 @@ def get_comic_book(book_id, book_format, page):
rarfile.UNRAR_TOOL = config.config_rarfile_location rarfile.UNRAR_TOOL = config.config_rarfile_location
try: try:
rf = rarfile.RarFile(cbr_file) rf = rarfile.RarFile(cbr_file)
rarNames = sort(rf.namelist()) names = sort(rf.namelist())
b64 = codecs.encode(rf.read(rarNames[page]), 'base64').decode() extract = lambda page: rf.read(names[page])
extractedfile="data:image/png;base64," + b64
fileData={"name": rarNames[page],"page":page, "last":rarNames.__len__()-1, "content": extractedfile}
except: except:
# rarfile not valid # rarfile not valid
app.logger.error('Unrar binary not found, or unable to decompress file ' + cbr_file) app.logger.error('Unrar binary not found, or unable to decompress file ' + cbr_file)
@ -949,25 +956,27 @@ def get_comic_book(book_id, book_format, page):
app.logger.info('Unrar is not supported please install python rarfile extension') app.logger.info('Unrar is not supported please install python rarfile extension')
# no support means return nothing # no support means return nothing
return "", 204 return "", 204
if book_format in ("cbz", "zip"): elif book_format in ("cbz", "zip"):
zf = zipfile.ZipFile(cbr_file) zf = zipfile.ZipFile(cbr_file)
zipNames=sort(zf.namelist()) names=sort(zf.namelist())
if sys.version_info.major >= 3: extract = lambda page: zf.read(names[page])
b64 = codecs.encode(zf.read(zipNames[page]), 'base64').decode() elif book_format in ("cbt", "tar"):
tf = tarfile.TarFile(cbr_file)
names=sort(tf.getnames())
extract = lambda page: tf.extractfile(names[page]).read()
else: else:
b64 = zf.read(zipNames[page]).encode('base64') app.logger.error('unsupported comic format')
extractedfile="data:image/png;base64," + b64 return "", 204
fileData={"name": zipNames[page],"page":page, "last":zipNames.__len__()-1, "content": extractedfile}
if book_format in ("cbt", "tar"):
tf = tarfile.TarFile(cbr_file)
tarNames=sort(tf.getnames())
if sys.version_info.major >= 3: if sys.version_info.major >= 3:
b64 = codecs.encode(tf.extractfile(tarNames[page]).read(), 'base64').decode() b64 = codecs.encode(extract(page), 'base64').decode()
else: else:
b64 = (tf.extractfile(tarNames[page]).read()).encode('base64') b64 = extract(page).encode('base64')
extractedfile="data:image/png;base64," + bs ext = names[page].rpartition('.')[-1]
fileData={"name": tarNames[page],"page":page, "last":tarNames.__len__()-1, "content": extractedfile} if ext not in ('png', 'gif', 'jpg', 'jpeg'):
ext = 'png'
extractedfile="data:image/" + ext + ";base64," + b64
fileData={"name": names[page], "page":page, "last":len(names)-1, "content": extractedfile}
return make_response(json.dumps(fileData)) return make_response(json.dumps(fileData))
return "", 204 return "", 204
@ -3264,4 +3273,3 @@ def start_gevent():
app.logger.info('Unable to listen on \'\', trying on IPv4 only...') app.logger.info('Unable to listen on \'\', trying on IPv4 only...')
gevent_server = WSGIServer(('0.0.0.0', ub.config.config_port), app) gevent_server = WSGIServer(('0.0.0.0', ub.config.config_port), app)
gevent_server.serve_forever() gevent_server.serve_forever()

Loading…
Cancel
Save