Implement Discontinuity Index for Live Streaming Enhancements
ci / build-backend (push) Successful in 2m17s
ci / build-frontend (push) Successful in 53s
ci / tests (push) Successful in 1m39s
ci / sonar (push) Failing after 1m23s

Added a DiscontinuityIndex property to ScheduleEntry and related DTOs to track the cumulative number of discontinuities in live streaming. Updated the LiveWindowCalculator to utilize this index for generating accurate EXT-X-DISCONTINUITY-SEQUENCE values, ensuring compatibility with ffmpeg-based players. Enhanced the WriteEntriesAsync method to calculate and persist the discontinuity index during entry creation. Updated relevant tests and documentation to reflect these changes, improving the reliability of live streaming functionality.
This commit is contained in:
Leonid Pershin
2026-08-04 12:43:35 +03:00
parent 7a164dbd90
commit 0f609db4e9
16 changed files with 1851 additions and 26 deletions
+10
View File
@@ -162,6 +162,16 @@ BuildLiveWindow(расписание, филлер, now, windowSegments, segment
UTC; локальный пояс показывает фронтенд. Раздача встык — типичный случай без филлера; филлер
подставляется только при пустом расписании.
**`EXT-X-DISCONTINUITY-SEQUENCE` обязателен.** Плейлист — скользящее окно, и когда тег
`EXT-X-DISCONTINUITY` уезжает за его верхний край, плеер должен по-прежнему знать абсолютный номер
текущей склейки. Без него ffmpeg-based клиенты (Jellyfin) сбивают счёт и встают на стыке серий (в
браузере hls.js терпим и пересчитывает сам). Считать число склеек от эпохи на каждый запрос нечем —
поэтому накопительный номер склейки `DiscontinuityIndex` **материализуется на каждой записи**
планировщиком (`WriteEntriesAsync`, продолжая счёт от уцелевшего хвоста: смена ассета +1, разрыв во
времени с филлером +2). Калькулятор берёт номер записи первого сегмента окна и «отматывает» его назад
по тегам `EXT-X-DISCONTINUITY` внутри окна — так один и тот же физический сегмент сообщает один и тот
же `DISCONTINUITY-SEQUENCE` на каждой перезагрузке.
**Плеер возвращается к живому краю сам.** Окно короткое, а вкладка в фоне живёт по другим правилам:
браузер душит таймеры, hls.js не успевает тянуть сегменты, видео доигрывает буфер и встаёт. Пока
зритель не смотрит, окно уходит вперёд на сколько угодно — и, вернувшись, он увидел бы программу,