推しが活動終了したので動画サイトの自作を試みた話
1年強愛した推しの動画にアクセスできる環境を整備しました.
大事な前提条件
著作権云々があるのでLAN内限定であることに拘ります.展開先は一般家庭のネットワーク構成なのでドメインもなければグローバルIPも変わりますし.あくまでおうち内でローカルIPあるいはホスト名でアクセスするだけ.自分しか見ません.私的利用に絞っての運用です.
クラウドストレージにあげたら? or VPSは?
→著作権で私的利用に落とし込むためおうち内完結を目指しましたNASでよくない?
→スマホでも簡単に再生できるようブラウザベースで見られる形でもっといい方法あるよ
→勉強やロマン兼ねたので効率はあまり追求してませんでしたが…
おすすめのソリューションがあれば後学の為ご教授いただけると
やったこと
1人月(ぼくが3ヶ月くらい暇な時間にだけコツコツ進めた)のプロジェクトだったので記事が長いですが,やったことをまとめると以下のとおりです.
yt-dlpで動画を集約
Pythonで簡易的にWebサーバを構築
コードの改善やSSD・2.5G LANの活用で高速化
以下はこの3点を深堀りしているだけなので興味ない方はここまででも!
タイトルに惹かれてくれただけで感謝!!
環境
動画収集
消えゆくコンテンツと一生一緒であるためにまず保存をしなければなりません.巨大なストレージとyt-dlp,ffmpegを用意しましょう.コマンドのオプションのあれこれは調べるといいです.サムネイルとメタデータはマスト,メン限まで保存するならCookieをテキストファイルに書き出す拡張機能があるのでそれを併用しつつ.
ハードウェア
使ってないラズパイとかでも良かったのですが,某配信サービスの録画サーバとして使っているThinkCentre M710sを強化してそこに展開.
ProxmoxでVMを2つ作り,Windowsを入れて引き続き配信録画用とUbuntuを入れて今回のそれ用に割り当てます.
VMを増やすことでスレッド数とメモリがいるなということで強化してます.CPUがWindows11の動作要件を満たさないのでかなりお買い得になっていたのが嬉しい誤算.また,DDR4も中古市場で随分と安くなりました.
それとProxmoxの入ったマシンでDVDドライブなんか使うはずがないので撤去して2.5inchのストレージを1発増やし,将来的にバックアップや負荷分散に用いるつもりです.
ソフトウェア
Apacheでいい感じにできないかと検討するもドライブ内の動画に対して動的にWebページの表示を変えられるように実装するのは自分には無理と判断.PythonのHTTPServerでカバーしました.ChatGPTのおかげで楽に実装.
レイアウトは以下の通り実現したらタイトルの文字数で崩れました.
処理の最適化
トップ表示速度の改善
表示させるタイトルはffprobeコマンドを呼び出して動画のメタデータを確認しながら送信という手法を取りました.しかし動画の数が多くリロードのたびに読み込み時間がえらいことになってしまう始末.
そこでCSVファイルにファイル名とタイトルをペアで記録しておき,そちらから参照→台帳にないもののみffprobeしてその都度CSVに加筆していくように改良を加えました.
CSVファイルのレコードの数が今後増えていったら検索にも時間がかかると…考えたくもありませんが新しく供給が出ることはないのでその心配はなさそうです.
キャッシュ
アクセスする可能性の高い動画のみ720p化して軽量にしたものをSSDに格納します.HDDのリードは足を引っ張り得るため.SSDにお望みの物があればそれを,なければHDDに見にいって送るという実装に改善.
キャッシュとして歌みたとMVを格納しました.SATA SSDは600MB/s弱出ることを考えるとストレージは頭打ち.このLAN内とファイルをシェアする使い方においてNVME SSDは人類にはまだ早いのかもしれません.
ここまで総合すると以下のようなディレクトリ構造になりました.
メインは別ドライブにあり,cacheとしてよく見る動画1と2,サムネやヘッダ画像とファビコン,その他処理に使うものはSSD保管といったイメージ.
$ tree
.
├── cache
│ ├── 1.mp4
│ └── 2.mp4
├── favicon.ico
├── header.jpg
├── HTTPServe.py
├── thumbnails
│ ├── 1.jpg
│ ├── 2.jpg
│ ├── 3.jpg
│ └── 4.jpg
├── videos -> /mnt/hoge/videos
└── VideoTitles.csv
通信の最適化
そもそもの問題点
SATA SSDが600MB/s近く出てNVME接続のSSDならそれ以上に出る令和の時代に,125MB/sに律速されてしまうのは宝の持ち腐れ感があります.
解決策1→ボンディング
PCIEスロットに密林で安かったLANカードを挿してインターネッツを増やしました.片方のLANケーブルを引っこ抜いても問題なく通信しているので,機能してるかしてないかでいうとしてそうです.別の案件で通信してるときに帯域を奪われにくくなるのではっていう認識.あまり恩恵は感じられませんでしたが.
解決策2→2.5G環境の整備
1000Baseが遅いならそれ以上にしようという発想からです.2.5Gとか10Gとか色々ありますが,予算と労力から2.5G LANで妥協.これで300MB/sほど出るはずなのでかなり快適になるのではと今度こそ期待.
RTL8125BチップのLANカードをAliexpressでめちゃくちゃ安く調達.万国郵便条約あざますって感じですね.スイッチハブは密林でエレコムの5ポートを選定するもかなり懐に打撃.クライアント側はM/B交換で対応.
Windowsの実機ならコントロールパネルからリンク速度が見られるのでほしい速度が出ているか確認.Proxmoxは以下でチェック可能.VM内にsambaでドライブ立てたものにクライアント側からLAN Speed testをしてあげることで実測値が測定可能.
sudo ethtool enp1s0
#enp1s0のところは構成によって2s0だったり3s0だったり名前がつくので一例
もしなぜか速度が出ていなければ
sudo ethtools -s enp1s0 speed 2500
展望
今後どう改善するか保留中の事柄をメモしておきます.
順番は僕内優先度で高→低
ルータ・スイッチ間もマルチギガ化して,モバイル端末からでも高速化
CSSでデザインまともにする
検索機能をサーバ側で実現(今はCtrl+Fでやってる)
→エクスペリエンスは変わらないのに負荷は増えそうだしうーん再生した回数例のCSVファイルに記録
→トップページのリストの上部の表示を工夫できるのでは?動画の収集からLAN内公開に至るまでの(半)自動化
→シェルスクリプトで実現可能?
並行して別の開発もしていたりして,実験機が欲しいなと思っていたらThinkCentreがもう1台生えていたので負荷分散なんかも勉強できそうです.
(おまけ)導入事例
今回の配置はルータに2.5Gスイッチを接続,そこに2.5Gb対応の機器をぶらさげました.スイッチ間で完結する通信なら2.5Gb.ワイヤレスはwifi6対応で2.4Gb出ますが,ルータとスイッチ間で1Gbに律速されるのが少し惜しいです.以下の画像では赤矢印が2.5Gbで黒が1Gbです.
ファンの音はそこまで気になりませんがアクセスランプが眩しいです.背面の増設した2.5G LANポートもピカピカします.