PHEXCEL'S BLOG

【2018/06版】curlでAvgleの動画をダウンロードするスクリプト書いた!

8 Comments
PHEXCEL
avgle.jpg
2018/06/04 現在、動作することを確認しています。
2018/06/18 GUIアプリ製作中です。お楽しみに。

独自スクリプトを利用してAvgleの動画を保存する方法をご紹介します。
AvgleではHLS形式(m3u8+ts)の動画ストリーミングを採用しており、Video DownloadHelperなどでは簡単に保存ができません。
以前はffmpegを利用してm3u8からtsを保存する方法がありましたが、現在ではそれは利用できないとのことです。私が確認したところcurlを使えば保存可能であることが判明したので、m3u8ファイルから動画(tsファイル)のURLを読み込み、curlで保存するスクリプト(Python)を書きました。

Windowsの方下の記事を参照してください。

[2018/05版]curlでAvgleのm3u8から動画をDLする(Windows向け) - PHEXCEL's BLOG

今回は、以前、「[2018/05版]curlでAvgleのm3u8から動画をDLできるスクリプト書いた!」で紹介したPythonスクリプトのWindows向けを作ってみました!

iPhoneでも簡単にダウンロードできます。詳しくはこちら

注意! 著作権は遵守すること。

準備

  • Chrome
  • 動画ゲッター(Link
  • Python(標準のPythonでOK)
* 動作確認はMacでのみ行ってます。

m3u8をダウンロード

まず、動画のm3u8ファイルをダウンロードします。m3u8ファイルをダウンロードするにはChromeの拡張機能である「動画ゲッター(Link)」を用いるのが簡単なのでインストールしておきましょう。

実際に動画ページで動画ゲッターのボタンを押すと下図のようにm3u8をダウンロードできます。
m3u8.png

Pythonスクリプトを使って動画を保存 

スクリプト作成

次のスクリプトをコピーし、テキストエディットなどに貼り付けて適当なディレクトリに.py形式でファイルを保存してください(例:m3u8.py)。環境によっては動かない場合もあります。
import argparse
import os
import subprocess

# コマンドライン引数
parser = argparse.ArgumentParser()
parser.add_argument("path",
                    help="m3u8 file path",
                    type=str, default=None)
parser.add_argument("-o",
                    help="Output dir",
                    type=str, default="~/Downloads")
args = parser.parse_args()

# 保存先のディレクトリ作成
file_name = args.path.split('/')[-1].replace('.m3u8', '')
dir = os.path.expanduser(args.o + "/" + file_name)
if not os.path.exists(dir):
    os.makedirs(dir)

# m3u8読み込み
with open(args.path) as f:
    os.chdir(dir)
    i = 0
    for line in f:
        if 'https://' in line:
            line = line.rstrip()
            print("Downloading of " + line)
            # curlを使って動画をDL
            subprocess.call("curl '{}' -H 'Origin: https://avgle.com' "
                            "-H 'Accept-Encoding: gzip, deflate, br' "
                            "-H 'Accept-Language: ja,en-US;q=0.9,en;q=0.8' "
                            "-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4)"
                            "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 "
                            "Safari/537.36' "
                            "-H 'Accept: */*' "
                            "-H 'Referer: https://avgle.com/video/' "
                            "-H 'Connection: keep-alive' --compressed "
                            "-o '{:0>10}_out.ts'".format(line, str(i)), shell=True)
            i += 1

    # catを使ってtsを一つのファイルにする
    subprocess.call('cat *_out.ts > "{}.ts"'.format(file_name), shell=True)
    subprocess.call('rm *_out.ts', shell=True)


スクリプトの実行

次にTerminalで上記スクリプトを実行します。下記の例のようにコマンドを実行すればm3u8ファイルが読み込まれ動画のダウンロードが開始されます。デフォルトでは保存先は「/Users/[ユーザー名]/Downloads」です。
例:
python m3u8.py hogehoge.m3u8 

screenshot.png 

一つ一つのtsファイルが順次ダウンロードされるため長時間の動画ですとかなりの時間がかかります。
なお、動画の保存先を変更する場合は-o引数で保存先のパス(できれば絶対パスで)を指定してください。
例:
python m3u8.py  hogehoge.m3u8 -o /Users/[ユーザー名]/Videos 

Pythonスクリプトの説明

m3u8ファイルに記述されているtsファイルのURLを取得し順次curlでDLするスクリプトです。
curlでは403エラーが出ないようにheaderを指定しています。
最後にすべてのtsが保存されたらcatコマンドで一つのtsに結合し、いらなくなったファイルを削除する処理を行っています。

冗長な処理や稚拙なコードが存在しますので、適宜改変してご使用いただければと思います。

以上、お読みいただいきありがとうございました!

2018/05/28 追記)ソースコード修正しました。
2018/06/04 追記)本文修正しました。

