GYAO!の動画をFFmpegでダウンロードする

動画サイトGYAO!がサービス終了する。

誠に勝手ながら、「GYAO!」「GYAO!ストア」「トレンドニュース」は、2023年3月31日(金)午後5時をもちまして、すべてのサービスを終了いたします。
GYAO! サービス終了のお知らせ

終わってしまう前に,気に入った動画を保存しておきたい。FFmpegで保存することができる。全自動でないのである程度は面倒であるが,お気に入りの動画を無劣化でダウンロードできるので利点はある。押さえておくポイントは次の3つ。

  • ダウンロードできる動画とできない動画がある
  • 動画の情報は拡張子が「.m3u8」のファイルに書かれている
  • 映像と音声の2つのストリームがある

これを踏まえたダウンロードの方針は次の通り。

  1. ダウンロードしたい動画のページの中から「.m3u8」を探す
  2. 映像情報は「rendition.m3u8」,音声情報「rendition.m3u8」で同じなので,別名でダウンロード保存する
  3. ダウンロードした映像の形式はTS,音声の形式はAACなので,これを合体させてMP4形式にする

「.m3u8」が検索で出てこない動画はダウンロードできないので諦める。以下のシェルスクリプトを使うと上の手順が簡単になる。スクリプトにはgyao.shなどの好みの名前をつけて保存する。これはMacの例だが,Windowsのバッチファイルでも同様のことができると思われる。
おまけの動作として,タイトルに半角の「!」,「?」,全角のスペースが入っているときはsedで全角の「!」,「?」,半角のスペースに変換している。映像は仮に「tmp-$$.ts」,音声は「tmp-$$.aac」保存する。「$$」はシェルスクリプトのプロセス番号なので他のファイルとの重複を避けている。合体させてMP4ファイルを作った後に削除している。

#!/bin/bash
echo "動画URL:"
read movie
echo "音声URL:"
read sound
echo "タイトル:"
read title
file=$(echo $title | sed 'y/!? /!? /')
ffmpeg -y -c copy "tmp-$$.ts" -i "$movie"
ffmpeg -y -c copy "tmp-$$.aac" -i "$sound"
ffmpeg -i "tmp-$$.ts" -i "tmp-$$.aac" -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 "$file.mp4"
rm -f tmp-$$.ts tmp-$$.aac

具体的な操作は以下の通り。

  1. GYAO!で保存したい動画のページをGoogle Chromeで開く
  2. Chromeのメニューから「その他のツール」→「デベロッパーツール」を開く
    1. デベロッパーツールの一番上で「Network」を選択
    2. 検索窓に「m3u8」と入力
  3. Chromeでそのページを再読み込みする(m3u8にマッチする行が表示される)
  4. Macのターミナルでgyao.shを起動
    1. Chromeデベロッパーツールに表示された,上の方の「rendition.m3u8」を選択し,「Copy」→「Copy Link Address」でリンクアドレスをコピー
    2. ターミナルの「動画:」プロンプトに貼付け
    3. Chromeデベロッパーツールに表示された,下の方の「rendition.m3u8」を選択し,「Copy」→「Copy Link Address」でリンクアドレスをコピー
    4. ターミナルの「音声:」プロンプトに貼付け
    5. Chromeの動画タイトルをコピー
    6. ターミナルの「タイトル:」プロンプトに貼付け
  5. 待っていれば完了

Chromeとターミナルを行ったり来たりする必要があるので面倒だが,ストリーミングを無劣化で保存できるのは利点だろう。
ダウンロードの様子はターミナルに表示される。回線が細いなど,状況によってはエラーが表示されることがある。その場合は,一旦Ctrl-Cでスクリプトを停止し,最初からやり直す必要がある。

エラー処理などは一切行っていないので,ダウンロード後に確認してほしい。例えば,「rendition」を選択するのに間違えるなどして,映像がないとか音声が入っていない動画になっている可能性がある。また,GYAO!のページをロードしたタイミングで回線が細いと判断された場合,低画質の情報になる場合がある。「映像のダウンロードが妙に早いな」と思ったらダウンロードを一旦止めて,ページをリロードして高画質の情報を取得し,再度ダウンロードし直すとよい。