{"definition_raw":"---\nid: home-radio-mixer\ntitle: Home Radio day-part mixer (18 mood playlists)\nschedule: \"30 2 * * *\"\ntimeout: 1200\nretry: false\nbackground: true # MC-4942 U8: backgrounded \u2014 long-running, was stalling the tick\nenabled: true\nnotify_on: failure\nrun_as: shell\ncommand: \"cd /home/lucienne/workspace/projects/home-radio && python3 mixer.py 2>&1 | tail -60\"\ntags: [home-radio, spotify, mixer, music, nightly]\nruntime_profile: direct_spotify\nnotify_to: general\n---\n\n**OVERRIDES runtime profile:** uses Spotify Web API directly, does not invoke the `claude` CLI.\n\nNightly 04:30 SAST (02:30 UTC), 30 minutes after `home-radio-scrape` completes. Builds 18 day-part mood playlists from `mood_pools.yaml`:\n\n- `weekday.{late, morning, midday, afternoon, evening, night}`\n- `sat.{...}`\n- `sun.{...}`\n\nFor each bucket: pulls plays in the listed station + hour windows from `scrape.db`, dedupes by URI, excludes URIs the user heard on either Spotify account in the last 12h (`/me/player/recently-played` for econ + conrelma), and applies a freshness boost so tracks present in the prior refresh are downweighted when there are more candidates than the cap. Writes one private playlist per bucket on the econ account.\n\nPer-bucket diff (added/removed/retained URIs) appended to `~/workspace/state/home_radio_operator.jsonl` for visibility into how the rotation is evolving.\n\nPhase 2 of the Home Radio project. Phase 3 (HA scheduler/state-machine) will reference these playlists by bucket and swap them on the house speaker by time-of-day.\n","id":"home-radio-mixer","last_run":{"duration_s":897.308003,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/413218.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1983 candidate URIs\n  excluded 7 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  870 candidate URIs\n  excluded 17 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  450 candidate URIs\n  excluded 12 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  942 candidate URIs\n  excluded 28 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  2089 candidate URIs\n  excluded 32 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1604 candidate URIs\n  excluded 5 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  619 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  177 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  159 candidate URIs\n  wrote 80 (+79 -79 =1) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1429 candidate URIs\n  excluded 24 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  2128 candidate URIs\n  excluded 35 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  627 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  619 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-13T02:30:03.141469+02:00","status":"completed"},"next_run":"2026-06-14 02:30","next_run_iso":"2026-06-14T02:30:00+02:00","runs":[{"duration_s":897.308003,"finished_at":"2026-06-13T02:45:00.450121+02:00","id":413218,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/413218.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1983 candidate URIs\n  excluded 7 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  870 candidate URIs\n  excluded 17 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  450 candidate URIs\n  excluded 12 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  942 candidate URIs\n  excluded 28 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  2089 candidate URIs\n  excluded 32 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1604 candidate URIs\n  excluded 5 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  619 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  177 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  159 candidate URIs\n  wrote 80 (+79 -79 =1) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1429 candidate URIs\n  excluded 24 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  2128 candidate URIs\n  excluded 35 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  627 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  619 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-13T02:30:03.141469+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"},{"duration_s":897.332938,"finished_at":"2026-06-12T02:45:00.435494+02:00","id":409053,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/409053.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1974 candidate URIs\n  excluded 4 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  869 candidate URIs\n  excluded 15 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  450 candidate URIs\n  excluded 11 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  942 candidate URIs\n  excluded 26 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  2069 candidate URIs\n  excluded 36 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1590 candidate URIs\n  excluded 3 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  618 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  177 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  159 candidate URIs\n  wrote 80 (+79 -79 =1) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1424 candidate URIs\n  excluded 21 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  2104 candidate URIs\n  excluded 34 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  623 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  618 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-12T02:30:03.102008+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"},{"duration_s":793.377414,"finished_at":"2026-06-11T02:43:16.600099+02:00","id":404706,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/404706.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1969 candidate URIs\n  excluded 1 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  866 candidate URIs\n  excluded 15 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  449 candidate URIs\n  excluded 7 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  941 candidate URIs\n  excluded 23 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  2053 candidate URIs\n  excluded 28 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1579 candidate URIs\n  excluded 1 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  616 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  177 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  159 candidate URIs\n  wrote 80 (+79 -79 =1) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1420 candidate URIs\n  excluded 21 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  2087 candidate URIs\n  excluded 33 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  619 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  616 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-11T02:30:03.219690+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"},{"duration_s":777.308333,"finished_at":"2026-06-10T02:43:00.604877+02:00","id":400428,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/400428.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1956 candidate URIs\n  excluded 7 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  862 candidate URIs\n  excluded 24 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  449 candidate URIs\n  excluded 12 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  940 candidate URIs\n  excluded 31 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  2027 candidate URIs\n  excluded 37 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1558 candidate URIs\n  excluded 4 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  613 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  177 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  158 candidate URIs\n  wrote 80 (+78 -78 =2) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1415 candidate URIs\n  excluded 28 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  2060 candidate URIs\n  excluded 32 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  612 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  613 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-10T02:30:03.293633+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"},{"duration_s":748.674526,"finished_at":"2026-06-09T02:42:31.658045+02:00","id":396189,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/396189.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1946 candidate URIs\n  excluded 7 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  858 candidate URIs\n  excluded 12 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  446 candidate URIs\n  excluded 12 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  940 candidate URIs\n  excluded 32 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  2006 candidate URIs\n  excluded 41 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1539 candidate URIs\n  excluded 4 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  613 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  177 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  157 candidate URIs\n  wrote 80 (+77 -77 =3) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1411 candidate URIs\n  excluded 27 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  2039 candidate URIs\n  excluded 47 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  608 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  613 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-09T02:30:02.981137+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"},{"duration_s":730.41328,"finished_at":"2026-06-08T02:42:13.482825+02:00","id":392102,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/392102.log","output":"  excluded 11 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  854 candidate URIs\n  excluded 1 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  445 candidate URIs\n  excluded 1 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  936 candidate URIs\n  excluded 15 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  1977 candidate URIs\n  excluded 42 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1516 candidate URIs\n  excluded 8 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  611 candidate URIs\n  excluded 2 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  176 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  157 candidate URIs\n  wrote 80 (+77 -77 =3) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1400 candidate URIs\n  excluded 17 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  2010 candidate URIs\n  excluded 48 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  600 candidate URIs\n  excluded 1 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  611 candidate URIs\n  excluded 2 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-08T02:30:03.066577+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"},{"duration_s":706.455043,"finished_at":"2026-06-07T02:41:49.480330+02:00","id":387668,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/387668.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1914 candidate URIs\n  excluded 5 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  850 candidate URIs\n  excluded 7 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  445 candidate URIs\n  excluded 5 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  934 candidate URIs\n  excluded 23 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  1951 candidate URIs\n  excluded 48 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1498 candidate URIs\n  excluded 4 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  605 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  176 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  156 candidate URIs\n  wrote 80 (+76 -76 =4) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1393 candidate URIs\n  excluded 21 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  1985 candidate URIs\n  excluded 40 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  597 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  605 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-07T02:30:03.022619+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"},{"duration_s":681.756366,"finished_at":"2026-06-06T02:41:24.830546+02:00","id":382943,"log_path":"/home/lucienne/workspace/logs/task-runs/home-radio-mixer/382943.log","output":"\n[weekday.late] sources=['smooth_chill', 'classichits109_70s']\n  1896 candidate URIs\n  excluded 12 recently-played\n  wrote 80 (+80 -80 =0) \u2192 14g3QB1cBRmJOOetwdeIAg\n\n[sat.morning] sources=['977_todayshits', '100hitz_top40', 'hitsradio_nl', 'elmar_50th']\n  846 candidate URIs\n  excluded 17 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UsiWHrxUNo3eHCd9XRITY\n\n[sat.midday] sources=['100hitz_top40', '100hitz_hothitz', '100hitz_alternative', 'elmar_50th']\n  444 candidate URIs\n  excluded 11 recently-played\n  wrote 80 (+80 -80 =0) \u2192 4eGUp3MoCVwIhPUFzVe8HX\n\n[sat.afternoon] sources=['100hitz_themix', 'smooth_radio', '100hitz_90s_alt', 'gotradio_aaa', 'elmar_50th']\n  931 candidate URIs\n  excluded 28 recently-played\n  wrote 80 (+80 -80 =0) \u2192 2tiZfAxioepkS4ZiKdrO7A\n\n[sat.evening] sources=['100hitz_themix', 'classichits109_80s', '100hitz_90s_alt', 'elmar_50th']\n  1927 candidate URIs\n  excluded 30 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3Y8C5IpGVvhEBdXSPHI2JI\n\n[sat.night] sources=['smooth_chill', 'classichits109_70s']\n  1478 candidate URIs\n  excluded 9 recently-played\n  wrote 80 (+80 -80 =0) \u2192 6kawjHd53HgExDH1UoENPp\n\n[sat.late] sources=['smooth_chill']\n  603 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 4eJDXY8oKZvaCGZKagep1x\n\n[sun.morning] sources=['air1']\n  175 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 2TMXYlNjqnxi8YBd27mlWG\n\n[sun.midday] sources=['air1']\n  156 candidate URIs\n  wrote 80 (+76 -76 =4) \u2192 0BbycQqZVh9mvUxPe7JsaO\n\n[sun.afternoon] sources=['smooth_chill', '100hitz_themix', 'smooth_radio']\n  1383 candidate URIs\n  excluded 26 recently-played\n  wrote 80 (+80 -80 =0) \u2192 30xZC1DC6xXYrF32f4QE0a\n\n[sun.evening] sources=['smooth_radio', 'classichits109_80s']\n  1963 candidate URIs\n  excluded 38 recently-played\n  wrote 80 (+80 -80 =0) \u2192 3UZKSUVSKVggdgy5nOi6ij\n\n[sun.night] sources=['smooth_chill']\n  592 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 6YIQs1bDPmZuCECxHb7kMX\n\n[sun.late] sources=['smooth_chill']\n  603 candidate URIs\n  wrote 80 (+80 -80 =0) \u2192 3fgs1gv68S4LTmEmdpB6qi\n","started_at":"2026-06-06T02:30:03.071651+02:00","status":"completed","task_id":"home-radio-mixer","task_name":"Home Radio day-part mixer (18 mood playlists)"}],"runs_limit":20,"schedule":"30 2 * * *","schedule_label":{"description":"Daily at 02:30","is_custom":false,"label":"Daily","sort":4,"sort_time":"02:30"},"stats":{"avg_duration":779.078237875,"completed":8,"failed":0,"timeout":0,"total":8},"task":{"_description":"**OVERRIDES runtime profile:** uses Spotify Web API directly, does not invoke the `claude` CLI.\n\nNightly 04:30 SAST (02:30 UTC), 30 minutes after `home-radio-scrape` completes. Builds 18 day-part mood playlists from `mood_pools.yaml`:\n\n- `weekday.{late, morning, midday, afternoon, evening, night}`\n- `sat.{...}`\n- `sun.{...}`\n\nFor each bucket: pulls plays in the listed station + hour windows from `scrape.db`, dedupes by URI, excludes URIs the user heard on either Spotify account in the last 12h (`/me/player/recently-played` for econ + conrelma), and applies a freshness boost so tracks present in the prior refresh are downweighted when there are more candidates than the cap. Writes one private playlist per bucket on the econ account.\n\nPer-bucket diff (added/removed/retained URIs) appended to `~/workspace/state/home_radio_operator.jsonl` for visibility into how the rotation is evolving.\n\nPhase 2 of the Home Radio project. Phase 3 (HA scheduler/state-machine) will reference these playlists by bucket and swap them on the house speaker by time-of-day.","_file":"home-radio-mixer.md","_path":"/home/lucienne/workspace/tasks/home-radio-mixer.md","background":true,"command":"cd /home/lucienne/workspace/projects/home-radio && python3 mixer.py 2>&1 | tail -60","enabled":true,"id":"home-radio-mixer","notify_on":"failure","notify_to":"general","retry":false,"run_as":"shell","runtime_profile":"direct_spotify","schedule":"30 2 * * *","tags":["home-radio","spotify","mixer","music","nightly"],"timeout":1200,"title":"Home Radio day-part mixer (18 mood playlists)"}}
