feat: in-app ePub reader with epub.js, TOC sidebar, chapter navigation

Made-with: Cursor
This commit is contained in:
cottongin
2026-04-06 17:39:37 -04:00
parent 5ca7156723
commit 8d58fa92b6
3 changed files with 140 additions and 1 deletions

View File

@@ -46,6 +46,33 @@ def cover_image(issue_id):
return send_file(issue.cover_path, mimetype="image/jpeg")
@issues_bp.route("/issues/<int:issue_id>/read")
def read(issue_id):
issue = Issue.query.get_or_404(issue_id)
if not os.path.exists(issue.epub_path):
flash("ePub file not found.", "error")
return redirect(url_for("issues.index"))
article_count = len(json.loads(issue.article_ids))
if issue.issue_type == "single_article":
article_ids = json.loads(issue.article_ids)
article = Article.query.get(article_ids[0]) if article_ids else None
title = article.title if article else "Single Article"
elif issue.issue_type == "multi_week":
w1 = issue.week_start.isocalendar()[1]
w2 = issue.week_end.isocalendar()[1]
title = f"Weeks {w1}\u2013{w2}"
else:
title = f"Week {issue.week_start.isocalendar()[1]}"
return render_template(
"reader.html",
issue=issue,
title=title,
article_count=article_count,
)
@issues_bp.route("/issues/<int:issue_id>/regenerate", methods=["POST"])
def regenerate(issue_id):
issue = Issue.query.get_or_404(issue_id)