Initial work

This commit is contained in:
Pat Teruel committed 2026-02-22 15:15:07 +08:00
commit 929088cef0
13 files changed
+613

No files matched your search

+89
View File
@@ -0,0 +1,89 @@
from flask import Flask, render_template, jsonify, request
from datetime import date, timedelta
import os
from dotenv import load_dotenv
load_dotenv()
from clients import jellyfin, sonarr
app = Flask(__name__)
def last_saturday(from_date=None):
d = from_date or date.today()
# weekday(): Monday=0 ... Saturday=5 ... Sunday=6
days_back = (d.weekday() - 5) % 7
if days_back == 0:
days_back = 7
return d - timedelta(days=days_back)
@app.route("/")
def index():
end = last_saturday()
start = end - timedelta(days=6)
return render_template("index.html", default_start=start.isoformat(), default_end=end.isoformat())
@app.route("/api/fetch-episodes")
def fetch_episodes():
"""Return the absolute episode numbers for the two Saturdays bracketing the given date range."""
start_str = request.args.get("start")
end_str = request.args.get("end")
try:
end_date = date.fromisoformat(end_str) if end_str else last_saturday()
start_date = date.fromisoformat(start_str) if start_str else end_date - timedelta(days=6)
except ValueError as e:
return jsonify({"error": str(e)}), 400
try:
latest_ep = jellyfin.get_last_watched_episode(end_date)
previous_ep = jellyfin.get_last_watched_episode(start_date - timedelta(days=1))
except Exception as e:
return jsonify({"error": f"Jellyfin error: {e}"}), 502
try:
latest_abs = sonarr.get_absolute_episode(latest_ep["season"], latest_ep["episode"])
previous_abs = sonarr.get_absolute_episode(previous_ep["season"], previous_ep["episode"])
except Exception as e:
return jsonify({"error": f"Sonarr error: {e}"}), 502
total_episodes = sonarr.get_total_episodes()
watched_this_week = latest_abs - previous_abs
return jsonify({
"start": start_date.isoformat(),
"end": end_date.isoformat(),
"latest_episode": latest_abs,
"previous_episode": previous_abs,
"watched_this_week": watched_this_week,
"total_episodes": total_episodes,
"latest_jellyfin": latest_ep,
"previous_jellyfin": previous_ep,
})
@app.route("/api/report")
def report():
data = fetch_episodes().get_json()
if "error" in data:
return jsonify(data), 502
start = date.fromisoformat(data["start"])
end = date.fromisoformat(data["end"])
date_range = f"{start.strftime('%b %-d')}-{end.strftime('%-d')}"
template = (
f"ONE PIECE PROGRESS!!! ({date_range})\n"
f"Episode {data['latest_episode']}/{data['total_episodes']}\n"
f"Around {data['watched_this_week']} episodes watched this week!"
)
data["report"] = template
return jsonify(data)
if __name__ == "__main__":
port = int(os.environ.get("PORT", 5000))
app.run(host="0.0.0.0", port=port, debug=False)