1
0
mirror of https://github.com/janeczku/calibre-web synced 2024-11-24 18:47:23 +00:00

Merge remote-tracking branch 'original/Develop' into kobo_book_delete

This commit is contained in:
Michael Shavit 2020-01-26 15:58:57 -05:00
commit 9804a98af8
19 changed files with 628 additions and 435 deletions

View File

@ -30,7 +30,7 @@ Calibre-Web is a web app providing a clean interface for browsing, reading and d
## Quick start
1. Install dependencies by running `pip install --target vendor -r requirements.txt`.
1. Install dependencies by running `pip3 install --target vendor -r requirements.txt`.
2. Execute the command: `python cps.py` (or `nohup python cps.py` - recommended if you want to exit the terminal window)
3. Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog
4. Set `Location of Calibre database` to the path of the folder where your Calibre library (metadata.db) lives, push "submit" button\
@ -46,7 +46,7 @@ Please note that running the above install command can fail on some versions of
## Requirements
Python 2.7+, python 3.x+
python 3.x+, (Python 2.7+)
Optionally, to enable on-the-fly conversion from one ebook format to another when using the send-to-kindle feature, or during editing of ebooks metadata:

View File

@ -532,6 +532,9 @@ def _configuration_update_helper():
_config_checkbox_int("config_uploading")
_config_checkbox_int("config_anonbrowse")
_config_checkbox_int("config_public_reg")
_config_checkbox_int("config_kobo_sync")
_config_checkbox_int("config_kobo_proxy")
_config_int("config_ebookconverter")
_config_string("config_calibre")

View File

@ -68,6 +68,7 @@ class _Settings(_Base):
config_anonbrowse = Column(SmallInteger, default=0)
config_public_reg = Column(SmallInteger, default=0)
config_remote_login = Column(Boolean, default=False)
config_kobo_sync = Column(Boolean, default=False)
config_default_role = Column(SmallInteger, default=0)
config_default_show = Column(SmallInteger, default=38911)
@ -89,7 +90,8 @@ class _Settings(_Base):
config_login_type = Column(Integer, default=0)
# config_oauth_provider = Column(Integer)
config_kobo_proxy = Column(Boolean, default=False)
config_ldap_provider_url = Column(String, default='localhost')
config_ldap_port = Column(SmallInteger, default=389)

View File

@ -126,7 +126,7 @@ def selected_roles(dictionary):
BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, description, tags, series, '
'series_id, languages')
STABLE_VERSION = {'version': '0.6.5 Beta'}
STABLE_VERSION = {'version': '0.6.6 Beta'}
NIGHTLY_VERSION = {}
NIGHTLY_VERSION[0] = '$Format:%H$'

View File

