feat: in-app ePub reader with epub.js, TOC sidebar, chapter navigation
Made-with: Cursor
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user