막 올라온 인코딩 중인 다시보기의 m3u8값은 잘 가져오는데
이미 인코딩이 끝난 다시보기의 m3u8값은 가져오지 못하는 현상에 대해 찾아보며 기록

인코딩 중인 다시보기의 경우 개발 도구로 Network 내의 Fetch/XHR을 살펴보면
vod_playlist.m3u8?...와 vod_chunklist.m3u8 파일이 있다.

이전에는 chunklist.m3u8의 requestURL을 복사해서 사용했었는데 yt-dlp -g로 해당 링크의 m3u8값을

다시 가져와 봤을 때 가져오는 링크값이 달라서 살펴보니

 

vod_playlist.m3u8(마스터 플레이리스트) 파일의 Preview를 살펴보면 아래처럼 있다.

 

이 중 가장 아래쪽을 보면 1080p/... 이렇게 있는 부분이 있다. 이 값을 playlist.m3u8의 Request URL 값 중

 

.../vod_playlist.m3u8 <-이 부분을 지우고 넣어주면 같은 결과값을 낼 수 있다.

https://light-slit.akamaized.net/chzzk/kr/live_rewind/c/live_rewind_kr/chauhkzgqntkkw7rt505sgok5u6owe/1080p/hdntl=exp=1781781359~acl=*%2fkr%2f*~data=hdntl~hmac=c37fcd3cb4d22f2aca877e17a58476e4d46e9d5900a2b3f4d1ea0212ac97756e/vod_chunklist.m3u8

ㄴ대략 이런 형태.

 

playlist.m3u8이 RequestURL값도 막 인코딩이 시작한 참이면 값이 다를 수 있는데, 이 땐

https://api.chzzk.naver.com/service/v2/videos/(비디오 id)

 

위 api 값 내의 hls 링크를 확인해보면 될 듯.

 

그래서 왜 이미 인코딩이 끝난 다시보기의 m3u8값은 못가져오는가에 대한 부분인데..

인코딩이 끝난 다시보기는 방금 쓴 api 링크로 들어갔을 때, hls 링크가 따로 없다.

대신 inKey 값이 있는데. yt-dlp 내의 chzzk.py 내부를 살펴봤을 때,

 

def _real_extract(self, url):
        video_id = self._match_id(url)
        video_meta = self._download_json(
            f'https://api.chzzk.naver.com/service/v3/videos/{video_id}', video_id,
            note='Downloading video info', errnote='Unable to download video info')['content']

        live_status = 'was_live' if video_meta.get('liveOpenDate') else 'not_live'
        video_status = video_meta.get('vodStatus')
        if video_status == 'ABR_HLS':
            formats, subtitles = self._extract_mpd_formats_and_subtitles(
                f'https://apis.naver.com/neonplayer/vodplay/v1/playback/{video_meta["videoId"]}',
                video_id, query={
                    'key': video_meta['inKey'],
                    'env': 'real',
                    'lc': 'en_US',
                    'cpl': 'en_US',
                })

 

이런 부분이 있다. 위의 링크에서 비디오 메다데이터를 받아온 후 이를 이용해 아래 api 링크를 완성시키는 듯 한데.

테스트용 영상에서 개발자도구를 활용해 Request URL을 확인해보니 같은 형태의 api 링크를 들어갔을 때 m3u8 데이터를

포함한 값들을 제대로 출력하는 것을 확인했다. 그렇다면 문제는 이 부분에서 해당 api 링크를 제대로 생성시키지 못하고 있는

가능성이 있어보인다. 또는 해당 api 내에서 값을 받아온 뒤 처리하는 부분의 문제거나.

 

테스트 해보니 링크에서 데이터 값은 제대로 가져오는 것을 확인했다. 데이터의 값을 처리하는데서 문제가 생긴 듯 하다.

그냥 데이터를 통째로 불러와서 m3u8 링크를 파싱해 가져오도록 수정하니 정상동작은 한다.

문제는 프로그램 자체에 수정이 아닌 따로 다운받은 스크립트 내의 테스트 수정이라 실제 쓰고있는 프로그램에선 적용되지 않는 것..

 

아래는 수정부분 파싱 코드는 ai의 힘을 빌렸다.

if video_status == 'ABR_HLS':
            raw_data = self._download_webpage(
                f'https://apis.naver.com/neonplayer/vodplay/v1/playback/{video_meta["videoId"]}',
                video_id, query={
                    'key': video_meta['inKey'],
                    'env': 'real',
                    'lc': 'en_US',
                    'cpl': 'en_US',
                }, note='XML 데이터에서 m3u8 주소 추출 중...')

            # 2. 정밀 정규식: nvod:m3u="주소" 구조에서 따옴표 안의 주소만 쏙 빼옵니다.
            import re
            # 1080p 해상도 영역에 있는 nvod:m3u 주소를 최우선으로 매칭합니다.
            m3u8_matches = re.findall(r'height="1080"[^>]+?nvod:m3u="([^"]+?\.m3u8[^"]*?)"', raw_data)
            
            # 만약 1080p 조건 지정 매칭이 실패하면, nvod:m3u="주소" 형태 전체 중 첫 번째를 가져옵니다.
            if not m3u8_matches:
                m3u8_matches = re.findall(r'nvod:m3u="([^"]+?\.m3u8[^"]*?)"', raw_data)

            if m3u8_matches:
                # XML 엔티티(&amp;)가 섞여있을 수 있으므로 일반 & 기호로 변환합니다.
                target_url = m3u8_matches[0].replace('&amp;', '&')
                
                self.write_debug(f'[치지직 정밀 픽스] 추출된 m3u8 주소: {target_url}')
                
                # 3. 에러를 뿜던 MPD 파서 대신, 검증된 m3u8 파서에 이 다이렉트 주소를 꽂아줍니다!
                formats, subtitles = self._extract_m3u8_formats_and_subtitles(
                    target_url, video_id, 'mp4', m3u8_id='hls', fatal=False)
            else:
                # 안전장치: 혹시라도 m3u8 주소가 하나도 안 뽑히면 원래 순정 코드로 돌려보냅니다.
                formats, subtitles = self._extract_mpd_formats_and_subtitles(
                    f'https://apis.naver.com/neonplayer/vodplay/v1/playback/{video_meta["videoId"]}',
                    video_id, query={
                        'key': video_meta['inKey'],
                        'env': 'real',
                        'lc': 'en_US',
                        'cpl': 'en_US',
                    })

 

 

실제 프로그램이 정상 작동 하려면 그냥 업데이트 기다려야 할둣

반응형

'IT > buglog' 카테고리의 다른 글

치지직 방송 처음 시작 시 에러  (0) 2025.04.27
[Unity] 애니메이션 동작 문제..  (0) 2025.03.16

+ Recent posts