関連記事

Comments 8

There are no comments yet.
名無しさん  
Windows用のスクリプトを書いていただけないでしょうか?

当方windowsユーザーなのですが、curlを導入してみて上のスクリプトを試してみたのですが、
上手く動作しませんでした。

windows用のスクリプトを書いていただけないでしょうか?
宜しくお願いします。

2018/05/16 (Wed) 20:52 | EDIT | REPLY |   
PHEXCEL  
Re: Windows用のスクリプトを書いていただけないでしょうか?

> 当方windowsユーザーなのですが、curlを導入してみて上のスクリプトを試してみたのですが、
> 上手く動作しませんでした。
>
> windows用のスクリプトを書いていただけないでしょうか?
> 宜しくお願いします。

閲覧いただきありがとうございます。
確かにWindowsのコマンドプロンプトだと動作しないと思います。
Windows Subsystem for Linuxを導入すればMacと同様に動作するように思います。
当方Windows機を直ちに用意できないため後日また記事にしたいと思います。
よろしくお願いします。

2018/05/22 追記)下記にWin対応版を公開しました!
https://exq.blog.fc2.com/blog-entry-459.html

2018/05/18 (Fri) 00:54 | EDIT | REPLY |   
名無しさん  
403 が出ます

昨日までこちらのスクリプトを使わせていただいていたのですが、今日になって突然ダウンロードされた ts ファイルが数 KB のファイルになってしまい、元の *.ts ファイル群を確認したところ 403 エラーページがダウンロードされているようでした。
この症状は私だけでしょうか?
大量のファイルをダウンロードしすぎて IP アドレスでブロックされていることも有り得るのでしょうか?
何か対策などあれば教えていただけると幸いです。

2018/05/20 (Sun) 18:46 | EDIT | REPLY |   
PHEXCEL  
Re: 403 が出ます

> 昨日までこちらのスクリプトを使わせていただいていたのですが、今日になって突然ダウンロードされた ts ファイルが数 KB のファイルになってしまい、元の *.ts ファイル群を確認したところ 403 エラーページがダウンロードされているようでした。
> この症状は私だけでしょうか?
> 大量のファイルをダウンロードしすぎて IP アドレスでブロックされていることも有り得るのでしょうか?
> 何か対策などあれば教えていただけると幸いです。

閲覧ありがとうございます。
私の環境でダウンロードを試みましたところ正常にダウンロードできていました。
403エラーが出る理由は不明ですが、curlのuser-agentを変更してみる、Refererを動画のURLに変更するといった対策が思い浮かびます。
たしかに、avgle側でブロックされているかも知れませんので少し時間をおいてみるのもしれません。

2018/05/22 追記)m3u8が古いと403が出るようです。新しくDLし直すと直るかもしれません。

2018/05/20 (Sun) 20:30 | EDIT | REPLY |   
-  
管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

2018/05/31 (Thu) 22:25 | EDIT | REPLY |   
名無しさん  

このブログに書かれている通り、m3u8のファイルをダウンロードし、テキストエディットに上記スクリプトをダウンロードフォルダに[m3u8.py]で保存した後、ターミナルで[python m3u8.py hogehoge.m3u8]のコマンドを入力、実行したところ[python: can't open file 'm3u8.py': [Errno 2] No such file or directory]というエラーメッセージが表示されてしまいました。

恥ずかしながら、コンピュータ初心者でどう解決したらいいか分かりません。誠に勝手ながら、ご教示願いたいです。よろしくお願いします。

2018/05/31 (Thu) 22:33 | EDIT | REPLY |   
PHEXCEL  
Re: タイトルなし

ターミナルのカレントディレクトリがおそらくホームディレクトリ(/Users/[ユーザー名])になっているためスクリプトを参照できないんだと思います。確実に動かすにはスクリプトの絶対パスを指定すれば良いと思います。
例えば「python /Users/[ユーザー名]/Downloads/m3u8.py [m3u8のパス]」のような感じです。
スクリプトファイルをターミナルにD&Dすればスクリプトの絶対パスを簡単に貼り付けできます。
他にはスクリプトをホームディレクトリに移動する、または、「cd ./Downloads」と入力してダウンロードフォルダをカレントディレクトリにするなどの方法が挙げられます。

ご参考になりましたら幸いです。

2018/05/31 (Thu) 22:40 | EDIT | REPLY |   
-  
承認待ちコメント

このコメントは管理者の承認待ちです

2018/06/10 (Sun) 20:48 | EDIT | REPLY |   

Leave a reply