YouTube-DL On Rail
youtube-dlのフロントエンド
動画サイトのURLを入力すると、動画をダウンロードするツール(Webアプリケーション)です。 自宅などのLANに設置したサーバ(LinuxをインストールしたNASキット等)で動かして、同じLAN内のPCやスマートフォンのブラウザからアクセスして使用することを想定しています。 回線やダウンロード元の動画サイト動画に不当な負荷をかけないように、ダウンロードはURLを入力した順に順番に行われます。 ダウンロードした動画にタグ付けして、タグやタイトルで後から動画を探せます。(予定)
内部告発の動画など、諸事情でプラットフォームの運用者によって削除される可能性がある動画を見つけたときは、動画画をローカルに保存しておきたくなります。 しかし、「明日起きてからパソコンからやろう」といった感じで後回しにしてしまうと、起きたときにはもう削除されている…ということがしばしばあります。 これは自分にとって少々我慢ならないことだったので、寝る直前くらいの頭でも、スマートフォンからyoutube-dlに指示を出せるようなツールがほしいと考えていました。
Rails7がリリースされ、デフォルトで含まれるようになったHotwireが魅力的に思えたので、以下の技術の習作を兼ねて、このアプリケーションを実装してみることにしました。
- Rails7
- Hotwire
- Active Job
- Active Storage
パブリックにアクセスできるサービスとして公開しなかったのは、以下のような理由からです。
- 他人の用に供するのは公衆送信権の侵害にあたる可能性があること
- 自分しか利用しないデータにアクセスするために回線に負荷をかけたくないこと
- 動画ストレージの費用と転送量を負担しきれないこと
セットアップ前に使い勝手を試すことができるように、デモサイトを用意しています。 次セクションをご覧ください。
デモサイト利用上の注意
- デモサイトを試す際は、ライセンス的に問題のない動画のURLを入力してください
- 動画のダウンロードを利用規約で禁止している動画サイトのURLを入力しないでください
- 利用規約でダウンロードを禁止している動画サイトの例としては、YouTubeが挙げられます
- 利用規約でダウンロードを禁止していない動画サイトの例としては、Vimeoが挙げられます
- オープンライセンスの動画の一覧がWikipediaにあります
- まとめると、「利用規約でダウンロードが禁止されていない動画サイトにアップロードされているCC0(Public Domain)の動画」がデモを試すためのURLとして望ましいです
- 動画のダウンロードを利用規約で禁止している動画サイトのURLを入力しないでください
- ダウンロードが完了してから15分が経過すると、動画は自動的に削除されます
- Ruby 3.1
- Redis
起動
./docker_compose up --build
ブラウザから http://localhost:3000/ にアクセスする
テストの実行
- すべてのテストを実行する
./docker_compose --profile test run --rm --build test rails test
- test:system のみ実行する
./docker_compose --profile test run --rm --build test rails test:system
- テストのログを見る
tail -f log/test.log
gemのアップデート
- すべての gem のバージョンをアップデートする
./docker_compose run --rm web bundle update && ./docker_compose build
- capybara gem のバージョンをアップデートする
./docker_compose run --rm web bundle update capybara
./docker_compose build
solargraphのセットアップ
yard
gem install solargraph-rails-init
solargraph-rails-init
- 例として, LAN内に設置されたDebianサーバ ytdlor.local にデプロイする
サーバの準備
- Docker Engine をインストールする
ssh ytdlor.local
という形式でsshできるように, デプロイに使用する作業用マシンの ssh_config に設定を追加しておく
Host ytdlor.local
HostName ytdlor.local
User debian
ssh ytdlor.local
でsshログインできることを確認しておく- お好みでnginxを立ち上げる
nginx.conf
を参考にしてください
デプロイスクリプトの用意
- デプロイ用のsecretを生成する
./docker_compose run --rm web rails secret
- 以下の内容で
deploy_scripts/deploy_ytdlor_local.sh
を作成する- 生成したsecretを
SECRET_KEY_BASE=
に設定する
- 生成したsecretを
#!/bin/sh
set -eu
docker_compose() {
export DOCKER_HOST="ssh://ytdlor.local"
export COMPOSE_PROJECT_NAME="ytdlor"
export SECRET_KEY_BASE="<ここに生成したsecretを設定する>"
export YTDLOR_WEB_PORT="8001"
docker compose -f docker-compose.yml -f docker-compose-production.yml -f restart-always.yml "${@}"
}
args="${@:-""}"
if [ -n "${args}" ]; then
docker_compose "${@}"
else
docker_compose build
docker_compose down
docker_compose run --rm web rails db:migrate
docker_compose up -d --remove-orphans
fi
- 実行権限を付与する
chmod +x deploy_scripts/deploy_ytdlor_local.sh
デプロイの実行
./deploy_scripts/deploy_ytdlor_local.sh