major fix

This commit is contained in:
Pat Teruel committed 2026-02-22 15:39:50 +08:00
1 parent 929088cef0
commit 9e799049a7
10 files changed
+339 -281

No files matched your search

+99
View File
@@ -0,0 +1,99 @@
"""SQLite persistence for weekly episode tracking."""
import os
import sqlite3
from datetime import datetime, timezone, timedelta
from contextlib import contextmanager
DB_PATH = os.environ.get("DB_PATH", "/app/data/episodes.db")
SEED_EPISODE = 928
@contextmanager
def _conn():
os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
con = sqlite3.connect(DB_PATH)
con.row_factory = sqlite3.Row
try:
yield con
con.commit()
finally:
con.close()
def init_db():
"""Create table and seed with the initial previous-week episode if empty."""
with _conn() as con:
con.execute("""
CREATE TABLE IF NOT EXISTS weekly_episodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
episode_number INTEGER NOT NULL,
week_start TEXT NOT NULL,
week_end TEXT NOT NULL,
item_id TEXT,
media_name TEXT,
watched_at TEXT,
recorded_at TEXT DEFAULT (datetime('now'))
)
""")
count = con.execute("SELECT COUNT(*) FROM weekly_episodes").fetchone()[0]
if count == 0:
_seed(con)
def _seed(con):
"""Seed with episode 928 for the week before the current week."""
from datetime import date
PHT = timezone(timedelta(hours=8))
now_pht = datetime.now(PHT)
days_since_sunday = (now_pht.weekday() + 1) % 7
current_sunday = (now_pht - timedelta(days=days_since_sunday)).date()
prev_sunday = current_sunday - timedelta(weeks=1)
prev_saturday = prev_sunday + timedelta(days=6)
con.execute(
"INSERT INTO weekly_episodes (episode_number, week_start, week_end, media_name) VALUES (?,?,?,?)",
(SEED_EPISODE, prev_sunday.isoformat(), prev_saturday.isoformat(), "seed"),
)
def save_episode(episode_number: int, week_start: str, week_end: str,
item_id: str = None, media_name: str = None, watched_at: str = None):
"""Insert or replace the episode record for this week."""
with _conn() as con:
existing = con.execute(
"SELECT id FROM weekly_episodes WHERE week_start = ?", (week_start,)
).fetchone()
if existing:
con.execute(
"""UPDATE weekly_episodes
SET episode_number=?, item_id=?, media_name=?, watched_at=?, recorded_at=datetime('now')
WHERE week_start=?""",
(episode_number, item_id, media_name, watched_at, week_start),
)
else:
con.execute(
"""INSERT INTO weekly_episodes
(episode_number, week_start, week_end, item_id, media_name, watched_at)
VALUES (?,?,?,?,?,?)""",
(episode_number, week_start, week_end, item_id, media_name, watched_at),
)
def get_previous_episode(week_start: str) -> dict | None:
"""Return the most recent episode record strictly before week_start."""
with _conn() as con:
row = con.execute(
"""SELECT * FROM weekly_episodes
WHERE week_start < ?
ORDER BY week_start DESC LIMIT 1""",
(week_start,),
).fetchone()
return dict(row) if row else None
def get_all_history() -> list:
"""Return all weekly episode records, newest first."""
with _conn() as con:
rows = con.execute(
"SELECT * FROM weekly_episodes ORDER BY week_start DESC"
).fetchall()
return [dict(r) for r in rows]