Bridges YouTube onto the existing watchlist/wishlist tables (the chosen approach) via a generic source/source_id (+ parent_source_id on wishlist) and a stable surrogate for the NOT NULL tmdb_id, so existing dedup/group-by machinery is untouched. SCHEMA_VERSION 13, additive column migrations. - Channel follow = video_watchlist kind='channel' (source='youtube'). - Wished video = video_wishlist kind='video' grouped by parent channel. - youtube_surrogate_id(), add/remove/list/hydrate channels, add_videos_to_wishlist, query_youtube_wishlist (channel=group, videos=newest-first feed), youtube_wishlist_counts, scoped removal. - Kept wishlist_counts/watchlist_counts byte-identical (exact-equality tests); YouTube counts live on their own method. 80 DB tests green. |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| music_database.py | ||
| personalized_schema.py | ||
| video_database.py | ||
| video_schema.sql | ||