{"definition_raw":"---\nid: home-radio-scrape\ntitle: Home Radio nightly scrape + Spotify playlist refresh\nschedule: \"0 2 * * *\"\ntimeout: 1800\nretry: false\nenabled: true\nnotify_on: failure\nrun_as: shell\ncommand: \"cd /home/lucienne/workspace/projects/home-radio && python3 scrape.py 2>&1 | tail -40\"\ntags: [home-radio, spotify, scrape, music, nightly]\nruntime_profile: direct_spotify\nnotify_to: general\n---\n\n**OVERRIDES runtime profile:** uses Spotify Web API + onlineradiobox HTTP scrape directly because it does not invoke the `claude` CLI.\n\nNightly 04:00 SAST (02:00 UTC). Scrapes the last 7 days of plays for every station in `stations.yaml` from onlineradiobox.com, dedupes by (artist, title), resolves to Spotify URIs (lexical-similarity gate, cached in `scrape.db`), then replaces the contents of one playlist per station on the Spotify house account.\n\nPhase 1 of the Home Radio project. Phase 2 will add day-part mood mixers; Phase 3 the HA scheduler/state-machine; Phase 4 the MC dashboard.\n\nCurrently running against the personal `conrelma` Spotify account because the HA-managed `econ` (HEOS-bound) refresh token was revoked. Switch back to econ once the Spotify integration is reconfigured in Home Assistant (Settings \u2192 Devices \u2192 Spotify \u2192 econ \u2192 reconfigure), then update `state/house_token.json` from `/config/.storage/core.config_entries`.\n","id":"home-radio-scrape","last_run":{"duration_s":96.733661,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/413132.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2061 plays scraped\n  200 unique tracks (cap=200)\n  resolved 186 URIs, 14 misses\n  wrote 186 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1881 plays scraped\n  200 unique tracks (cap=200)\n  resolved 197 URIs, 3 misses\n  wrote 197 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1738 plays scraped\n  186 unique tracks (cap=200)\n  resolved 164 URIs, 22 misses\n  wrote 164 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=46 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2519, 'unique': 200, 'uris': 193, 'miss': 7, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2428, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2239, 'unique': 200, 'uris': 195, 'miss': 5, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2427, 'unique': 200, 'uris': 190, 'miss': 10, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2169, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2346, 'unique': 200, 'uris': 199, 'miss': 1, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2061, 'unique': 200, 'uris': 186, 'miss': 14, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1881, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1738, 'unique': 186, 'uris': 164, 'miss': 22, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-13T02:00:23.964078+02:00","status":"completed"},"next_run":"2026-06-14 02:00","next_run_iso":"2026-06-14T02:00:00+02:00","runs":[{"duration_s":96.733661,"finished_at":"2026-06-13T02:02:00.701264+02:00","id":413132,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/413132.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2061 plays scraped\n  200 unique tracks (cap=200)\n  resolved 186 URIs, 14 misses\n  wrote 186 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1881 plays scraped\n  200 unique tracks (cap=200)\n  resolved 197 URIs, 3 misses\n  wrote 197 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1738 plays scraped\n  186 unique tracks (cap=200)\n  resolved 164 URIs, 22 misses\n  wrote 164 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=46 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2519, 'unique': 200, 'uris': 193, 'miss': 7, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2428, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2239, 'unique': 200, 'uris': 195, 'miss': 5, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2427, 'unique': 200, 'uris': 190, 'miss': 10, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2169, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2346, 'unique': 200, 'uris': 199, 'miss': 1, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2061, 'unique': 200, 'uris': 186, 'miss': 14, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1881, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1738, 'unique': 186, 'uris': 164, 'miss': 22, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-13T02:00:23.964078+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"},{"duration_s":98.511455,"finished_at":"2026-06-12T02:01:58.263584+02:00","id":408967,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/408967.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2053 plays scraped\n  200 unique tracks (cap=200)\n  resolved 187 URIs, 13 misses\n  wrote 187 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1886 plays scraped\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1745 plays scraped\n  187 unique tracks (cap=200)\n  resolved 165 URIs, 22 misses\n  wrote 165 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=45 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2517, 'unique': 200, 'uris': 194, 'miss': 6, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2427, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2245, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2429, 'unique': 200, 'uris': 186, 'miss': 14, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2174, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2342, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2053, 'unique': 200, 'uris': 187, 'miss': 13, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1886, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1745, 'unique': 187, 'uris': 165, 'miss': 22, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-12T02:00:19.748490+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"},{"duration_s":95.476617,"finished_at":"2026-06-11T02:01:54.954474+02:00","id":404612,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/404612.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2057 plays scraped\n  200 unique tracks (cap=200)\n  resolved 188 URIs, 12 misses\n  wrote 188 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1890 plays scraped\n  200 unique tracks (cap=200)\n  resolved 198 URIs, 2 misses\n  wrote 198 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1676 plays scraped\n  186 unique tracks (cap=200)\n  resolved 165 URIs, 21 misses\n  wrote 165 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=44 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2515, 'unique': 200, 'uris': 193, 'miss': 7, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2416, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2239, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2415, 'unique': 200, 'uris': 186, 'miss': 14, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2166, 'unique': 200, 'uris': 199, 'miss': 1, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2345, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2057, 'unique': 200, 'uris': 188, 'miss': 12, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1890, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1676, 'unique': 186, 'uris': 165, 'miss': 21, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-11T02:00:19.475042+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"},{"duration_s":96.413084,"finished_at":"2026-06-10T02:01:55.665347+02:00","id":400338,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/400338.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2053 plays scraped\n  200 unique tracks (cap=200)\n  resolved 185 URIs, 15 misses\n  wrote 185 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1896 plays scraped\n  200 unique tracks (cap=200)\n  resolved 199 URIs, 1 misses\n  wrote 199 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1680 plays scraped\n  185 unique tracks (cap=200)\n  resolved 164 URIs, 21 misses\n  wrote 164 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=43 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2509, 'unique': 200, 'uris': 193, 'miss': 7, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2415, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2238, 'unique': 200, 'uris': 196, 'miss': 4, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2404, 'unique': 200, 'uris': 181, 'miss': 19, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2168, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2338, 'unique': 200, 'uris': 196, 'miss': 4, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2053, 'unique': 200, 'uris': 185, 'miss': 15, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1896, 'unique': 200, 'uris': 199, 'miss': 1, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1680, 'unique': 185, 'uris': 164, 'miss': 21, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-10T02:00:19.249941+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"},{"duration_s":97.614184,"finished_at":"2026-06-09T02:01:57.328012+02:00","id":396095,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/396095.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2063 plays scraped\n  200 unique tracks (cap=200)\n  resolved 186 URIs, 14 misses\n  wrote 186 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1896 plays scraped\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1682 plays scraped\n  184 unique tracks (cap=200)\n  resolved 163 URIs, 21 misses\n  wrote 163 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=42 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2498, 'unique': 200, 'uris': 193, 'miss': 7, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2411, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2235, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2376, 'unique': 200, 'uris': 190, 'miss': 10, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2171, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2344, 'unique': 200, 'uris': 199, 'miss': 1, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2063, 'unique': 200, 'uris': 186, 'miss': 14, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1896, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1682, 'unique': 184, 'uris': 163, 'miss': 21, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-09T02:00:19.711229+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"},{"duration_s":96.531448,"finished_at":"2026-06-08T02:01:53.427987+02:00","id":392011,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/392011.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2061 plays scraped\n  200 unique tracks (cap=200)\n  resolved 185 URIs, 15 misses\n  wrote 185 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1894 plays scraped\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1684 plays scraped\n  182 unique tracks (cap=200)\n  resolved 162 URIs, 20 misses\n  wrote 162 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=41 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2476, 'unique': 200, 'uris': 194, 'miss': 6, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2406, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2236, 'unique': 200, 'uris': 196, 'miss': 4, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2329, 'unique': 200, 'uris': 191, 'miss': 9, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2169, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2344, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2061, 'unique': 200, 'uris': 185, 'miss': 15, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1894, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1684, 'unique': 182, 'uris': 162, 'miss': 20, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-08T02:00:16.893404+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"},{"duration_s":99.810337,"finished_at":"2026-06-07T02:01:58.235702+02:00","id":387568,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/387568.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2066 plays scraped\n  200 unique tracks (cap=200)\n  resolved 185 URIs, 15 misses\n  wrote 185 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1889 plays scraped\n  200 unique tracks (cap=200)\n  resolved 197 URIs, 3 misses\n  wrote 197 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1665 plays scraped\n  183 unique tracks (cap=200)\n  resolved 163 URIs, 20 misses\n  wrote 163 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=40 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2456, 'unique': 200, 'uris': 194, 'miss': 6, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2397, 'unique': 200, 'uris': 198, 'miss': 2, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2236, 'unique': 200, 'uris': 195, 'miss': 5, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2315, 'unique': 200, 'uris': 184, 'miss': 16, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2173, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2346, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2066, 'unique': 200, 'uris': 185, 'miss': 15, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1889, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1665, 'unique': 183, 'uris': 163, 'miss': 20, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-07T02:00:18.422406+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"},{"duration_s":98.749959,"finished_at":"2026-06-06T02:01:57.214887+02:00","id":382846,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-scrape/382846.log","output":"[smooth_chill] scraping onlineradiobox:uk/chilldigital ...\n  2066 plays scraped\n  200 unique tracks (cap=200)\n  resolved 188 URIs, 12 misses\n  wrote 188 tracks -> playlist '26nUTzCCG31rgFFOYNCddD' ('Home Radio - Smooth Chill')\n[smooth_radio] scraping onlineradiobox:uk/smoothradio1022 ...\n  1890 plays scraped\n  200 unique tracks (cap=200)\n  resolved 197 URIs, 3 misses\n  wrote 197 tracks -> playlist '5gUbqMiluMlybr4uRfcyVh' ('Home Radio - Smooth Radio (substitute for Smooth Extra)')\n[air1] scraping radoxo: ...\n  1670 plays scraped\n  184 unique tracks (cap=200)\n  resolved 164 URIs, 20 misses\n  wrote 164 tracks -> playlist '76bKWN2UZltR2DogSKxjAt' ('Home Radio - Air 1')\n[elmar_50th] scraping spotify_playlist: ...\n  127 plays scraped\n  pre-resolved 127 URIs from playlist\n  126 unique tracks (cap=200)\n  resolved 126 URIs, 0 misses\n  wrote 126 tracks -> playlist '54SCyu91qV22Nro3pkUI3T' ('Home Radio - Elmar 50th (Spotify playlist)')\n[elmar_liked] scraping spotify_liked: ...\n  980 plays scraped\n  pre-resolved 980 URIs from playlist\n  200 unique tracks (cap=200)\n  resolved 200 URIs, 0 misses\n  wrote 200 tracks -> playlist '2IDid3uuhzwkk869oRqo0x' ('Home Radio - Elmar Liked Songs')\n\nrun_id=39 done. ok=True. summary:\n  {'id': '100hitz_top40', 'ok': True, 'plays': 2437, 'unique': 200, 'uris': 193, 'miss': 7, 'playlist_id': '2oFCdYoVWHrFsRVPWdx0Cw'}\n  {'id': '100hitz_hothitz', 'ok': True, 'plays': 2391, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '6pKmiyLIV2z6qiKFdFdQL8'}\n  {'id': '100hitz_themix', 'ok': True, 'plays': 2233, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '1BOJyet0arqfD7yeIRi5fY'}\n  {'id': '977_todayshits', 'ok': True, 'plays': 2310, 'unique': 200, 'uris': 184, 'miss': 16, 'playlist_id': '44y7UyBSQJbGmKyxr1UN8W'}\n  {'id': 'classichits109_80s', 'ok': True, 'plays': 2168, 'unique': 200, 'uris': 199, 'miss': 1, 'playlist_id': '2xua34Ylq9sZkHpzXxjFcF'}\n  {'id': 'classichits109_70s', 'ok': True, 'plays': 2339, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '6HAGAL4XbtcooCLx7HZhzT'}\n  {'id': 'smooth_chill', 'ok': True, 'plays': 2066, 'unique': 200, 'uris': 188, 'miss': 12, 'playlist_id': '26nUTzCCG31rgFFOYNCddD'}\n  {'id': 'smooth_radio', 'ok': True, 'plays': 1890, 'unique': 200, 'uris': 197, 'miss': 3, 'playlist_id': '5gUbqMiluMlybr4uRfcyVh'}\n  {'id': 'air1', 'ok': True, 'plays': 1670, 'unique': 184, 'uris': 164, 'miss': 20, 'playlist_id': '76bKWN2UZltR2DogSKxjAt'}\n  {'id': 'elmar_50th', 'ok': True, 'plays': 127, 'unique': 126, 'uris': 126, 'miss': 0, 'playlist_id': '54SCyu91qV22Nro3pkUI3T'}\n  {'id': 'elmar_liked', 'ok': True, 'plays': 980, 'unique': 200, 'uris': 200, 'miss': 0, 'playlist_id': '2IDid3uuhzwkk869oRqo0x'}\n","started_at":"2026-06-06T02:00:18.462301+02:00","status":"completed","task_id":"home-radio-scrape","task_name":"Home Radio nightly scrape + Spotify playlist refresh"}],"runs_limit":20,"schedule":"0 2 * * *","schedule_label":{"description":"Daily at 02:00","is_custom":false,"label":"Daily","sort":4,"sort_time":"02:00"},"stats":{"avg_duration":97.480093125,"completed":8,"failed":0,"timeout":0,"total":8},"task":{"_description":"**OVERRIDES runtime profile:** uses Spotify Web API + onlineradiobox HTTP scrape directly because it does not invoke the `claude` CLI.\n\nNightly 04:00 SAST (02:00 UTC). Scrapes the last 7 days of plays for every station in `stations.yaml` from onlineradiobox.com, dedupes by (artist, title), resolves to Spotify URIs (lexical-similarity gate, cached in `scrape.db`), then replaces the contents of one playlist per station on the Spotify house account.\n\nPhase 1 of the Home Radio project. Phase 2 will add day-part mood mixers; Phase 3 the HA scheduler/state-machine; Phase 4 the MC dashboard.\n\nCurrently running against the personal `conrelma` Spotify account because the HA-managed `econ` (HEOS-bound) refresh token was revoked. Switch back to econ once the Spotify integration is reconfigured in Home Assistant (Settings \u2192 Devices \u2192 Spotify \u2192 econ \u2192 reconfigure), then update `state/house_token.json` from `/config/.storage/core.config_entries`.","_file":"home-radio-scrape.md","_path":"/home/lucienne/workspace/tasks/home-radio-scrape.md","command":"cd /home/lucienne/workspace/projects/home-radio && python3 scrape.py 2>&1 | tail -40","enabled":true,"id":"home-radio-scrape","notify_on":"failure","notify_to":"general","retry":false,"run_as":"shell","runtime_profile":"direct_spotify","schedule":"0 2 * * *","tags":["home-radio","spotify","scrape","music","nightly"],"timeout":1800,"title":"Home Radio nightly scrape + Spotify playlist refresh"}}
