diff --git a/README.md b/README.md index dcfb2b0..d1e9384 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ localStorage.setItem('chzzk-bypass:debug', '1') ``` manifest.json 확장 정의 (MV3) content.js 그리드 우회 (UA / platform / UA-CH 위장) -timemachine.js 타임머신 강제 활성화 (fetch 후킹) +timemachine.js 타임머신 강제 활성화 (fetch + XHR 후킹) popup.html/css/js 툴바 팝업 icons/ 확장 아이콘 ``` @@ -86,7 +86,7 @@ icons/ 확장 아이콘 - `[chzzk-bypass:timemachine] hooks installed (fetch + XHR)` — 후킹 성공 - `[chzzk-bypass:timemachine] XHR live-detail intercepted for ` — XHR 가로채기 진입 - `[chzzk-bypass:timemachine] forcing timeMachine ON for ` — 패치 적용 -- `[chzzk-bypass:timemachine] livePlaybackJson swapped for DVR manifest` — 매니페스트 교체 성공 +- `[chzzk-bypass:timemachine] inner livePlaybackJson meta/live patched (liveRewind, duration, timeMachine)` — 내부 매니페스트 메타 패치 성공 ## 면책 diff --git a/timemachine.js b/timemachine.js index 5b6b60e..9875eb1 100644 --- a/timemachine.js +++ b/timemachine.js @@ -1,17 +1,23 @@ -// 치지직 라이브 응답을 가로채 타임머신 기능을 강제로 활성화한다. -// 스트리머가 타임머신을 꺼둔 방송에서도 플레이어에 되감기(seek) UI 를 표시하고, -// 가능하면 DVR 매니페스트(URL) 까지 함께 갈아끼워 실제 되감기도 동작하도록 만든다. +// 치지직 라이브 응답을 가로채 타임머신 되감기 UI 를 강제로 노출시키는 cosmetic 패치. // // 동작 원리 // - 치지직 웹 플레이어는 `api.chzzk.naver.com/service/v3.2/channels/{id}/live-detail` -// 응답의 `content.timeMachineActive` / `content.timeMachinePlayback` 플래그 두 개로 -// 되감기 UI 노출 여부를 결정한다. -// - 같은 채널의 `live-playback-json` 엔드포인트는 DVR 가능한 HLS 매니페스트 URL 을 -// 항상 돌려준다. ChzzkDownloader 의 `--stream force-timemachine` 옵션이 쓰는 -// 바로 그 엔드포인트다. -// - 따라서 `live-detail` 응답을 가로채서 (1) 두 플래그를 강제로 true 로 만들고, -// (2) `livePlaybackJson` 안의 매니페스트 URL 을 `live-playback-json` 응답으로 -// 교체하면, 스트리머 설정과 무관하게 되감기 UI 와 실제 seek 동작 모두 살아난다. +// 응답의 `content.timeMachineActive` / `content.timeMachinePlayback` 두 플래그와, +// 같은 응답에 박혀 있는 `content.livePlaybackJson` (JSON 문자열) 안의 +// `meta.liveRewind`, `meta.duration`, `live.timeMachine` 필드 조합으로 +// 되감기(seek) UI 노출 여부를 결정한다. +// - 따라서 `live-detail` 응답을 가로채서 (1) 두 플래그를 true 로 만들고, +// (2) 내부 `livePlaybackJson` 의 meta/live 를 보강해 다시 직렬화하면 플레이어가 +// seek 바 UI 를 그리게 된다. +// +// 한계 (중요) +// - 이건 UI 만 켜는 cosmetic 패치다. 실제 DVR window 자체는 CDN 이 스트리머의 +// 타임머신 설정에 따라 서버-사이드에서만 프로비저닝하므로, 스트리머가 꺼둔 +// 라이브에서는 과거 segment 가 존재하지 않아 실제 seek 은 동작하지 않을 가능성이 +// 매우 높다. 자세한 내용은 README 참고. +// - 별도로 `live-playback-json` 엔드포인트를 fetch 해서 매니페스트를 갈아끼우는 +// 로직은 두지 않는다. 해당 엔드포인트는 스트리머가 타임머신을 켜둔 채널에서만 +// 200 을 돌려주고, 꺼둔 채널에서는 404 라 의미가 없다. // // 치지직 React 앱은 axios 기반이라 실제 요청은 `XMLHttpRequest` 로 나가고, 일부 경로는 // `fetch` 도 쓴다. 그래서 두 경로 모두 후킹한다.