20b56905ec2bb7f9f941dbf7d085fe48892a239c
WeightedShuffle is implemented for classic schedule items only, and every other engine mishandles an order it doesn't know *silently*: PlaylistEnumerator has no default arm so the item is dropped from the playlist; BlockPlayoutBuilder filters block items against an allow-list and `continue`s past the rest; YAML and Scripted return None, which their callers' foreach reads as "no content". A weighted order degrading to unweighted random or to nothing is the worst failure mode here, because the output is supposed to look arbitrary — nobody would notice. Rather than change those shipped fallbacks (a real defect class, but pre-existing and wider than this feature — filed separately, non-goal here), this closes the new exposure at the write path: ReplacePlaylistItems and ReplaceBlockItems reject WeightedShuffle with an error naming where it is available. If it can't be persisted where it isn't handled, the silent sites never see it. Defence in depth for the two engines that address orders by name: YAML and Scripted now log a warning when a parsed order falls through unhandled, so an empty schedule explains itself. Enum.Parse accepts "weightedShuffle" the moment the value exists, so the gate above can't cover them. EnumeratorForContent becomes an instance method to reach the logger. ProgramScheduleItemCommandBase lists WeightedShuffle explicitly as valid for multi collections — it already passed by falling through the switch, and implicit-by- omission is how this subsystem grew its silent paths. Core.Tests: 558 passed, 0 failed. Refs #70 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ci(406): disable swap on the capped mysql; fix peak-step placement and failure mode [decisions-edit]
Merge pull request 'chore(deps): update dependency humanizer.core to 3.0.10' (#328) from renovate/humanizer-monorepo into main
ErsatzTV
ErsatzTV lets you transform your media library into a personalized, live TV experience - complete with EPG, channel scheduling, and seamless streaming to all your devices. Rediscover your content, your way.
How It Works
- Install ErsatzTV: Download and set up the server on your system.
- Add Your Media: Connect your media libraries and collections.
- Create Channels: Design and schedule your own live channels.
- Stream Anywhere: Watch on any device with IPTV and EPG support.
Key Features
- Custom channels: Create and schedule your own live TV channels.
- IPTV & EPG: Stream with IPTV and Electronic Program Guide support.
- Hardware Transcoding: High-performance streaming with hardware acceleration (NVENC, QSV, VAAPI, AMF, VideoToolbox)
- Media Server Integration: Connect Plex, Jellyfin, Emby and more.
- Music & Subtitles: Mix music videos and enjoy subtitle support.
- Open Source: Free, open, and community-driven project.
Documentation
Documentation is available at ersatztv.org.
License
This project is inspired by pseudotv-plex and the dizquetv fork and is released under the zlib license.
