From eb38a9723fa1220025a8405f5af6448c8df90cec Mon Sep 17 00:00:00 2001 From: idalin Date: Mon, 13 Feb 2017 09:09:49 +0800 Subject: [PATCH 01/14] update translations --- .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 299192 -> 299151 bytes .../zh_Hans_CN/LC_MESSAGES/messages.po | 24 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index 411a650999521541fb6aa5d796092a892bc051b6..65d2954fd4d358815933facba1e280d81f6a7b69 100644 GIT binary patch delta 57373 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

GDX* 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 delta 57277 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 fStB7=4Z}M^}CwI(~G@6VbT$pm83G)6wzI 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 OTw1k+Z Date: Wed, 15 Feb 2017 14:11:35 +0800 Subject: [PATCH 02/14] limit the extensions of uploading files --- cps/web.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cps/web.py b/cps/web.py index da601c10..f73e974f 100755 --- a/cps/web.py +++ b/cps/web.py @@ -52,6 +52,7 @@ from cgi import escape # Global variables global_task = None +ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx']) # Proxy Helper class @@ -2115,6 +2116,13 @@ def upload(): db.session.connection().connection.connection.create_function('uuid4', 0, lambda: str(uuid4())) if request.method == 'POST' and 'btn-upload' in request.files: file = request.files['btn-upload'] + if not ('.' in file.filename and file.filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS): + flash( + _('File extension "%s" is not allowed to be uploaded to this server' % + file.filename.rsplit('.', 1)[1].lower()), + category="error" + ) + return redirect(url_for('index')) meta = uploader.upload(file) title = meta.title From e02a91526e3aa5b73d9be6772db95777ae204d3b Mon Sep 17 00:00:00 2001 From: idalin Date: Fri, 17 Feb 2017 15:05:17 +0800 Subject: [PATCH 03/14] bug fix with uploading limit --- cps/web.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/cps/web.py b/cps/web.py index f73e974f..ed92647d 100755 --- a/cps/web.py +++ b/cps/web.py @@ -52,7 +52,7 @@ from cgi import escape # Global variables global_task = None -ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx']) +ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', 'fb2']) # Proxy Helper class @@ -2116,12 +2116,17 @@ def upload(): db.session.connection().connection.connection.create_function('uuid4', 0, lambda: str(uuid4())) if request.method == 'POST' and 'btn-upload' in request.files: file = request.files['btn-upload'] - if not ('.' in file.filename and file.filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS): - flash( - _('File extension "%s" is not allowed to be uploaded to this server' % - file.filename.rsplit('.', 1)[1].lower()), - category="error" - ) + if '.' in file.filename: + file_ext = file.filename.rsplit('.', 1)[-1].lower() + if file_ext not in ALLOWED_EXTENSIONS: + flash( + _('File extension "%s" is not allowed to be uploaded to this server' % + file_ext), + category="error" + ) + return redirect(url_for('index')) + else: + flash(_('File to be uploaded must have an extension'), category="error") return redirect(url_for('index')) meta = uploader.upload(file) From 80e6311b9306d29dc3ff31014705f92ab0cc6894 Mon Sep 17 00:00:00 2001 From: idalin Date: Tue, 21 Feb 2017 17:49:43 +0800 Subject: [PATCH 04/14] fetch metadata from douban while editing metadata --- cps/static/js/douban_meta.js | 87 ++++++++++++++++++++++++++++++++++++ cps/templates/book_edit.html | 17 +++++++ 2 files changed, 104 insertions(+) create mode 100644 cps/static/js/douban_meta.js diff --git a/cps/static/js/douban_meta.js b/cps/static/js/douban_meta.js new file mode 100644 index 00000000..773939f9 --- /dev/null +++ b/cps/static/js/douban_meta.js @@ -0,0 +1,87 @@ +/* + * Get Metadata from Douban api + * Created by idalin + */ + +$(document).ready(function () { + var get_meta_btn = '

  • ' + + '' + + '获取Meta
  • '; + $('#main-nav').prepend(get_meta_btn); + var douban = 'https://api.douban.com'; + var search = '/v2/book/search'; + var get_info = '/v2/book/'; + var get_info_by_isbn = '/v2/book/isbn/ '; + + $.ajaxSetup({ + type: "GET", + dataType: "jsonp", + jsonp: 'callback', + async: false + }); + + get_meta = function (id) { + var url = douban + get_info + id; + console.log('getting book meta:' + id); + $.ajax({ + url: url, + success: function (meta) { + console.log(meta); + //$('#metaModal').modal('hide'); + $('#description').val(meta.summary); + $('#bookAuthor').val(meta.author.join(' & ')); + $('#book_title').val(meta.title); + var tags = ''; + for (var i = 0; i < meta.tags.length; i++) { + tags = tags + meta.tags[i].title + ','; + } + $('#tags').val(tags); + $('#rating').val(Math.round(meta.rating.average / 4)); + } + }); + } + + get_meta_by_isbn = function (isbn) { + var url = douban + get_info_by_isbn + isbn; + } + + search_book = function (title) { + var url = douban + search + '?q=' + title + '&fields=id,title,author,publisher,isbn13,image,summary'; + $.ajax({ + url: url, + success: function (data) { + if (data.books.length < 1) { + $('#meta-info').html('

    搜索不到对应的书籍

    '); + } else { + $('#meta-info').html('
      '); + for (var i = 0; i < data.books.length; i++) { + var book = '
    • ' + + 'Cover' + + '
      ' + + '

      ' + data.books[i].title + '

      ' + + '

      作者:' + data.books[i].author + '

      ' + + '

      出版社:' + data.books[i].publisher + '

      ' + + '

      简介:' + data.books[i].summary + '

      ' + + '
      ' + + '
    • '; + $("#book-list").append(book); + } + } + }, + error: function () { + $('#meta-info').html('

      搜索出错

      '); + } + }); + } + + $('#get_meta').click(function () { + var book_title = $('#book_title').val(); + if (book_title) { + // console.log(book_title); + search_book(book_title); + } + }); +}); \ No newline at end of file diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 32452dd8..16e1c0b9 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -109,11 +109,28 @@ {% endif %} + {% endblock %} {% block js %} + {% endblock %} {% block header %} From 9020c358190db51937c9dd211fb17a182574951d Mon Sep 17 00:00:00 2001 From: idalin Date: Thu, 23 Feb 2017 11:26:39 +0800 Subject: [PATCH 05/14] fixed send to kindle not working problem for some smtp provider. #94 --- cps/helper.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cps/helper.py b/cps/helper.py index 5e9c9210..54fa1946 100755 --- a/cps/helper.py +++ b/cps/helper.py @@ -19,6 +19,8 @@ from email.MIMEBase import MIMEBase from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.generator import Generator +from email.utils import formatdate +from email.utils import make_msgid from flask_babel import gettext as _ import subprocess import threading @@ -165,6 +167,8 @@ def send_mail(book_id, kindle_mail, calibrepath): # create MIME message msg = MIMEMultipart() msg['Subject'] = _(u'Send to Kindle') + msg['Message-Id'] = make_msgid('calibre-web') + msg['Date'] = formatdate(localtime=True) text = _(u'This email has been sent via calibre web.') msg.attach(MIMEText(text.encode('UTF-8'), 'plain', 'UTF-8')) From 3dcfebca603f0af2ac0c1ac877dead49aaec710c Mon Sep 17 00:00:00 2001 From: idalin Date: Thu, 23 Feb 2017 13:52:58 +0800 Subject: [PATCH 06/14] update translations --- .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 299763 -> 299688 bytes .../zh_Hans_CN/LC_MESSAGES/messages.po | 48 +++++++++--------- cps/web.py | 14 +++++ 3 files changed, 38 insertions(+), 24 deletions(-) diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo index d3a83c0d80ac570bd5c1f7c520dd36b82a507115..5cb1b1c9580c0ed255440e3f96a16083481e0c4c 100644 GIT binary patch delta 60604 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 OHqFof$AIi&=lv5?O2rxg delta 60214 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 F{|6pjiWdL? diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index 5356f3b2..c68904f6 100644 --- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po @@ -61,31 +61,31 @@ msgstr "游客" #: cps/web.py:734 msgid "Requesting update package" -msgstr "" +msgstr "正在请求更新包" #: cps/web.py:735 msgid "Downloading update package" -msgstr "" +msgstr "正在下载更新包" #: cps/web.py:736 msgid "Unzipping update package" -msgstr "" +msgstr "正在解压更新包" #: cps/web.py:737 msgid "Files are replaced" -msgstr "" +msgstr "文件已替换" #: cps/web.py:738 msgid "Database connections are closed" -msgstr "" +msgstr "数据库连接已关闭" #: cps/web.py:739 msgid "Server is stopped" -msgstr "" +msgstr "服务器已停止" #: cps/web.py:740 msgid "Update finished, please press okay and reload page" -msgstr "" +msgstr "更新完成,请按确定并刷新页面" #: cps/web.py:810 msgid "Latest Books" @@ -97,7 +97,7 @@ msgstr "热门书籍(最多下载)" #: cps/web.py:845 msgid "Best rated books" -msgstr "" +msgstr "最高评分书籍" #: cps/templates/index.xml:36 cps/web.py:854 msgid "Random Books" @@ -108,9 +108,9 @@ msgid "Author list" msgstr "作者列表" #: cps/web.py:878 -#, python-format +#, python-forma msgid "Author: %(name)s" -msgstr "" +msgstr "作者: %(name)s" #: cps/web.py:880 cps/web.py:908 cps/web.py:1007 cps/web.py:1235 #: cps/web.py:2115 @@ -150,7 +150,7 @@ msgstr "统计" #: cps/web.py:1061 msgid "Server restarted, please reload page" -msgstr "" +msgstr "服务器已重启,请刷新页面" #: cps/web.py:1063 msgid "Performing shutdown of server, please close window" @@ -158,7 +158,7 @@ msgstr "正在关闭服务器,请关闭窗口" #: cps/web.py:1073 msgid "Update done" -msgstr "" +msgstr "更新完成" #: cps/web.py:1147 cps/web.py:1160 msgid "search" @@ -475,11 +475,11 @@ msgstr "管理" #: cps/templates/admin.html:80 msgid "Current commit timestamp" -msgstr "" +msgstr "当前提交时间戳" #: cps/templates/admin.html:81 msgid "Newest commit timestamp" -msgstr "" +msgstr "最新提交时间戳" #: cps/templates/admin.html:83 msgid "Restart Calibre-web" @@ -491,11 +491,11 @@ msgstr "停止 Calibre-web" #: cps/templates/admin.html:85 msgid "Check for update" -msgstr "" +msgstr "检查更新" #: cps/templates/admin.html:86 msgid "Perform Update" -msgstr "" +msgstr "执行更新" #: cps/templates/admin.html:96 msgid "Do you really want to restart Calibre-web?" @@ -519,7 +519,7 @@ msgstr "您确定要关闭 Calibre-web 吗?" #: cps/templates/admin.html:127 msgid "Updating, please do not reload page" -msgstr "" +msgstr "正在更新,请不要刷新页面" #: cps/templates/book_edit.html:16 cps/templates/search_form.html:6 msgid "Book Title" @@ -610,7 +610,7 @@ msgstr "启用注册" #: cps/templates/config_edit.html:52 msgid "Default Settings for new users" -msgstr "" +msgstr "新用户默认设置" #: cps/templates/config_edit.html:55 cps/templates/user_edit.html:80 msgid "Admin user" @@ -651,7 +651,7 @@ msgstr "语言" #: cps/templates/detail.html:74 msgid "Publishing date" -msgstr "" +msgstr "出版日期" #: cps/templates/detail.html:106 msgid "Description:" @@ -723,11 +723,11 @@ msgstr "热门书籍" #: cps/templates/index.xml:19 msgid "Popular publications from this catalog based on Downloads." -msgstr "" +msgstr "基于下载数的热门书籍" #: cps/templates/index.xml:22 cps/templates/layout.html:129 msgid "Best rated Books" -msgstr "" +msgstr "最高评分书籍" #: cps/templates/index.xml:26 msgid "Popular publications from this catalog based on Rating." @@ -933,11 +933,11 @@ msgstr "个作者在此书库" #: cps/templates/stats.html:45 msgid "Categories in this Library" -msgstr "" +msgstr "个分类在此书库" #: cps/templates/stats.html:49 msgid "Series in this Library" -msgstr "" +msgstr "个丛书在此书库" #: cps/templates/user_edit.html:23 msgid "Kindle E-Mail" @@ -961,7 +961,7 @@ msgstr "显示热门书籍" #: cps/templates/user_edit.html:53 msgid "Show best rated books" -msgstr "" +msgstr "显示最高评分书籍" #: cps/templates/user_edit.html:57 msgid "Show language selection" diff --git a/cps/web.py b/cps/web.py index a33748e0..69cefe1a 100755 --- a/cps/web.py +++ b/cps/web.py @@ -51,6 +51,7 @@ except ImportError, e: use_generic_pdf_cover = True from cgi import escape +ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', 'fb2']) # Proxy Helper class class ReverseProxied(object): @@ -2136,6 +2137,19 @@ def upload(): db.session.connection().connection.connection.create_function('uuid4', 0, lambda: str(uuid4())) if request.method == 'POST' and 'btn-upload' in request.files: file = request.files['btn-upload'] + file = request.files['btn-upload'] + if '.' in file.filename: + file_ext = file.filename.rsplit('.', 1)[-1].lower() + if file_ext not in ALLOWED_EXTENSIONS: + flash( + _('File extension "%s" is not allowed to be uploaded to this server' % + file_ext), + category="error" + ) + return redirect(url_for('index')) + else: + flash(_('File to be uploaded must have an extension'), category="error") + return redirect(url_for('index')) meta = uploader.upload(file) title = meta.title From 0277d08706c4c72634df97f29da3a11fb283f8ed Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Thu, 23 Feb 2017 19:06:52 +0100 Subject: [PATCH 07/14] Merged #123. Thanks @idalin. I think this solves permanently sending to kindle issues like (#94) --- cps/web.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cps/web.py b/cps/web.py index 69cefe1a..b256ad87 100755 --- a/cps/web.py +++ b/cps/web.py @@ -2136,7 +2136,6 @@ def upload(): db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) db.session.connection().connection.connection.create_function('uuid4', 0, lambda: str(uuid4())) if request.method == 'POST' and 'btn-upload' in request.files: - file = request.files['btn-upload'] file = request.files['btn-upload'] if '.' in file.filename: file_ext = file.filename.rsplit('.', 1)[-1].lower() From 41a20fe3e13e3c801626341036d0e601bed5eb98 Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Thu, 23 Feb 2017 19:58:56 +0100 Subject: [PATCH 08/14] Added version info of dependencys in about section --- cps/static/js/main.js | 5 +-- cps/templates/stats.html | 66 ++++++++++++++++++++++++++++++---------- cps/web.py | 22 ++++++++++++-- 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 74e1a1d8..0a184530 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -36,7 +36,7 @@ $(function() { success: function(data) { $('#spinner').show(); displaytext=data.text; - window.setTimeout(restartTimer, 3000);} + setTimeout(restartTimer, 3000);} }); }); $("#shutdown").click(function() { @@ -110,7 +110,8 @@ function updateTimer() { $('#UpdateprogressDialog #updateFinished').removeClass('hidden'); $("#check_for_update").removeClass('hidden'); $("#perform_update").addClass('hidden'); - } + }, + timeout:2000 }); } diff --git a/cps/templates/stats.html b/cps/templates/stats.html index 22826003..7ab72092 100644 --- a/cps/templates/stats.html +++ b/cps/templates/stats.html @@ -1,7 +1,27 @@ {% extends "layout.html" %} {% block body %} +

      {{_('Calibre library statistics')}}

      + + + + + + + + + + + + + + + + + + + +
      {{bookcounter}}{{_('Books in this Library')}}
      {{authorcounter}}{{_('Authors in this Library')}}
      {{categorycounter}}{{_('Categories in this Library')}}
      {{seriecounter}}{{_('Series in this Library')}}

      {{_('Linked libraries')}}

      - @@ -24,30 +44,44 @@ - + - -
      PyPDF2{{versions['PyPdfVersion']}}v{{versions['PyPdfVersion']}}
      - -

      {{_('Calibre library statistics')}}

      - - - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + +
      {{bookcounter}}{{_('Books in this Library')}}Babelv{{versions['babel']}}
      {{authorcounter}}{{_('Authors in this Library')}}SqlAlchemyv{{versions['sqlalchemy']}}
      {{categorycounter}}{{_('Categories in this Library')}}Flaskv{{versions['flask']}}
      {{seriecounter}}{{_('Series in this Library')}}Flask Loginv{{versions['flasklogin']}}
      Flask Principalv{{versions['flask_principal']}}
      Tornado web serverv{{versions['tornado']}}
      ISO639 Languagesv{{versions['iso639']}}
      Requestsv{{versions['requests']}}
      + {% endblock %} + + diff --git a/cps/web.py b/cps/web.py index b256ad87..06930901 100755 --- a/cps/web.py +++ b/cps/web.py @@ -4,8 +4,9 @@ import mimetypes import logging from logging.handlers import RotatingFileHandler import textwrap -from flask import Flask, render_template, session, request, Response, redirect, url_for, send_from_directory, \ +from flask import Flask, render_template, request, Response, redirect, url_for, send_from_directory, \ make_response, g, flash, abort +from flask import __version__ as flaskVersion import ub from ub import config import helper @@ -14,9 +15,12 @@ import errno from sqlalchemy.sql.expression import func from sqlalchemy.sql.expression import false from sqlalchemy.exc import IntegrityError +from sqlalchemy import __version__ as sqlalchemyVersion from math import ceil from flask_login import LoginManager, login_user, logout_user, login_required, current_user +from flask_login import __version__ as flask_loginVersion from flask_principal import Principal, Identity, AnonymousIdentity, identity_changed +from flask_login import __version__ as flask_principalVersion from flask_babel import Babel from flask_babel import gettext as _ import requests @@ -24,6 +28,7 @@ import zipfile from werkzeug.security import generate_password_hash, check_password_hash from babel import Locale as LC from babel import negotiate_locale +from babel import __version__ as babelVersion from babel.dates import format_date from functools import wraps import base64 @@ -32,16 +37,16 @@ import json import urllib import datetime from iso639 import languages as isoLanguages +from iso639 import __version__ as iso639Version from uuid import uuid4 import os.path import sys import subprocess import re import db -import thread from shutil import move, copyfile from tornado.ioloop import IOLoop - +from tornado import version as tornadoVersion try: from wand.image import Image @@ -1042,6 +1047,15 @@ def stats(): if re.search('Amazon kindlegen\(', lines): versions['KindlegenVersion'] = lines versions['PythonVersion'] = sys.version + versions['babel'] = babelVersion + versions['sqlalchemy'] = sqlalchemyVersion + versions['flask'] = flaskVersion + versions['flasklogin'] = flask_loginVersion + versions['flask_principal'] = flask_principalVersion + versions['tornado'] = tornadoVersion + versions['iso639'] = iso639Version + versions['requests'] = requests.__version__ + return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=versions, categorycounter=categorys, seriecounter=series, title=_(u"Statistics")) @@ -1796,6 +1810,8 @@ def edit_mailsettings(): category="success") else: flash(_(u"There was an error sending the Test E-Mail: %(res)s", res=result), category="error") + else: + flash(_(u"E-Mail settings updated"), category="success") return render_title_template("email_edit.html", content=content, title=_(u"Edit mail settings")) From 40c6ef3a189fe638cb07e32d0535cb504ba8f421 Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Fri, 24 Feb 2017 20:20:41 +0100 Subject: [PATCH 09/14] More generic aproach for postion of epub coverfile (#122) --- cps/epub.py | 21 ++++++++++++++------- cps/templates/book_edit.html | 17 ----------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/cps/epub.py b/cps/epub.py index e6945d75..f9d46362 100644 --- a/cps/epub.py +++ b/cps/epub.py @@ -7,13 +7,14 @@ import os import uploader -def extractCover(zip, coverFile, tmp_file_name): +def extractCover(zip, coverFile, coverpath, tmp_file_name): if coverFile is None: return None else: - cf = zip.read("OPS/" + coverFile) + zipCoverPath = os.path.join(coverpath , coverFile).replace('\\','/') + cf = zip.read(zipCoverPath) prefix = os.path.splitext(tmp_file_name)[0] - tmp_cover_name = prefix + "." + coverFile + tmp_cover_name = prefix + '.' + os.path.basename(zipCoverPath) image = open(tmp_cover_name, 'wb') image.write(cf) image.close() @@ -32,10 +33,11 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension): txt = zip.read('META-INF/container.xml') tree = etree.fromstring(txt) cfname = tree.xpath('n:rootfiles/n:rootfile/@full-path', namespaces=ns)[0] - cf = zip.read(cfname) tree = etree.fromstring(cf) + coverpath=os.path.dirname(cfname) + p = tree.xpath('/pkg:package/pkg:metadata', namespaces=ns)[0] epub_metadata = {} @@ -46,11 +48,16 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension): else: epub_metadata[s] = "Unknown" - coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='cover']/@href", namespaces=ns) + coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='cover-image']/@href", namespaces=ns) if len(coversection) > 0: - coverfile = extractCover(zip, coversection[0], tmp_file_path) + coverfile = extractCover(zip, coversection[0], coverpath, tmp_file_path) else: - coverfile = None + coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='cover']/@href", namespaces=ns) + if len(coversection) > 0: + coverfile = extractCover(zip, coversection[0], coverpath, tmp_file_path) + else: + coverfile = None + if epub_metadata['title'] is None: title = original_file_name else: diff --git a/cps/templates/book_edit.html b/cps/templates/book_edit.html index 16e1c0b9..32452dd8 100644 --- a/cps/templates/book_edit.html +++ b/cps/templates/book_edit.html @@ -109,28 +109,11 @@ {% endif %} - {% endblock %} {% block js %} - {% endblock %} {% block header %} From b876505f2266409ced1d88e7105c2917fd2bd61d Mon Sep 17 00:00:00 2001 From: Ozzie Isaacs Date: Sat, 25 Feb 2017 06:15:00 +0100 Subject: [PATCH 10/14] Delete doubtable.js --- cps/static/js/douban_meta.js | 87 ------------------------------------ 1 file changed, 87 deletions(-) delete mode 100644 cps/static/js/douban_meta.js diff --git a/cps/static/js/douban_meta.js b/cps/static/js/douban_meta.js deleted file mode 100644 index 773939f9..00000000 --- a/cps/static/js/douban_meta.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Get Metadata from Douban api - * Created by idalin - */ - -$(document).ready(function () { - var get_meta_btn = '
    • ' + - '' + - '获取Meta
    • '; - $('#main-nav').prepend(get_meta_btn); - var douban = 'https://api.douban.com'; - var search = '/v2/book/search'; - var get_info = '/v2/book/'; - var get_info_by_isbn = '/v2/book/isbn/ '; - - $.ajaxSetup({ - type: "GET", - dataType: "jsonp", - jsonp: 'callback', - async: false - }); - - get_meta = function (id) { - var url = douban + get_info + id; - console.log('getting book meta:' + id); - $.ajax({ - url: url, - success: function (meta) { - console.log(meta); - //$('#metaModal').modal('hide'); - $('#description').val(meta.summary); - $('#bookAuthor').val(meta.author.join(' & ')); - $('#book_title').val(meta.title); - var tags = ''; - for (var i = 0; i < meta.tags.length; i++) { - tags = tags + meta.tags[i].title + ','; - } - $('#tags').val(tags); - $('#rating').val(Math.round(meta.rating.average / 4)); - } - }); - } - - get_meta_by_isbn = function (isbn) { - var url = douban + get_info_by_isbn + isbn; - } - - search_book = function (title) { - var url = douban + search + '?q=' + title + '&fields=id,title,author,publisher,isbn13,image,summary'; - $.ajax({ - url: url, - success: function (data) { - if (data.books.length < 1) { - $('#meta-info').html('

      搜索不到对应的书籍

      '); - } else { - $('#meta-info').html('
        '); - for (var i = 0; i < data.books.length; i++) { - var book = '
      • ' + - 'Cover' + - '
        ' + - '

        ' + data.books[i].title + '

        ' + - '

        作者:' + data.books[i].author + '

        ' + - '

        出版社:' + data.books[i].publisher + '

        ' + - '

        简介:' + data.books[i].summary + '

        ' + - '
        ' + - '
      • '; - $("#book-list").append(book); - } - } - }, - error: function () { - $('#meta-info').html('

        搜索出错

        '); - } - }); - } - - $('#get_meta').click(function () { - var book_title = $('#book_title').val(); - if (book_title) { - // console.log(book_title); - search_book(book_title); - } - }); -}); \ No newline at end of file From 1a83ad713cb9746ec57c3e9a518ce445f94911de Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Sat, 25 Feb 2017 09:02:59 +0100 Subject: [PATCH 11/14] Additional version info for sqlite database --- cps/db.py | 2 +- cps/static/js/main.js | 2 +- cps/templates/stats.html | 9 ++++++++- cps/ub.py | 1 - cps/web.py | 2 ++ 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/cps/db.py b/cps/db.py index e4082a16..f25848c7 100755 --- a/cps/db.py +++ b/cps/db.py @@ -294,7 +294,7 @@ def setup_db(): return False dbpath = os.path.join(config.config_calibre_dir, "metadata.db") - engine = create_engine('sqlite:///{0}'.format(dbpath.encode('utf-8')), echo=False) + engine = create_engine('sqlite:///{0}'.format(dbpath.encode('utf-8')), echo=False, isolation_level="SERIALIZABLE") try: conn = engine.connect() diff --git a/cps/static/js/main.js b/cps/static/js/main.js index 0a184530..8b0b099f 100644 --- a/cps/static/js/main.js +++ b/cps/static/js/main.js @@ -50,7 +50,7 @@ $(function() { }); $("#check_for_update").click(function() { var button_text = $("#check_for_update").html(); - $("#check_for_update").html('Checking...'); + $("#check_for_update").html('...'); $.ajax({ dataType: 'json', url: window.location.pathname+"/../../get_update_status", diff --git a/cps/templates/stats.html b/cps/templates/stats.html index 7ab72092..4b08afda 100644 --- a/cps/templates/stats.html +++ b/cps/templates/stats.html @@ -78,7 +78,14 @@ Requests v{{versions['requests']}} - + + SQlite + v{{versions['sqlite']}} + + + Pysqlite + v{{versions['pysqlite']}} + diff --git a/cps/ub.py b/cps/ub.py index f5207f06..653454ce 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -7,7 +7,6 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import * from flask_login import AnonymousUserMixin import os -import traceback import logging from werkzeug.security import generate_password_hash from flask_babel import gettext as _ diff --git a/cps/web.py b/cps/web.py index 06930901..5d218ecc 100755 --- a/cps/web.py +++ b/cps/web.py @@ -1055,6 +1055,8 @@ def stats(): versions['tornado'] = tornadoVersion versions['iso639'] = iso639Version versions['requests'] = requests.__version__ + versions['pysqlite'] = db.engine.dialect.dbapi.version + versions['sqlite'] = db.engine.dialect.dbapi.sqlite_version return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=versions, categorycounter=categorys, seriecounter=series, title=_(u"Statistics")) From 00763d6e4c7802edc0b8b4f352c1d097e923cb68 Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Sat, 25 Feb 2017 11:14:45 +0100 Subject: [PATCH 12/14] Read book is now tied to the right downlolad books for guest users (fixes #110) --- cps/templates/detail.html | 4 ++-- cps/web.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 0a5167b6..9639e954 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -132,10 +132,10 @@ {% endif %} - {% if g.user.is_authenticated %} - {% if g.user.kindle_mail %} + {% if g.user.kindle_mail and g.user.is_authenticated %} {{_('Send to Kindle')}} {% endif %} + {% if (g.user.role_download() and g.user.is_anonymous()) or g.user.is_authenticated %}
        {% endblock %} diff --git a/cps/templates/list.html b/cps/templates/list.html index d424d495..0a63b139 100644 --- a/cps/templates/list.html +++ b/cps/templates/list.html @@ -2,11 +2,17 @@ {% block body %}

        {{title}}

        +
        {% for entry in entries %} + {% if loop.index0 == (loop.length/2)|int and loop.length > 20 %} +
        +
        + {% endif %}
        {{entry.count}}
        {% endfor %}
        +
        {% endblock %} diff --git a/cps/templates/user_edit.html b/cps/templates/user_edit.html index b9cff3eb..02bf31d6 100644 --- a/cps/templates/user_edit.html +++ b/cps/templates/user_edit.html @@ -40,6 +40,8 @@ {% endfor %} +
        +
        @@ -72,7 +74,8 @@
        - +
        +
        {% if g.user and g.user.role_admin() and not profile %} {% if not content.role_anonymous() %}
        @@ -106,10 +109,15 @@
        {% endif %} +
        +
        {% if not profile %} {{_('Back')}} +
        {% endif %} + + {% if downloads %} From 679effbaef7424aefbc6359834f73d86bb46258e Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Sat, 25 Feb 2017 13:34:33 +0100 Subject: [PATCH 14/14] Bugfix placement of "recent downloads in "edit user section" --- cps/templates/user_edit.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cps/templates/user_edit.html b/cps/templates/user_edit.html index 02bf31d6..2d4354ec 100644 --- a/cps/templates/user_edit.html +++ b/cps/templates/user_edit.html @@ -116,11 +116,10 @@ {{_('Back')}} {% endif %} - - {% if downloads %} +

        {{_('Recent Downloads')}}

        {% for entry in downloads %}
        @@ -129,6 +128,7 @@
        {% endfor %} +
        {% endif %} {% endblock %}