簡単!ABEMA無料放送動画をyt_dlp&pythonでダウンロードする方法

簡単!ABEMA無料放送動画をyt_dlp&pythonでダウンロードする方法 ソフトウェア

pythonからyt_dlpを動かしてアベマの「無料ビデオ」や「全話一挙配信」などのアニメをダウンロードしてローカル保存することができる簡単なスクリプトを書きました。

複数話を一気に繋げてダウンロードしたり、1話ごと別ファイルにして保存したり、任意のフォルダ内に好きな名前を付けて保存することもできる使い勝手の良いものとなりましたので備忘録として紹介&解説します。

1、必要なものをインストール

pythonとyt_dlpが必要です。

まずPython3.10をインストール & パスを通す

当方で動作確認が取れているのはPython3.10.7のためそれをインストールしていますが、多分バージョンを合わせなくても大丈夫です。

Pythonがまだインストールされていない方は以下の手順に従ってPythonをWindowsにインストールしてください。

PythonのインストールとPATHへの追加が終わっている前提で次に進みます。

あとは必要なモジュール「yt_dlp」をpip installコマンドでインストールしていきます。

次に「yt_dlp」をpipでインストール

コマンドプロンプトにコマンドをコピペしてエンターキーを押してください。

コマンドプロンプトはWindowsキーを押した後、「cmd」と打ち込みエンターキーを押すと起動できます。

管理者権限は不要です。

Youtubeダウンローダー「yt-dlpをインストールします。
(なおyoutube-dlは遅いので勧めません。yt-dlpが完全上位です。10倍以上高速!!)

pip install yt-dlp

あとはスクリプトをコピペするだけでアベマ動画がダウンロードできます。

ダウンロードできなくなったらアプデしよう

pip install --upgrade yt-dlp

動画を落とせなくなった場合、上記コマンドを用いて配信サイト側の変更に対応するアプデを行います。

2、コピペOKなスクリプト ABEMA動画をダウンロード

その1、一挙放送を話数ごとに分割せずダウンロードする版

全話一挙を文字通り全話そのまま単一の動画ファイルとして保存するスクリプトです。

ファイル数が増えるとWindowsのエクスプローラでファイル一覧を表示するのが遅くなるので、私は基本こっちを重宝してます。

どこまで見たか分からなくなるというデメリットがあるので、再生位置を記憶するMPC-BEのような動画再生ソフトを使用するのがおすすめです。

コード コピペOK

コピペして「abemadl.py」とか名前を付けて実行して下さい。

"""Abema DL"""
import yt_dlp

