90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
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)
|