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)