diff --git a/cps/templates/feed.xml b/cps/templates/feed.xml
index 84d03493..6e5575c0 100644
--- a/cps/templates/feed.xml
+++ b/cps/templates/feed.xml
@@ -61,23 +61,25 @@
{% for author in authors %}
{{author.name}}
-
{{ url_for('feed_author', name=author.name) }}
-
+
+
{% endfor %}
{% for entry in categorys %}
{{entry.name}}
{{ url_for('feed_category', name=entry.name) }}
-
+
+
{% endfor %}
{% for entry in series %}
{{entry.name}}
{{ url_for('feed_series', name=entry.name) }}
-
-
+
+
+
{% endfor %}
diff --git a/cps/templates/index.xml b/cps/templates/index.xml
index d315ffd1..118f5481 100644
--- a/cps/templates/index.xml
+++ b/cps/templates/index.xml
@@ -21,51 +21,55 @@
{{_('Hot Books')}}
-
+
+
{{url_for('feed_hot')}}
{{_('Popular publications from this catalog based on Rating.')}}
{{_('New Books')}}
+
+ type="application/atom+xml;profile=opds-catalog;type=feed;kind=acquisition"/>
{{url_for('feed_new')}}
{{_('The latest Books')}}
{{_('Random Books')}}
+
+ type="application/atom+xml;profile=opds-catalog;type=feed;kind=acquisition"/>
{{url_for('feed_discover')}}
{{_('Show Random Books')}}
{{_('Authors')}}
+
+ type="application/atom+xml;profile=opds-catalog;type=feed;kind=navigation"/>
{{url_for('feed_authorindex')}}
{{_('Books ordered by Author')}}
{{_('Category list')}}
+
+ type="application/atom+xml;profile=opds-catalog;type=feed;kind=navigation"/>
{{url_for('feed_categoryindex')}}
{{_('Books ordered by category')}}
{{_('Series list')}}
+
+ type="application/atom+xml;profile=opds-catalog;type=feed;kind=navigation"/>
{{url_for('feed_seriesindex')}}
{{_('Books ordered by series')}}
diff --git a/cps/templates/osd.xml b/cps/templates/osd.xml
index c569712b..ddbb3e91 100644
--- a/cps/templates/osd.xml
+++ b/cps/templates/osd.xml
@@ -13,21 +13,6 @@
-
-
-
-
-
- Search Data Copyright 1971-2012, Project Gutenberg, All Rights Reserved.
open
de-DE
UTF-8
diff --git a/cps/templates/search.xml b/cps/templates/search.xml
index 95f5c58a..ddbb3e91 100644
--- a/cps/templates/search.xml
+++ b/cps/templates/search.xml
@@ -13,17 +13,6 @@
-
-
-
-
-
-
open
de-DE
UTF-8
diff --git a/cps/web.py b/cps/web.py
index 4458700f..527781af 100755
--- a/cps/web.py
+++ b/cps/web.py
@@ -416,7 +416,7 @@ def before_request():
g.allow_upload = config.UPLOADING
-@app.route("/feed")
+@app.route("/opds")
@requires_basic_auth_if_no_ano
def feed_index():
if current_user.filter_language() != "all":
@@ -429,7 +429,7 @@ def feed_index():
return response
-@app.route("/feed/osd")
+@app.route("/opds/osd")
@requires_basic_auth_if_no_ano
def feed_osd():
xml = render_template('osd.xml')
@@ -438,7 +438,7 @@ def feed_osd():
return response
-@app.route("/feed/search", methods=["GET"])
+@app.route("/opds/search", methods=["GET"])
@requires_basic_auth_if_no_ano
def feed_search():
term = request.args.get("query").strip()
@@ -459,7 +459,7 @@ def feed_search():
return response
-@app.route("/feed/new")
+@app.route("/opds/new")
@requires_basic_auth_if_no_ano
def feed_new():
off = request.args.get("start_index")
@@ -472,13 +472,13 @@ def feed_new():
entries = db.session.query(db.Books).filter(filter).order_by(db.Books.timestamp.desc()).offset(off).limit(
config.NEWEST_BOOKS)
xml = render_template('feed.xml', entries=entries,
- next_url="/feed/new?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/new?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/discover")
+@app.route("/opds/discover")
@requires_basic_auth_if_no_ano
def feed_discover():
off = request.args.get("start_index")
@@ -490,13 +490,13 @@ def feed_discover():
off = 0
entries = db.session.query(db.Books).filter(filter).order_by(func.random()).offset(off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', entries=entries,
- next_url="/feed/discover?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/discover?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/hot")
+@app.route("/opds/hot")
@requires_basic_auth_if_no_ano
def feed_hot():
off = request.args.get("start_index")
@@ -510,13 +510,13 @@ def feed_hot():
off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', entries=entries,
- next_url="/feed/hot?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/hot?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/author")
+@app.route("/opds/author")
@requires_basic_auth_if_no_ano
def feed_authorindex():
off = request.args.get("start_index")
@@ -528,13 +528,13 @@ def feed_authorindex():
off = 0
authors = db.session.query(db.Authors).order_by(db.Authors.sort).offset(off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', authors=authors,
- next_url="/feed/author?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/author?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/author/")
+@app.route("/opds/author/")
@requires_basic_auth_if_no_ano
def feed_author(name):
off = request.args.get("start_index")
@@ -547,13 +547,13 @@ def feed_author(name):
entries = db.session.query(db.Books).filter(db.Books.authors.any(db.Authors.name.like("%" + name + "%"))).filter(
filter).offset(off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', entries=entries,
- next_url="/feed/author?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/author?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/category")
+@app.route("/opds/category")
@requires_basic_auth_if_no_ano
def feed_categoryindex():
off = request.args.get("start_index")
@@ -561,13 +561,13 @@ def feed_categoryindex():
off = 0
entries = db.session.query(db.Tags).order_by(db.Tags.name).offset(off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', categorys=entries,
- next_url="/feed/category?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/category?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/category/")
+@app.route("/opds/category/")
@requires_basic_auth_if_no_ano
def feed_category(name):
off = request.args.get("start_index")
@@ -580,13 +580,13 @@ def feed_category(name):
entries = db.session.query(db.Books).filter(db.Books.tags.any(db.Tags.name.like("%" + name + "%"))).order_by(
db.Books.timestamp.desc()).filter(filter).offset(off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', entries=entries,
- next_url="/feed/category?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/category?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/series")
+@app.route("/opds/series")
@requires_basic_auth_if_no_ano
def feed_seriesindex():
off = request.args.get("start_index")
@@ -594,13 +594,13 @@ def feed_seriesindex():
off = 0
entries = db.session.query(db.Series).order_by(db.Series.name).offset(off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', series=entries,
- next_url="/feed/series?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/series?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/series/")
+@app.route("/opds/series/")
@requires_basic_auth_if_no_ano
def feed_series(name):
off = request.args.get("start_index")
@@ -613,13 +613,13 @@ def feed_series(name):
entries = db.session.query(db.Books).filter(db.Books.series.any(db.Series.name.like("%" + name + "%"))).order_by(
db.Books.timestamp.desc()).filter(filter).offset(off).limit(config.NEWEST_BOOKS)
xml = render_template('feed.xml', entries=entries,
- next_url="/feed/series?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
+ next_url="/opds/series?start_index=%d" % (int(config.NEWEST_BOOKS) + int(off)))
response = make_response(xml)
response.headers["Content-Type"] = "application/xml"
return response
-@app.route("/feed/download//")
+@app.route("/opds/download//")
@requires_basic_auth_if_no_ano
@download_required
def get_opds_download_link(book_id, format):
@@ -1036,7 +1036,7 @@ def get_cover(cover_path):
return send_from_directory(os.path.join(config.DB_ROOT, cover_path), "cover.jpg")
-@app.route("/feed/cover/")
+@app.route("/opds/cover/")
@requires_basic_auth_if_no_ano
def feed_get_cover(cover_path):
return send_from_directory(os.path.join(config.DB_ROOT, cover_path), "cover.jpg")
diff --git a/readme.md b/readme.md
index d23b0cdd..1bcdf784 100755
--- a/readme.md
+++ b/readme.md
@@ -10,7 +10,8 @@ Calibre Web is a web app providing a clean interface for browsing, reading and d
- Bootstrap 3 HTML5 interface
- User management
- Admin interface
-- OPDS feed for eBook reader apps
+- User Interface in english, german and french
+- OPDS feed for eBook reader apps
- Filter and search by titles, authors, tags, series and language
- Create custom book collection (shelves)
- Support for editing eBook metadata
@@ -18,7 +19,7 @@ Calibre Web is a web app providing a clean interface for browsing, reading and d
- Restrict eBook download to logged-in users
- Support for public user registration
- Send eBooks to Kindle devices with the click of a button
-- Support for reading eBooks directly in the browser
+- Support for reading eBooks directly in the browser (.txt, .epub, .pdf)
- Upload new books in PDF format
- Support for Calibre custom columns
- Fine grained per-user permissions
@@ -27,7 +28,7 @@ Calibre Web is a web app providing a clean interface for browsing, reading and d
1. Rename `config.ini.example` to `config.ini` and set `DB_ROOT` to the path of the folder where your Calibre library (metadata.db) lives
2. Execute the command: `python cps.py`
-3. Point your browser to `http://localhost:8083` or `http://localhost:8083/feed` for the OPDS catalog
+3. Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog
**Default admin login:**
*Username:* admin