youtube-dlをcronと組み合わせて特定のチャンネルを定期的に、指定のディレクトリにダウンロードする

youtubeの特定のチャンネルの動画を全部ダウンロードし、新しく投稿されたらそれのダウンロードも自動化したかったのでスクリプトを組みました。youtube-dlの–download-archiveというオプションとcronを使うことで特に最新の投稿を監視するような処理は不要なので書いてません。

Youtube用

youtube以外も出来るかもしれないですけど試してません。

#!/bin/bash
declare -A list;
list=(
    ["/video/path"]="https://www.youtube.com/user/URL"
)

for i in ${!list[@]};
do
    mkdir -p $i
    youtube-dl -i "${list[$i]}" -o "$i/[%(uploader)s]%(title)s-%(display_id)s.mkv" --download-archive "$i/list.txt" --merge-output-format mkv
done 

使い方

githubのREADME.mdに書いてるので読んでください

ビリビリ動画用

ビリビリ動画でも全部DLしたいチャンネルがあったので専用に処理を書いた。どうもyoutube-dlの現状の仕様だとyoutubeのようにチャンネルの動画一覧のURLを引数に渡しても動いてくれないので、別途pythonでビリビリ動画のapiにアクセスして、チャンネルIDから全部の動画ID抽出し、bash用の配列で標準出力する処理も作った。

メインの処理

#!/bin/bash
declare -A list;
list=(
    ["/video/path"]="12345678"
)
for i in ${!list[@]};
do
    mkdir -p $i
    ID_list=(`python3 ./py/bilibili-list-get.py ${list[$i]}`)
    for j in ${ID_list[@]}; do
        youtube-dl -i "https://www.bilibili.com/video/av$j" -o "$i/[%(uploader)s]%(title)s-%(display_id)s.mkv" --download-archive "$i/list.txt" --merge-output-format mkv
    done
done 

動画ID抽出用のpythonスクリプト

import requests,sys
args = sys.argv
class function_set:
    def getHTML(self,Cid):
        V_list = []
        headers= {"content-type": "application/json"}
        data1 = requests.get(f"http://space.bilibili.com/ajax/member/getSubmitVideos?mid={Cid}&pagesize=1",headers)
        count = data1.json()["data"]["count"]
        data2 = requests.get(f"http://space.bilibili.com/ajax/member/getSubmitVideos?mid={Cid}&pagesize={count}",headers)
        for jd in  data2.json()["data"]["vlist"]:
            V_list.append(jd["aid"])
        return str(V_list).strip("[").strip("]").replace(',', '')
fset = function_set()
print(fset.getHTML(args[1]))

使い方

README.md読んでどうぞ。