Initial work
This commit is contained in:
commit
929088cef0
13 files changed
+613
No files matched your search
@@ -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)
|
||||
Reference in new issue
Block a user