| … | … | @@ -533,7 +533,7 @@ TV_GENRES = [ |
| 533 | 533 | |
| 534 | 534 | MANIFEST = { |
| 535 | 535 | "id": "org.tabertron.vsembed", |
| 536 | | "version": "0.8.1", |
| 536 | "version": "0.8.2", |
| 537 | 537 | "name": "Tabertron VsEmbed", |
| 538 | 538 | "description": "Self-hosted HLS extractor with TMDB browse + search, played via vidcore", |
| 539 | 539 | "types": ["movie", "series"], |
| … | … | @@ -1072,15 +1072,27 @@ def _append_vidcore_row(out: list, kind: str, ident: Optional[str], |
| 1072 | 1072 | _prefetch_vidcore(kind, ident, season, episode) |
| 1073 | 1073 | except Exception as exc: # never let a warm-up break /stream |
| 1074 | 1074 | log.warning("vidcore prefetch could not start: %s", exc) |
| 1075 | | # Auto first, fixed heights under it -- the two paths trade off against each |
| 1076 | | # other and neither is strictly better yet: |
| 1077 | | # Auto -> inputstream.adaptive. Seek and resume work (ffmpeg ignores a |
| 1078 | | # seek on these fMP4 segments: 50% -> 1.2%, vs ISA 50% -> 14:07) |
| 1079 | | # but audio is currently silent through Jacktook. |
| 1080 | | # fixed -> bare ffmpeg. Audio works, seek does not. |
| 1081 | | # Until the ISA audio problem is solved, offering only Auto would mean |
| 1082 | | # offering only a silent stream, so the working path stays one click away. |
| 1083 | | for height in (VIDCORE_AUTO, *VIDCORE_HEIGHTS): |
| 1075 | # Fixed variants only. The adaptive row is NOT offered: inputstream.adaptive |
| 1076 | # cannot play this CDN's audio, and the cause is in the media, not in how we |
| 1077 | # ask for it. Measured 2026-08-10 by pulling a segment and probing it: |
| 1078 | # |
| 1079 | # init-s1080p-v1-a1.mp4 -> index=0 h264 video |
| 1080 | # index=1 aac audio 48000Hz 2ch (real audio, |
| 1081 | # mean_volume -32.0dB, max -14.7dB) |
| 1082 | # |
| 1083 | # Video and audio are MUXED into one fMP4 track set. ISA builds its stream |
| 1084 | # list from the manifest CODECS ("avc1...,mp4a..."), so it reports two |
| 1085 | # streams and opens the aac decoder from that metadata, but its HLS fMP4 |
| 1086 | # reader only feeds the first track -- the audio stream gets no samples, |
| 1087 | # which is the "CVideoPlayerAudio::Process - stream stalled" line, and the |
| 1088 | # result is perfect video with no sound. ffmpeg demuxes the container itself |
| 1089 | # and gets both tracks, which is why the fixed rows have audio. |
| 1090 | # |
| 1091 | # The cost is seek: ffmpeg accepts a seek on these segments and ignores it |
| 1092 | # (request 50%, stay at 1.2%), while ISA seeks correctly. On this source the |
| 1093 | # two are mutually exclusive, and audio wins. Seek needs a source that is not |
| 1094 | # muxed fMP4 HLS -- a progressive MP4 (vidlink) seeks natively under ffmpeg. |
| 1095 | for height in VIDCORE_HEIGHTS: |
| 1084 | 1096 | out.append(_stream_dict( |
| 1085 | 1097 | _vidcore_row(request.host, kind, ident, season, episode, height=height))) |
| 1086 | 1098 | |