v1.1.3: livePlaybackJson 내부 meta/live 도 패치 (cosmetic UI only)
발견: live-detail 의 outer boolean (timeMachineActive, timeMachinePlayback) 두 개를 true 로 만들어도 재생바가 안 뜸. 외부 자료 (jaesung9507/nvver playback.go) 확인 결과, 플레이어는 livePlaybackJson 내부의 meta.liveRewind / meta.duration / live.timeMachine 을 보고 UI 를 결정함. 이 필드들은 omitempty 라서 DVR ON 일 때만 응답에 존재. 수정: - patchLiveDetailData 에서 livePlaybackJson 을 파싱해 meta.liveRewind=true, meta.duration 보강 (1h 기본), live.timeMachine=true 주입 후 재직렬화. - 깨진 live-playback-json 외부 호출은 이전 커밋에서 이미 제거됨. 근본적 한계 (README 에 명시): - 이건 cosmetic 패치다. CDN 의 DVR window 는 스트리머가 타임머신을 켰을 때만 서버가 프로비저닝하므로, 스트리머가 꺼둔 라이브는 HLS 매니페스트에 과거 segment 자체가 없음. 재생바가 떠도 실제 seek 은 동작 안 할 가능성 높음. - live-playback-json 엔드포인트가 timeMachine-off 채널에서 404 인 것도 같은 이유. Streamlink/ChzzkDownloader 도 timeMachineActive 일 때만 부름. - 진짜 force-timemachine 은 서버 사이드(CDN) 의 결정이라 클라이언트에서 근본적으로 우회 불가. manifest 버전 1.1.2 → 1.1.3, README 한계 명시.
This commit is contained in:
@@ -79,6 +79,33 @@
|
||||
content.timeMachineActive = true;
|
||||
content.timeMachinePlayback = true;
|
||||
|
||||
// 내부 livePlaybackJson 의 meta/live 도 같이 패치한다. 플레이어는 외부 boolean
|
||||
// 두 개만 보는 게 아니라, livePlaybackJson 을 파싱해 meta.liveRewind / meta.duration /
|
||||
// live.timeMachine 을 확인해서 seekbar UI 여부를 결정한다.
|
||||
// (참고: jaesung9507/nvver playback.go 의 Meta/Live 구조체. liveRewind/duration 은
|
||||
// omitempty 라서 DVR ON 일 때만 존재함)
|
||||
//
|
||||
// 한계: 이건 어디까지나 UI 만 켜는 cosmetic 패치다. CDN 의 DVR window 는 스트리머가
|
||||
// 타임머신을 켰을 때만 서버가 프로비저닝하므로, 실제 segment 가 과거 시점에 존재하지
|
||||
// 않아 seek 자체는 동작하지 않을 수 있다 (재생바가 떠도 누르면 live edge 로 튕김).
|
||||
try {
|
||||
const raw = content.livePlaybackJson;
|
||||
const pb = typeof raw === 'string' ? JSON.parse(raw) : raw;
|
||||
if (pb && typeof pb === 'object') {
|
||||
pb.meta = pb.meta || {};
|
||||
pb.meta.liveRewind = true;
|
||||
if (typeof pb.meta.duration !== 'number' || pb.meta.duration <= 0) {
|
||||
pb.meta.duration = 3600; // 1h. 진짜 길이는 CDN 이 정함.
|
||||
}
|
||||
pb.live = pb.live || {};
|
||||
pb.live.timeMachine = true;
|
||||
content.livePlaybackJson = typeof raw === 'string' ? JSON.stringify(pb) : pb;
|
||||
log('inner livePlaybackJson meta/live patched (liveRewind, duration, timeMachine)');
|
||||
}
|
||||
} catch (e) {
|
||||
log('inner livePlaybackJson patch failed', e);
|
||||
}
|
||||
|
||||
// 진단용: live-detail content 와 livePlaybackJson 디코딩 결과를 통째로 덤프.
|
||||
// 플레이어가 어느 필드를 보는지 모를 때 켜서 들여다보는 용도.
|
||||
// 활성화: devtools 콘솔에서 `localStorage.setItem('chzzk-bypass:debug','1')` 후 새로고침.
|
||||
|
||||
Reference in New Issue
Block a user