major fix
This commit is contained in:
1 parent
929088cef0
commit
9e799049a7
10 files changed
+339
-281
No files matched your search
@@ -1,89 +1,113 @@
|
||||
from flask import Flask, render_template, jsonify, request
|
||||
from datetime import date, timedelta
|
||||
from flask import Flask, render_template, jsonify
|
||||
from datetime import datetime, timezone, timedelta
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
from clients import jellyfin, sonarr
|
||||
import db
|
||||
from clients import jellyfin
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
PHT = timezone(timedelta(hours=8))
|
||||
|
||||
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)
|
||||
|
||||
def current_week():
|
||||
"""Return (week_start, week_end, cutoff_utc) for the current week in PHT.
|
||||
|
||||
week_start = most recent Sunday (PHT date)
|
||||
week_end = that Sunday + 6 days (Saturday)
|
||||
cutoff_utc = Sunday 00:00 PHT expressed in UTC (= Saturday 16:00 UTC)
|
||||
"""
|
||||
now_pht = datetime.now(PHT)
|
||||
days_since_sunday = (now_pht.weekday() + 1) % 7
|
||||
sunday_midnight_pht = (now_pht - timedelta(days=days_since_sunday)).replace(
|
||||
hour=0, minute=0, second=0, microsecond=0
|
||||
)
|
||||
week_start = sunday_midnight_pht.date()
|
||||
week_end = week_start + timedelta(days=6)
|
||||
cutoff_utc = sunday_midnight_pht.astimezone(timezone.utc)
|
||||
return week_start, week_end, cutoff_utc
|
||||
|
||||
|
||||
def format_date_range(week_start, week_end) -> str:
|
||||
"""Format date range: 'Feb 8-14' (same month) or 'Mar 29 - Apr 4' (different)."""
|
||||
if week_start.month == week_end.month:
|
||||
return f"{week_start.strftime('%b %-d')}-{week_end.strftime('%-d')}"
|
||||
return f"{week_start.strftime('%b %-d')} - {week_end.strftime('%b %-d')}"
|
||||
|
||||
|
||||
@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,
|
||||
})
|
||||
week_start, week_end, _ = current_week()
|
||||
config = {
|
||||
"JELLYFIN_HOST": os.environ.get("JELLYFIN_HOST", ""),
|
||||
"JELLYFIN_API_KEY": os.environ.get("JELLYFIN_API_KEY", ""),
|
||||
"JELLYFIN_USER_ID": os.environ.get("JELLYFIN_USER_ID", ""),
|
||||
"TOTAL_EPISODES": os.environ.get("TOTAL_EPISODES", "1155"),
|
||||
"DB_PATH": os.environ.get("DB_PATH", "/app/data/episodes.db"),
|
||||
}
|
||||
return render_template(
|
||||
"index.html",
|
||||
week_start=week_start.isoformat(),
|
||||
week_end=week_end.isoformat(),
|
||||
date_range=format_date_range(week_start, week_end),
|
||||
config=config,
|
||||
)
|
||||
|
||||
|
||||
@app.route("/api/report")
|
||||
def report():
|
||||
data = fetch_episodes().get_json()
|
||||
if "error" in data:
|
||||
return jsonify(data), 502
|
||||
week_start, week_end, cutoff_utc = current_week()
|
||||
total_episodes = int(os.environ.get("TOTAL_EPISODES", 1155))
|
||||
|
||||
start = date.fromisoformat(data["start"])
|
||||
end = date.fromisoformat(data["end"])
|
||||
date_range = f"{start.strftime('%b %-d')}-{end.strftime('%-d')}"
|
||||
try:
|
||||
ep_info = jellyfin.find_last_one_piece_before(cutoff_utc)
|
||||
except Exception as e:
|
||||
return jsonify({"error": str(e)}), 502
|
||||
|
||||
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!"
|
||||
db.save_episode(
|
||||
episode_number=ep_info["episode_number"],
|
||||
week_start=week_start.isoformat(),
|
||||
week_end=week_end.isoformat(),
|
||||
item_id=ep_info.get("item_id"),
|
||||
media_name=ep_info.get("media_name"),
|
||||
watched_at=ep_info.get("watched_at"),
|
||||
)
|
||||
data["report"] = template
|
||||
return jsonify(data)
|
||||
|
||||
prev = db.get_previous_episode(week_start.isoformat())
|
||||
previous_episode = prev["episode_number"] if prev else ep_info["episode_number"]
|
||||
watched_this_week = ep_info["episode_number"] - previous_episode
|
||||
|
||||
date_range = format_date_range(week_start, week_end)
|
||||
report_text = (
|
||||
f"ONE PIECE PROGRESS!!! ({date_range})\n"
|
||||
f"Episode {ep_info['episode_number']}/{total_episodes}\n"
|
||||
f"Around {watched_this_week} episodes watched this week!"
|
||||
)
|
||||
|
||||
return jsonify({
|
||||
"week_start": week_start.isoformat(),
|
||||
"week_end": week_end.isoformat(),
|
||||
"date_range": date_range,
|
||||
"latest_episode": ep_info["episode_number"],
|
||||
"previous_episode": previous_episode,
|
||||
"watched_this_week": watched_this_week,
|
||||
"total_episodes": total_episodes,
|
||||
"media_name": ep_info.get("media_name"),
|
||||
"watched_at": ep_info.get("watched_at"),
|
||||
"report": report_text,
|
||||
})
|
||||
|
||||
|
||||
@app.route("/api/history")
|
||||
def history():
|
||||
return jsonify(db.get_all_history())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
db.init_db()
|
||||
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