なまけもの

備忘録

【2018/10~】Avgleの動画をダウンロードする(Python)

simple.hatenablog.jp

概要

Pythonで、Avgleの動画をダウンロードできるスクリプトを書いてみる。

注意

Avgleには有償著作権物のアップロードもある。それらをダウンロードすることは違法であり、「2年以下の懲役もしくは200万円以下の罰金、またはこれの併科」になる。

目次

環境

ソフトウェア

  • Windows 7 64bit
  • Python 3.7 (64bit)
  • ffmpegを利用できる環境
  • Avgleからm3u8ファイルをダウンロードできる環境

ハードウェア

  • 特になし

スポンサードリンク

コード

基本的に上からコピペしていけば動くようになるはず。
C:\sample\avgle_downloader.pyファイルとします。

宣言部分

import argparse        # 引数を使用するのに必要
import os
import urllib.request  # Webアクセスに必要
import subprocess      # ffmpegを実行する際に必要

m3u8ファイルから動画のURLを取得する

def get_video_urls(file_path):
    """
    Parameters
        file_path : m3u8ファイルのフルパス
    Returns
        video_urls : tsファイルのURLのリスト
    """
    video_urls = []
    # m3u8を開き"https://"の行を集める
    with open(file_path) as f:
        video_urls = [line.strip() for line in f if "https://" in line]
    return video_urls

動画をダウンロードする

def download_videos(video_urls):
    """
    Parameters
        video_urls : tsファイルのURLのリスト
    Returns
        file_list : ダウンロードした一時ファイル名のリスト
    """
    # Webアクセスの準備
    opener = urllib.request.build_opener()
    opener.addheaders = {
        ("Origin", "https://avgle.com"),
        ("Accept-Encoding", "gzip, deflate, br"),
        ("Accept-Language", "ja,en-US;q=0.9,en;q=0.8"),
        ("Accept", "*/*"),
        ("Referer", "https://avgle.com/video/"),
        ("Connection", "keep-alive")
    }
    urllib.request.install_opener(opener)

    file_list = []
    for i, video_url in enumerate(video_urls):
        print("Downloading : " + video_url)
        file_list.append("tmp_{:0>10}.ts".format(str(i)))
        urllib.request.urlretrieve(video_url, file_list[i])    # 動画をダウンロード

    return file_list

ffmpegで動画を結合する

def exec_ffmpeg(file_name, file_list):
    """
    Parameters
        file_name : 結合後のファイル名
        file_list : 結合するtsファイル名の一覧
    """
    # ffmpegに渡すListファイルを作成
    with open("DLlist.txt","w") as f:
        for line in file_list:
            f.write("file '{}'\n".format(line))

    result = subprocess.check_output(["ffmpeg.exe",    # ffmpgeのフルパスを記述する
                                      "-f",
                                      "concat",
                                      "-safe",
                                      "0",
                                      "-i",
                                      "DLlist.txt",
                                      "-c",
                                      "copy",
                                      file_name + ".mp4"
                                      ])
    print(result)

main

if __name__ == "__main__":
    # 引数を利用する準備
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "file_path",
        help="m3u8 file path",
        type=str,
        default=None
    )
    parser.add_argument(
        "folder_path",
        help = "folder path",
        type = str,
        default = "C:\\Users\\~\\Downloads"
    )                    
    args = parser.parse_args()

    os.chdir(args.folder_path)

    # 動画をダウンロードする
    file_list = download_videos(get_video_urls(args.file_path))

    # 中間ファイルを結合する
    exec_ffmpeg(os.path.splitext(os.path.basename(args.file_path))[0], file_list)

    # 中間ファイルを削除する
    for file in file_list:
        os.remove(file)

実行

以下のコマンドでスクリプトを実行できる。
python C:\sample\avgle_downloader.py <m3u8ファイルのフルパス> <保存フォルダ>

Avgleのm3u8ファイルの期限は短い。1日持たないと思う。
urllib.error.HTTPError: HTTP Error 403: Forbiddenが発生したら、再度m3u8をDLしスクリプトを実行してみるといいかも。


以上。