@ -19,7 +19,6 @@
import sys
import uuid
from datetime import datetime
from time import gmtime, strftime
try:
@ -32,9 +31,10 @@ from flask import (
request,
make_response,
jsonify,
json,
current_app,
url_for,
redirect,
abort
)
from flask_login import login_required, current_user
from werkzeug.datastructures import Headers
@ -46,7 +46,7 @@ from . import config, logger, kobo_auth, db, helper, ub
from .services import SyncToken as SyncToken
from .web import download_required
KOBO_FORMATS = {"KEPUB": ["KEPUB"], "EPUB": ["EPUB", "EPUB3"]}
KOBO_FORMATS = {"KEPUB": ["KEPUB"], "EPUB": ["EPUB3", "EPUB"]}
KOBO_STOREAPI_URL = "https://storeapi.kobo.com"
kobo = Blueprint("kobo", __name__, url_prefix="/kobo/<auth_token>")
@ -74,30 +74,33 @@ CONNECTION_SPECIFIC_HEADERS = [
def redirect_or_proxy_request():
if request.method == "GET":
return redirect(get_store_url_for_current_request(), 307)
if request.method == "DELETE":
return make_response(jsonify({}))
if config.config_kobo_proxy:
if request.method == "GET":
return redirect(get_store_url_for_current_request(), 307)
if request.method == "DELETE":
log.info('Delete Book')
return make_response(jsonify({}))
else:
# The Kobo device turns other request types into GET requests on redirects, so we instead proxy to the Kobo store ourselves.
outgoing_headers = Headers(request.headers)
outgoing_headers.remove("Host")
store_response = requests.request(
method=request.method,
url=get_store_url_for_current_request(),
headers=outgoing_headers,
data=request.get_data(),
allow_redirects=False,
)
response_headers = store_response.headers
for header_key in CONNECTION_SPECIFIC_HEADERS:
response_headers.pop(header_key, default=None)
return make_response(
store_response.content, store_response.status_code, response_headers.items()
)
else:
# The Kobo device turns other request types into GET requests on redirects, so we instead proxy to the Kobo store ourselves.
outgoing_headers = Headers(request.headers)
outgoing_headers.remove("Host")
store_response = requests.request(
method=request.method,
url=get_store_url_for_current_request(),
headers=outgoing_headers,
data=request.get_data(),
allow_redirects=False,
)
response_headers = store_response.headers
for header_key in CONNECTION_SPECIFIC_HEADERS:
response_headers.pop(header_key, default=None)
return make_response(
store_response.content, store_response.status_code, response_headers.items()
)
return make_response(jsonify({}))
@kobo.route("/v1/library/sync")
@login_required
@ -105,6 +108,8 @@ def redirect_or_proxy_request():
def HandleSyncRequest():
sync_token = SyncToken.SyncToken.from_headers(request.headers)
log.info("Kobo library sync request received.")
if not current_app.wsgi_app.is_proxied:
log.debug('Kobo: Received unproxied request, changed request port to server port')
# TODO: Limit the number of books return per sync call, and rely on the sync-continuatation header
# instead so that the device triggers another sync.
@ -149,6 +154,7 @@ def HandleSyncRequest():
.filter(db.Data.format.in_(KOBO_FORMATS))
.all()
)
for book in changed_entries:
entitlement = {
"BookEntitlement": create_book_entitlement(book, archived=(book.id in archived_book_ids)),
@ -169,7 +175,11 @@ def HandleSyncRequest():
sync_token.books_last_modified = new_books_last_modified
sync_token.archive_last_modified = new_archived_last_modified
return generate_sync_response(request, sync_token, entitlements)
if config.config_kobo_proxy:
return generate_sync_response(request, sync_token, entitlements)
return make_response(jsonify(entitlements))
# Missing feature: Detect server-side book deletions.
def generate_sync_response(request, sync_token, entitlements):
@ -210,6 +220,8 @@ def generate_sync_response(request, sync_token, entitlements):
@login_required
@download_required
def HandleMetadataRequest(book_uuid):
if not current_app.wsgi_app.is_proxied:
log.debug('Kobo: Received unproxied request, changed request port to server port')
log.info("Kobo library metadata request received for book %s" % book_uuid)
book = db.session.query(db.Books).filter(db.Books.uuid == book_uuid).first()
if not book or not book.data:
@ -221,12 +233,21 @@ def HandleMetadataRequest(book_uuid):
def get_download_url_for_book(book, book_format):
return url_for(
"web.download_link",
book_id=book.id,
book_format=book_format.lower(),
_external=True,
)
if not current_app.wsgi_app.is_proxied:
return "{url_scheme}://{url_base}:{url_port}/download/{book_id}/{book_format}".format(
url_scheme=request.environ['wsgi.url_scheme'],
url_base=request.environ['SERVER_NAME'],
url_port=config.config_port,
book_id=book.id,
book_format=book_format.lower()
)
else:
return url_for(
"web.download_link",
book_id=book.id,
book_format=book_format.lower(),
_external=True,
)
def create_book_entitlement(book, archived):
@ -278,11 +299,11 @@ def get_series(book):
def get_metadata(book):
download_urls = []
for book_data in book.data:
if book_data.format not in KOBO_FORMATS:
continue
for kobo_format in KOBO_FORMATS[book_data.format]:
# log.debug('Id: %s, Format: %s' % (book.id, kobo_format))
download_urls.append(
{
"Format": kobo_format,
@ -356,7 +377,10 @@ def HandleCoverImageRequest(book_uuid):
book_uuid, use_generic_cover_on_failure=False
)
if not book_cover:
return redirect(get_store_url_for_current_request(), 307)
if config.config_kobo_proxy:
return redirect(get_store_url_for_current_request(), 307)
else:
abort(404)
return book_cover
@ -397,39 +421,196 @@ def HandleBookDeletionRequest(book_uuid):
@kobo.route("/v1/library/tags/<shelf_name>", methods=["POST"])
@kobo.route("/v1/library/tags/<tag_id>", methods=["DELETE"])
def HandleUnimplementedRequest(book_uuid=None, shelf_name=None, tag_id=None):
log.debug("Alternative Request received:")
return redirect_or_proxy_request()
# TODO: Implement the following routes
@kobo.route("/v1/user/loyalty/<dummy>", methods=["GET", "POST"])
@kobo.route("/v1/user/profile", methods=["GET", "POST"])
@kobo.route("/v1/user/wishlist", methods=["GET", "POST"])
@kobo.route("/v1/user/recommendations", methods=["GET", "POST"])
@kobo.route("/v1/analytics/<dummy>", methods=["GET", "POST"])
def HandleUserRequest(dummy=None):
log.debug("Unimplemented Request received: %s", request.base_url)
return redirect_or_proxy_request()
@kobo.app_errorhandler(404)
def handle_404(err):
# This handler acts as a catch-all for endpoints that we don't have an interest in
# implementing (e.g: v1/analytics/gettests, v1/user/recommendations, etc)
log.debug("Unknown Request received: %s", request.base_url)
return redirect_or_proxy_request()
@kobo.route("/v1/initialization")
@login_required
def HandleInitRequest():
outgoing_headers = Headers(request.headers)
outgoing_headers.remove("Host")
store_response = requests.request(
method=request.method,
url=get_store_url_for_current_request(),
headers=outgoing_headers,
data=request.get_data(),
)
store_response_json = store_response.json()
if "Resources" in store_response_json:
kobo_resources = store_response_json["Resources"]
if not current_app.wsgi_app.is_proxied:
log.debug('Kobo: Received unproxied request, changed request port to server port')
calibre_web_url = "{url_scheme}://{url_base}:{url_port}".format(
url_scheme=request.environ['wsgi.url_scheme'],
url_base=request.environ['SERVER_NAME'],
url_port=config.config_port
)
else:
calibre_web_url = url_for("web.index", _external=True).strip("/")
kobo_resources["image_host"] = calibre_web_url
kobo_resources["image_url_quality_template"] = unquote(url_for("kobo.HandleCoverImageRequest", _external=True,
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}"))
kobo_resources["image_url_template"] = unquote(url_for("kobo.HandleCoverImageRequest", _external=True,
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}"))
if config.config_kobo_proxy:
outgoing_headers = Headers(request.headers)
outgoing_headers.remove("Host")
store_response = requests.request(
method=request.method,
url=get_store_url_for_current_request(),
headers=outgoing_headers,
data=request.get_data(),
)
return make_response(store_response_json, store_response.status_code)
store_response_json = store_response.json()
if "Resources" in store_response_json:
kobo_resources = store_response_json["Resources"]
# calibre_web_url = url_for("web.index", _external=True).strip("/")
kobo_resources["image_host"] = calibre_web_url
kobo_resources["image_url_quality_template"] = unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}"))
kobo_resources["image_url_template"] = unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}"))
return make_response(store_response_json, store_response.status_code)
else:
resources = NATIVE_KOBO_RESOURCES(calibre_web_url)
response = make_response(jsonify({"Resources": resources}))
response.headers["x-kobo-apitoken"] = "e30="
return response
def NATIVE_KOBO_RESOURCES(calibre_web_url):
return {
"account_page": "https://secure.kobobooks.com/profile",
"account_page_rakuten": "https://my.rakuten.co.jp/",
"add_entitlement": "https://storeapi.kobo.com/v1/library/{RevisionIds}",
"affiliaterequest": "https://storeapi.kobo.com/v1/affiliate",
"audiobook_subscription_orange_deal_inclusion_url": "https://authorize.kobo.com/inclusion",
"authorproduct_recommendations": "https://storeapi.kobo.com/v1/products/books/authors/recommendations",
"autocomplete": "https://storeapi.kobo.com/v1/products/autocomplete",
"blackstone_header": {"key": "x-amz-request-payer", "value": "requester"},
"book": "https://storeapi.kobo.com/v1/products/books/{ProductId}",
"book_detail_page": "https://store.kobobooks.com/{culture}/ebook/{slug}",
"book_detail_page_rakuten": "http://books.rakuten.co.jp/rk/{crossrevisionid}",
"book_landing_page": "https://store.kobobooks.com/ebooks",
"book_subscription": "https://storeapi.kobo.com/v1/products/books/subscriptions",
"categories": "https://storeapi.kobo.com/v1/categories",
"categories_page": "https://store.kobobooks.com/ebooks/categories",
"category": "https://storeapi.kobo.com/v1/categories/{CategoryId}",
"category_featured_lists": "https://storeapi.kobo.com/v1/categories/{CategoryId}/featured",
"category_products": "https://storeapi.kobo.com/v1/categories/{CategoryId}/products",
"checkout_borrowed_book": "https://storeapi.kobo.com/v1/library/borrow",
"configuration_data": "https://storeapi.kobo.com/v1/configuration",
"content_access_book": "https://storeapi.kobo.com/v1/products/books/{ProductId}/access",
"customer_care_live_chat": "https://v2.zopim.com/widget/livechat.html?key=Y6gwUmnu4OATxN3Tli4Av9bYN319BTdO",
"daily_deal": "https://storeapi.kobo.com/v1/products/dailydeal",
"deals": "https://storeapi.kobo.com/v1/deals",
"delete_entitlement": "https://storeapi.kobo.com/v1/library/{Ids}",
"delete_tag": "https://storeapi.kobo.com/v1/library/tags/{TagId}",
"delete_tag_items": "https://storeapi.kobo.com/v1/library/tags/{TagId}/items/delete",
"device_auth": "https://storeapi.kobo.com/v1/auth/device",
"device_refresh": "https://storeapi.kobo.com/v1/auth/refresh",
"dictionary_host": "https://kbdownload1-a.akamaihd.net",
"discovery_host": "https://discovery.kobobooks.com",
"eula_page": "https://www.kobo.com/termsofuse?style=onestore",
"exchange_auth": "https://storeapi.kobo.com/v1/auth/exchange",
"external_book": "https://storeapi.kobo.com/v1/products/books/external/{Ids}",
"facebook_sso_page": "https://authorize.kobo.com/signin/provider/Facebook/login?returnUrl=http://store.kobobooks.com/",
"featured_list": "https://storeapi.kobo.com/v1/products/featured/{FeaturedListId}",
"featured_lists": "https://storeapi.kobo.com/v1/products/featured",
"free_books_page": {
"EN": "https://www.kobo.com/{region}/{language}/p/free-ebooks",
"FR": "https://www.kobo.com/{region}/{language}/p/livres-gratuits",
"IT": "https://www.kobo.com/{region}/{language}/p/libri-gratuiti",
"NL": "https://www.kobo.com/{region}/{language}/List/bekijk-het-overzicht-van-gratis-ebooks/QpkkVWnUw8sxmgjSlCbJRg",
"PT": "https://www.kobo.com/{region}/{language}/p/livros-gratis",
},
"fte_feedback": "https://storeapi.kobo.com/v1/products/ftefeedback",
"get_tests_request": "https://storeapi.kobo.com/v1/analytics/gettests",
"giftcard_epd_redeem_url": "https://www.kobo.com/{storefront}/{language}/redeem-ereader",
"giftcard_redeem_url": "https://www.kobo.com/{storefront}/{language}/redeem",
"help_page": "http://www.kobo.com/help",
"image_host": calibre_web_url,
"image_url_quality_template": unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}")),
"image_url_template": unquote(calibre_web_url + url_for("kobo.HandleCoverImageRequest",
auth_token = kobo_auth.get_auth_token(),
book_uuid="{ImageId}")),
"kobo_audiobooks_enabled": "False",
"kobo_audiobooks_orange_deal_enabled": "False",
"kobo_audiobooks_subscriptions_enabled": "False",
"kobo_nativeborrow_enabled": "True",
"kobo_onestorelibrary_enabled": "False",
"kobo_redeem_enabled": "True",
"kobo_shelfie_enabled": "False",
"kobo_subscriptions_enabled": "False",
"kobo_superpoints_enabled": "False",
"kobo_wishlist_enabled": "True",
"library_book": "https://storeapi.kobo.com/v1/user/library/books/{LibraryItemId}",
"library_items": "https://storeapi.kobo.com/v1/user/library",
"library_metadata": "https://storeapi.kobo.com/v1/library/{Ids}/metadata",
"library_prices": "https://storeapi.kobo.com/v1/user/library/previews/prices",
"library_stack": "https://storeapi.kobo.com/v1/user/library/stacks/{LibraryItemId}",
"library_sync": "https://storeapi.kobo.com/v1/library/sync",
"love_dashboard_page": "https://store.kobobooks.com/{culture}/kobosuperpoints",
"love_points_redemption_page": "https://store.kobobooks.com/{culture}/KoboSuperPointsRedemption?productId={ProductId}",
"magazine_landing_page": "https://store.kobobooks.com/emagazines",
"notifications_registration_issue": "https://storeapi.kobo.com/v1/notifications/registration",
"oauth_host": "https://oauth.kobo.com",
"overdrive_account": "https://auth.overdrive.com/account",
"overdrive_library": "https://{libraryKey}.auth.overdrive.com/library",
"overdrive_library_finder_host": "https://libraryfinder.api.overdrive.com",
"overdrive_thunder_host": "https://thunder.api.overdrive.com",
"password_retrieval_page": "https://www.kobobooks.com/passwordretrieval.html",
"post_analytics_event": "https://storeapi.kobo.com/v1/analytics/event",
"privacy_page": "https://www.kobo.com/privacypolicy?style=onestore",
"product_nextread": "https://storeapi.kobo.com/v1/products/{ProductIds}/nextread",
"product_prices": "https://storeapi.kobo.com/v1/products/{ProductIds}/prices",
"product_recommendations": "https://storeapi.kobo.com/v1/products/{ProductId}/recommendations",
"product_reviews": "https://storeapi.kobo.com/v1/products/{ProductIds}/reviews",
"products": "https://storeapi.kobo.com/v1/products",
"provider_external_sign_in_page": "https://authorize.kobo.com/ExternalSignIn/{providerName}?returnUrl=http://store.kobobooks.com/",
"purchase_buy": "https://www.kobo.com/checkout/createpurchase/",
"purchase_buy_templated": "https://www.kobo.com/{culture}/checkout/createpurchase/{ProductId}",
"quickbuy_checkout": "https://storeapi.kobo.com/v1/store/quickbuy/{PurchaseId}/checkout",
"quickbuy_create": "https://storeapi.kobo.com/v1/store/quickbuy/purchase",
"rating": "https://storeapi.kobo.com/v1/products/{ProductId}/rating/{Rating}",
"reading_state": "https://storeapi.kobo.com/v1/library/{Ids}/state",
"redeem_interstitial_page": "https://store.kobobooks.com",
"registration_page": "https://authorize.kobo.com/signup?returnUrl=http://store.kobobooks.com/",
"related_items": "https://storeapi.kobo.com/v1/products/{Id}/related",
"remaining_book_series": "https://storeapi.kobo.com/v1/products/books/series/{SeriesId}",
"rename_tag": "https://storeapi.kobo.com/v1/library/tags/{TagId}",
"review": "https://storeapi.kobo.com/v1/products/reviews/{ReviewId}",
"review_sentiment": "https://storeapi.kobo.com/v1/products/reviews/{ReviewId}/sentiment/{Sentiment}",
"shelfie_recommendations": "https://storeapi.kobo.com/v1/user/recommendations/shelfie",
"sign_in_page": "https://authorize.kobo.com/signin?returnUrl=http://store.kobobooks.com/",
"social_authorization_host": "https://social.kobobooks.com:8443",
"social_host": "https://social.kobobooks.com",
"stacks_host_productId": "https://store.kobobooks.com/collections/byproductid/",
"store_home": "www.kobo.com/{region}/{language}",
"store_host": "store.kobobooks.com",
"store_newreleases": "https://store.kobobooks.com/{culture}/List/new-releases/961XUjtsU0qxkFItWOutGA",
"store_search": "https://store.kobobooks.com/{culture}/Search?Query={query}",
"store_top50": "https://store.kobobooks.com/{culture}/ebooks/Top",
"tag_items": "https://storeapi.kobo.com/v1/library/tags/{TagId}/Items",
"tags": "https://storeapi.kobo.com/v1/library/tags",
"taste_profile": "https://storeapi.kobo.com/v1/products/tasteprofile",
"update_accessibility_to_preview": "https://storeapi.kobo.com/v1/library/{EntitlementIds}/preview",
"use_one_store": "False",
"user_loyalty_benefits": "https://storeapi.kobo.com/v1/user/loyalty/benefits",
"user_platform": "https://storeapi.kobo.com/v1/user/platform",
"user_profile": "https://storeapi.kobo.com/v1/user/profile",
"user_ratings": "https://storeapi.kobo.com/v1/user/ratings",
"user_recommendations": "https://storeapi.kobo.com/v1/user/recommendations",
"user_reviews": "https://storeapi.kobo.com/v1/user/reviews",
"user_wishlist": "https://storeapi.kobo.com/v1/user/wishlist",
"userguide_host": "https://kbdownload1-a.akamaihd.net",
"wishlist_page": "https://store.kobobooks.com/{region}/{language}/account/wishlist",
}

View File

@ -62,7 +62,7 @@ from datetime import datetime
from os import urandom
from flask import g, Blueprint, url_for
from flask_login import login_user, current_user, login_required
from flask_login import login_user, login_required
from flask_babel import gettext as _
from . import logger, ub, lm
@ -102,8 +102,7 @@ def load_user_from_kobo_request(request):
login_user(user)
return user
log.info("Received Kobo request without a recognizable auth token.")
return None
return
kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth")

View File

@ -60,10 +60,13 @@ class ReverseProxied(object):
def __init__(self, application):
self.app = application
self.proxied = False
def __call__(self, environ, start_response):
self.proxied = False
script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
if script_name:
self.proxied = True
environ['SCRIPT_NAME'] = script_name
path_info = environ.get('PATH_INFO', '')
if path_info and path_info.startswith(script_name):
@ -76,3 +79,7 @@ class ReverseProxied(object):
if servr:
environ['HTTP_HOST'] = servr
return self.app(environ, start_response)
@property
def is_proxied(self):
return self.proxied

View File

@ -1,6 +1,6 @@
{% extends "layout.html" %}
{% block body %}
<div class="discover">
<div class="discover" xmlns:text-indent="http://www.w3.org/1999/xhtml">
<h2>{{title}}</h2>
<form role="form" method="POST" autocomplete="off">
<div class="panel-group">
@ -169,6 +169,18 @@
<input type="checkbox" id="config_remote_login" name="config_remote_login" {% if config.config_remote_login %}checked{% endif %}>
<label for="config_remote_login">{{_('Enable remote login ("magic link")')}}</label>
</div>
{% if feature_support['kobo'] %}
<div class="form-group">
<input type="checkbox" id="config_kobo_sync" name="config_kobo_sync" data-control="kobo-settings" {% if config.config_kobo_sync %}checked{% endif %}>
<label for="config_kobo_sync">{{_('Enable Kobo sync')}}</label>
</div>
<div data-related="kobo-settings">
<div class="form-group" style="text-indent:10px;">
<input type="checkbox" id="config_kobo_proxy" name="config_kobo_proxy" {% if config.config_kobo_proxy %}checked{% endif %}>
<label for="config_kobo_proxy">{{_('Proxy unknown requests to Kobo Store')}}</label>
</div>
</div>
{% endif %}
{% if feature_support['goodreads'] %}
<div class="form-group">
<input type="checkbox" id="config_use_goodreads" name="config_use_goodreads" data-control="goodreads-settings" {% if config.config_use_goodreads %}checked{% endif %}>

View File

@ -26,6 +26,7 @@
<label for="kindle_mail">{{_('Kindle E-Mail')}}</label>
<input type="email" class="form-control" name="kindle_mail" id="kindle_mail" value="{{ content.kindle_mail if content.kindle_mail != None }}">
</div>
{% if not content.role_anonymous() %}
<div class="form-group">
<label for="locale">{{_('Language')}}</label>
<select name="locale" id="locale" class="form-control">
@ -34,6 +35,8 @@
{% endfor %}
</select>
</div>
{% endif %}
<div class="form-group">
<label for="default_language">{{_('Show books with language')}}</label>
<select name="default_language" id="default_language" class="form-control">
@ -55,7 +58,7 @@
{% endfor %}
</div>
{% endif %}
{% if feature_support['kobo'] %}
{% if feature_support['kobo'] and not new_user %}
<label>{{ _('Kobo Sync Token')}}</label>
<div class="form-group col">
<a class="btn btn-default" id="config_create_kobo_token" data-toggle="modal" data-target="#modal_kobo_token" data-remote="false" href="{{ url_for('kobo_auth.generate_auth_token', user_id=content.id) }}">{{_('Create/View')}}</a>

View File

@ -1,65 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of the Calibre-Web (https://github.com/janeczku/calibre-web)
# Copyright (C) 2018-2019 OzzieIsaacs
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from subproc_wrapper import process_open, cmdlineCall
import os
import sys
import re
import time
def main():
quotes = [1, 2]
format_new_ext = '.mobi'
format_old_ext = '.epub'
file_path = '/home/matthias/Dokumente/bücher/Bettina Szramah/Die Giftmischerin TCP_IP (10)/Die Giftmischerin TCP_IP - Bettina, Szrama'
command = ['/opt/calibre/ebook-convert', (file_path + format_old_ext),
(file_path + format_new_ext)]
#print(command)
#p1 = cmdlineCall(command[0],command[1:])
#time.sleep(10)
#print(p1)
p = process_open(command, quotes)
while p.poll() is None:
nextline = p.stdout.readline()
if os.name == 'nt' and sys.version_info < (3, 0):
nextline = nextline.decode('windows-1252')
elif os.name == 'posix' and sys.version_info < (3, 0):
nextline = nextline.decode('utf-8')
# log.debug(nextline.strip('\r\n'))
# parse progress string from calibre-converter
progress = re.search(r"(\d+)%\s.*", nextline)
if progress:
print('Progress:' + str(progress))
# self.UIqueue[index]['progress'] = progress.group(1) + ' %
# process returncode
check = p.returncode
calibre_traceback = p.stderr.readlines()
for ele in calibre_traceback:
if sys.version_info < (3, 0):
ele = ele.decode('utf-8')
print(ele.strip('\n'))
if not ele.startswith('Traceback') and not ele.startswith(' File'):
print( "Calibre failed with error: %s" % ele.strip('\n'))
print(str(check))
if __name__ == '__main__':
main()

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2020-01-12 13:57+0100\n"
"POT-Creation-Date: 2020-01-20 20:31+0100\n"
"PO-Revision-Date: 2020-01-08 11:37+0000\n"
"Last-Translator: Lukas Heroudek <lukas.heroudek@gmail.com>\n"
"Language: cs_CZ\n"
@ -59,7 +59,7 @@ msgstr "Konfigurace Calibre-Web aktualizována"
msgid "Basic Configuration"
msgstr "Základní konfigurace"
#: cps/admin.py:465 cps/web.py:1093
#: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!"
msgstr "Vyplňte všechna pole!"
@ -68,7 +68,7 @@ msgstr "Vyplňte všechna pole!"
msgid "Add new user"
msgstr "Přidat nového uživatele"
#: cps/admin.py:476 cps/web.py:1318
#: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain"
msgstr "E-mail není z platné domény"
@ -112,23 +112,23 @@ msgstr "Uživatel '%(nick)s' smazán"
msgid "No admin user remaining, can't delete user"
msgstr "Nezbývá žádný správce, nemůžete jej odstranit"
#: cps/admin.py:612 cps/web.py:1359
#: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address."
msgstr "Byl nalezen existující účet pro tuto e-mailovou adresu."
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format
msgid "Edit User %(nick)s"
msgstr "Upravit uživatele %(nick)s"
#: cps/admin.py:622 cps/web.py:1327
#: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken"
msgstr "Toto uživatelské jméno je již použito"
#: cps/admin.py:637
#, python-format
msgid "User '%(nick)s' updated"
msgstr "Uživatel %(nick)s aktualizován"
msgstr "Uživatel '%(nick)s' aktualizován"
#: cps/admin.py:640
msgid "An unknown error occured."
@ -139,11 +139,11 @@ msgstr "Došlo k neznámé chybě."
msgid "Password for user %(user)s reset"
msgstr "Heslo pro uživatele %(user)s resetováno"
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174
#: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later."
msgstr "Neznámá chyba. Opakujte prosím později."
#: cps/admin.py:663 cps/web.py:1062
#: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..."
msgstr "Nejprve nakonfigurujte nastavení pošty SMTP..."
@ -241,7 +241,7 @@ msgstr "Obal není v podporovaném formátu (jpg/png/webp), nelze uložit"
#: cps/editbooks.py:451
msgid "Cover is not a jpg file, can't save"
msgstr "Obal neni soubor jpg, nelze uložit"
msgstr "Obal není soubor jpg, nelze uložit"
#: cps/editbooks.py:494
#, python-format
@ -489,7 +489,7 @@ msgstr "Kniha je již součástí police: %(shelfname)s"
#: cps/shelf.py:85
#, python-format
msgid "Book has been added to shelf: %(sname)s"
msgstr "Kniha byla přidána do plice: %(sname)s"
msgstr "Kniha byla přidána do police: %(sname)s"
#: cps/shelf.py:104
#, python-format
@ -591,7 +591,7 @@ msgid "Show best rated books"
msgstr "Zobrazit nejlépe hodnocené knihy"
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011
#: cps/web.py:1009
msgid "Read Books"
msgstr "Přečtené knihy"
@ -600,7 +600,7 @@ msgid "Show read and unread"
msgstr "Zobrazit prečtené a nepřečtené"
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015
#: cps/web.py:1013
msgid "Unread Books"
msgstr "Nepřečtené knihy"
@ -722,7 +722,7 @@ msgstr "Knihy"
msgid "Hot Books (most downloaded)"
msgstr "Žhavé knihy (nejstahovanější)"
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478
#: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Chyba při otevíraní eKnihy. Soubor neexistuje nebo neni přístupný:"
@ -790,128 +790,128 @@ msgid "Tasks"
msgstr "Úlohy"
#: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831
#: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search"
msgstr "Hledat"
#: cps/web.py:881
#: cps/web.py:879
msgid "Published after "
msgstr "Vydáno po "
#: cps/web.py:888
#: cps/web.py:886
msgid "Published before "
msgstr "Vydáno před "
#: cps/web.py:902
#: cps/web.py:900
#, python-format
msgid "Rating <= %(rating)s"
msgstr "Hodnocení <= %(rating)s"
#: cps/web.py:904
#: cps/web.py:902
#, python-format
msgid "Rating >= %(rating)s"
msgstr "Hodnocení >= %(rating)s"
#: cps/web.py:970 cps/web.py:982
#: cps/web.py:968 cps/web.py:980
msgid "search"
msgstr "hledat"
#: cps/web.py:1067
#: cps/web.py:1064
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Kniha byla úspěšně zařazena do fronty pro odeslání na %(kindlemail)s"
#: cps/web.py:1071
#: cps/web.py:1068
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Při odesílání této knihy došlo k chybě: %(res)s"
#: cps/web.py:1073
#: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..."
msgstr "Nejprve nakonfigurujte vaši kindle e-mailovou adresu.."
#: cps/web.py:1087
#: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!"
msgstr "E-mailový server není nakonfigurován, kontaktujte svého správce!"
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123
#: cps/web.py:1128 cps/web.py:1132
#: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1125 cps/web.py:1129
msgid "register"
msgstr "registrovat"
#: cps/web.py:1121
#: cps/web.py:1118
msgid "Your e-mail is not allowed to register"
msgstr "Váš e-mail nemá povolení k registraci"
#: cps/web.py:1124
#: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Potvrzovací e-mail byl odeslán na váš účet."
#: cps/web.py:1127
#: cps/web.py:1124
msgid "This username or e-mail address is already in use."
msgstr "Toto uživatelské jméno nebo e-mailová adresa jsou již používány."
#: cps/web.py:1144
#: cps/web.py:1141
msgid "Cannot activate LDAP authentication"
msgstr "Nelze aktivovat ověření LDAP"
#: cps/web.py:1154 cps/web.py:1281
#: cps/web.py:1151 cps/web.py:1278
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "nyní jste přihlášeni jako: %(nickname)s"
#: cps/web.py:1159
#: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator"
msgstr "Nelze se přihlásit. LDAP server neodpovídá, kontaktujte svého správce"
#: cps/web.py:1163 cps/web.py:1186
#: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password"
msgstr "Špatné uživatelské jméno nebo heslo"
#: cps/web.py:1170
#: cps/web.py:1167
msgid "New Password was send to your email address"
msgstr "Nové heslo bylo zasláno na váši emailovou adresu"
#: cps/web.py:1176
#: cps/web.py:1173
msgid "Please enter valid username to reset password"
msgstr "Zadejte platné uživatelské jméno pro obnovení hesla"
#: cps/web.py:1182
#: cps/web.py:1179
#, python-format
msgid "You are now logged in as: '%(nickname)s'"
msgstr "Nyní jste přihlášeni jako: '%(nickname)s'"
#: cps/web.py:1189 cps/web.py:1213
#: cps/web.py:1186 cps/web.py:1210
msgid "login"
msgstr "přihlásit se"
#: cps/web.py:1225 cps/web.py:1259
#: cps/web.py:1222 cps/web.py:1256
msgid "Token not found"
msgstr "Token nenalezen"
#: cps/web.py:1234 cps/web.py:1267
#: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired"
msgstr "Token vypršel"
#: cps/web.py:1243
#: cps/web.py:1240
msgid "Success! Please return to your device"
msgstr "Úspěch! Vraťte se prosím do zařízení"
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369
#: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s profil"
#: cps/web.py:1365
#: cps/web.py:1362
msgid "Profile updated"
msgstr "Profil aktualizován"
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407
#: cps/web.py:1412
#: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1409
msgid "Read a Book"
msgstr "Číst knihu"
#: cps/web.py:1423
#: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr "Chyba při otevírání eKnihy. Soubor neexistuje nebo není přístupný"
@ -953,11 +953,11 @@ msgstr "Správce"
#: cps/templates/detail.html:27 cps/templates/shelf.html:6
#: cps/templates/shelfdown.html:62
msgid "Download"
msgstr "Stáhovat"
msgstr "Stahovat"
#: cps/templates/admin.html:18
msgid "View Ebooks"
msgstr "Prohlížet eknihy"
msgstr "Prohlížet"
#: cps/templates/admin.html:19 cps/templates/layout.html:65
msgid "Upload"
@ -1098,7 +1098,7 @@ msgstr "Ok"
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:133
msgid "Back"
msgstr "Zpět"
@ -1211,7 +1211,7 @@ msgstr "Datum vydání"
msgid "Publisher"
msgstr "Vydavatel"
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language"
msgstr "Jazyk"
@ -1238,7 +1238,7 @@ msgstr "Získat metadata"
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129
#: cps/templates/user_edit.html:131
msgid "Submit"
msgstr "Odeslat"
@ -1405,7 +1405,7 @@ msgstr "Povolit veřejnou registraci"
#: cps/templates/config_edit.html:170
msgid "Enable remote login (\"magic link\")"
msgstr "Povolit vzdálené přihlášení (\“magic link\”)"
msgstr "Povolit vzdálené přihlášení (\\“magic link\\”)"
#: cps/templates/config_edit.html:175
msgid "Use Goodreads"
@ -1591,35 +1591,35 @@ msgstr "Štítky pro obsah pro dospělé"
msgid "Default settings for new users"
msgstr "Výchozí nastavení pro nového uživatele"
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user"
msgstr "Uživatel admin"
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads"
msgstr "Povolit stahování"
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer"
msgstr "Povolit prohlížeč knih"
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads"
msgstr "Povolit nahrávání"
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit"
msgstr "Povolit úpravy"
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books"
msgstr "Povolit mazání knih"
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password"
msgstr "Povolit změnu hesla"
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs"
msgstr "Povolit úpravy veřejných polic"
@ -1627,11 +1627,11 @@ msgstr "Povolit úpravy veřejných polic"
msgid "Default visibilities for new users"
msgstr "Výchozí viditelnosti pro nové uživatele"
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view"
msgstr "Zobrazit náhodné knihy v podrobném zobrazení"
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content"
msgstr "Zobrazit obsah pro dospělé"
@ -1665,7 +1665,7 @@ msgstr "Označit jako přečtené"
#: cps/templates/detail.html:201
msgid "Read"
msgstr "Číst"
msgstr "Přečteno"
#: cps/templates/detail.html:211
msgid "Description:"
@ -1910,13 +1910,21 @@ msgstr "Zapomenuté heslo"
msgid "Log in with magic link"
msgstr "Přihlásit se pomocí magického odkazu"
#: cps/templates/logviewer.html:5
msgid "Show Calibre-Web log"
msgstr "Zobrazit Calibre-Web log"
#: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log: "
msgstr "Zobrazit Calibre-Web log: "
#: cps/templates/logviewer.html:8
msgid "Show access log"
msgstr "Zobrazit log přístupu"
msgid "Calibre-Web log: "
msgstr "Calibre-Web log: "
#: cps/templates/logviewer.html:8
msgid "Stream output, can't be displayed"
msgstr ""
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr "Zobrazit log přístupu: "
#: cps/templates/osd.xml:5
msgid "Calibre-Web ebook catalog"
@ -1972,7 +1980,7 @@ msgstr "Světlý"
#: cps/templates/readcbr.html:116
msgid "Dark"
msgstr "Tnavý"
msgstr "Tmavý"
#: cps/templates/readcbr.html:121
msgid "Scale"
@ -2140,19 +2148,19 @@ msgstr "Statistika knihovny Calibre"
#: cps/templates/stats.html:12
msgid "Books in this Library"
msgstr "Knihy v této knihovně"
msgstr "Knih v této knihovně"
#: cps/templates/stats.html:16
msgid "Authors in this Library"
msgstr "Autoři v této knihovně"
msgstr "Auto v této knihovně"
#: cps/templates/stats.html:20
msgid "Categories in this Library"
msgstr "Kategorie v této knihovně"
msgstr "Kategorií v této knihovně"
#: cps/templates/stats.html:24
msgid "Series in this Library"
msgstr "Série v této knihovně"
msgstr "Sérií v této knihovně"
#: cps/templates/stats.html:28
msgid "Linked libraries"
@ -2208,33 +2216,33 @@ msgstr "Resetovat uživatelské heslo"
#: cps/templates/user_edit.html:26
msgid "Kindle E-Mail"
msgstr "Kindle E-Mail"
msgstr "Kindle e-mail"
#: cps/templates/user_edit.html:39
#: cps/templates/user_edit.html:41
msgid "Show books with language"
msgstr "Zobrazit knihy s jazykem"
#: cps/templates/user_edit.html:41
#: cps/templates/user_edit.html:43
msgid "Show all"
msgstr "Zobrazit vše"
#: cps/templates/user_edit.html:51
#: cps/templates/user_edit.html:53
msgid "OAuth Settings"
msgstr "Nastavení OAuth"
#: cps/templates/user_edit.html:53
#: cps/templates/user_edit.html:55
msgid "Link"
msgstr "Připojit"
#: cps/templates/user_edit.html:55
#: cps/templates/user_edit.html:57
msgid "Unlink"
msgstr "Odpojit"
#: cps/templates/user_edit.html:123
#: cps/templates/user_edit.html:125
msgid "Delete this user"
msgstr "Odstranit tohoto uživatele"
#: cps/templates/user_edit.html:138
#: cps/templates/user_edit.html:140
msgid "Recent Downloads"
msgstr "Nedávná stahování"
@ -3591,3 +3599,9 @@ msgstr "Nedávná stahování"
#~ msgid "Zaza"
#~ msgstr "Zaza"
#~ msgid "Show Calibre-Web log"
#~ msgstr "Zobrazit Calibre-Web log"
#~ msgid "Show access log"
#~ msgstr "Zobrazit log přístupu"

View File

@ -5,19 +5,18 @@
# FIRST AUTHOR OzzieIsaacs, 2016.
msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2020-01-12 13:57+0100\n"
"PO-Revision-Date: 2020-01-13 18:24+0100\n"
"POT-Creation-Date: 2020-01-18 12:54+0100\n"
"PO-Revision-Date: 2020-01-18 12:52+0100\n"
"Last-Translator: Ozzie Isaacs\n"
"Language: de\n"
"Language-Team: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.7.0\n"
"X-Generator: Poedit 2.2.4\n"
#: cps/about.py:42
msgid "installed"
@ -61,7 +60,7 @@ msgstr "Konfiguration von Calibre-Web wurde aktualisiert"
msgid "Basic Configuration"
msgstr "Basiskonfiguration"
#: cps/admin.py:465 cps/web.py:1093
#: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!"
msgstr "Bitte alle Felder ausfüllen!"
@ -70,7 +69,7 @@ msgstr "Bitte alle Felder ausfüllen!"
msgid "Add new user"
msgstr "Neuen Benutzer hinzufügen"
#: cps/admin.py:476 cps/web.py:1318
#: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain"
msgstr "E-Mail bezieht sich nicht auf eine gültige Domain"
@ -114,16 +113,16 @@ msgstr "Benutzer '%(nick)s' gelöscht"
msgid "No admin user remaining, can't delete user"
msgstr "Benutzer kann nicht gelöscht werden, es wäre kein Admin Benutzer übrig"
#: cps/admin.py:612 cps/web.py:1359
#: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address."
msgstr "Es existiert bereits ein Benutzer für diese E-Mailadresse."
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format
msgid "Edit User %(nick)s"
msgstr "Benutzer %(nick)s bearbeiten"
#: cps/admin.py:622 cps/web.py:1327
#: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken"
msgstr "Benutzername ist schon vorhanden"
@ -141,11 +140,11 @@ msgstr "Es ist ein unbekannter Fehler aufgetreten."
msgid "Password for user %(user)s reset"
msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt"
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174
#: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later."
msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen."
#: cps/admin.py:663 cps/web.py:1062
#: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..."
msgstr "Bitte zuerst die SMTP-Einstellung konfigurieren ..."
@ -593,7 +592,7 @@ msgid "Show best rated books"
msgstr "Zeige am besten bewertete Bücher"
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011
#: cps/web.py:1009
msgid "Read Books"
msgstr "Gelesene Bücher"
@ -602,7 +601,7 @@ msgid "Show read and unread"
msgstr "Zeige gelesene/ungelesene Bücher"
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015
#: cps/web.py:1013
msgid "Unread Books"
msgstr "Ungelesene Bücher"
@ -724,7 +723,7 @@ msgstr "Bücher"
msgid "Hot Books (most downloaded)"
msgstr "Beliebte Bücher (am meisten Downloads)"
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478
#: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Öffnen des Buchs fehlgeschlagen. Datei existiert nicht oder ist nicht zugänglich:"
@ -792,128 +791,128 @@ msgid "Tasks"
msgstr "Aufgaben"
#: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831
#: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search"
msgstr "Suche"
#: cps/web.py:881
#: cps/web.py:879
msgid "Published after "
msgstr "Herausgegeben nach dem "
#: cps/web.py:888
#: cps/web.py:886
msgid "Published before "
msgstr "Herausgegeben vor dem "
#: cps/web.py:902
#: cps/web.py:900
#, python-format
msgid "Rating <= %(rating)s"
msgstr "Bewertung <= %(rating)s"
#: cps/web.py:904
#: cps/web.py:902
#, python-format
msgid "Rating >= %(rating)s"
msgstr "Bewertung >= %(rating)s"
#: cps/web.py:970 cps/web.py:982
#: cps/web.py:968 cps/web.py:980
msgid "search"
msgstr "Suche"
#: cps/web.py:1067
#: cps/web.py:1064
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht"
#: cps/web.py:1071
#: cps/web.py:1068
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s"
#: cps/web.py:1073
#: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..."
msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..."
#: cps/web.py:1087
#: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!"
msgstr "Der E-Mail Server ist nicht konfigurierte, bitte den Administrator kontaktieren!"
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123
#: cps/web.py:1128 cps/web.py:1132
#: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1125 cps/web.py:1129
msgid "register"
msgstr "Registieren"
#: cps/web.py:1121
#: cps/web.py:1118
msgid "Your e-mail is not allowed to register"
msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen"
#: cps/web.py:1124
#: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Eine Bestätigungs-E-Mail wurde an deinen E-Mail Account versendet."
#: cps/web.py:1127
#: cps/web.py:1124
msgid "This username or e-mail address is already in use."
msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung."
#: cps/web.py:1144
#: cps/web.py:1141
msgid "Cannot activate LDAP authentication"
msgstr "LDAP-Authentifizierung kann nicht aktiviert werden"
#: cps/web.py:1154 cps/web.py:1281
#: cps/web.py:1151 cps/web.py:1278
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "Du bist nun eingeloggt als '%(nickname)s'"
#: cps/web.py:1159
#: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator"
msgstr "Login nicht erfolgreich, LDAP Server nicht erreichbar, bitte Administrator kontaktieren"
#: cps/web.py:1163 cps/web.py:1186
#: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password"
msgstr "Falscher Benutzername oder Passwort"
#: cps/web.py:1170
#: cps/web.py:1167
msgid "New Password was send to your email address"
msgstr "Das neue Passwort wurde an die E-Mail Adresse verschickt"
#: cps/web.py:1176
#: cps/web.py:1173
msgid "Please enter valid username to reset password"
msgstr "Bitte einen gültigen Benutzernamen zum Zurücksetzen des Passworts angeben"
#: cps/web.py:1182
#: cps/web.py:1179
#, python-format
msgid "You are now logged in as: '%(nickname)s'"
msgstr "Eingeloggt als: '%(nickname)s'"
#: cps/web.py:1189 cps/web.py:1213
#: cps/web.py:1186 cps/web.py:1210
msgid "login"
msgstr "Login"
#: cps/web.py:1225 cps/web.py:1259
#: cps/web.py:1222 cps/web.py:1256
msgid "Token not found"
msgstr "Token wurde nicht gefunden"
#: cps/web.py:1234 cps/web.py:1267
#: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired"
msgstr "Das Token ist abgelaufen"
#: cps/web.py:1243
#: cps/web.py:1240
msgid "Success! Please return to your device"
msgstr "Erfolg! Bitte zum Gerät zurückkehren"
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369
#: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)s's Profil"
#: cps/web.py:1365
#: cps/web.py:1362
msgid "Profile updated"
msgstr "Profil aktualisiert"
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407
#: cps/web.py:1412
#: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1409
msgid "Read a Book"
msgstr "Lese ein Buch"
#: cps/web.py:1423
#: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr "Fehler beim Öffnen des eBooks. Datei existiert nicht oder ist nicht zugänglich."
@ -1100,7 +1099,7 @@ msgstr "OK"
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:133
msgid "Back"
msgstr "Zurück"
@ -1213,7 +1212,7 @@ msgstr "Herausgabedatum"
msgid "Publisher"
msgstr "Herausgeber"
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language"
msgstr "Sprache"
@ -1240,7 +1239,7 @@ msgstr "Metadaten laden"
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129
#: cps/templates/user_edit.html:131
msgid "Submit"
msgstr "Abschicken"
@ -1593,35 +1592,35 @@ msgstr "Kategorien für Erwachseneninhalte"
msgid "Default settings for new users"
msgstr "Standard-Einstellungen für neue Benutzer"
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user"
msgstr "Administrator"
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads"
msgstr "Downloads erlauben"
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer"
msgstr "Anzeige von Büchern erlauben"
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads"
msgstr "Hochladen erlauben"
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit"
msgstr "Bearbeiten erlauben"
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books"
msgstr "Löschen von Büchern erlauben"
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password"
msgstr "Ändern des Passworts erlauben"
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs"
msgstr "Editieren öffentlicher Bücherregale erlauben"
@ -1629,11 +1628,11 @@ msgstr "Editieren öffentlicher Bücherregale erlauben"
msgid "Default visibilities for new users"
msgstr "Standard-Sichtbarkeiten für neue Benutzer"
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view"
msgstr "Zeige zufällige Bücher in der Detailansicht"
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content"
msgstr "Erwachseneninhalte anzeigen"
@ -1912,13 +1911,21 @@ msgstr "Passwort vergessen"
msgid "Log in with magic link"
msgstr "Einloggen mit magischem Link"
#: cps/templates/logviewer.html:5
msgid "Show Calibre-Web log"
msgstr "Zeige Calibre-Web Logdatei"
#: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log: "
msgstr "Calibre-Web Logdatei anzeigen: "
#: cps/templates/logviewer.html:8
msgid "Show access log"
msgstr "Zeige Zugriffslogdatei"
msgid "Calibre-Web log: "
msgstr "Calibre-Web Logdatei: "
#: cps/templates/logviewer.html:8
msgid "Stream output, can't be displayed"
msgstr "Stream Ausgabe, kann nicht angezeigt werden"
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr "Zugriffslogbuch anzeigen: "
#: cps/templates/osd.xml:5
msgid "Calibre-Web ebook catalog"
@ -2212,31 +2219,31 @@ msgstr "Benutzerpasswort zurücksetzen"
msgid "Kindle E-Mail"
msgstr "Kindle E-Mail"
#: cps/templates/user_edit.html:39
#: cps/templates/user_edit.html:41
msgid "Show books with language"
msgstr "Zeige nur Bücher mit dieser Sprache"
#: cps/templates/user_edit.html:41
#: cps/templates/user_edit.html:43
msgid "Show all"
msgstr "Zeige alle"
#: cps/templates/user_edit.html:51
#: cps/templates/user_edit.html:53
msgid "OAuth Settings"
msgstr "Oauth Einstellungen"
#: cps/templates/user_edit.html:53
#: cps/templates/user_edit.html:55
msgid "Link"
msgstr "Verknüpfung herstellen"
#: cps/templates/user_edit.html:55
#: cps/templates/user_edit.html:57
msgid "Unlink"
msgstr "Verknüpfung entfernen"
#: cps/templates/user_edit.html:123
#: cps/templates/user_edit.html:125
msgid "Delete this user"
msgstr "Benutzer löschen"
#: cps/templates/user_edit.html:138
#: cps/templates/user_edit.html:140
msgid "Recent Downloads"
msgstr "Letzte Downloads"
@ -2374,3 +2381,10 @@ msgstr "Letzte Downloads"
#~ msgid "New Books"
#~ msgstr "Neue Bücher"
#~ msgid "Show Calibre-Web log"
#~ msgstr "Zeige Calibre-Web Logdatei"
#~ msgid "Show access log"
#~ msgstr "Zeige Zugriffslogdatei"

View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Calibre-Web\n"
"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n"
"POT-Creation-Date: 2020-01-12 13:57+0100\n"
"PO-Revision-Date: 2019-11-14 18:50+0100\n"
"POT-Creation-Date: 2020-01-18 12:28+0100\n"
"PO-Revision-Date: 2020-01-18 11:22+0100\n"
"Last-Translator: Jonatan Nyberg <jonatan.nyberg.karl@gmail.com>\n"
"Language: sv\n"
"Language-Team: \n"
@ -60,7 +60,7 @@ msgstr "Calibre-Web konfiguration uppdaterad"
msgid "Basic Configuration"
msgstr "Grundläggande konfiguration"
#: cps/admin.py:465 cps/web.py:1093
#: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!"
msgstr "Fyll i alla fält!"
@ -69,7 +69,7 @@ msgstr "Fyll i alla fält!"
msgid "Add new user"
msgstr "Lägg till ny användare"
#: cps/admin.py:476 cps/web.py:1318
#: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain"
msgstr "E-posten är inte från giltig domän"
@ -98,7 +98,7 @@ msgstr "Det gick inte att skicka Testmeddelandet: %(res)s"
#: cps/admin.py:540
msgid "Please configure your e-mail address first..."
msgstr ""
msgstr "Vänligen konfigurera din e-postadress först..."
#: cps/admin.py:542
msgid "E-mail server settings updated"
@ -113,18 +113,18 @@ msgstr "Användaren '%(nick)s' borttagen"
msgid "No admin user remaining, can't delete user"
msgstr "Ingen adminstratörsanvändare kvar, kan inte ta bort användaren"
#: cps/admin.py:612 cps/web.py:1359
#: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address."
msgstr "Hittade ett befintligt konto för den här e-postadressen."
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format
msgid "Edit User %(nick)s"
msgstr "Redigera användaren %(nick)s"
#: cps/admin.py:622 cps/web.py:1327
#: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken"
msgstr ""
msgstr "Detta användarnamn är redan taget"
#: cps/admin.py:637
#, python-format
@ -140,11 +140,11 @@ msgstr "Ett okänt fel uppstod."
msgid "Password for user %(user)s reset"
msgstr "Lösenord för användaren %(user)s återställd"
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174
#: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later."
msgstr "Ett okänt fel uppstod. Försök igen senare."
#: cps/admin.py:663 cps/web.py:1062
#: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..."
msgstr "Konfigurera SMTP-postinställningarna först..."
@ -260,11 +260,11 @@ msgstr "Det gick inte att redigera boken, kontrollera loggfilen för mer informa
#: cps/editbooks.py:581
#, python-format
msgid "File %(filename)s could not saved to temp dir"
msgstr ""
msgstr "Filen %(filename)s kunde inte sparas i temp dir"
#: cps/editbooks.py:598
msgid "Uploaded book probably exists in the library, consider to change before upload new: "
msgstr ""
msgstr "Uppladdad bok finns förmodligen i biblioteket, överväg att ändra innan du laddar upp nya: "
#: cps/editbooks.py:613
#, python-format
@ -592,7 +592,7 @@ msgid "Show best rated books"
msgstr "Visa böcker med bästa betyg"
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011
#: cps/web.py:1009
msgid "Read Books"
msgstr "Lästa böcker"
@ -601,7 +601,7 @@ msgid "Show read and unread"
msgstr "Visa lästa och olästa"
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015
#: cps/web.py:1013
msgid "Unread Books"
msgstr "Olästa böcker"
@ -723,7 +723,7 @@ msgstr "Böcker"
msgid "Hot Books (most downloaded)"
msgstr "Heta böcker (mest hämtade)"
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478
#: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr "Fel vid öppnande av e-bok. Filen finns inte eller filen är inte tillgänglig:"
@ -791,128 +791,128 @@ msgid "Tasks"
msgstr "Uppgifter"
#: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831
#: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search"
msgstr "Sök"
#: cps/web.py:881
#: cps/web.py:879
msgid "Published after "
msgstr "Publicerad efter "
#: cps/web.py:888
#: cps/web.py:886
msgid "Published before "
msgstr "Publicerad före "
#: cps/web.py:902
#: cps/web.py:900
#, python-format
msgid "Rating <= %(rating)s"
msgstr "Betyg <= %(rating)s"
#: cps/web.py:904
#: cps/web.py:902
#, python-format
msgid "Rating >= %(rating)s"
msgstr "Betyg >= %(rating)s"
#: cps/web.py:970 cps/web.py:982
#: cps/web.py:968 cps/web.py:980
msgid "search"
msgstr "sök"
#: cps/web.py:1067
#: cps/web.py:1064
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr "Boken är i kö för att skicka till %(kindlemail)s"
#: cps/web.py:1071
#: cps/web.py:1068
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr "Det gick inte att skicka den här boken: %(res)s"
#: cps/web.py:1073
#: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..."
msgstr "Konfigurera din kindle-e-postadress först..."
#: cps/web.py:1087
#: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!"
msgstr ""
msgstr "E-postservern är inte konfigurerad, kontakta din administratör!"
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123
#: cps/web.py:1128 cps/web.py:1132
#: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1125 cps/web.py:1129
msgid "register"
msgstr "registrera"
#: cps/web.py:1121
#: cps/web.py:1118
msgid "Your e-mail is not allowed to register"
msgstr "Din e-post är inte tillåten att registrera"
#: cps/web.py:1124
#: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account."
msgstr "Bekräftelsemail skickades till ditt e-postkonto."
#: cps/web.py:1127
#: cps/web.py:1124
msgid "This username or e-mail address is already in use."
msgstr "Det här användarnamnet eller e-postadressen är redan i bruk."
#: cps/web.py:1144
#: cps/web.py:1141
msgid "Cannot activate LDAP authentication"
msgstr "Det går inte att aktivera LDAP-autentisering"
#: cps/web.py:1154 cps/web.py:1281
#: cps/web.py:1151 cps/web.py:1278
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr "du är nu inloggad som: \"%(nickname)s\""
#: cps/web.py:1159
#: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator"
msgstr "Det gick inte att logga in. LDAP-servern är nere, kontakta din administratör"
#: cps/web.py:1163 cps/web.py:1186
#: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password"
msgstr "Fel användarnamn eller lösenord"
#: cps/web.py:1170
#: cps/web.py:1167
msgid "New Password was send to your email address"
msgstr ""
msgstr "Nytt lösenord skickades till din e-postadress"
#: cps/web.py:1176
#: cps/web.py:1173
msgid "Please enter valid username to reset password"
msgstr ""
msgstr "Ange giltigt användarnamn för att återställa lösenordet"
#: cps/web.py:1182
#: cps/web.py:1179
#, python-format
msgid "You are now logged in as: '%(nickname)s'"
msgstr "Du är nu inloggad som: \"%(nickname)s\""
#: cps/web.py:1189 cps/web.py:1213
#: cps/web.py:1186 cps/web.py:1210
msgid "login"
msgstr "logga in"
#: cps/web.py:1225 cps/web.py:1259
#: cps/web.py:1222 cps/web.py:1256
msgid "Token not found"
msgstr "Token hittades inte"
#: cps/web.py:1234 cps/web.py:1267
#: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired"
msgstr "Token har löpt ut"
#: cps/web.py:1243
#: cps/web.py:1240
msgid "Success! Please return to your device"
msgstr "Lyckades! Vänligen återvänd till din enhet"
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369
#: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format
msgid "%(name)s's profile"
msgstr "%(name)ss profil"
#: cps/web.py:1365
#: cps/web.py:1362
msgid "Profile updated"
msgstr "Profilen uppdaterad"
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407
#: cps/web.py:1412
#: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1409
msgid "Read a Book"
msgstr "Läs en bok"
#: cps/web.py:1423
#: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr "Fel vid öppningen av e-boken. Filen finns inte eller filen är inte tillgänglig."
@ -1034,11 +1034,11 @@ msgstr "Fjärrinloggning"
#: cps/templates/admin.html:104
msgid "Reverse proxy login"
msgstr ""
msgstr "Omvänd proxy inloggning"
#: cps/templates/admin.html:109
msgid "Reverse proxy header name"
msgstr ""
msgstr "Omvänt proxy rubriknamn"
#: cps/templates/admin.html:121
msgid "Administration"
@ -1099,7 +1099,7 @@ msgstr "Ok"
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:133
msgid "Back"
msgstr "Tillbaka"
@ -1212,7 +1212,7 @@ msgstr "Publiceringsdatum"
msgid "Publisher"
msgstr "Förlag"
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language"
msgstr "Språk"
@ -1239,7 +1239,7 @@ msgstr "Hämta metadata"
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129
#: cps/templates/user_edit.html:131
msgid "Submit"
msgstr "Skicka"
@ -1505,11 +1505,11 @@ msgstr "%(provider)s OAuth-klient-hemlighet"
#: cps/templates/config_edit.html:276
msgid "Allow Reverse Proxy Authentication"
msgstr ""
msgstr "Tillåt omvänd proxyautentisering"
#: cps/templates/config_edit.html:280
msgid "Reverse Proxy Header Name"
msgstr ""
msgstr "Omvänt proxy rubriknamn"
#: cps/templates/config_edit.html:292
msgid "External binaries"
@ -1592,35 +1592,35 @@ msgstr "Taggar för vuxeninnehåll"
msgid "Default settings for new users"
msgstr "Standardinställningar för nya användare"
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user"
msgstr "Adminstratör användare"
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads"
msgstr "Tillåt Hämtningar"
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer"
msgstr "Tillåt bokvisare"
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads"
msgstr "Tillåt Uppladdningar"
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit"
msgstr "Tillåt Redigera"
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books"
msgstr "Tillåt Ta bort böcker"
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password"
msgstr "Tillåt Ändra lösenord"
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs"
msgstr "Tillåt Redigering av offentliga hyllor"
@ -1628,11 +1628,11 @@ msgstr "Tillåt Redigering av offentliga hyllor"
msgid "Default visibilities for new users"
msgstr "Standardvisibiliteter för nya användare"
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view"
msgstr "Visa slumpmässiga böcker i detaljvyn"
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content"
msgstr "Visa vuxeninnehåll"
@ -1734,7 +1734,7 @@ msgstr "Ange domännamn"
#: cps/templates/email_edit.html:60
msgid "Denied domains for registering"
msgstr ""
msgstr "Nekade domäner för registrering"
#: cps/templates/email_edit.html:90
msgid "Do you really want to delete this domain rule?"
@ -1774,7 +1774,7 @@ msgstr "Populära publikationer från den här katalogen baserad på betyg."
#: cps/templates/index.xml:31
msgid "Recently added Books"
msgstr ""
msgstr "Senaste tillagda böcker"
#: cps/templates/index.xml:35
msgid "The latest Books"
@ -1802,11 +1802,11 @@ msgstr "Böcker ordnade efter serier"
#: cps/templates/index.xml:93
msgid "Books ordered by Languages"
msgstr ""
msgstr "Böcker ordnade efter språk"
#: cps/templates/index.xml:100
msgid "Books ordered by file formats"
msgstr ""
msgstr "Böcker ordnade av filformat"
#: cps/templates/index.xml:103 cps/templates/layout.html:137
msgid "Public Shelves"
@ -1905,19 +1905,27 @@ msgstr "Kom ihåg mig"
#: cps/templates/login.html:22
msgid "Forgot password"
msgstr ""
msgstr "Glömt lösenord"
#: cps/templates/login.html:25
msgid "Log in with magic link"
msgstr "Logga in med magisk länk"
#: cps/templates/logviewer.html:5
msgid "Show Calibre-Web log"
msgstr "Visa Calibre-Web-logg"
#: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log: "
msgstr "Visa Calibre-Web-logg: "
#: cps/templates/logviewer.html:8
msgid "Show access log"
msgstr "Visa åtkomstlogg"
msgid "Calibre-Web log: "
msgstr "Visa åtkomstlogg: "
#: cps/templates/logviewer.html:8
msgid "Stream output, can't be displayed"
msgstr "Strömutmatning kan inte visas"
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr "Visa åtkomstlogg: "
#: cps/templates/osd.xml:5
msgid "Calibre-Web ebook catalog"
@ -2093,11 +2101,11 @@ msgstr "Uteslut språk"
#: cps/templates/search_form.html:95
msgid "Extensions"
msgstr ""
msgstr "Tillägg"
#: cps/templates/search_form.html:105
msgid "Exclude Extensions"
msgstr ""
msgstr "Uteslut tillägg"
#: cps/templates/search_form.html:117
msgid "Rating bigger than"
@ -2211,31 +2219,31 @@ msgstr "Återställ användarlösenordet"
msgid "Kindle E-Mail"
msgstr "Kindle e-post"
#: cps/templates/user_edit.html:39
#: cps/templates/user_edit.html:41
msgid "Show books with language"
msgstr "Visa böcker med språk"
#: cps/templates/user_edit.html:41
#: cps/templates/user_edit.html:43
msgid "Show all"
msgstr "Visa alla"
#: cps/templates/user_edit.html:51
#: cps/templates/user_edit.html:53
msgid "OAuth Settings"
msgstr "OAuth-inställningar"
#: cps/templates/user_edit.html:53
#: cps/templates/user_edit.html:55
msgid "Link"
msgstr "Koppla"
#: cps/templates/user_edit.html:55
#: cps/templates/user_edit.html:57
msgid "Unlink"
msgstr "Koppla bort"
#: cps/templates/user_edit.html:123
#: cps/templates/user_edit.html:125
msgid "Delete this user"
msgstr "Ta bort den här användaren"
#: cps/templates/user_edit.html:138
#: cps/templates/user_edit.html:140
msgid "Recent Downloads"
msgstr "Senaste hämtningar"
@ -2458,3 +2466,9 @@ msgstr "Senaste hämtningar"
#~ msgid "New Books"
#~ msgstr "Nya böcker"
#~ msgid "Show Calibre-Web log"
#~ msgstr "Visa Calibre-Web-logg"
#~ msgid "Show access log"
#~ msgstr "Visa åtkomstlogg"

View File

@ -479,7 +479,8 @@ def migrate_Database(session):
def clean_database(session):
# Remove expired remote login tokens
now = datetime.datetime.now()
session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete()
session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).\
filter(RemoteAuthToken.token_type !=1 ).delete()
session.commit()

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-01-12 13:57+0100\n"
"POT-Creation-Date: 2020-01-18 12:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -59,7 +59,7 @@ msgstr ""
msgid "Basic Configuration"
msgstr ""
#: cps/admin.py:465 cps/web.py:1093
#: cps/admin.py:465 cps/web.py:1090
msgid "Please fill out all fields!"
msgstr ""
@ -68,7 +68,7 @@ msgstr ""
msgid "Add new user"
msgstr ""
#: cps/admin.py:476 cps/web.py:1318
#: cps/admin.py:476 cps/web.py:1315
msgid "E-mail is not from valid domain"
msgstr ""
@ -112,16 +112,16 @@ msgstr ""
msgid "No admin user remaining, can't delete user"
msgstr ""
#: cps/admin.py:612 cps/web.py:1359
#: cps/admin.py:612 cps/web.py:1356
msgid "Found an existing account for this e-mail address."
msgstr ""
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1334
#: cps/admin.py:616 cps/admin.py:630 cps/admin.py:644 cps/web.py:1331
#, python-format
msgid "Edit User %(nick)s"
msgstr ""
#: cps/admin.py:622 cps/web.py:1327
#: cps/admin.py:622 cps/web.py:1324
msgid "This username is already taken"
msgstr ""
@ -139,11 +139,11 @@ msgstr ""
msgid "Password for user %(user)s reset"
msgstr ""
#: cps/admin.py:660 cps/web.py:1118 cps/web.py:1174
#: cps/admin.py:660 cps/web.py:1115 cps/web.py:1171
msgid "An unknown error occurred. Please try again later."
msgstr ""
#: cps/admin.py:663 cps/web.py:1062
#: cps/admin.py:663 cps/web.py:1059
msgid "Please configure the SMTP mail settings first..."
msgstr ""
@ -591,7 +591,7 @@ msgid "Show best rated books"
msgstr ""
#: cps/templates/index.xml:46 cps/templates/index.xml:50 cps/ub.py:67
#: cps/web.py:1011
#: cps/web.py:1009
msgid "Read Books"
msgstr ""
@ -600,7 +600,7 @@ msgid "Show read and unread"
msgstr ""
#: cps/templates/index.xml:53 cps/templates/index.xml:57 cps/ub.py:71
#: cps/web.py:1015
#: cps/web.py:1013
msgid "Unread Books"
msgstr ""
@ -722,7 +722,7 @@ msgstr ""
msgid "Hot Books (most downloaded)"
msgstr ""
#: cps/web.py:586 cps/web.py:1382 cps/web.py:1478
#: cps/web.py:586 cps/web.py:1379 cps/web.py:1475
msgid "Error opening eBook. File does not exist or file is not accessible:"
msgstr ""
@ -790,128 +790,128 @@ msgid "Tasks"
msgstr ""
#: cps/templates/feed.xml:33 cps/templates/layout.html:44
#: cps/templates/layout.html:45 cps/web.py:829 cps/web.py:831
#: cps/templates/layout.html:45 cps/web.py:827 cps/web.py:829
msgid "Search"
msgstr ""
#: cps/web.py:881
#: cps/web.py:879
msgid "Published after "
msgstr ""
#: cps/web.py:888
#: cps/web.py:886
msgid "Published before "
msgstr ""
#: cps/web.py:902
#: cps/web.py:900
#, python-format
msgid "Rating <= %(rating)s"
msgstr ""
#: cps/web.py:904
#: cps/web.py:902
#, python-format
msgid "Rating >= %(rating)s"
msgstr ""
#: cps/web.py:970 cps/web.py:982
#: cps/web.py:968 cps/web.py:980
msgid "search"
msgstr ""
#: cps/web.py:1067
#: cps/web.py:1064
#, python-format
msgid "Book successfully queued for sending to %(kindlemail)s"
msgstr ""
#: cps/web.py:1071
#: cps/web.py:1068
#, python-format
msgid "There was an error sending this book: %(res)s"
msgstr ""
#: cps/web.py:1073
#: cps/web.py:1070
msgid "Please configure your kindle e-mail address first..."
msgstr ""
#: cps/web.py:1087
#: cps/web.py:1084
msgid "E-Mail server is not configured, please contact your administrator!"
msgstr ""
#: cps/web.py:1088 cps/web.py:1094 cps/web.py:1119 cps/web.py:1123
#: cps/web.py:1128 cps/web.py:1132
#: cps/web.py:1085 cps/web.py:1091 cps/web.py:1116 cps/web.py:1120
#: cps/web.py:1125 cps/web.py:1129
msgid "register"
msgstr ""
#: cps/web.py:1121
#: cps/web.py:1118
msgid "Your e-mail is not allowed to register"
msgstr ""
#: cps/web.py:1124
#: cps/web.py:1121
msgid "Confirmation e-mail was send to your e-mail account."
msgstr ""
#: cps/web.py:1127
#: cps/web.py:1124
msgid "This username or e-mail address is already in use."
msgstr ""
#: cps/web.py:1144
#: cps/web.py:1141
msgid "Cannot activate LDAP authentication"
msgstr ""
#: cps/web.py:1154 cps/web.py:1281
#: cps/web.py:1151 cps/web.py:1278
#, python-format
msgid "you are now logged in as: '%(nickname)s'"
msgstr ""
#: cps/web.py:1159
#: cps/web.py:1156
msgid "Could not login. LDAP server down, please contact your administrator"
msgstr ""
#: cps/web.py:1163 cps/web.py:1186
#: cps/web.py:1160 cps/web.py:1183
msgid "Wrong Username or Password"
msgstr ""
#: cps/web.py:1170
#: cps/web.py:1167
msgid "New Password was send to your email address"
msgstr ""
#: cps/web.py:1176
#: cps/web.py:1173
msgid "Please enter valid username to reset password"
msgstr ""
#: cps/web.py:1182
#: cps/web.py:1179
#, python-format
msgid "You are now logged in as: '%(nickname)s'"
msgstr ""
#: cps/web.py:1189 cps/web.py:1213
#: cps/web.py:1186 cps/web.py:1210
msgid "login"
msgstr ""
#: cps/web.py:1225 cps/web.py:1259
#: cps/web.py:1222 cps/web.py:1256
msgid "Token not found"
msgstr ""
#: cps/web.py:1234 cps/web.py:1267
#: cps/web.py:1231 cps/web.py:1264
msgid "Token has expired"
msgstr ""
#: cps/web.py:1243
#: cps/web.py:1240
msgid "Success! Please return to your device"
msgstr ""
#: cps/web.py:1320 cps/web.py:1363 cps/web.py:1369
#: cps/web.py:1317 cps/web.py:1360 cps/web.py:1366
#, python-format
msgid "%(name)s's profile"
msgstr ""
#: cps/web.py:1365
#: cps/web.py:1362
msgid "Profile updated"
msgstr ""
#: cps/web.py:1394 cps/web.py:1397 cps/web.py:1400 cps/web.py:1407
#: cps/web.py:1412
#: cps/web.py:1391 cps/web.py:1394 cps/web.py:1397 cps/web.py:1404
#: cps/web.py:1409
msgid "Read a Book"
msgstr ""
#: cps/web.py:1423
#: cps/web.py:1420
msgid "Error opening eBook. File does not exist or file is not accessible."
msgstr ""
@ -1098,7 +1098,7 @@ msgstr ""
#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:92
#: cps/templates/layout.html:28 cps/templates/shelf.html:73
#: cps/templates/shelf_edit.html:19 cps/templates/shelf_order.html:32
#: cps/templates/user_edit.html:131
#: cps/templates/user_edit.html:133
msgid "Back"
msgstr ""
@ -1211,7 +1211,7 @@ msgstr ""
msgid "Publisher"
msgstr ""
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:30
#: cps/templates/book_edit.html:103 cps/templates/user_edit.html:31
msgid "Language"
msgstr ""
@ -1238,7 +1238,7 @@ msgstr ""
#: cps/templates/book_edit.html:173 cps/templates/config_edit.html:329
#: cps/templates/config_view_edit.html:146 cps/templates/login.html:20
#: cps/templates/search_form.html:170 cps/templates/shelf_edit.html:17
#: cps/templates/user_edit.html:129
#: cps/templates/user_edit.html:131
msgid "Submit"
msgstr ""
@ -1591,35 +1591,35 @@ msgstr ""
msgid "Default settings for new users"
msgstr ""
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:82
#: cps/templates/config_view_edit.html:81 cps/templates/user_edit.html:84
msgid "Admin user"
msgstr ""
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:91
#: cps/templates/config_view_edit.html:85 cps/templates/user_edit.html:93
msgid "Allow Downloads"
msgstr ""
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:95
#: cps/templates/config_view_edit.html:89 cps/templates/user_edit.html:97
msgid "Allow book viewer"
msgstr ""
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:99
#: cps/templates/config_view_edit.html:93 cps/templates/user_edit.html:101
msgid "Allow Uploads"
msgstr ""
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:103
#: cps/templates/config_view_edit.html:97 cps/templates/user_edit.html:105
msgid "Allow Edit"
msgstr ""
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:107
#: cps/templates/config_view_edit.html:101 cps/templates/user_edit.html:109
msgid "Allow Delete books"
msgstr ""
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:112
#: cps/templates/config_view_edit.html:105 cps/templates/user_edit.html:114
msgid "Allow Changing Password"
msgstr ""
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:116
#: cps/templates/config_view_edit.html:109 cps/templates/user_edit.html:118
msgid "Allow Editing Public Shelfs"
msgstr ""
@ -1627,11 +1627,11 @@ msgstr ""
msgid "Default visibilities for new users"
msgstr ""
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:74
#: cps/templates/config_view_edit.html:135 cps/templates/user_edit.html:76
msgid "Show random books in detail view"
msgstr ""
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:87
#: cps/templates/config_view_edit.html:139 cps/templates/user_edit.html:89
msgid "Show mature content"
msgstr ""
@ -1910,12 +1910,20 @@ msgstr ""
msgid "Log in with magic link"
msgstr ""
#: cps/templates/logviewer.html:5
msgid "Show Calibre-Web log"
#: cps/templates/logviewer.html:6
msgid "Show Calibre-Web log: "
msgstr ""
#: cps/templates/logviewer.html:8
msgid "Show access log"
msgid "Calibre-Web log: "
msgstr ""
#: cps/templates/logviewer.html:8
msgid "Stream output, can't be displayed"
msgstr ""
#: cps/templates/logviewer.html:12
msgid "Show access log: "
msgstr ""
#: cps/templates/osd.xml:5
@ -2210,31 +2218,31 @@ msgstr ""
msgid "Kindle E-Mail"
msgstr ""
#: cps/templates/user_edit.html:39
#: cps/templates/user_edit.html:41
msgid "Show books with language"
msgstr ""
#: cps/templates/user_edit.html:41
#: cps/templates/user_edit.html:43
msgid "Show all"
msgstr ""
#: cps/templates/user_edit.html:51
#: cps/templates/user_edit.html:53
msgid "OAuth Settings"
msgstr ""
#: cps/templates/user_edit.html:53
#: cps/templates/user_edit.html:55
msgid "Link"
msgstr ""
#: cps/templates/user_edit.html:55
#: cps/templates/user_edit.html:57
msgid "Unlink"
msgstr ""
#: cps/templates/user_edit.html:123
#: cps/templates/user_edit.html:125
msgid "Delete this user"
msgstr ""
#: cps/templates/user_edit.html:138
#: cps/templates/user_edit.html:140
msgid "Recent Downloads"
msgstr ""

View File

@ -31,7 +31,7 @@ rarfile>=2.7
# other
natsort>=2.2.0
git+https://github.com/OzzieIsaacs/comicapi.git@5346716578b2843f54d522f44d01bc8d25001d24#egg=comicapi
git+https://github.com/OzzieIsaacs/comicapi.git@ad8bfe5a1c31db882480433f86db2c5c57634a3f#egg=comicapi
#kobo integration
jsonschema>=3.2.0