major fix
This commit is contained in:
1 parent
929088cef0
commit
9e799049a7
10 files changed
+339
-281
No files matched your search
@@ -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]
|
||||
Reference in new issue
Block a user