hiyamgyyy

学生がやったことのメモとかいろいろ

YouTubeチャンネルの動画を自動で全保存してみよう

先日、僕が応援する某アイドルのシンガーソングライター名義でのYouTubeチャンネルが大人の事情で削除されるかもしれないという情報を聞きつけ、消される前に動画を全保存しなければ。という使命感に駆られました。
また最近では、そのアイドルグループのMVやライブ映像もメジャーデビューに先駆け(?)削除されたり、静岡朝日SunsetTVで配信されている僕が好きなコンテンツの「Aマッソのゲラニチョビ」がプロデューサーの逮捕により全削除されたりと(現在は一部復活)、YouTube上の動画もいつ見れなくなるかわからない状況です。

Clipboxとかの既存ダウンロードツールもありますが、一つ一つやるの億劫なので自動化しようと思い、そのメモです。

こちらを参考にさせていただきました。
PythonでYoutubeの動画をダウンロードするまで(2017/11/30現在)


私的利用のためのダウンロードであり、再配布やアップロードなどの法的悪用をするつもりはありませんのでご留意ください。

YouTubeチャンネルの動画リスト抽出

YouTube Data API (v3)のSearch APIを用いることでキーワード検索やチャンネル検索などいろいろできました。
公式ドキュメントにサンプルコードがあったので、そのまま流用。
https://developers.google.com/youtube/v3/code_samples/python#search_by_keyword

パラメータにChannelIDを指定するだけで、そのチャンネルから投稿された動画をlistで返してくれます。


ChannelIDは
https://www.youtube.com/channel/XXXXXXXXX
のXXX部分に該当します。


また、一回のリクエストで50件しか取得できない問題があるので、それ以上動画投稿してるチャンネルとかだと繰り返し処理する必要があります。
search APIを投げた際に指定した件数(maxResults)以上の件数動画が存在する場合はnextPageTokenというパラメータが帰って来るので、リクエストパラメータのpagetokenに指定して再帰的に処理することで全件取得しました。

この辺はこちらを参考にしました。500件以上だとできない問題あるらしいけど今回僕の対象はそこまで動画が多くないので今は無視。
YouTubeの特定のチャンネルに紐付く動画を取得する。(YouTube Data API (v3) Search)

from apiclient.discovery import build
from oauth2client.tools import argparser

DEVELOPER_KEY = "自分のキー"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
ChannelId = "UC7MyccaiE4MYa9ERzqZYY4Q" #チャンネルID
videos = [] #videoURLを格納する配列

def youtube_search(pagetoken):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    developerKey=DEVELOPER_KEY)

  search_response = youtube.search().list(
    # q=options.q,
    part="snippet",
    channelId= ChannelId,
    maxResults=50,
    order="date", #日付順にソート
    pageToken=pagetoken #再帰的に指定
  ).execute()


  for search_result in search_response.get("items", []):
    if search_result["id"]["kind"] == "youtube#video":
      videos.append(search_result["id"]["videoId"])

  try:
      nextPagetoken =  search_response["nextPageToken"] #nextPageTokenが返ってくる限り処理を繰り返す
      youtube_search(nextPagetoken)
  except:
      return

YouTube動画の保存

Pythonにはpytubeというモジュールがあり、これがURLを引数に指定するだけで保存してくれる超優れものだったので使用しました。
ネット環境にも依存しますが、5分の動画を30秒くらいで保存してくれるのでまじ速い。もっと早く使えばよかったと思いました。

from pytube import YouTube

def save_video(search_list):
    for ID in search_list:
        query = 'https://www.youtube.com/watch?v=' + ID
        print(query+"を保存")
        yt = YouTube(query)
        yt.streams.filter(subtype='mp4').first().download("./videos")


これらを実行すると、

https://www.youtube.com/watch?v=PhYT-_l2lMkを保存
https://www.youtube.com/watch?v=Ty0J4YL9BwYを保存
https://www.youtube.com/watch?v=zBrA2nztpu8を保存
・
・
・

みたいに自動でチャンネル内全ての動画がローカルに保存されます。やったね。

最後に

僕は在宅時代、このシンガーソングライターさんのYouTube動画を見て、ライブ反省会と題した動画の中で自らのことをいちいちブスだの可愛いだのと一喜一憂する姿がとても人間味があって面白い人だなと感じ、彼女が所属するアイドル現場に足を運ぶきっかけとなりました。
このご時世YouTubeなどによる影響力はものすごいし、無料コンテンツながらもバタフライエフェクト的に経済を回していると思います。ですので、素晴らしい動画コンテンツが大人の事情で削除されるのは非常に勿体無いなぁと思いつつ、今回自動ダウンロードを試みました。
法律に詳しくないのでYouTubeなどの無料コンテンツは私的利用のためのダウンロードなら可能という認識ですが、間違っていたらご指摘ください。