AiPE
1. Laftel Downloader 구상 및 관련 법령 조사 본문
1. Laftel Downloader 구상 및 관련 법령 조사
Oshimaker 2023. 2. 1. 21:12국내 애니 스트리밍 서비스 플랫폼인 라프텔에서 영상을 다운받을 수 있는 라프텔 영상 다운로더를 개발해보려고 한다.
https://laftel.net/
laftel.net
1. 개발 목표
제목 그대로 라프텔의 영상을 .mp4파일로 다운로드 해 "소장" 하는 것이 목표이다.
영상을 단순히 소장만 하고 혼자 즐길거지, 누구한테 나눠줄 생각은 절대 없다.
2. 이론적인 방법론
먼저 가능한 이론적인 방법을 제시해보겠다.

- 모든 언어는 Python을 기반으로 하려고 한다. 필요에 따라 부분 부분 다른 걸 쓸수도 있지만 일단은 최대한 Python만으로 끝내보려고 한다.
- 라프텔 크롬 플레이어에서 자막(Caption이라고 표시되더라)을 껐다 켰다 할 수 있는 것으로 보아 라프텔 서버에서 받아 오는 영상자체에는 자막이 포함되어 있지 않다. 따라서 우리가 서버측에 요청에서 받아오는 영상에도 자막은 없다. 자막 파일은 따로 다운로드 해서 나중에 합치자. 자막은 꼭 라프텔이 아니라 다른 사이트에서 받아와도 된다.
- 라프텔 서버와 클라이언트의 통신은 MPEG-DASH를 이용한다. 뭔지 궁금하면 잘 설명해놓은 글이 있으니 참고하자. https://www.cloudflare.com/ko-kr/learning/video/what-is-mpeg-dash/
- MPEG-DASH 방식에서는 서버가 클라이언트에게 영상 전체의 정보를 담고 있는 마스터파일인 init파일 1개와 영상 조각인 segment파일 수십~수백개를 보낸다. segment파일의 이름은 seg-1.m4s seg-2.m4s ~~ seg.239.m4s 이런식이다. segment파일이 있더라도 init파일이 없으면 정상작동하지 않는다.
- 라프텔은 MPEG-DASH 중에서도 원본 파일을 init.mp4와 segment.m4s파일로 쪼개는 방식을 이용한다. 이론상 이 파일들을 어떻게 다 합쳐주면 원본 파일로 변환할수 있다. (다른 예시로는 .. 카카오TV가 init.m4s파일과 segment.m4s로 쪼개는 방식을 이용한다.)
- 크롬 개발자도구(F12)에 보면 Network탭에서 파일을 확장자별로 분류할 수 있다. .m4s파일의 개수는 영상의 길이에 따라 다르다. 23분가량의 영상은 239개, 52분 가량의 영상은 528개이다. 다행인 것은 같은 시리즈는 방영 시간이 거의 비슷해서 개수 변동이 거의 없다는 것이다.
- init파일이 m4s형식이 아니라 mp4형식으로 제공되는데, segment파일과 init파일의 확장자가 달라서 골치아프다
- Network탭에서 하나의 Element를 클릭하면 우측 탭에서 Request URL을 확인할 수 있다. 이 Request URL은 클라이언트가 서버에 해당 Element를 요청할 때 쓰는 URL이다. 이 Reuqest URL을 이용해 엘리멘트를 직접 다운받을 수 있다.

