유튜브 채널 또는 재생목록에 신규 항목이 있을 경우 자동으로 다운로드 하는 방법을 다룬다.

흐름은 아래와 같다.
- 유튜브 채널/재생목록의 rss 주소 생성
- flexget이 rss 감시 / 분석 / youtube-dl 실행
- youtube-dl이 flexget이 알려준 주소의 동영상을 다운로드

이 글은 Flexget과 youtube-dl이 이미 설치되어 있다고 생각하고 작성한다.


1. 유튜브 채널 rss 주소 찾기

평소 사용하는 rss 앱에 유튜브 채널 주소를 입력하면 rss가 등록되는 것을 보고 신기해서 찾아보니 유튜브가 자체적으로 rss 피드를 해주더라. 왜 구글은 rss 링크를 웹페이지에 꺼내놓지 않을걸까? 

유튜브 rss 주소는 아래처럼 생겼는데, 주소만 봐도 자체 설명이 된다. 

https://www.youtube.com/feeds/videos.xml?channel_id=채널ID값

그렇다. rss로 구독할 채널의 채널ID값만 알면된다.


채널ID값을 얻는 것도 그리 어렵지 않다. 유튜브 채널의 기본 페이지에 접속하면, 웹 브라우저의 주소표시줄에 채널ID값이 노출되기 때문이다. 채널의 기본 페이지라고 함은 동영상 링크가 아닌 유튜브 웹페이지에서 채널명을 클릭해서 접속되는 페이지를 말한다. 설명이 좀 자신이 없는데, 아래 예시의 주소로 접속해보고 직접 이해하시라.

여기서 channel/ 이후의 UC7-AfAX_aDvwmFy4sg4h3GQ 가 바로 채널ID값이다. 이 부분을 복사한 후 앞서 적어둔 유튜브 rss 주소의 빠진 부분을 메워주자.



2. 유튜브 재생목록 rss 주소 찾기

재생목록 rss 주소는 아래처럼 생겼고, 역시나 주소만 봐도 자체 설명이 된다. playlist가 우리말로 뭐? ㅎㅎㅎ

https://www.youtube.com/feeds/videos.xml?playlist_id=재생목록ID값


재생목록ID값은 어떻게 얻을까? 그렇다. 채널ID값을 얻을 때와 마찬가지로 재생목록의 기본 페이지에 접속해서 주소를 따오면 된다. 역시 기본 페이지는 재생목록의 제목을 클릭했을 때 연결되는 페이지를 말한다. 아래 예시의 주소로 접속해보고 어떤 페이지를 말하는지 터득하시라.

https://www.youtube.com/playlist?list=PL-zWPkHCq3SQiJPXgBpGFpzPzMlmDbES6



list= 이후의 PL-zWPkHCq3SQiJPXgBpGFpzPzMlmDbES6 부분이 바로 재생목록ID값이다. 복사한 후 유튜브 재생목록 rss 주소의 빠진 부분을 채워주자.



3. FlexGet 설정

아래와 같이 task를 하나 추가해준다. 빨간색 부분은 수정해주자.

  youtube:
    inputs:
      - rss: https://www.youtube.com/feeds/videos.xml?playlist_id=PL-zWPkHCq3SQiJPXgBpGFpzPzMlmDbES6
    accept_all: yes
    exec:
      auto_escape: yes
      on_output:
        for_accepted: "youtube-dl -f 'bestvideo[ext=mp4][height<=1080]+bestaudio[ext=m4a]/best[ext=mp4]/best' --merge-output-format mp4 -o '/다운로드 디렉토리/%(title)s - %(upload_date)s.%(width)sx%(height)s.%(ext)s' {{url}}"

즉,
- youtube라는 task를 하나 만들었고,
- 이 task의 input은 방금 만든 rss 주소
- 필터는 accetp_all 즉, rss에 들어있는 모든 것에 대하여 exec를 실행
- exec의 내용은 필터에서 accept된 {{url}}을 youtube-dl로 넘겨줌
- youtube-dl은 {{url}의 동영상을 다운받는데, 영상 품질은 다음 세 단계로 선택한다.
  단계1: 비디오 전용 포멧 중 최고품질(세로해상도는 최대 1080p까지)과 최고품질 오디오를 각각 다운후 합침
           이 때 컨테이너는 mp4
  단계2: 단계1 실패 시(비디오/오디오 파일이 각각 업로드되지 않은 경우) mp4 확장자 중 최고품질
  단계3: 단계2 실패 시(mp4 확장자가 등록되지 않은 경우) 모든 확장자 중 최고 품질
  파일명은 "제목 - 업로드 날짜.가로해상도x세로해상도.확장자"



4. FlexGet 응용 - Metadata 이용하기

실은 youtube-dl만으로도 재생목록을 통째로 받을 수 있고, 일부 메타데이터를 이용해서 파일명을 구성할 수 있으며, 다운로드 내역을 기록해 두었다가 추가된 영상만 받을 수 있기 때문에 youtube-dl을 주기적으로 실행하는 것 만으로도 영상을 자동으로 받는 것 까지 모두 구현 가능하다. 즉, 어지간해서는 궂이 FlexGet을 거칠 필요가 없다는 것.

FlexGet을 사용하는 유일한 의미는 rss의 데이터를 가공할 때 있다. 아래 예시에서는 날짜 형식을 youtube-dl 기본 옵션인 20170814 가 아닌 s2017e0814로 바꾸는 내용이다. 물론 정규표현식을 이용하여 제목을 정리하는 것이 본 목적인데, 이건 예를 들기가 어렵다. ^^


for_accepted: youtube-dl -f 'bestvideo[ext=mp4][height<=1080]+bestaudio[ext=m4a]/best[ext=mp4]/best' --merge-output-format mp4 -o '/다운로드 디렉토리/{{rss_pubdate|re_replace('^(\\d{4})-(\\d{2})-(\\d{2}) .*','s\g<1>e\g<2>\g<3>')}} - %(title)s - %(width)sx%(height)s.%(ext)s' {{url}}

기본 예시와는 달리 동영상을 "sYYYYeMMDD - 제목 - 가로해상도x세로해상도.확장자"로 저장해준다.
{{rss_pubdate|re_replace('^(\\d{4})-(\\d{2})-(\\d{2}) .*','s\g<1>e\g<2>\g<3>')}} 부분이 핵심.

sYYYYeMMDD 라는 날짜 형식은 좀 뜬금 없지만, PLEX에 쉽게 등록하기위한 꼼수이니 PLEX를 사용하지 않는 분들은 그냥 그러려니 하자.


참고로 FlexGet에서 유튜브 rss를 통해서 생성한 엔트리는 아래와 같다.

title            : Get Curious
url              : https://www.youtube.com/watch?v=egdHV0m2pXI
original_url     : https://www.youtube.com/watch?v=egdHV0m2pXI
accepted_by      : accept_all
author           : VisitSweden
description      : “That’s when I knew we were friends”. Explore the forest through child eyes. Meet the boy who became friends with the white reindeer, and in that found a stronger relationship with his father. See kids explore nature through curiosity and play. Learning about the rules of nature, how to take care of it and sparking imagination and thoughts about clouds, ants and the water, otherwise difficult to dream up.
guid             : yt:video:egdHV0m2pXI
quality          : unknown
rss_pubdate      : 2016-10-25 13:24:47
task             : youtube

빨간색으로 표시한 부분이 좀 건드려볼만하지 않을까?