dl_pass = "C:/Users/loveanime/Desktop/test/"
url = input("動画URL( 例:https://abema.tv/channels/special-plus-7/slots/A3Kx2MG9vYv3bm) : ")
title = input("動画タイトル : ")
URLS = url
ydl_opts = {
    "format": "best",
    "outtmpl": dl_pass + title + ".%(ext)s",
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    error_code = ydl.download(URLS)

動作 操作方法など

まず動画URLを入力してエンターします。

適当な動作確認には「abema.tv放送済み無料ビデオ一覧」で好きな動画を選んでください。

無料 あとn日間」と表記されていればダウンロードできます。

そして動画タイトルを入力してエンターキーを押すと、ダウンロードが開始されます。

大体100Mbps=25MB/sくらいでダウンロードが進みました。

通信環境はこのくらいで土曜の16時での速度です。

FHD画質の1クールで5,6分といったところですね!

このように正常に保存されました。

ちなみにダウンロードの最中にフォルダを除くと、並列でダウンロードしてるっぽい様子が伺えます。

m3u8ファイルの結合をしているだけかもしれませんが…

もろもろの設定 保存先や画質の変更

dl_pass = "C:/Users/loveanime/Desktop/test/"

ここを変更して好きな場所に動画を保存します。

"format": "best",

最高品質の動画をダウンロードする設定にしていますが、多分低画質でOKみたいな設定もできます。

なお最高品質以外に興味がないので調べていません…

ちなみにアベマアニメの最高品質は基本的にFHDのようです。

その2、話数ごとにファイルを分けてダウンロードする版

たま〜に、およそ20作品に1つの割合で、全話一挙のURLからダウンロードできない場合があります。

こっちのスクリプトでダウンロードに失敗したことはありません

全話一挙のURLからダウンロード出来ない時は、それぞれの話数ごとのURLを用いたダウンロードをする必要があるのでこっちを使います。

もちろん普段からこっちのスクリプトを使用しても良いんですよ⁈

アベマのURLの特徴

アベマのアニメは、話数ごとのURLに規則性があるので、URL入力の手間は先程紹介した「全話を単一の動画ファイルとして保存するスクリプト」と変わりません。

つまり話数ごとに動画ファイルを分けてダウンロードする際も1回URLを入力するだけでOK

具体的には、アベマのアニメには
「https://abema.tv/video/episode/106-1zxpewrca-r_s0_p1」
のような形で単話ごとのURLが与えられています。

帰納法的な推測ですが、個別再生画面のURLは以下のような構成です。

「https://abema.tv/video/episode/ランダムな数列_sα_pβ

  • α=season(第1期なら0か1)
  • β=part(第1話なら1)

αは1期でもs0とs1が混在しているので作品ごとに手入力することにしました。
(例えば鬼滅1期はs1で、ユーフォニアム1期はs0です。)

コード(今回は2つのpyファイルを使用する構成にしました)

  1. ダウンロード対象のURLをtemp.txtに保存するスクリプト
  2. 作成されたtemp.txtの情報を元にダウンロードを行うスクリプト

この2つ構成でないと連続ダウンロードできませんでしたOrz

備忘録として1つのスクリプトにまとめようとした試行錯誤の失敗談↓を載せときます。

例えば第1話の個別話のURLが
「https://abema.tv/video/episode/106-1zxpewrca-r_s0_p1」で第2話
「https://abema.tv/video/episode/106-1zxpewrca-r_s0_p2」…
と続けば誰でもfor i in range(1,13):したくなりますよね。

しかし!!!
yt_dlpとアベマの相性が悪いのか、連続して2つ以上のURLを対象にダウンロードを行うと、最初の1つしかダウンロードできません。
必ずこのエラーになります。

ERROR: unable to download video data: <urlopen error unknown url type: abematv-license>

以下の方法で複数話連続でダウンロードしようとしましたが失敗しました。

  • ダウンロード処理部分をmain()で囲んで for i in range(n): で動かす
  • URLをtemp.txtを作成して保存したうえで「os.execl(sys.executable, sys.executable, *sys.argv)」で自身を再起動させてみる

だから2つのスクリプトを用意するはめに……

コードその1ダウンロード対象のURLをtemp.txtに保存するスクリプト

適当にcreate_setting.pyとか名前を付けて保存してください。

"""Create ABEMA DL setting"""
def settei_nyuryoku_no_henkan(line_num):
    """指定行目を読み込む。文字列をリターン"""
    with open(temp_file_name, mode="r", encoding="UTF-8") as f:
        l_strip = [s.strip() for s in f.readlines()]
        text = l_strip[line_num]
        return text

def sitei_line_uwagaki(line_number, write_sentence):
    """ファイル名、行数を指定。その行に上書きしたい文字列を記述して。"""
    with open(temp_file_name, mode="r", encoding="utf-8") as file:
        text_list = file.readlines()
    text_list[line_number] = str(write_sentence)
    with open(temp_file_name, mode="w", encoding="utf-8") as file:
        file.writelines(text_list)

dl_pass = "C:/Users/loveanime/Desktop/test/"
temp_file_name = "temp.txt"
url = input("動画URL : ")
url_after = url.partition("_")[0]

title = input("動画タイトル : ")
season = input("シーズン(s0なら「0」) : ")
start_wasu = input("第何話からダウンロードをしますか? : ")
with open(temp_file_name, mode="w", encoding="UTF-8") as f:
    f.write(f"{title}\n{season}\n{start_wasu}\n{url_after}\n")  # ダウンロード設定ファイル作成

使い方はコードその2のあとに書きます。

実行するとダウンロードしたい動画のタイトルやURLなどが記録されたtemp.txtを同じディレクトリに作成するスクリプトです。
詳細は後述。

コードその2 作成されたtemp.txtの情報を元にダウンロードを行うスクリプト

temp.txtの内容に従いダウンロードを実行するスクリプトです。

適当にabemadl.pyとか名付けて保存してください。

"""Abema DL"""
import yt_dlp

def setting_input(line_num):
    """指定行目を読み込む。文字列をリターン"""
    with open(temp_file_name, mode="r", encoding="UTF-8") as f:
        l_strip = [s.strip() for s in f.readlines()]
        text = l_strip[line_num]
        return text

def line_rewrite(line_number, write_sentence):
    """ファイル名、行数を指定。その行に上書きしたい文字列を記述して。"""
    with open(temp_file_name, mode="r", encoding="utf-8") as file:
        text_list = file.readlines()
    text_list[line_number] = str(write_sentence)
    with open(temp_file_name, mode="w", encoding="utf-8") as file:
        file.writelines(text_list)

def main():
    title = setting_input(0)
    season = setting_input(1)
    wasu = setting_input(2)
    url_after = setting_input(3)
    filename = f"{title} 第{wasu}話"  # 例:「ゆるゆり 第1話」
    url_after_after = f"{url_after}_s{season}_p{wasu}"

    line_rewrite(2, f"{str(int(wasu) + 1)}\n")  # 次の1話をダウンロードするように設定ファイル書き換え

    URLS = url_after_after
    ydl_opts = {
        "format": "best",
        "outtmpl": f"{dl_pass}{filename}" + ".%(ext)s",
    }
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        error_code = ydl.download(URLS)

dl_pass = "C:/Users/loveanime/Desktop/test/"
temp_file_name = "temp.txt"
main()

これ単体では動きません。

先程のコードその1が作ったtemp.txtと合わせることで動作します。

使いかた

1,コードその1を実行

質問に答えていくと設定ファイル「temp.txt」に記入されていきます。

「temp.txt」はコードその1のスクリプトと同じディレクトリに作成されます。

中身はこの通り。

2,コードその2を話数と同じ数だけ実行

2話以上を連続でダウンロードすると生じるエラー回避のため、ユーザーはコードその2のスクリプトを連打で話数分多重起動します
(エレファントな解法)

ダウンロード実行の度に自動で「temp.txt」も書き換わり、p1→p2p3...と順番に次話のダウンロードを行います。

実行結果。

ちなみに話数以上の回数実行しても、無効なURLということで例外が発生してスクリプトが起動後即終了するだけなのでご安心ください。

重複ダウンロードが発生したり既存の動画が上書きされたりはしません。

別のシリーズの動画をダウンロードしたい時は再びコードその1のスクリプトを起動して、「temp.txt」の書き換えを行います。

もろもろの設定 保存先や画質の変更

dl_pass = "C:/Users/loveanime/Desktop/test/"

ここを変更して好きな場所に動画を保存します。

"format": "best",

最高品質の動画をダウンロードする設定にしていますが、多分低画質でOKみたいな設定もできます。

なおアベマアニメの最高品質は多分FHD画質です。

それではよいアベマライフを!!

このサイトのPython関連記事

今回のスクリプトは全てVSCodeを使用して、便利な拡張機能たちに助けられながら作成しました。

私が常用しているおすすめの拡張機能を布教しておきます。

pythonの制作物一部を紹介

タイトルとURLをコピーしました