siftlode/backend/app
npeter83 6330ac3184 feat(playlists): derive dirty from a synced-state fingerprint
Store a SHA-256 of each playlist's name + ordered video ids as last synced from /
pushed to YouTube (migration 0013, backfilled for already-clean linked playlists).
'dirty' is now recomputed on every edit by comparing the current fingerprint to that
baseline instead of being stickily set true. So manually restoring the original order
(or undo back to it) clears dirty on its own — the Reset to YouTube button disappears
and no YouTube read is needed. Baseline is set on read-sync, repull (reset), and a
clean push; a missing baseline counts as dirty (unknown YT state). Verified the
migration's fingerprint matches the app's runtime fingerprint exactly.
2026-06-15 23:00:56 +02:00
..
routes feat(playlists): derive dirty from a synced-state fingerprint 2026-06-15 23:00:56 +02:00
static chore: rebrand Subfeed -> Siftlode 2026-06-14 04:40:22 +02:00
sync feat(playlists): derive dirty from a synced-state fingerprint 2026-06-15 23:00:56 +02:00
youtube feat(playlists): make YouTube-mirrored playlists editable + syncable 2026-06-15 21:40:13 +02:00
__init__.py feat: M1 foundation — compose stack, FastAPI, Google OAuth, encrypted tokens 2026-06-11 01:01:37 +02:00
auth.py feat(i18n): foundation — react-i18next, language switcher, server-persisted choice 2026-06-15 00:30:34 +02:00
config.py feat(playlists): YouTube playlist read-sync (backend) 2026-06-15 19:37:03 +02:00
db.py feat: M1 foundation — compose stack, FastAPI, Google OAuth, encrypted tokens 2026-06-11 01:01:37 +02:00
email.py chore: rebrand Subfeed -> Siftlode 2026-06-14 04:40:22 +02:00
main.py feat(playlists): backend foundation — model, migration, CRUD API 2026-06-15 14:37:09 +02:00
models.py feat(playlists): derive dirty from a synced-state fingerprint 2026-06-15 23:00:56 +02:00
quota.py feat(stats): per-user API quota attribution + admin usage page 2026-06-12 02:47:55 +02:00
scheduler.py feat(playlists): YouTube playlist read-sync (backend) 2026-06-15 19:37:03 +02:00
security.py feat: M1 foundation — compose stack, FastAPI, Google OAuth, encrypted tokens 2026-06-11 01:01:37 +02:00
state.py chore: structured timestamped logging across the backend 2026-06-11 04:26:18 +02:00