検索

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

注意:しばらく運用してみたら全然cronに実行されてないようです。原因が全くわからないので知ってる方いたらツイッターに連絡ください。ファイル名にドットはいれていません(githubの奴には付けてるけどね)。

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 
Code language: PHP (php)

使い方

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

ビリビリ動画用

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

メインの処理

<pre class="wp-block-luxe-blocks-syntaxhighlighter line-numbers language-bash"><code class="language-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 </code></pre>
Code language: Bash (bash)

動画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]))
Code language: Python (python)

使い方

README.md読んでどうぞ。