본문 바로가기

게임, 트위치

치지직 동영상,클립 다운로드

치지직 동영상 다운로드 하는 법을 인터넷에 찾아보니

https://chzzk-vod.streamlit.app/

 

치지직 VOD 다운로더

This app was built in Streamlit! Check it out and visit https://streamlit.io for more awesome community apps. 🎈

chzzk-vod.streamlit.app

위와 같은 사이트에서 제공해준다. 라이브 스트리밍을 브라우저에서 열면 .ts 파일 형식으로 다운받아지는데 나는 url을 입력하면 자동으로 mp4 full download link를 어떻게 제공할 수 있는지에 대해서 알지는 못한다. 일단 위의 사이트를 이용하는 방법으로 풀 영상을 다운로드 받는 걸로 하자.

 

수동 클립을 따려면, 구조는 https://codingwhale.tistory.com/entry/아프리카tv-동영상-다운로드

 

아프리카tv 동영상 다운로드

이 글에서는 아프리카tv의 동영상 컨텐츠들의 영상 전부, 혹은 일부 시간대만 지정해서 다운로드 받는 방법을 소개한다. TwitchLink 라는 프로그램이 지금까지 찾아본 오픈소스 중에서는 가장 깔끔

codingwhale.tistory.com

때와 똑같다.

요즘은 발로란트를 가끔 하니까 발로란트 동영상을 기준으로 설명해보겠다. 브라우저에서 여느 때와 비슷하게 개발자 도구 열고, 검색창에 .ts 같은 것으로 검색해주면

치지직 개발자도구 화면캡처

위와 같이 재생이 진행됨에 따라서 partial 동영상 파일들이 로드되는 것을 알 수 있는데, 메타데이터를 저장하고 있는 m3u8파일의 주소는 다음과 같이 알 수 있다. partial 파일의 주소를

https://b01-kr-naver-vod.pstatic.net/glive/c/read/v2/VOD_ALPHA/glive_2024_03_08_3/hls/5745ec46-dcdc-11ee-9330-a0369ffdac64-000002.ts?_lsu_sa_=6d2581ffe1e165361ad615fc6615bcb48e8b3fc8320e3f9337b7b0c2a77933c5ac2ffa8e67f56e0420e636c29f356b529bcbb3f347a3105b2a992b3cc68b66a8e876891cbd2c8076db6dd256d29b9f7320277634dc7d2ae479c09298618ce7ca9f41c4474d3d46e3f27fafde75c4a2646383cb42e2f4d25a00c1b2fae386ba0c

로 예를 들면 

https://b01-kr-naver-vod.pstatic.net/glive/c/read/v2/VOD_ALPHA/glive_2024_03_08_3/hls/5745ec46-dcdc-11ee-9330-a0369ffdac64.m3u8?_lsu_sa_=6d2581ffe1e165361ad615fc6615bcb48e8b3fc8320e3f9337b7b0c2a77933c5ac2ffa8e67f56e0420e636c29f356b529bcbb3f347a3105b2a992b3cc68b66a8e876891cbd2c8076db6dd256d29b9f7320277634dc7d2ae479c09298618ce7ca9f41c4474d3d46e3f27fafde75c4a2646383cb42e2f4d25a00c1b2fae386ba0c

와 같이, 동영상 index.ts 된 부분을 지워주고 .m3u8을 붙여주면 된다. 뒤의 _lsu_sa_ 인자가 없으면 제대로 접근이 되지 않는다. 

해당하는 m3u8 파일을 다운받아보면,

m3u8파일 예시

이런 구조를 갖는데, EXTINF 4.000000 이라고 되어있는 부분을 보면 부분 파일들의 영상이 4초씩 잘려있음을 알 수 있다. 동영상 재생이 진행됨에 따라서 4초마다 다음동영상을 로드하는 것이다. 이것을 이용해서 당장은 수동으로 클리핑 할 수 있다. 내가 클립을 따고싶은 부분이 영상의

1시간 30분 35초부터 1시간 50분 0초 까지라고 하면,

start_idx = (1*3600 + 30*60 + 35)//4
end_idx = (1*3600 + 50*60 + 0)//4

니까 start_idx 부터 end_idx의 동영상을 다운받으면 된다. 주소창에 하나하나 넣어서 하지말고, 왠만하면 간단한 스크립트로 짜두도록 하자. 내가 만약 코딩을 모른다면 이 기회에 장난감예시로부터 시작해서 코딩을 배워보자. 소프트웨어 엔지니어는 아니더라도 단순노동을 많이 대체해준다.

 

예시를 들면 아프리카 클립 다운로드 때와 비슷하게 아래와 같은 스크립트를 작성하면 된다. (웹에서 제공하고 구글 애드센스 달면 개꿀일 거 같긴한데.. 아직 계획중에만 있다)

import requests
from tqdm import tqdm
import re

def string_to_time(time_str):
    splitted = time_str.split(':')
    try:
        return (int(splitted[0]), int(splitted[1]), int(splitted[2]))
    except:
        print("Your time format must be Hours:Minutes:Seconds")

def time_to_idx(time_tuple):
    h, m, s = time_tuple
    return (3600 * h + 60 * m + s) // 4

example_url = input("Input partial file example url: ")
start_time = input("Input clip start time: ")
end_time = input("Input clip end time: ")
fname = input("Input output file name: ")

start_idx = time_to_idx(string_to_time(start_time))
end_idx = time_to_idx(string_to_time(end_time))

(comb_start_idx, comb_end_idx) = re.search(r'\d{6}.ts', example_url).span()
general_url_former = example_url[:comb_start_idx]
general_url_latter = example_url[comb_end_idx:]

with open(fname + '.ts', "wb") as ofile:
    for i in tqdm(range(start_idx, end_idx)):
        full_url = general_url_former + f'{str(i).zfill(6)}.ts' + general_url_latter
        print(full_url)
        data = requests.get(full_url).content
        ofile.write(data)

 

위의 스크립트에 example_url은 아까 브라우저에 로드되던 .ts 파일의 이름 중 예시 하나를 입력하면 된다.

example_url = "https://b01-kr-naver-vod.pstatic.net/glive/c/read/v2/VOD_ALPHA/glive_2024_03_08_3/hls/5745ec46-dcdc-11ee-9330-a0369ffdac64-000002.ts?_lsu_sa_=6d2581ffe1e165361ad615fc6615bcb48e8b3fc8320e3f9337b7b0c2a77933c5ac2ffa8e67f56e0420e636c29f356b529bcbb3f347a3105b2a992b3cc68b66a8e876891cbd2c8076db6dd256d29b9f7320277634dc7d2ae479c09298618ce7ca9f41c4474d3d46e3f27fafde75c4a2646383cb42e2f4d25a00c1b2fae386ba0c"

 

 

아 그 참고로 이런 거 처음해보는 사람이면 partial 동영상 주소 브라우저에 그대로 입력했을때 아래와 같은 모습에 당황할 수 있는데,

partial file

그냥 Ctrl + S 누르시면 됩니다.

클립기능 어차피 만들겠지
반응형