From 6ca582224661d429ed1909f3f9bf0493988dc774 Mon Sep 17 00:00:00 2001 From: ponzischeme89 Date: Mon, 27 Apr 2026 21:54:20 +1200 Subject: [PATCH] Dvesign improvemments --- .cache/emby-user-context.json | 3796 ++++++++++++++++++++++++-- .cache/emby-users.db | Bin 20480 -> 20480 bytes .cache/users.inspect.db | Bin 0 -> 393216 bytes .cache/users.inspect.db-shm | Bin 0 -> 32768 bytes .cache/users.inspect.db-wal | 0 src/lib/CollectionBuilderPage.svelte | 44 +- src/lib/SectionCard.svelte | 71 +- src/lib/SettingsPanel.svelte | 42 +- src/lib/SqlModal.svelte | 21 +- src/lib/SyncPanel.svelte | 35 +- src/lib/constants.js | 85 +- src/routes/+page.svelte | 1613 ++++++----- tests/run-tests.js | 105 +- users.db-shm | Bin 0 -> 32768 bytes users.db-wal | 0 15 files changed, 4857 insertions(+), 955 deletions(-) create mode 100644 .cache/users.inspect.db create mode 100644 .cache/users.inspect.db-shm create mode 100644 .cache/users.inspect.db-wal create mode 100644 users.db-shm create mode 100644 users.db-wal diff --git a/.cache/emby-user-context.json b/.cache/emby-user-context.json index 920ace8..37db410 100644 --- a/.cache/emby-user-context.json +++ b/.cache/emby-user-context.json @@ -34,12 +34,7 @@ }, { "id": "462878", - "name": "Foreign Movies", - "type": "movies" - }, - { - "id": "469353", - "name": "Movies - Classics", + "name": "Foreign Language", "type": "movies" }, { @@ -278,14 +273,6 @@ "datePlayed": null, "isPlayed": true }, - { - "id": "511207", - "name": "Rebecca", - "type": "Movie", - "seriesName": null, - "datePlayed": null, - "isPlayed": true - }, { "id": "1016286", "name": "Rebecca", @@ -430,14 +417,6 @@ "datePlayed": null, "isPlayed": true }, - { - "id": "511196", - "name": "Gone with the Wind", - "type": "Movie", - "seriesName": null, - "datePlayed": null, - "isPlayed": true - }, { "id": "1158304", "name": "Via col vento", @@ -1640,7 +1619,7 @@ } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-25T08:37:45.415Z" + "lastSyncedAt": "2026-04-26T22:31:15.087Z" }, "ff5a825760c24f9ab6f63b04513909a4": { "views": [ @@ -1656,7 +1635,7 @@ }, { "id": "462878", - "name": "Foreign Movies", + "name": "Foreign Language", "type": "movies" }, { @@ -1679,11 +1658,6 @@ "name": "Recordings", "type": "CollectionFolder" }, - { - "id": "469353", - "name": "Movies - Classics", - "type": "movies" - }, { "id": "451346", "name": "Playlists", @@ -3562,7 +3536,7 @@ } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-25T09:00:46.886Z" + "lastSyncedAt": "2026-04-26T22:20:28.008Z" }, "23bf90fc1fe049ce898db7adda1ed7bf": { "views": [ @@ -3583,7 +3557,7 @@ }, { "id": "462878", - "name": "Foreign Movies", + "name": "Foreign Language", "type": "movies" }, { @@ -3606,11 +3580,6 @@ "name": "Recordings", "type": "CollectionFolder" }, - { - "id": "469353", - "name": "Movies - Classics", - "type": "movies" - }, { "id": "1242097", "name": "Music", @@ -3895,14 +3864,6 @@ "datePlayed": null, "isPlayed": true }, - { - "id": "511196", - "name": "Gone with the Wind", - "type": "Movie", - "seriesName": null, - "datePlayed": null, - "isPlayed": true - }, { "id": "1158304", "name": "Via col vento", @@ -6135,14 +6096,6 @@ "datePlayed": null, "isPlayed": true }, - { - "id": "511191", - "name": "Cat on a Hot Tin Roof", - "type": "Movie", - "seriesName": null, - "datePlayed": null, - "isPlayed": true - }, { "id": "1016265", "name": "Cat on a Hot Tin Roof", @@ -6903,14 +6856,6 @@ "datePlayed": null, "isPlayed": true }, - { - "id": "511208", - "name": "Rope", - "type": "Movie", - "seriesName": null, - "datePlayed": null, - "isPlayed": true - }, { "id": "1016287", "name": "Rope", @@ -8367,14 +8312,6 @@ "datePlayed": null, "isPlayed": true }, - { - "id": "511190", - "name": "Casablanca", - "type": "Movie", - "seriesName": null, - "datePlayed": null, - "isPlayed": true - }, { "id": "1016264", "name": "Casablanca", @@ -10679,6 +10616,14 @@ "datePlayed": null, "isPlayed": true }, + { + "id": "1301394", + "name": "FROM", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, { "id": "1324100", "name": "Love & Death", @@ -10929,7 +10874,7 @@ } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-25T00:50:32.104Z" + "lastSyncedAt": "2026-04-26T22:18:13.232Z" }, "e1a4868aa0284c30b7b99a174abd276d": { "views": [ @@ -10965,12 +10910,7 @@ }, { "id": "462878", - "name": "Foreign Movies", - "type": "movies" - }, - { - "id": "469353", - "name": "Movies - Classics", + "name": "Foreign Language", "type": "movies" }, { @@ -11814,7 +11754,7 @@ } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-25T00:43:09.862Z" + "lastSyncedAt": "2026-04-26T22:20:28.853Z" }, "09e89bf14182400dbade53595113d1be": { "views": [ @@ -11855,12 +11795,7 @@ }, { "id": "462878", - "name": "Foreign Movies", - "type": "movies" - }, - { - "id": "469353", - "name": "Movies - Classics", + "name": "Foreign Language", "type": "movies" }, { @@ -11885,6 +11820,14 @@ } ], "recentlyPlayed": [ + { + "id": "509342", + "name": "The English Patient", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, { "id": "506840", "name": "10 Cloverfield Lane", @@ -11894,96 +11837,1680 @@ "isPlayed": true }, { - "id": "1309479", - "name": "Part 1", - "type": "Episode", - "seriesName": "Storm of the Century", + "id": "1292581", + "name": "Wasteman", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1309480", - "name": "Part 2", - "type": "Episode", - "seriesName": "Storm of the Century", + "id": "1287541", + "name": "\"Wuthering Heights\"", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1309481", - "name": "Part 3", - "type": "Episode", - "seriesName": "Storm of the Century", + "id": "507571", + "name": "Grease Live", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301997", - "name": "Episode 6", - "type": "Episode", - "seriesName": "A Thousand Blows", + "id": "1242050", + "name": "Ocean with David Attenborough", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1310377", - "name": "Episode 6", - "type": "Episode", - "seriesName": "The Hardacres", + "id": "1271014", + "name": "Anaconda", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301996", - "name": "Episode 5", - "type": "Episode", - "seriesName": "A Thousand Blows", + "id": "1270980", + "name": "Nuremberg", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1310376", - "name": "Episode 5", - "type": "Episode", - "seriesName": "The Hardacres", + "id": "1242055", + "name": "Springsteen: Deliver Me from Nowhere", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1310375", - "name": "Episode 4", - "type": "Episode", - "seriesName": "The Hardacres", + "id": "1151811", + "name": "TRON: Ares", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1310374", - "name": "Episode 3", - "type": "Episode", - "seriesName": "The Hardacres", + "id": "1136091", + "name": "Train Dreams", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1310373", - "name": "Episode 2", - "type": "Episode", - "seriesName": "The Hardacres", + "id": "1151809", + "name": "Roofman", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1310372", - "name": "Episode 1", - "type": "Episode", - "seriesName": "The Hardacres", + "id": "509709", + "name": "The Queen", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1127607", + "name": "Eleanor the Great", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1136076", + "name": "Swiped", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "571828", + "name": "Ordinary Angels", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1127603", + "name": "East of Wall", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1136088", + "name": "The Woman in Cabin 10", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108336", + "name": "Relay", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1157960", + "name": "The Lost Bus", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1158199", + "name": "Downton Abbey: The Grand Finale", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108324", + "name": "F1", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108348", + "name": "William Tell", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1049455", + "name": "28 Years Later", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108328", + "name": "Jurassic World Rebirth", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1142372", + "name": "Surviving Ohio State", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1158053", + "name": "Karate Kid: Legends", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1020898", + "name": "The Old Guard 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "979837", + "name": "Nonnas", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "964553", + "name": "Final Destination 3", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507379", + "name": "Final Destination", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507380", + "name": "Final Destination 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "969091", + "name": "Final Destination Bloodlines", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "979838", + "name": "The Accountant²", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "947847", + "name": "The Accountant", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "969104", + "name": "STRAW", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "927506", + "name": "The Island on Bird Street", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "969092", + "name": "Fountain of Youth", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1181208", + "name": "Mission: Impossible - Dead Reckoning Parte uno", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508310", + "name": "Mission: Impossible - Dead Reckoning Part One", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "969114", + "name": "Warfare", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "969083", + "name": "A Working Man", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508067", + "name": "Let Him Go", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508548", + "name": "Panic Room", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "907079", + "name": "Conclave", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510069", + "name": "Unlawful Entry", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507051", + "name": "Breakdown", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508422", + "name": "Never Been Kissed", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509219", + "name": "The Blind Side", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "931549", + "name": "The Order", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1181155", + "name": "Captain America: Brave New World", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507485", + "name": "Fury", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "942952", + "name": "Paddington in Peru", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "931548", + "name": "The Brutalist", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "907147", + "name": "Bridget Jones: Mad About the Boy", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506847", + "name": "127 Hours", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "850626", + "name": "Because I Said So", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508358", + "name": "Mrs. Doubtfire", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "902432", + "name": "Mufasa: The Lion King", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "902424", + "name": "Carry-On", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "902434", + "name": "Sonic the Hedgehog 3", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "902428", + "name": "Here", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "902427", + "name": "Gladiator II", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "782595", + "name": "Speak No Evil", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507359", + "name": "Fear", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "727425", + "name": "Camera", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "782586", + "name": "Alien: Romulus", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "717860", + "name": "The Magic of Ordinary Days", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506843", + "name": "101 Dalmatians", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "747008", + "name": "Babes", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506931", + "name": "American Pie 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507242", + "name": "Dumb and Dumber", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "747018", + "name": "Twisters", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "684754", + "name": "We Grown Now", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510173", + "name": "While You Were Sleeping", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509192", + "name": "The Artifice Girl", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "598334", + "name": "Arthur the King", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "782587", + "name": "Civil War", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "669860", + "name": "The First Omen", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507417", + "name": "Fly Away Home", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "598339", + "name": "Irena's Vow", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "598338", + "name": "Godzilla x Kong: The New Empire", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "598337", + "name": "Ghostbusters: Frozen Empire", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "571825", + "name": "Knox Goes Away", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509984", + "name": "Toy Story", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "514033", + "name": "The Boys in the Boat", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "514032", + "name": "The Beekeeper", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507245", + "name": "Dune", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "571830", + "name": "Road House", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1089639", + "name": "Coco", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "540703", + "name": "Land of Bad", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1021935", + "name": "The Zone of Interest", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "539035", + "name": "Ferrari", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "571834", + "name": "Wonka", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508639", + "name": "Priscilla", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509103", + "name": "Sully", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508737", + "name": "Richard Jewell", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508545", + "name": "Pain Hustlers", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509625", + "name": "The Miracle Club", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507039", + "name": "Bones of Crows", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509087", + "name": "Strays", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507820", + "name": "Indiana Jones and the Dial of Destiny", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "43330", + "name": "Monster", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507964", + "name": "Just Mercy", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509436", + "name": "The Hate U Give", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509885", + "name": "The Wife", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510492", + "name": "Nothing Compares", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508554", + "name": "Passengers", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509204", + "name": "The Basketball Diaries", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506961", + "name": "Asteroid City", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507593", + "name": "Guardians of the Galaxy Vol. 3", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507925", + "name": "John Wick: Chapter 4", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506909", + "name": "Air", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507599", + "name": "Guy Ritchie's The Covenant", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506896", + "name": "A Thousand and One", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509176", + "name": "Tetris", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506873", + "name": "A Good Person", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508563", + "name": "Pawn Sacrifice", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "870463", + "name": "Avatar: The Way of Water", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508523", + "name": "Operation Fortune: Ruse de Guerre", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "698146", + "name": "Boston Strangler", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506974", + "name": "Babylon", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506880", + "name": "A Man Called Otto", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509484", + "name": "The Inspection", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508604", + "name": "Plane", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506915", + "name": "Alice, Darling", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508662", + "name": "Puss in Boots: The Last Wish", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509795", + "name": "The Survivor", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510241", + "name": "Youth", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1199524", + "name": "Triangle of Sadness", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506985", + "name": "Barbarian", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508566", + "name": "Pearl", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507356", + "name": "Father Stu", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509420", + "name": "The Greatest Beer Run Ever", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509647", + "name": "The Northman", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507334", + "name": "Fall", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1287502", + "name": "Attenborough and the Sea Dragon", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510169", + "name": "Where the Crawdads Sing", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508453", + "name": "Nope", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509925", + "name": "Thirteen Lives", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508629", + "name": "Prey", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509980", + "name": "Top Gun: Maverick", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509979", + "name": "Top Gun", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507272", + "name": "Elvis", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1199001", + "name": "16 Blocks", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509216", + "name": "The Black Phone", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507225", + "name": "Downton Abbey: A New Era", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508993", + "name": "Sonic the Hedgehog 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509578", + "name": "The Lost City", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509205", + "name": "The Batman", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510499", + "name": "Polar Bear", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510050", + "name": "Uncharted", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507886", + "name": "Jackass Forever", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508457", + "name": "Northanger Abbey", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510144", + "name": "West Side Story", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509517", + "name": "The King's Man", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507005", + "name": "Belfast", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507296", + "name": "Eternals", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "43359", + "name": "The Matrix Resurrections", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507518", + "name": "Ghostbusters: Afterlife", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508485", + "name": "Old", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "43364", + "name": "The Novice", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507695", + "name": "Home Alone", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506930", + "name": "American Pie", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507156", + "name": "Dallas Buyers Club", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508446", + "name": "No Time to Die", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507381", + "name": "Finch", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "795844", + "name": "The Night House", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "43314", + "name": "Firewall", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1199005", + "name": "After Love", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506943", + "name": "Animal Kingdom", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324092", + "name": "Game of Thrones", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330961", + "name": "Mary Berry Cooks", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330174", + "name": "Project Nazi: The Blueprints of Evil", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301653", + "name": "Yellowstone", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329610", + "name": "Prodigal Son", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330186", + "name": "We Are Who We Are", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328552", + "name": "WandaVision", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328551", + "name": "The Falcon and The Winter Soldier", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328548", + "name": "Snowpiercer", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330183", + "name": "The Outsider", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328549", + "name": "Station Eleven", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330988", + "name": "Moon Knight", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330175", + "name": "Rise of the Nazis", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301453", + "name": "Masters of the Air", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301420", + "name": "House of the Dragon", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329606", + "name": "Coyote", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330182", + "name": "The Head", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301443", + "name": "Lioness", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1312988", + "name": "Domina", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330172", + "name": "Obi-Wan Kenobi", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328550", + "name": "The Book of Boba Fett", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330178", + "name": "Stanley Tucci: Searching for Italy", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324068", + "name": "1883", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301427", + "name": "Interview With The Vampire", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301581", + "name": "The Larkins", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330989", + "name": "The Man Who Fell to Earth", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301306", + "name": "1923", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301647", + "name": "We Were the Lucky Ones", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301315", + "name": "A Thousand Blows", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301624", + "name": "The Winter King", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301314", + "name": "A Small Light", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1300238", + "name": "Mammals", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301312", + "name": "A Knight of the Seven Kingdoms", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301488", + "name": "PLUR1BUS", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301585", + "name": "The Long Shadow", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301588", + "name": "The Madison", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301577", + "name": "The Hardacres", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301527", + "name": "Spartacus: House of Ashur", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330180", + "name": "The Darling Buds of May", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330179", + "name": "Storm of the Century", + "type": "Series", + "seriesName": null, "datePlayed": null, "isPlayed": true } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-25T00:31:04.377Z" + "lastSyncedAt": "2026-04-26T22:18:29.410Z" }, "90ffdbd86b5c4c0c8c4e53d4a8765175": { "views": [ @@ -12007,11 +13534,6 @@ "name": "Documentaries", "type": "movies" }, - { - "id": "469353", - "name": "Movies - Classics", - "type": "movies" - }, { "id": "451346", "name": "Playlists", @@ -13492,7 +15014,7 @@ } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-25T00:47:22.900Z" + "lastSyncedAt": "2026-04-26T22:18:32.752Z" }, "3506c48fc8fb468b9c17c76a9164f6e5": { "views": [ @@ -13506,11 +15028,6 @@ "name": "Movies", "type": "movies" }, - { - "id": "469353", - "name": "Movies - Classics", - "type": "movies" - }, { "id": "1242097", "name": "Music", @@ -13643,10 +15160,122 @@ "seriesName": null, "datePlayed": null, "isPlayed": true + }, + { + "id": "1328551", + "name": "The Falcon and The Winter Soldier", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328548", + "name": "Snowpiercer", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330183", + "name": "The Outsider", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328549", + "name": "Station Eleven", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330988", + "name": "Moon Knight", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330175", + "name": "Rise of the Nazis", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329606", + "name": "Coyote", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330182", + "name": "The Head", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1312988", + "name": "Domina", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330172", + "name": "Obi-Wan Kenobi", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328550", + "name": "The Book of Boba Fett", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330178", + "name": "Stanley Tucci: Searching for Italy", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330989", + "name": "The Man Who Fell to Earth", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507350", + "name": "Faster", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-20T00:51:08.034Z" + "lastSyncedAt": "2026-04-26T22:18:34.931Z" }, "66d471d46e474f48aecaff9ced3a2378": { "views": [ @@ -13667,7 +15296,7 @@ }, { "id": "462878", - "name": "Foreign Movies", + "name": "Foreign Language", "type": "movies" }, { @@ -13685,11 +15314,6 @@ "name": "Movies", "type": "movies" }, - { - "id": "469353", - "name": "Movies - Classics", - "type": "movies" - }, { "id": "451346", "name": "Playlists", @@ -13703,104 +15327,288 @@ ], "recentlyPlayed": [ { - "id": "1329562", - "name": "A Stereotypical Day", - "type": "Episode", - "seriesName": "Modern Family", + "id": "1242049", + "name": "Merge", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301812", - "name": "Don't Drink the Water", - "type": "Episode", - "seriesName": "9-1-1", + "id": "1287555", + "name": "Mercy", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301811", - "name": "The Last Alarm", - "type": "Episode", - "seriesName": "9-1-1", + "id": "1174178", + "name": "The Running Man", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301810", - "name": "Lab Rats (2)", - "type": "Episode", - "seriesName": "9-1-1", + "id": "1155718", + "name": "The Running Man", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301809", - "name": "Sick Day (1)", - "type": "Episode", - "seriesName": "9-1-1", + "id": "1151811", + "name": "TRON: Ares", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301808", - "name": "Invisible‎", - "type": "Episode", - "seriesName": "9-1-1", + "id": "1127619", + "name": "Nobody 2", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301806", - "name": "Holy Mother of God", - "type": "Episode", - "seriesName": "9-1-1", + "id": "1108339", + "name": "The Fantastic 4: First Steps", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301805", - "name": "Voices", - "type": "Episode", - "seriesName": "9-1-1", + "id": "43334", + "name": "Nobody", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301804", - "name": "Sob Stories", - "type": "Episode", - "seriesName": "9-1-1", + "id": "1108337", + "name": "Superman", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301803", - "name": "Wannabes", - "type": "Episode", - "seriesName": "9-1-1", + "id": "969091", + "name": "Final Destination Bloodlines", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301802", - "name": "Hotshots", - "type": "Episode", - "seriesName": "9-1-1", + "id": "969114", + "name": "Warfare", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true }, { - "id": "1301801", - "name": "Confessions", - "type": "Episode", - "seriesName": "9-1-1", + "id": "969098", + "name": "Mickey 17", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1181155", + "name": "Captain America: Brave New World", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "782586", + "name": "Alien: Romulus", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330174", + "name": "Project Nazi: The Blueprints of Evil", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329610", + "name": "Prodigal Son", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330186", + "name": "We Are Who We Are", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328552", + "name": "WandaVision", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328551", + "name": "The Falcon and The Winter Soldier", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328548", + "name": "Snowpiercer", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330183", + "name": "The Outsider", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328549", + "name": "Station Eleven", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330988", + "name": "Moon Knight", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330175", + "name": "Rise of the Nazis", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329606", + "name": "Coyote", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330182", + "name": "The Head", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1312988", + "name": "Domina", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330172", + "name": "Obi-Wan Kenobi", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328550", + "name": "The Book of Boba Fett", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330178", + "name": "Stanley Tucci: Searching for Italy", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330989", + "name": "The Man Who Fell to Earth", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301651", + "name": "Wonder Man", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301466", + "name": "Murderbot", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301373", + "name": "Earth Abides", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507336", + "name": "Falling Down", + "type": "Movie", + "seriesName": null, "datePlayed": null, "isPlayed": true } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-20T00:51:09.899Z" + "lastSyncedAt": "2026-04-26T22:18:36.738Z" }, "7d50c519f5704fd59db63ea3de1ec249": { "views": [ @@ -13811,7 +15619,7 @@ }, { "id": "462878", - "name": "Foreign Movies", + "name": "Foreign Language", "type": "movies" }, { @@ -13829,11 +15637,6 @@ "name": "Movies", "type": "movies" }, - { - "id": "469353", - "name": "Movies - Classics", - "type": "movies" - }, { "id": "4309", "name": "New Releases", @@ -13861,6 +15664,30 @@ } ], "recentlyPlayed": [ + { + "id": "509460", + "name": "The Hunger Games: Catching Fire", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508581", + "name": "Peter Rabbit 2: The Runaway", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1089639", + "name": "Coco", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, { "id": "1030989", "name": "Greystoke: The Legend of Tarzan, Lord of the Apes", @@ -13956,10 +15783,130 @@ "seriesName": null, "datePlayed": null, "isPlayed": true + }, + { + "id": "1330186", + "name": "We Are Who We Are", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328552", + "name": "WandaVision", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328551", + "name": "The Falcon and The Winter Soldier", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328548", + "name": "Snowpiercer", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330183", + "name": "The Outsider", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328549", + "name": "Station Eleven", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330988", + "name": "Moon Knight", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330175", + "name": "Rise of the Nazis", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329606", + "name": "Coyote", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330182", + "name": "The Head", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1312988", + "name": "Domina", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330172", + "name": "Obi-Wan Kenobi", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328550", + "name": "The Book of Boba Fett", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330178", + "name": "Stanley Tucci: Searching for Italy", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330989", + "name": "The Man Who Fell to Earth", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true } ], "excludedFolderLookup": {}, - "lastSyncedAt": "2026-04-20T00:51:12.866Z" + "lastSyncedAt": "2026-04-26T22:19:04.840Z" }, "28583323933644cd869605f51accf76c": { "views": [ @@ -14263,6 +16210,1453 @@ ], "excludedFolderLookup": {}, "lastSyncedAt": "2026-04-24T23:17:19.029Z" + }, + "af6347ffaa2b4ae99380a2f07af2bdb8": { + "views": [ + { + "id": "4309", + "name": "New Releases", + "type": "movies" + }, + { + "id": "39975", + "name": "Movies", + "type": "movies" + }, + { + "id": "320534", + "name": "TV Shows", + "type": "tvshows" + }, + { + "id": "3", + "name": "Live TV", + "type": "livetv" + }, + { + "id": "112374", + "name": "Documentaries", + "type": "movies" + }, + { + "id": "462878", + "name": "Foreign Language", + "type": "movies" + }, + { + "id": "451346", + "name": "Playlists", + "type": "playlists" + }, + { + "id": "228590", + "name": "Recordings", + "type": "CollectionFolder" + }, + { + "id": "527247", + "name": "Collections", + "type": "boxsets" + } + ], + "recentlyPlayed": [ + { + "id": "508639", + "name": "Priscilla", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507636", + "name": "Harry Potter and the Goblet of Fire", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "43318", + "name": "Harry Potter and the Half-Blood Prince", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1282333", + "name": "The Wrecking Crew", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1269918", + "name": "Song Sung Blue", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507954", + "name": "Juno", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510050", + "name": "Uncharted", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507222", + "name": "Dora and the Lost City of Gold", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1271015", + "name": "Wicked: For Good", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1199066", + "name": "Bridget Jones: The Edge of Reason", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1199067", + "name": "Bridget Jones's Diary", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508094", + "name": "Lights Out", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507605", + "name": "Hairspray", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "868323", + "name": "10 Things I Hate About You", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508329", + "name": "Monsters University", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508689", + "name": "Ratatouille", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1093712", + "name": "Twilight", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509834", + "name": "The Twilight Saga: Breaking Dawn - Part 1", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507711", + "name": "Horton Hears a Who!", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507639", + "name": "Harry Potter and the Prisoner of Azkaban", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108326", + "name": "Freakier Friday", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508292", + "name": "Minions: The Rise of Gru", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509955", + "name": "Tinker Bell", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507633", + "name": "Harry Potter and the Chamber of Secrets", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "902427", + "name": "Gladiator II", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507374", + "name": "Fifty Shades of Grey", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "747012", + "name": "It Ends with Us", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507570", + "name": "Grease", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "514032", + "name": "The Beekeeper", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506851", + "name": "16 Wishes", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509129", + "name": "Sweet Home Alabama", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "598338", + "name": "Godzilla x Kong: The New Empire", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507923", + "name": "John Wick: Chapter 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508823", + "name": "Scarface", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509991", + "name": "Training Day", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "598335", + "name": "Challengers", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509959", + "name": "Titanic", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "598341", + "name": "The Fall Guy", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "571834", + "name": "Wonka", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509648", + "name": "The Notebook", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507835", + "name": "Inside Out", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509559", + "name": "The Lion King", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506950", + "name": "Anyone But You", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510010", + "name": "Trolls World Tour", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507638", + "name": "Harry Potter and the Philosopher's Stone", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509741", + "name": "The Santa Clause", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509423", + "name": "The Greatest Showman", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507635", + "name": "Harry Potter and the Deathly Hallows: Part 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507010", + "name": "Billy Madison", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507344", + "name": "Fast & Furious 6", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509358", + "name": "The Fast and the Furious", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507346", + "name": "Fast Five", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508962", + "name": "Smile", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506909", + "name": "Air", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507599", + "name": "Guy Ritchie's The Covenant", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508604", + "name": "Plane", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510180", + "name": "White House Down", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507695", + "name": "Home Alone", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509695", + "name": "The Princess Diaries 2: Royal Engagement", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324071", + "name": "Ballers", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330174", + "name": "Project Nazi: The Blueprints of Evil", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301653", + "name": "Yellowstone", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301456", + "name": "Mayans M.C.", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329610", + "name": "Prodigal Son", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330186", + "name": "We Are Who We Are", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328552", + "name": "WandaVision", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328551", + "name": "The Falcon and The Winter Soldier", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328548", + "name": "Snowpiercer", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330183", + "name": "The Outsider", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328549", + "name": "Station Eleven", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330988", + "name": "Moon Knight", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330175", + "name": "Rise of the Nazis", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329606", + "name": "Coyote", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330182", + "name": "The Head", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324111", + "name": "Power Book IV: Force", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1312988", + "name": "Domina", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330172", + "name": "Obi-Wan Kenobi", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328550", + "name": "The Book of Boba Fett", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330178", + "name": "Stanley Tucci: Searching for Italy", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330989", + "name": "The Man Who Fell to Earth", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301600", + "name": "The Penguin", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301459", + "name": "MobLand", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324077", + "name": "Breaking Bad", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324123", + "name": "Sons of Anarchy", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + } + ], + "excludedFolderLookup": {}, + "lastSyncedAt": "2026-04-26T22:18:32.057Z" + }, + "2fc0e53e51d242a6af04f7f107187d91": { + "views": [ + { + "id": "4309", + "name": "New Releases", + "type": "movies" + }, + { + "id": "320534", + "name": "TV Shows", + "type": "tvshows" + }, + { + "id": "112374", + "name": "Documentaries", + "type": "movies" + }, + { + "id": "462878", + "name": "Foreign Language", + "type": "movies" + }, + { + "id": "118103", + "name": "Italian Movies", + "type": "movies" + }, + { + "id": "3", + "name": "Live TV", + "type": "livetv" + }, + { + "id": "39975", + "name": "Movies", + "type": "movies" + }, + { + "id": "451346", + "name": "Playlists", + "type": "playlists" + }, + { + "id": "527247", + "name": "Collections", + "type": "boxsets" + }, + { + "id": "1242097", + "name": "Music", + "type": "music" + } + ], + "recentlyPlayed": [ + { + "id": "1300181", + "name": "undertone", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508772", + "name": "Ron's Gone Wrong", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1279521", + "name": "Hoppers", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1289637", + "name": "The Bride!", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1285147", + "name": "Crime 101", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1285148", + "name": "Wardriver", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507482", + "name": "Funny Games", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1272966", + "name": "Peaky Blinders: The Immortal Man", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509157", + "name": "Tape", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509840", + "name": "The Unbearable Lightness of Being", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1276577", + "name": "Send Help", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1276574", + "name": "GOAT", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1287541", + "name": "\"Wuthering Heights\"", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508335", + "name": "Moon", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509624", + "name": "The Midnight Meat Train", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1249526", + "name": "Before I Go to Sleep", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1269918", + "name": "Song Sung Blue", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1089639", + "name": "Coco", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1282332", + "name": "The Housemaid", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1242060", + "name": "Zootopia 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1269913", + "name": "Marty Supreme", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507416", + "name": "Flushed Away", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1282333", + "name": "The Wrecking Crew", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1177098", + "name": "Good Boy", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507108", + "name": "Chappie", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1151807", + "name": "Predator: Badlands", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1269916", + "name": "Pillion", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "985852", + "name": "Jeanne du Barry", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1151806", + "name": "It Ends", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1174177", + "name": "Una battaglia dopo l’altra", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1157822", + "name": "One Battle After Another", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108347", + "name": "Weapons", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509478", + "name": "The Incredibles", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108344", + "name": "Together", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1157821", + "name": "Jay Kelly", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507697", + "name": "Home Alone 3", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1151800", + "name": "Bugonia", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508978", + "name": "Solaris", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509395", + "name": "The Gift", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1049458", + "name": "Cleaner", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1127629", + "name": "The Roses", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509495", + "name": "The Invitation", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510027", + "name": "Tully", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "508184", + "name": "Magnolia", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509413", + "name": "The Grand Budapest Hotel", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "540708", + "name": "Poor Things", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "506972", + "name": "Babe", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "509216", + "name": "The Black Phone", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "979838", + "name": "The Accountant²", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507258", + "name": "Edward Scissorhands", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1136063", + "name": "On Trial: The Idaho College Killer", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "782586", + "name": "Alien: Romulus", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1158151", + "name": "The Legend of Ochi", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "507704", + "name": "Honey, I Shrunk the Kids", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510013", + "name": "Tropic Thunder", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "902434", + "name": "Sonic the Hedgehog 3", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1108338", + "name": "The Bad Guys 2", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "510010", + "name": "Trolls World Tour", + "type": "Movie", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330174", + "name": "Project Nazi: The Blueprints of Evil", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329610", + "name": "Prodigal Son", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324126", + "name": "The Act", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330186", + "name": "We Are Who We Are", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328552", + "name": "WandaVision", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328551", + "name": "The Falcon and The Winter Soldier", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328548", + "name": "Snowpiercer", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330183", + "name": "The Outsider", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328549", + "name": "Station Eleven", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330988", + "name": "Moon Knight", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330175", + "name": "Rise of the Nazis", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1329606", + "name": "Coyote", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330182", + "name": "The Head", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1312988", + "name": "Domina", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330172", + "name": "Obi-Wan Kenobi", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1328550", + "name": "The Book of Boba Fett", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330178", + "name": "Stanley Tucci: Searching for Italy", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301446", + "name": "Love Story", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1330989", + "name": "The Man Who Fell to Earth", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1324087", + "name": "Dexter: Original Sin", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301488", + "name": "PLUR1BUS", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301366", + "name": "Dexter: Resurrection", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301553", + "name": "The Beauty", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301321", + "name": "Alien: Earth", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + }, + { + "id": "1301509", + "name": "Scarpetta", + "type": "Series", + "seriesName": null, + "datePlayed": null, + "isPlayed": true + } + ], + "excludedFolderLookup": {}, + "lastSyncedAt": "2026-04-26T22:12:52.369Z" } } } \ No newline at end of file diff --git a/.cache/emby-users.db b/.cache/emby-users.db index bbd4bbb31fcca4de80c62ec507fa08ab5098c54f..28d75ea556c867cfe8602e7d0b24b4dfb5d19aeb 100644 GIT binary patch delta 366 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 literal 0 HcmV?d00001 diff --git a/.cache/users.inspect.db-shm b/.cache/users.inspect.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 zcmeIuAr62r3 .section-card { - background: var(--surface); - border-radius: 20px; + background: #101318; + border-radius: 12px; border: 1px solid var(--border); margin-bottom: 12px; overflow: hidden; - box-shadow: 0 18px 36px rgba(0, 0, 0, 0.18); - transition: border-color 0.15s, transform 0.15s ease, box-shadow 0.15s ease; + transition: border-color 0.15s ease, background 0.15s ease; } .section-card:hover { - transform: translateY(-1px); - box-shadow: 0 22px 42px rgba(0, 0, 0, 0.22); + background: #12161d; } .section-card.expanded { border-color: var(--border-strong); - box-shadow: 0 24px 48px rgba(0, 0, 0, 0.26); } .section-header { all: unset; @@ -534,9 +531,9 @@ cursor: pointer; font-size: 10px; line-height: 1; - opacity: 0.6; + opacity: 0.7; padding: 3px 4px; - color: var(--text); + color: var(--text-muted); } .move-btn:disabled { opacity: 0.15; @@ -556,12 +553,12 @@ display: inline-flex; align-items: center; justify-content: center; - width: 34px; - height: 34px; - border-radius: 12px; - background: var(--bg-secondary); + width: 30px; + height: 30px; + border-radius: 8px; + background: rgba(40, 193, 220, 0.1); border: 1px solid var(--border); - color: #a9d6ff; + color: var(--accent); flex-shrink: 0; } .section-info { @@ -570,7 +567,7 @@ } .section-name { font-weight: 600; - font-size: 15px; + font-size: 14px; color: var(--text); white-space: nowrap; overflow: hidden; @@ -588,10 +585,10 @@ all: unset; cursor: pointer; color: var(--danger); - font-size: 22px; + font-size: 20px; line-height: 1; padding: 0 4px; - opacity: 0.5; + opacity: 0.55; } .remove-btn:hover { opacity: 1; @@ -604,8 +601,9 @@ /* Editor panel */ .section-editor { - padding: 8px 16px 18px; + padding: 10px 16px 18px; border-top: 1px solid var(--border); + background: #0d1015; } .field-grid { display: grid; @@ -629,10 +627,10 @@ } .field-label { font-size: 11px; - font-weight: 600; + font-weight: 700; color: var(--text-muted); text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.08em; } .hint-inline { font-size: 10px; @@ -644,9 +642,9 @@ .field input[type='text'], .field select { padding: 10px 12px; - border-radius: 12px; + border-radius: 10px; border: 1px solid var(--border); - background: #0b0f14; + background: #12151b; color: var(--text); font-size: 13px; font-family: inherit; @@ -668,10 +666,10 @@ } .lookup-btn { padding: 10px 12px; - border-radius: 12px; + border-radius: 10px; text-align: center; color: var(--text); - background: var(--surface); + background: #15181e; } .lookup-btn:disabled { opacity: 0.45; @@ -690,9 +688,9 @@ .inline-status { margin-top: 8px; padding: 10px 12px; - border-radius: 12px; + border-radius: 10px; border: 1px solid var(--border); - background: var(--surface); + background: #12151b; font-size: 12px; color: var(--text-muted); } @@ -714,6 +712,7 @@ font-size: 12px; border: 1px solid var(--border); color: var(--text-muted); + background: #12151b; transition: all 0.12s; } .chip:hover { @@ -722,8 +721,8 @@ } .chip.active { background: var(--accent); - border-color: transparent; - color: #fff; + border-color: rgba(42, 215, 239, 0.3); + color: #031014; } .field-inline { @@ -740,9 +739,9 @@ width: 100%; margin-top: 6px; padding: 10px 12px; - border-radius: 12px; + border-radius: 10px; border: 1px solid var(--border); - background: #0b0f14; + background: #12151b; color: var(--text); font-size: 12px; font-family: monospace; @@ -762,7 +761,7 @@ display: inline-flex; align-items: center; gap: 3px; - background: #0b0f14; + background: #12151b; border: 1px solid var(--border); border-radius: 999px; padding: 4px 8px 4px 10px; @@ -784,7 +783,7 @@ .badge { display: inline-block; background: var(--accent); - color: #fff; + color: #031014; border-radius: 999px; padding: 2px 6px; font-size: 10px; @@ -803,8 +802,8 @@ color: var(--text); margin-top: 6px; padding: 10px 12px; - background: #0b0f14; - border-radius: 12px; + background: #12151b; + border-radius: 10px; } .text-muted { color: var(--text-muted); @@ -821,8 +820,8 @@ justify-content: space-between; gap: 12px; padding: 8px 10px; - border-radius: 12px; - background: var(--bg-secondary); + border-radius: 10px; + background: #12151b; border: 1px solid var(--border); } .lookup-result:hover { diff --git a/src/lib/SettingsPanel.svelte b/src/lib/SettingsPanel.svelte index 0821d7f..dadb3f9 100644 --- a/src/lib/SettingsPanel.svelte +++ b/src/lib/SettingsPanel.svelte @@ -215,19 +215,19 @@ diff --git a/src/lib/SqlModal.svelte b/src/lib/SqlModal.svelte index fc3b6c8..37081e5 100644 --- a/src/lib/SqlModal.svelte +++ b/src/lib/SqlModal.svelte @@ -54,7 +54,7 @@ .overlay { position: fixed; inset: 0; - background: rgba(0, 0, 0, 0.72); + background: rgba(0, 0, 0, 0.82); display: flex; align-items: center; justify-content: center; @@ -62,14 +62,15 @@ padding: 20px; } .modal { - background: var(--surface-strong); + background: #0f1116; + border: 1px solid var(--border); border-radius: 14px; width: 100%; max-width: 720px; max-height: 80vh; display: flex; flex-direction: column; - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.42); } .modal-header { display: flex; @@ -103,9 +104,9 @@ white-space: pre-wrap; word-break: break-all; margin: 0; - background: var(--surface); + background: #12151b; padding: 14px; - border-radius: 8px; + border-radius: 10px; border: 1px solid var(--border); } .modal-actions { @@ -119,7 +120,7 @@ all: unset; cursor: pointer; padding: 8px 18px; - border-radius: 8px; + border-radius: 10px; font-size: 13px; font-weight: 600; font-family: inherit; @@ -127,15 +128,17 @@ .action-btn.secondary { border: 1px solid var(--border); color: var(--text); + background: #15181e; } .action-btn.secondary:hover { - background: var(--surface); + background: var(--surface-hover); } .action-btn.primary { background: var(--accent); - color: #fff; + border: 1px solid rgba(42, 215, 239, 0.35); + color: #031014; } .action-btn.primary:hover { - opacity: 0.9; + background: #35d2ea; } diff --git a/src/lib/SyncPanel.svelte b/src/lib/SyncPanel.svelte index 6a53e7f..508050b 100644 --- a/src/lib/SyncPanel.svelte +++ b/src/lib/SyncPanel.svelte @@ -158,8 +158,8 @@ padding: 0; } h3 { - font-size: 18px; - font-weight: 700; + font-size: 16px; + font-weight: 800; margin: 0 0 18px; color: var(--text); } @@ -168,10 +168,10 @@ } .step-label { font-size: 11px; - font-weight: 600; + font-weight: 700; color: var(--text-muted); text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.08em; display: block; margin-bottom: 6px; } @@ -184,9 +184,9 @@ .select-input { width: 100%; padding: 10px 12px; - border-radius: 12px; + border-radius: 10px; border: 1px solid var(--border); - background: #0b0f14; + background: #12151b; color: var(--text); font-size: 13px; font-family: inherit; @@ -202,9 +202,9 @@ align-items: flex-start; gap: 8px; padding: 10px 12px; - border-radius: 16px; + border-radius: 10px; border: 1px solid var(--border); - background: var(--surface); + background: #111419; cursor: pointer; transition: all 0.12s; } @@ -237,7 +237,8 @@ align-items: center; gap: 8px; padding: 8px 10px; - border-radius: 12px; + border-radius: 10px; + border: 1px solid transparent; cursor: pointer; font-size: 13px; } @@ -246,6 +247,7 @@ } .section-pick.selected { background: var(--surface-active); + border: 1px solid var(--border-strong); } .pick-name { flex: 1; @@ -266,7 +268,8 @@ align-items: center; gap: 8px; padding: 8px 10px; - border-radius: 12px; + border-radius: 10px; + border: 1px solid transparent; cursor: pointer; font-size: 13px; } @@ -275,6 +278,7 @@ } .target-option.selected { background: var(--surface-active); + border: 1px solid var(--border-strong); } .target-name { flex: 1; @@ -302,19 +306,18 @@ width: 100%; text-align: center; padding: 12px; - border-radius: 16px; + border-radius: 10px; background: var(--accent); - color: #fff; + border: 1px solid rgba(42, 215, 239, 0.35); + color: #031014; font-size: 14px; font-weight: 600; font-family: inherit; box-sizing: border-box; - box-shadow: 0 10px 24px rgba(0, 0, 0, 0.2); - transition: opacity 0.12s, transform 0.12s ease; + transition: opacity 0.12s, background 0.12s ease; } .sync-btn:hover:not(:disabled) { - opacity: 0.95; - transform: translateY(-1px); + background: #35d2ea; } .sync-btn:disabled { opacity: 0.4; diff --git a/src/lib/constants.js b/src/lib/constants.js index 6d38456..56f2f3d 100644 --- a/src/lib/constants.js +++ b/src/lib/constants.js @@ -90,7 +90,7 @@ export function createEmptySection(userId) { SectionType: 'items', ImageType: 'Thumb', CollectionType: 'movies', - SortBy: 'DateLastContentAdded,SortName', + SortBy: 'Random', SortOrder: 'Descending', Monitor: [], ItemTypes: ['Movie'], @@ -142,7 +142,7 @@ export function createBoxSetSection(userId, collectionName, collectionId) { SectionType: 'boxset', ImageType: 'Thumb', ItemTypes: [], - SortBy: 'default', + SortBy: 'Random', SortOrder: 'Descending', Monitor: [], ExcludedFolders: [], @@ -186,6 +186,40 @@ export function isWatchlistSection(section) { return !!section.Query?.IsFavorite || name.includes('watchlist') || name.includes('watch list'); } +export function isUpNextSection(section) { + if (!section) return false; + if (section.SectionType === 'resume') return true; + + const name = `${section.CustomName || ''} ${section.Name || ''}`.trim().toLowerCase(); + return name === 'up next' || name === 'next up' || name === 'resume / up next'; +} + +export function isNewToEmbySection(section) { + if (!section) return false; + const name = `${section.CustomName || ''} ${section.Name || ''}`.toLowerCase(); + return name.includes('new to emby'); +} + +export function isRecentlyWatchedSection(section) { + if (!section) return false; + const name = `${section.CustomName || ''} ${section.Name || ''}`.toLowerCase(); + return section.Query?.IsPlayed === true || name.includes('recently watched'); +} + +export function isFixedOrderSection(section) { + if (!section) return false; + return ( + isUpNextSection(section) || + isWatchlistSection(section) || + isNewToEmbySection(section) || + isRecentlyWatchedSection(section) || + section.SectionType === 'latestepisodereleases' || + section.SectionType === 'latestmoviereleases' || + section.SectionType === 'latestmediablock' || + section.SectionType === 'userviews' + ); +} + function renameWatchlistLabel(label, targetName) { if (!label || !targetName) return label; if (/^\s*watch\s+list\s*$/i.test(label)) return 'Watch List'; @@ -259,6 +293,53 @@ export function getWatchlistLabelsForTarget(sourceSection, targetUser) { }; } +export function applySectionStandards(sourceSection, targetUser) { + const section = JSON.parse(JSON.stringify(sourceSection || {})); + + if (isUpNextSection(section)) { + section.Name = 'Up Next'; + section.CustomName = 'Up Next'; + return section; + } + + if (isWatchlistSection(section)) { + const labels = getWatchlistLabelsForTarget(section, targetUser); + if (labels.Name) section.Name = labels.Name; + if (labels.CustomName) section.CustomName = labels.CustomName; + return section; + } + + if (isNewToEmbySection(section)) { + section.Name = 'New to Emby'; + section.CustomName = 'New to Emby'; + section.SortBy = 'DateLastContentAdded,SortName'; + section.SortOrder = 'Descending'; + return section; + } + + if (isRecentlyWatchedSection(section)) { + const targetName = getPreferredUserName(targetUser); + const label = `Recently Watched${targetName ? ` - ${targetName}` : ''}`; + section.Name = label; + section.CustomName = label; + section.SortBy = 'DatePlayed'; + section.SortOrder = 'Descending'; + return section; + } + + if (!isFixedOrderSection(section) && ['items', 'collections', 'boxset'].includes(section.SectionType)) { + section.SortBy = 'Random'; + section.SortOrder = 'Descending'; + } + + if (section.SectionType === 'userviews') { + section.Name = 'Libraries'; + section.CustomName = 'Libraries'; + } + + return section; +} + /** * Build SQL UPDATE statements from modified user data. * Each user's entire homescreensettings JSON is replaced. diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index dec07e5..a5bf34b 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -6,13 +6,11 @@ import SqlModal from '$lib/SqlModal.svelte'; import SettingsPanel from '$lib/SettingsPanel.svelte'; import { - PAGE_ICONS, + applySectionStandards, createBoxSetSection, createEmptySection, createRecentlyWatchedSection, - generateSQL, - getWatchlistLabelsForTarget, - isWatchlistSection + generateSQL } from '$lib/constants.js'; /** @type {import('./$types').PageData} */ @@ -24,24 +22,74 @@ let selectedUserId = users.find((u) => u.sections?.length > 0)?.id || null; let expandedIndex = -1; - let activeTab = 'edit'; // 'edit' | 'sync' | 'collections' | 'settings' + let activeTab = 'edit'; let showSqlModal = false; let generatedSql = ''; let changeCount = 0; - let writeStatus = ''; // '' | 'writing' | 'ok' | 'error' + let writeStatus = ''; let writeMessage = ''; let dbValidation = null; - let userContext = { views: [], recentlyPlayed: [], excludedFolderLookup: {}, source: '', lastSyncedAt: null, message: '' }; + let userContext = { + views: [], + recentlyPlayed: [], + excludedFolderLookup: {}, + source: '', + lastSyncedAt: null, + message: '' + }; let userContextBusy = false; + let recentlyPlayedCollapsed = false; + let lastRecentlyPlayedUserId = null; $: selectedUser = users.find((u) => u.id === selectedUserId); $: sections = selectedUser?.sections || []; + $: activeUsers = users.filter((u) => u.sections?.length > 0); + $: emptyUsers = users.filter((u) => !u.sections || u.sections.length === 0); + $: totalSectionCount = users.reduce((n, u) => n + (u.sections?.length || 0), 0); $: dbConfigured = !!config.dbPath; $: selectedExcludedIds = [...new Set(sections.flatMap((section) => section.ExcludedFolders || []))]; + $: randomSectionCount = sections.filter((section) => section.SortBy === 'Random').length; + $: filteredSectionCount = sections.filter((section) => !!section.Query).length; + $: collectionSectionCount = sections.filter((section) => ['boxset', 'collections'].includes(section.SectionType)).length; + $: currentTabMeta = { + edit: { + label: 'Editor', + title: selectedUser ? `${selectedUser.name}'s Home Screen` : 'Home Screen Editor', + description: selectedUser + ? 'Tune section order, filters, and collection rows with a flatter monitoring-style layout.' + : 'Choose a user from the sidebar to begin editing.' + }, + sync: { + label: 'Sync', + title: 'Section Sync', + description: 'Copy or append curated home screen sections across users.' + }, + collections: { + label: 'Collections', + title: 'Recommendation Collections', + description: 'Generate box set sections from recent activity and seeded recommendations.' + }, + settings: { + label: 'Settings', + title: 'Connections and Database', + description: 'Manage Emby connectivity, TMDB access, and live database operations.' + } + }[activeTab]; + $: if (selectedUserId !== lastRecentlyPlayedUserId) { + lastRecentlyPlayedUserId = selectedUserId; + recentlyPlayedCollapsed = false; + } $: if (selectedUser?.embyGuid) { loadSelectedUserContext(selectedUser, selectedExcludedIds); } else { - userContext = { views: [], recentlyPlayed: [], excludedFolderLookup: {}, source: '', lastSyncedAt: null, message: '' }; + userContext = { + views: [], + recentlyPlayed: [], + excludedFolderLookup: {}, + source: '', + lastSyncedAt: null, + message: '' + }; } function moveSection(index, dir) { @@ -121,7 +169,8 @@ return { index: existingIndex, changed: false }; } - const insertIndex = targetUser.sections?.[0]?.SectionType === 'resume' ? 1 : (targetUser.sections?.length || 0); + const insertIndex = + targetUser.sections?.[0]?.SectionType === 'resume' ? 1 : (targetUser.sections?.length || 0); const nextSection = createBoxSetSection(targetUser.embyGuid || '', collection.name, collection.id); targetUser.sections = [ ...(targetUser.sections || []).slice(0, insertIndex), @@ -134,9 +183,7 @@ function onCollectionCreated(event) { const { collection, targetUserIds = [] } = event.detail; - if (!collection?.id) { - return; - } + if (!collection?.id) return; let firstTargetId = null; let firstExpandedIndex = -1; @@ -150,9 +197,7 @@ firstTargetId = targetUser.id; firstExpandedIndex = result.index; } - if (result.changed) { - changes += 1; - } + if (result.changed) changes += 1; } users = users; @@ -167,10 +212,10 @@ } const navigationItems = [ - { id: 'edit', label: 'Edit', icon: PAGE_ICONS.edit }, - { id: 'collections', label: 'Collections', icon: PAGE_ICONS.collections }, - { id: 'sync', label: 'Sync', icon: PAGE_ICONS.sync }, - { id: 'settings', label: 'Settings', icon: PAGE_ICONS.settings } + { id: 'edit', label: 'Editor', icon: 'edit' }, + { id: 'collections', label: 'Collections', icon: 'collections' }, + { id: 'sync', label: 'Sync', icon: 'sync' }, + { id: 'settings', label: 'Settings', icon: 'settings' } ]; function handleSync(event) { @@ -183,16 +228,10 @@ if (!target) continue; const cloned = JSON.parse(JSON.stringify(syncSections)).map((s) => { - s.UserId = target.embyGuid || ''; - s.Id = crypto.randomUUID().replace(/-/g, '').slice(0, 32); - - if (isWatchlistSection(s)) { - const labels = getWatchlistLabelsForTarget(s, target); - if (labels.Name) s.Name = labels.Name; - if (labels.CustomName) s.CustomName = labels.CustomName; - } - - return s; + const normalized = applySectionStandards(s, target); + normalized.UserId = target.embyGuid || ''; + normalized.Id = crypto.randomUUID().replace(/-/g, '').slice(0, 32); + return normalized; }); if (mode === 'replace') { @@ -255,7 +294,6 @@ } } - // Build the list of changed users for db-write function buildChanges() { const changes = []; for (const user of users) { @@ -293,7 +331,6 @@ if (!res.ok) throw new Error(body.message || body.error || res.statusText); writeStatus = 'ok'; writeMessage = `Wrote ${body.count} user(s) to database.${body.normalizedSections ? ` Normalized ${body.normalizedSections} section UserId values.` : ''}`; - // Sync originalUsers so change counter resets originalUsers = JSON.parse(JSON.stringify(users)); changeCount = 0; } catch (e) { @@ -302,26 +339,25 @@ } } - // SettingsPanel event handlers function onConfigSaved(e) { config = { ...e.detail }; } function onNamesRefreshed(e) { const payload = Array.isArray(e.detail) ? { users: e.detail, source: 'live' } : e.detail; - const embyUsers = payload.users || []; // [{ embyGuid, name }] + const embyUsers = payload.users || []; const nameMap = Object.fromEntries(embyUsers.map((u) => [u.embyGuid, u.name])); users = users.map((u) => ({ ...u, dbName: u.dbName || u.name, - embyName: (u.embyGuid && nameMap[u.embyGuid]) ? nameMap[u.embyGuid] : u.embyName, - name: (u.embyGuid && nameMap[u.embyGuid]) ? nameMap[u.embyGuid] : u.name + embyName: u.embyGuid && nameMap[u.embyGuid] ? nameMap[u.embyGuid] : u.embyName, + name: u.embyGuid && nameMap[u.embyGuid] ? nameMap[u.embyGuid] : u.name })); originalUsers = originalUsers.map((u) => ({ ...u, dbName: u.dbName || u.name, - embyName: (u.embyGuid && nameMap[u.embyGuid]) ? nameMap[u.embyGuid] : u.embyName, - name: (u.embyGuid && nameMap[u.embyGuid]) ? nameMap[u.embyGuid] : u.name + embyName: u.embyGuid && nameMap[u.embyGuid] ? nameMap[u.embyGuid] : u.embyName, + name: u.embyGuid && nameMap[u.embyGuid] ? nameMap[u.embyGuid] : u.name })); } @@ -339,85 +375,48 @@
-
-
+
-
- - - - -
- {#if activeTab === 'edit' && selectedUser} -
-
-
- - - -

{selectedUser.name}'s home screen

-
-

Curate rows, tune filters, and shape the exact first impression.

-
-
- - - -
-
- -
-
-
User profile
-
- Source - {selectedUser.details?.sourceTable || dbValidation?.userSource || 'Unknown'} -
-
- Last login - {selectedUser.details?.lastLoginDate ? new Date(selectedUser.details.lastLoginDate).toLocaleString() : 'Not available'} -
-
- Last activity - {selectedUser.details?.lastActivityDate ? new Date(selectedUser.details.lastActivityDate).toLocaleString() : 'Not available'} -
-
- Sections - {sections.length} -
-
- -
-
Emby context
-
- Status - {userContextBusy ? 'Loading…' : (userContext.source || 'Not loaded')} -
-
- Accessible views - {userContext.views?.length || 0} -
-
- Recently played - {userContext.recentlyPlayed?.length || 0} -
-
- Last synced - {userContext.lastSyncedAt ? new Date(userContext.lastSyncedAt).toLocaleString() : 'Not available'} -
- {#if userContext.message} -

{userContext.message}

+ {#if emptyUsers.length} +
No sections yet
+ {#each emptyUsers as user} + + {/each} {/if}
+ {:else if activeTab === 'collections'} + + + + {:else if activeTab === 'settings'} + + + {/if} +
- {#if userContext.recentlyPlayed?.length} -
-
-
Recently played from Emby
- -
-
- {#each userContext.recentlyPlayed as item} -
-
-
{item.name}
-
{item.seriesName ? `${item.seriesName} · ` : ''}{item.type}
-
-
{item.datePlayed ? new Date(item.datePlayed).toLocaleString() : 'Played'}
+ + + +
+
+
+
{currentTabMeta.label}
+

{currentTabMeta.title}

+

{currentTabMeta.description}

+
+
+ {#if writeStatus === 'ok'} + {writeMessage} + {:else if writeStatus === 'error'} + Write failed + {/if} + {#if dbValidation && dbValidation.userSource} + + {dbValidation.userSource} linked + + {/if} + {#if changeCount > 0} + {changeCount} pending + + {/if} + + {#if dbConfigured} + + {/if} +
+
+ +
+ {#if activeTab === 'edit' && selectedUser} +
+
+
+
+
+
+ {sections.length} + Total rows
- {/each} +
+
+
+
+ {randomSectionCount} + Randomized +
+
+
+
+
+ {filteredSectionCount} + Filtered +
+
+
+
+
+ {collectionSectionCount} + Collections +
+
-
- {/if} - {#if sections.length === 0} -
-

No sections configured for this user.

-
- - +
+
+
+
Section Canvas
+
+ Edit the rows exactly as they will be written back into Emby. +
+
+
+ + + +
+
+ + {#if sections.length === 0} +
+

No sections are configured for this user yet.

+
+ + +
+
+ {:else} +
+ {#each sections as section, i (section.Id + '-' + i)} + (expandedIndex = expandedIndex === i ? -1 : i)} + on:move={(e) => moveSection(i, e.detail)} + on:remove={() => removeSection(i)} + on:change={onSectionChange} + /> + {/each} +
+ {/if}
-
- {:else} -
- {#each sections as section, i (section.Id + '-' + i)} - (expandedIndex = expandedIndex === i ? -1 : i)} - on:move={(e) => moveSection(i, e.detail)} - on:remove={() => removeSection(i)} - on:change={onSectionChange} - /> - {/each} -
- {/if} + + + +
{:else if activeTab === 'sync'} -
-
- - - -

Section sync

+
+
+
+
+
Sync Workflow
+
+ Choose a source layout, decide how it should land, then push it to other users. +
+
+
+
-

- Use the panel on the left to copy home screen sections from one user to others. - You can replace their entire layout, append sections, or pick specific ones. -

-

After syncing, switch to the Edit tab to review changes per user.

-
{:else if activeTab === 'collections'} - +
+ +
{:else if activeTab === 'settings'} -
-
- - - -

Settings

+
+
+
+
+
Connection Settings
+
+ Save your Emby and TMDB credentials, then manage database reads and writes. +
+
+
+
-

Configure your Emby server connection and database path in the panel on the left.

-
-
Emby API
+
+
Emby API
- Connect to your Emby server to fetch real user names. Without this, users - without a recognisable name pattern will show as "User 11", "User 14" etc. + Connect to Emby to resolve real user names and gather live activity context for the collection tools.
-
-
Load from DB
+
+
Load From DB
- Read the live users.db directly instead of using the static - db_export.json snapshot. Stop Emby first to avoid a locked database. + Read the live users.db instead of the bundled snapshot whenever you want the current production state.
-
-
Write to DB
+
+
Write To DB
- Apply your changes directly to the database — only the - homescreensettings rows for users you modified are touched. - Stop Emby first. The "Generate SQL" button is still available as a fallback. + Only modified homescreensettings rows are touched, but Emby should be stopped first for safety.
{:else}
-

Select a user from the sidebar to edit their home screen.

+

Select a user from the sidebar to start editing.

{/if}
@@ -666,227 +796,143 @@ :global(*) { box-sizing: border-box; } + :global(body) { margin: 0; - font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; - --bg: #07090d; - --bg-secondary: #0c1016; - --surface: #11161d; - --surface-strong: #171d26; - --surface-hover: #1c2430; - --surface-active: #12202f; - --border: rgba(148, 163, 184, 0.14); - --border-strong: rgba(96, 165, 250, 0.4); - --text: #eef2f7; - --text-muted: #92a0b4; - --accent: #4d87cc; + font-family: 'Aptos', 'Aptos Display', 'Segoe UI Variable', sans-serif; + --bg: #090a0d; + --bg-secondary: #101115; + --surface: #111318; + --surface-strong: #161920; + --surface-hover: #171b22; + --surface-active: #1d2f36; + --border: rgba(255, 255, 255, 0.08); + --border-strong: rgba(45, 208, 232, 0.38); + --text: #f7f8fb; + --text-muted: #9ba3b2; + --accent: #28c1dc; + --accent-strong: #a6f4ff; + --glow: rgba(40, 193, 220, 0.18); --success: #22c55e; --danger: #ef4444; - background: var(--bg); + background: linear-gradient(180deg, #08090c 0%, #0a0b0e 100%); color: var(--text); } + .app { min-height: 100vh; + display: grid; + grid-template-columns: 290px minmax(0, 1fr); + } + + .sidebar { display: flex; flex-direction: column; + min-height: 100vh; + background: #131418; + border-right: 1px solid var(--border); } - header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 16px 28px; - border-bottom: 1px solid var(--border); - background: #0d1218; - box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16); - flex-shrink: 0; - } - .header-left { - display: flex; - align-items: center; - gap: 28px; - min-width: 0; + + .sidebar-top { + padding: 20px 16px 14px; } + .brand-lockup { display: flex; align-items: center; - gap: 16px; - flex-shrink: 0; + gap: 12px; + margin-bottom: 18px; } + .brand-mark { display: grid; place-items: center; - width: 42px; - height: 42px; - border-radius: 12px; - font-size: 12px; + width: 28px; + height: 28px; + border-radius: 999px; + font-size: 14px; font-weight: 800; - letter-spacing: 0.16em; - color: #eff6ff; - background: #15304e; - border: 1px solid rgba(96, 165, 250, 0.2); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); + color: #081116; + background: linear-gradient(135deg, #2ad7ef 0%, #1798b4 100%); + box-shadow: 0 0 0 1px rgba(42, 215, 239, 0.1), 0 10px 24px rgba(0, 0, 0, 0.32); } + .brand-copy { display: flex; flex-direction: column; - gap: 2px; - } - .eyebrow { - font-size: 11px; - font-weight: 700; - letter-spacing: 0.16em; - text-transform: uppercase; - color: #8cb8e7; - } - h1 { - font-size: 20px; - font-weight: 800; - margin: 0; - color: var(--text); - letter-spacing: -0.05em; - } - .subtitle { - font-size: 13px; - color: var(--text-muted); - } - .header-actions { - display: flex; - align-items: center; - gap: 8px; - flex-wrap: wrap; - justify-content: flex-end; - } - .header-nav { - display: flex; - align-items: center; - gap: 6px; - padding: 4px; - border: 1px solid var(--border); - border-radius: 14px; - background: rgba(255, 255, 255, 0.02); - } - .write-status { - font-size: 12px; - padding: 7px 11px; - border-radius: 999px; - border: 1px solid var(--border); - } - .db-status { - font-size: 12px; - padding: 7px 11px; - border-radius: 999px; - border: 1px solid var(--border-strong); - background: rgba(77, 135, 204, 0.12); - color: #a9d6ff; - } - .write-status.ok { - background: rgba(34, 197, 94, 0.14); - color: #86efac; - } - .write-status.error { - background: rgba(239, 68, 68, 0.14); - color: #fca5a5; - cursor: help; } - /* Buttons */ - .btn { - all: unset; - cursor: pointer; - display: inline-flex; - align-items: center; - justify-content: center; - gap: 8px; - padding: 9px 16px; - border-radius: 12px; - font-size: 13px; - font-weight: 600; - font-family: inherit; - transition: transform 0.16s ease, background 0.16s ease, border-color 0.16s ease, opacity 0.16s ease; - border: 1px solid transparent; + .brand-name { + font-size: 24px; + font-weight: 800; + letter-spacing: -0.04em; + line-height: 1; } - .btn.primary { - background: var(--accent); - color: #fff; - box-shadow: 0 10px 22px rgba(0, 0, 0, 0.2); - } - .btn.primary:hover:not(:disabled) { - transform: translateY(-1px); - } - .btn.primary:disabled { - opacity: 0.35; - cursor: default; - } - .btn.ghost { - color: #d9e7f8; - border: 1px solid var(--border); - background: var(--surface); - } - .btn.ghost:hover:not(:disabled) { - background: var(--surface-hover); - color: var(--text); - border-color: var(--border-strong); - } - .btn.ghost:disabled { - opacity: 0.35; - cursor: default; - } - .btn.accent { - background: var(--accent); - color: #fff; - box-shadow: 0 10px 22px rgba(0, 0, 0, 0.2); - } - .btn.accent:hover { - transform: translateY(-1px); - } - .btn.small { - padding: 8px 13px; + + .brand-subtitle { + margin-top: 3px; font-size: 12px; + color: var(--text-muted); } + + .sidebar-nav { + display: flex; + flex-direction: column; + gap: 4px; + } + .nav-link { all: unset; cursor: pointer; display: inline-flex; align-items: center; - justify-content: center; + justify-content: flex-start; gap: 8px; - padding: 9px 14px; + padding: 10px 12px; border-radius: 10px; border: 1px solid transparent; color: var(--text-muted); font-size: 13px; font-weight: 600; line-height: 1; - transition: background 0.16s ease, color 0.16s ease, border-color 0.16s ease; + transition: background 0.16s ease, color 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease; } + .nav-link:hover { background: var(--surface-hover); color: var(--text); } + .nav-link.active { - background: var(--surface); - color: var(--text); - border-color: var(--border); + background: linear-gradient(90deg, rgba(40, 193, 220, 0.95), rgba(40, 193, 220, 0.85)); + color: #061116; + border-color: rgba(40, 193, 220, 0.45); + box-shadow: 0 0 0 1px rgba(40, 193, 220, 0.08) inset; } - /* Layout */ - .layout { - display: flex; + .nav-icon { + display: inline-flex; + color: currentColor; + } + + .sidebar-panel { flex: 1; - min-height: 0; + overflow-y: auto; + padding: 8px 12px 16px; } - .sidebar { - width: 280px; - border-right: 1px solid var(--border); + + .sidebar-section { + padding: 10px 8px 12px; + } + + .sidebar-title-row { display: flex; - flex-direction: column; - flex-shrink: 0; - background: var(--bg-secondary); - } - .sidebar-header { - padding: 16px 16px 10px; - border-bottom: 1px solid rgba(148, 163, 184, 0.08); + align-items: flex-start; + justify-content: space-between; + gap: 12px; + padding: 0 4px 10px; } + .sidebar-title { font-size: 12px; font-weight: 700; @@ -895,231 +941,530 @@ color: var(--text); margin-bottom: 6px; } + .sidebar-copy { font-size: 12px; line-height: 1.5; color: var(--text-muted); } + + .sidebar-badge { + padding: 2px 8px; + border-radius: 999px; + font-size: 11px; + border: 1px solid var(--border); + color: var(--text-muted); + background: #0d0f13; + } + + .sidebar-note { + margin: 0 8px 10px; + padding: 12px; + border: 1px solid var(--border); + border-radius: 12px; + background: #111419; + } + + .note-title { + font-size: 12px; + font-weight: 700; + color: var(--text); + margin-bottom: 6px; + } + + .note-copy { + font-size: 12px; + line-height: 1.55; + color: var(--text-muted); + } + + .sidebar-footer { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + padding: 14px 16px 18px; + border-top: 1px solid var(--border); + background: #111317; + } + + .footer-stat { + padding: 10px 12px; + border-radius: 12px; + border: 1px solid var(--border); + background: #0d0f13; + } + + .footer-stat span { + display: block; + font-size: 11px; + color: var(--text-muted); + margin-bottom: 4px; + } + + .footer-stat strong { + font-size: 18px; + font-weight: 800; + } + + .workspace { + min-width: 0; + display: flex; + flex-direction: column; + min-height: 100vh; + } + + .topbar { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 20px; + padding: 18px 22px; + border-bottom: 1px solid var(--border); + background: rgba(9, 10, 13, 0.96); + position: sticky; + top: 0; + z-index: 20; + backdrop-filter: blur(12px); + } + + .topbar-copy { + min-width: 0; + } + + .topbar-label { + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--accent-strong); + margin-bottom: 8px; + } + + h1 { + margin: 0; + font-size: 22px; + font-weight: 800; + letter-spacing: -0.04em; + color: var(--text); + } + + .topbar-copy p { + margin: 6px 0 0; + font-size: 13px; + line-height: 1.5; + color: var(--text-muted); + } + + .header-actions { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 8px; + flex-wrap: wrap; + } + + .status-pill { + display: inline-flex; + align-items: center; + padding: 7px 10px; + border-radius: 999px; + border: 1px solid var(--border); + background: #111419; + font-size: 12px; + color: var(--text-muted); + } + + .status-pill.ok { + border-color: rgba(34, 197, 94, 0.28); + color: #86efac; + } + + .status-pill.error { + border-color: rgba(239, 68, 68, 0.28); + color: #fca5a5; + } + + .status-pill.info { + border-color: var(--border-strong); + color: #aeeef8; + } + + .status-pill.pending { + border-color: rgba(250, 204, 21, 0.2); + color: #facc15; + } + + .btn { + all: unset; + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 9px 14px; + border-radius: 10px; + font-size: 13px; + font-weight: 600; + font-family: inherit; + transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease, opacity 0.16s ease; + border: 1px solid transparent; + } + + .btn.primary { + background: var(--accent); + border-color: rgba(42, 215, 239, 0.4); + color: #031014; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.14); + } + + .btn.primary:hover:not(:disabled) { + background: #35d2ea; + } + + .btn.ghost { + color: var(--text); + border-color: var(--border); + background: #15181e; + } + + .btn.ghost:hover:not(:disabled) { + background: var(--surface-hover); + border-color: var(--border-strong); + } + + .btn.accent { + background: var(--accent); + border-color: rgba(42, 215, 239, 0.4); + color: #031014; + } + + .btn.accent:hover:not(:disabled) { + background: #35d2ea; + } + + .btn.small { + padding: 8px 12px; + font-size: 12px; + } + + .btn:disabled { + opacity: 0.35; + cursor: default; + } + .main { flex: 1; overflow-y: auto; - padding: 28px; + padding: 20px; } - /* User list */ .user-list { - flex: 1; - overflow-y: auto; - padding: 14px 12px 12px; + display: flex; + flex-direction: column; + gap: 8px; } + .user-item { all: unset; cursor: pointer; display: flex; justify-content: space-between; - align-items: center; - padding: 11px 12px; - border-radius: 14px; + align-items: flex-start; + padding: 12px; + border-radius: 12px; width: 100%; box-sizing: border-box; - border: 1px solid transparent; - transition: background 0.12s ease, border-color 0.12s ease, transform 0.12s ease; - margin-bottom: 6px; + border: 1px solid var(--border); + background: #111419; + transition: background 0.12s ease, border-color 0.12s ease; } + .user-item:hover { background: var(--surface-hover); - transform: translateY(-1px); } + .user-item.active { background: var(--surface-active); - border-color: rgba(96, 165, 250, 0.32); - box-shadow: none; + border-color: var(--border-strong); } + .user-item.dim { - opacity: 0.5; + opacity: 0.7; } + + .user-copy { + display: flex; + flex-direction: column; + gap: 4px; + min-width: 0; + } + .user-name { font-size: 13px; font-weight: 600; color: var(--text); } + + .user-meta { + font-size: 11px; + color: var(--text-muted); + } + .user-count { font-size: 11px; - color: #cfe0f5; - background: #0b0f14; + color: var(--text); + background: #0c0e12; padding: 4px 8px; border-radius: 999px; border: 1px solid var(--border); font-variant-numeric: tabular-nums; } + .user-divider { font-size: 11px; color: var(--text-muted); - padding: 12px 12px 4px; + padding: 8px 4px 2px; text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.08em; font-weight: 600; } - /* Settings sidebar */ - .settings-container { - flex: 1; - overflow-y: auto; - padding: 0 16px 20px; - } - .collections-sidebar { - display: flex; - flex-direction: column; - gap: 12px; - padding: 16px; - } - .settings-header { - margin: 0 -16px 18px; - padding-left: 16px; - padding-right: 16px; + .builder-shell { + display: grid; + grid-template-columns: minmax(0, 1fr) 320px; + gap: 18px; + align-items: start; } - /* Main area */ - .main-header { + .builder-main, + .builder-rail, + .view-shell { + min-width: 0; + } + + .view-shell { display: flex; - justify-content: space-between; - align-items: flex-start; - margin-bottom: 18px; + flex-direction: column; gap: 16px; } + + .rail-stack { + position: sticky; + top: 86px; + display: flex; + flex-direction: column; + gap: 16px; + } + + .metrics-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; + margin-bottom: 16px; + } + + .metric-card { + display: flex; + align-items: center; + gap: 12px; + padding: 14px 16px; + border-radius: 12px; + border: 1px solid var(--border); + background: #101217; + } + + .metric-icon { + display: grid; + place-items: center; + width: 28px; + height: 28px; + border-radius: 8px; + background: rgba(40, 193, 220, 0.1); + color: var(--accent); + } + + .metric-copy { + display: flex; + flex-direction: column; + gap: 3px; + } + + .metric-copy strong { + font-size: 24px; + font-weight: 800; + line-height: 1; + } + + .metric-copy span { + font-size: 12px; + color: var(--text-muted); + } + + .content-card { + border: 1px solid var(--border); + border-radius: 14px; + background: #0f1116; + padding: 18px; + } + + .side-card { + padding: 16px; + } + + .content-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + padding-bottom: 16px; + margin-bottom: 16px; + border-bottom: 1px solid var(--border); + } + + .content-title { + font-size: 15px; + font-weight: 800; + color: var(--text); + letter-spacing: -0.02em; + } + + .content-subtitle { + margin-top: 6px; + font-size: 13px; + line-height: 1.55; + color: var(--text-muted); + } + .main-header-actions { display: flex; gap: 10px; flex-wrap: wrap; } - .page-heading { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 8px; - } - .page-icon { - display: inline-flex; - align-items: center; - justify-content: center; - width: 38px; - height: 38px; - border-radius: 12px; - background: var(--surface-active); - color: #a9d6ff; - border: 1px solid rgba(96, 165, 250, 0.18); - } - h2 { - font-size: 26px; - font-weight: 800; - margin: 0; - color: var(--text); - letter-spacing: -0.05em; - } - .main-kicker { - margin: 0; - font-size: 14px; - color: var(--text-muted); - line-height: 1.6; - } + .section-list { - max-width: 760px; + max-width: none; } - .user-detail-grid { + + .rail-actions { display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 14px; - max-width: 760px; - margin-bottom: 18px; + grid-template-columns: 1fr; + gap: 10px; + margin-top: 14px; } - .detail-card { - background: var(--surface); - border: 1px solid var(--border); - border-radius: 18px; - padding: 16px 18px; - box-shadow: 0 10px 28px rgba(0, 0, 0, 0.16); - } - .detail-title { - font-size: 13px; - font-weight: 700; - color: var(--text); - margin-bottom: 12px; - text-transform: uppercase; - letter-spacing: 0.08em; + + .rail-btn { + width: 100%; + justify-content: flex-start; } + .detail-row { display: flex; justify-content: space-between; gap: 12px; - padding: 8px 0; - border-bottom: 1px solid rgba(148, 163, 184, 0.08); + padding: 10px 0; + border-bottom: 1px solid var(--border); font-size: 13px; } + .detail-row:last-child { border-bottom: none; } + .detail-row span { color: var(--text-muted); } + .detail-row strong { color: var(--text); text-align: right; } + .detail-message { - margin: 12px 0 0; + margin: 14px 0 0; font-size: 12px; color: var(--text-muted); line-height: 1.5; } - .activity-card { - max-width: 760px; - margin-bottom: 18px; - } - .activity-list { - display: flex; - flex-direction: column; - gap: 10px; + + .rail-card { + max-height: min(58vh, 680px); + overflow: hidden; } + .activity-header { display: flex; justify-content: space-between; align-items: center; gap: 12px; - margin-bottom: 12px; + margin-bottom: 8px; } + + .activity-summary { + margin-top: 5px; + font-size: 12px; + color: var(--text-muted); + } + + .activity-list { + display: flex; + flex-direction: column; + gap: 4px; + overflow-y: auto; + padding-right: 2px; + } + .activity-item { display: flex; justify-content: space-between; - gap: 16px; + align-items: flex-start; + gap: 12px; padding: 10px 0; - border-bottom: 1px solid rgba(148, 163, 184, 0.08); + border-bottom: 1px solid var(--border); } + .activity-item:last-child { border-bottom: none; padding-bottom: 0; } + + .activity-copy { + min-width: 0; + } + .activity-name { - font-size: 14px; + font-size: 13px; font-weight: 600; color: var(--text); } + .activity-meta, .activity-time { font-size: 12px; color: var(--text-muted); } + + .activity-time { + flex-shrink: 0; + text-align: right; + } + .empty-state { text-align: center; - padding: 72px 24px; + padding: 56px 24px; color: var(--text-muted); - background: var(--surface); + background: #0f1116; border: 1px solid var(--border); - border-radius: 24px; - box-shadow: 0 14px 32px rgba(0, 0, 0, 0.18); + border-radius: 14px; } + + .empty-state-inline { + margin-top: 8px; + } + .empty-state p { margin-bottom: 16px; } + .empty-actions { display: inline-flex; flex-wrap: wrap; @@ -1127,122 +1472,96 @@ gap: 10px; } - /* Sync */ - .sync-info { - max-width: 760px; - } - .sync-info > p { - color: var(--text-muted); - font-size: 14px; - line-height: 1.6; - margin-bottom: 8px; + .settings-grid { + display: grid; + grid-template-columns: minmax(0, 1.3fr) minmax(280px, 0.8fr); + gap: 16px; + align-items: start; } - /* Settings info panel */ - .settings-info { - max-width: 760px; - } - .settings-info > p { - color: var(--text-muted); - font-size: 14px; - margin-bottom: 20px; - line-height: 1.6; - } .settings-cards { display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + grid-template-columns: 1fr; gap: 12px; } + .info-card { - background: var(--surface); - border: 1px solid var(--border); - border-radius: 20px; - padding: 18px; - box-shadow: 0 10px 28px rgba(0, 0, 0, 0.16); - } - .card-title { - font-size: 14px; - font-weight: 700; - color: var(--text); - margin-bottom: 8px; + padding: 16px; } + .card-body { + margin-top: 8px; font-size: 13px; color: var(--text-muted); line-height: 1.6; } - .card-body code { + + .card-body code, + .sidebar-copy code, + .note-copy code { font-size: 12px; - background: #0b0f14; + background: #0c0e12; padding: 2px 6px; border-radius: 6px; color: var(--text); } + @media (max-width: 1200px) { + .builder-shell, + .settings-grid { + grid-template-columns: 1fr; + } + + .rail-stack { + position: static; + } + + .metrics-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + } + @media (max-width: 900px) { - header, - .main { - padding: 20px; - } - .layout { - flex-direction: column; + .app { + grid-template-columns: 1fr; } + .sidebar { - width: 100%; + min-height: 0; border-right: none; border-bottom: 1px solid var(--border); } - .main-header { + + .topbar, + .content-header { flex-direction: column; } - .main-header-actions { - width: 100%; - } - .page-heading { - align-items: flex-start; + + .main { + padding: 16px; } } @media (max-width: 640px) { - header { - flex-direction: column; - align-items: stretch; - gap: 16px; - } - .header-left { - flex-direction: column; - align-items: stretch; - gap: 14px; - } - .brand-lockup { - width: 100%; - } .header-actions { justify-content: flex-start; } - .header-nav { - width: 100%; - justify-content: space-between; - } - .nav-link { - flex: 1; - } - .nav-link span { - min-width: 0; - } - .brand-mark { - width: 40px; - height: 40px; - } + h1 { font-size: 20px; } - h2 { - font-size: 22px; + + .metrics-grid, + .sidebar-footer { + grid-template-columns: 1fr 1fr; } - .main, - .settings-container { + + .content-card { padding: 16px; } + + .main-header-actions { + width: 100%; + } } diff --git a/tests/run-tests.js b/tests/run-tests.js index c8b9685..9ceaf32 100644 --- a/tests/run-tests.js +++ b/tests/run-tests.js @@ -2,7 +2,12 @@ import assert from 'node:assert/strict'; import { mkdtempSync, rmSync } from 'fs'; import { join } from 'path'; import { tmpdir } from 'os'; -import { createBoxSetSection, createRecentlyWatchedSection, getWatchlistLabelsForTarget } from '../src/lib/constants.js'; +import { + applySectionStandards, + createBoxSetSection, + createRecentlyWatchedSection, + getWatchlistLabelsForTarget +} from '../src/lib/constants.js'; import { normalizeLookupItem, rankRecommendationResults } from '../src/lib/collection-tools.js'; import * as embyUserCache from '../src/lib/server/emby-user-cache.js'; @@ -152,6 +157,104 @@ test('box set section template links a created collection', () => { }); }); +test('section standards normalize up next label', () => { + const normalized = applySectionStandards( + { + Name: 'Resume / Up Next', + CustomName: 'Resume / Up Next', + SectionType: 'resume' + }, + { + embyName: 'Bob', + sections: [] + } + ); + + assert.equal(normalized.Name, 'Up Next'); + assert.equal(normalized.CustomName, 'Up Next'); +}); + +test('section standards normalize watchlist label for target user', () => { + const normalized = applySectionStandards( + { + Name: "Matt's Watchlist", + CustomName: "Matt's Watchlist", + SectionType: 'items', + Query: { IsFavorite: true } + }, + { + embyName: 'Bob', + sections: [] + } + ); + + assert.equal(normalized.Name, "Bob's Watchlist"); + assert.equal(normalized.CustomName, "Bob's Watchlist"); +}); + +test('section standards keep new to emby fixed to date added descending', () => { + const normalized = applySectionStandards( + { + Name: 'New To Emby', + CustomName: 'New To Emby', + SectionType: 'items', + SortBy: 'ProductionYear,PremiereDate,SortName', + SortOrder: 'Ascending' + }, + { + embyName: 'Bob', + sections: [] + } + ); + + assert.equal(normalized.Name, 'New to Emby'); + assert.equal(normalized.CustomName, 'New to Emby'); + assert.equal(normalized.SortBy, 'DateLastContentAdded,SortName'); + assert.equal(normalized.SortOrder, 'Descending'); +}); + +test('section standards randomize regular curated sections', () => { + const normalized = applySectionStandards( + { + Name: 'Crime / Drama Shows', + CustomName: 'Crime / Drama Shows', + SectionType: 'items', + SortBy: 'ProductionYear,PremiereDate,SortName', + SortOrder: 'Ascending', + Query: { GenreIds: ['4910', '62'] } + }, + { + embyName: 'Bob', + sections: [] + } + ); + + assert.equal(normalized.SortBy, 'Random'); + assert.equal(normalized.SortOrder, 'Descending'); +}); + +test('section standards preserve recently watched ordering semantics', () => { + const normalized = applySectionStandards( + { + Name: 'Recently Watched - Matt', + CustomName: 'Recently Watched - Matt', + SectionType: 'items', + SortBy: 'Random', + SortOrder: 'Ascending', + Query: { IsPlayed: true } + }, + { + embyName: 'Bob', + sections: [] + } + ); + + assert.equal(normalized.Name, 'Recently Watched - Bob'); + assert.equal(normalized.CustomName, 'Recently Watched - Bob'); + assert.equal(normalized.SortBy, 'DatePlayed'); + assert.equal(normalized.SortOrder, 'Descending'); +}); + test('normalizeLookupItem preserves already-normalized recommendation items', () => { const normalized = normalizeLookupItem({ id: 'pick-1', diff --git a/users.db-shm b/users.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 zcmeIuAr62r3