- 다운로드는 curl명령어를 사용하겠다. 윈도우 cmd에서 사용할 수 있고, 파이썬에서는 os.system("curl url")의 형태로 동작시킬 수 있다.
- 다운받은 init과 segment를 합치는 것은 ffmpeg라는 인코딩 툴을 이용할 생각이다. 아직은 ffmpeg에 대한 이해가 부족해서 여러 가지 실험해 보고 확실히 되는 방법을 찾아야 한다.
- 소리 없는 비디오인 full_video.mp4와 오디오 파일인 full_audio.m4s파일을 합친다. .mp4비디오에 .m4s오디오는 별도 인코딩 없이 입혀지는 것 같은데 이것도 실험해봐야 한다. 이후 어딘가에서 구해온 자막 파일을 합친다. 자막 파일은 따로 보관하고 싶을 수도 있어서 합칠지 말지 사용자가 결정하게 하려고 한다.
- 이후 최종 영상을 제외한 작업에 사용했던 모든 파일 (init.mp4 segment.m4s 등등)을 삭제하고 최종 영상 파일 이름을 설정한다.
이 방법은 약간의 수정을 거치면 라프텔 뿐만 아니라 MPEG-DASH 중 init.mp4와 segment.m4s 로 파일을 조각내 송신하는 모든 사이트에 적용할 수 있겠다. 하나 만들어놓으면 다른 사이트의 다운로더를 제작하는 것도 쉬워질 것이다.
3. 관련 법령 조사
*법에 대해서는 공부해나가는 중입니다. 틀린 내용이 있다면 차차 수정해가겠습니다.
일단 라프텔에서의 영상은 아래의 두 가지 형태로 나뉜다.
1. 광고를 시청하면 무료로 끝까지 볼 수 있게 해주는 형태
2. 멤버쉽 가입을 요구하는 형태 ㅡ 멤버쉽이 없으면 전반 3분만 시청 가능함. 그 뒤로는 시청이 불가능.
라프텔 모바일 앱에는 자체적으로 다운로드 기능을 지원한다. 물론 완전한 형태의 다운로드는 아니고 라프텔 앱 내장 플레이어만으로 재생이 가능한 형태로 다운로드 된다. PC에서는 라프텔 다운로드를 지원하지 않는다.
3.1.
1번 형태의 경우 애초에 광고비를 받고 모든 이에게 무료로 스트리밍 하는 것이기에, 유튜브 등의 플랫폼과 동일한 취급이 가능하다.
| 공표된 저작물을 개인 소장용으로 복제하는 행위는 저작권 침해에 해당하지 않는다. 타인의 저작물을 이용하기 위하여는 원칙적으로 저작재산권자에게 이용 허락을 받아야 한다. (저작권법 제46조). |
이 경우, 영상을 다운로드 하여 소장하는 것은 형사상 처벌을 받지 않는다. 이 영상을 유포하거나 영리 목적으로 쓰지 않으면 된다. 라프텔 다운로더의 목적은 어차피 애니메이션을 우리가 소장하는 것이기 때문에 1번 형태의 영상에 대해서는 위법성이 없다.
3.2.
2번 형태의 경우 해당 영상을 다운로드 할 경우 위법일 가능성이 상당히 높다. 라프텔 멤버쉽을 통해 제공되는 영상은 광고가 없으므로, 이를 멤버쉽이 없는 상태에서 다운로드 한다면 수익에 영향이 가기 때문에 문제가 생길 것이다. 실질적인 처벌이 어찌어찌 안 되더라도 라프텔 측에서 문제 제기를 할 가능성이 굉장히 높다. 여기에서의 문제 제기는 "고소" 보다는 "메일을 통한 경고"나 "IP차단"에 가까울 듯.
눈치가 빠른 사람은 앞의 이론적인 방법에 대한 설명을 듣고 깨달았겠지만, "3분 무료보기"라는 시스템이 존재하는 한 로그인 없이 멤버쉽 전용 영상 다운이 가능할 확률이 있다. 물론 단순히 curl명령어만으로 다운이 될 것 같지는 않고, 브라우저의 쿠키 설정 등 여러가지를 신경써야겠지만, 미로그인 상태에서도 Request URL 자체를 알아내는 데는 문제가 없기 때문에 가능성은 열려있다.
멤버쉽 전용 영상을 다운하려고 요청하면 어떻게 될 지 조금 더 조사해보아야겠다.
3.3
만약 라프텔 멤버쉽을 구매한 후 원래는 비공개였던 다운하면 어떨까? 이 경우는 1번 경우와 같은 이유로 형사처벌을 받지 않을 것이라고 "예상한다." 물론 라프텔 측에서 정책위반으로 IP차단을 먹일 수는 있다. 속도 조절을 잘 해가면서, 혹은 VPN을 사용해 다운 받는 것이 안전해 보인다.
저작권법은 저작권자가 고소를 해야 처벌이 가능하다. 우리는 어차피 라프텔 측 서버에서 정보를 받아오는 것이기 때문에 라프텔은 우리가 정보를 빼가고 있다는 것을 알 수 밖에 없다. 따라서 라프텔 측에서 문제제기를 할 가능성도 충분하다고 생각한다.
실제로 모 웹툰 사이트에서 웹툰을 다운받다가 일시적으로 IP차단을 먹은 적이 있다. 불법 웹툰 서비스 사이트에서 자기네들 사이트에 올릴 웹툰을 긁어가는 줄 알았던 것 같다. 이런 IP차단을 방지하기 위한 대책으로는, headers정보 똑바로 넣기, 일반 사용자 로딩 속도와 비슷하게 속도 조절 하기 등이 있겠다. 적절한 방법들을 나중에 좀 더 구체적으로 생각해보려 한다.
3.4.
결론적으로, 무료 공개된 영상을 다운하는 것은 형사처벌이 불가능하고, 유료/비공개 영상의 경우 다운하면 문제가 될 수 있다. 안전하게 하고 싶으면 멤버쉽을 구매하자.
기업이 개인을 상대로 얼마나 강경대응할지는 모르겠지만, 라프텔 다운로더를 만들어놓은 사람이 아무도 없는 것으로 보아 어느 정도 대응을 하리라 생각할 수 있다. 이 글도 라프텔측에서 문제삼을 수도 있겠다.
4. 개발 계획
일단 앞의 FlowChart에 나온 대로 순서대로 만들 생각이다.
내가 생각하기에 고생할 만한 포인트는 4가지이다.
- Request URL을 파이썬으로 어떻게 읽어들일 것인가? Selenium을 좀 다루어 봤지만 개발자도구에 접근하는 방법은 들어본적이 없다.
- 영상 길이마다 매번 다른 .m4s개수를 어떻게 처리할 것인가? 개수가 일정하면 for in range(1, 240)으로 돌리려고 했는데 길이가 매번 달라서야 원 .. 영상 길이를 인식하는 코드를 짜야 하나?
- init.mp4와 segment.m4s의 서로 다른 포맷을 합치는 곳에서 상당히 고생할 듯 하다. 파일 분할 방식에 대해 좀 더 심도깊게 공부해서 이해해야 할 듯.
- 크롬 개발자도구 Network탭에 유명한 자막 파일 형식은 .vtt .srt .smi를 모두 검색해봤는데 아무것도 안 나온다. 자막을 어떻게 다운받아야 하나..
뭐 아무튼 순서대로 만들어보겠다.
'Development Project > Laftel Downloader' 카테고리의 다른 글
| 4. Shaka Packager 분석 및 복호화(Decrypt) 방법 고안 (9) | 2023.02.04 |
|---|---|
| 3.5. 스택 오버플로우 질문 : Not able to merge init.mp4 and seg-*.m4s with ffmpeg and python due to its file format difference 번역 (0) | 2023.02.04 |
| 3. m4s파일과 init.mp4 ffmpeg로 병합하기 (3) | 2023.02.01 |
| 2. 크롬 개발자 도구 Network Request URL 파이썬으로 받아오기 (4) | 2023.02.01 |