一つのYoutubeチャンネルから再生回数TOP10を一括ダウンロード

Qiitaへの初投稿です。
基本的に私の備忘録も兼ねて使う予定です。
まだPython勉強中なのでコードに関して突っ込みなどあればご指摘お願いします。

また、著作権などに関しては私的使用の範囲であれば可能という認識ですが、何か問題があった場合は指摘してください。

# 下準備

まずは、https://console.cloud.google.com/にアクセスしてプロジェクト作成、ライブラリからYoutube Data APIを有効化、認証情報(APIKey)の追加。

次に、Youtube Data APIを使うにあたって必要になるライブラリのインストール、動画の保存に当たって必要になるYoutube_DLのインストール。

```
pip install google-api-python-client
pip install youtube-dl
```
# コード

インストールできたら、まずライブラリのインポートと各変数への代入です。

```Python
from apiclient import discovery
import youtube_dl

DEVELOPER_KEY = "" # ここにAPIKey
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
ydl_opts = {
   'format': 'bestaudio/best',
   'postprocessors': [
       {'key': 'FFmpegExtractAudio',
       'preferredcodec': 'mp3',
        'preferredquality': '192'},
       {'key': 'FFmpegMetadata'},
   ],
} # youtube-dlでダウンロードする動画を音楽に変換する
```

もし音楽ではなく動画をダウンロードしたい場合はytdl_optsを空にすればOKです。

次に、チャンネルで最も多く再生されている動画のURLを0-10まで取得。

```Python
def youtube_search(channelId):
 videos = [] # URLを入れるリスト
 youtube = discovery.build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
   developerKey=DEVELOPER_KEY)

 search_response = youtube.search().list(
   part="snippet",
   channelId= channelId,
   maxResults=10,
   order="viewCount",
 ).execute() # APIでチャンネルを指定したうえで再生回数順に１０件動画検索をかける
 
 for search_result in search_response.get("items", []):
   if search_result["id"]["kind"] == "youtube#video":
     print("https://www.youtube.com/watch?v=" + search_result['id']['videoId'])
     videos.append(search_result["id"]["videoId"]) # videosにURL追加

 return videos
```

ちなみに検索数はmaxResults=0-50まで任意で指定できます。

最後にリストに入っているURLの動画すべてをダウンロード

```Python
def download_video(video_list):
 for i, videoId in enumerate(video_list): # インデックス番号と要素を同時に回す
   # ydl_opts['outtmpl'] = "music{}".format(str(i)) + '.%(ext)s' # もし再生回数順ををわかりやすくしたい場合はここの#を外せばmusic0-10.mp3(mp4)としてダウンロードできます
   ydl = youtube_dl.YoutubeDL(ydl_opts)
   ydl.extract_info("https://www.youtube.com/watch?v={}".format(videoId), download=True)

# ytdl_opts=...の部分はファイル名の形式を表しています。

#を消せばmusic[0-10].mp3(mp4)の形式でダウンロードできます。
```

# 最後
そのままコード実行して使える形

```Python
from apiclient import discovery
import youtube_dl

DEVELOPER_KEY = "YOUR_API_KEY" # ここにAPIKeyを入れてください
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
ydl_opts = {
   'format': 'bestaudio/best',
   'postprocessors': [
       {'key': 'FFmpegExtractAudio',
       'preferredcodec': 'mp3',
        'preferredquality': '192'},
       {'key': 'FFmpegMetadata'},
   ],
} # youtube-dlでダウンロードする動画を音楽に変換する

def youtube_search(channelId):
 videos = [] # URLを入れるリスト
 youtube = discovery.build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
   developerKey=DEVELOPER_KEY)

 search_response = youtube.search().list(
   part="snippet",
   channelId= channelId,
   maxResults=10,
   order="viewCount",
 ).execute() # APIでチャンネルを指定したうえで再生回数順に１０件動画検索をかける
 
 for search_result in search_response.get("items", []):
   if search_result["id"]["kind"] == "youtube#video":
     print("https://www.youtube.com/watch?v=" + search_result['id']['videoId'])
     videos.append(search_result["id"]["videoId"]) # videosにURL追加

 return videos

def download_video(video_list):
 for i, videoId in enumerate(video_list): # インデックス番号と要素を同時に回す
   # ydl_opts['outtmpl'] = "music{}".format(str(i)) + '.%(ext)s' # もし各動画の再生回数順をわかりやすくしたい場合はここの#を外せばmusic0-10.mp3としてダウンロードできます
   ydl = youtube_dl.YoutubeDL(ydl_opts)
   ydl.extract_info("https://www.youtube.com/watch?v={}".format(videoId), download=True)

if __name__ == '__main__':
 channel = input("チャンネルIDを入力してください：")
 videos = youtube_search(channel)
 download_video(videos)
 print('ダウンロードが完了しました。')
```

この記事はここまでです。ありがとうございました。