- Castor は、Webページや直接のストリームURLから実際の映像ストリームを見つけてTV向けに変換し、画面ミラーリングなしで元の品質のままリアルタイム転送するターミナルツール
- ヘッドレスChromeと Chrome DevTools Protocol でネットワークトラフィックを監視し、ページのクリック・最大のiframeへの移動・再クリックを経てストリームを抽出するが、自動再生を許可しないページでは動作しない可能性がある
- DLNA/UPnP 対応のスマートTVやKodi・VLC・Plexで利用でき、Chromecast対応も実装されているが、まだ実験的で未テスト
- 再生可能なH.264映像は再エンコードせずに転送し、必要に応じてハードウェアエンコーダや
libx264 で変換し、whisper で生成した字幕を映像に挿入することもできる
- 映像・カタログ・ソースを提供したりDRMを回避したりはせず、ユーザーが直接指定し利用権限を持つページとストリームだけを転送するよう設計されている
Web動画を実際のストリームとして転送
- Castor は、任意のWeb動画を直接転送できないスマートTVや、遅延・解像度低下のある画面ミラーリングの代わりに、実際の映像ストリーム をフル品質で転送する
- Webページまたは直接のストリームURLを入力すると、動画を探索してストリームを抽出し、TVに合わせてトランスコードしてリアルタイムで転送する
- ユーザーが構成したソースから IMDB/TMDB ID を参照したり、自動生成字幕を映像に挿入したりできる
castor cast を実行すると、ターミナルベースの対話型ブラウザで作品を探して転送できる
ストリーム抽出方式と制限
- ヘッドレスChromeを起動し、Chrome DevTools Protocol でネットワークトラフィックを監視してストリームを見つける
- 再生開始のために短い動作パイプラインを実行する
- ページをクリック
- 最も大きいiframeへ移動
- 代替動作として再度クリック
- 自動再生を許可するページで動作し、すべてのサイトをサポートするわけではない
インストールと実行要件
- 推奨される方式は、TVと同じネットワークで動作する ネイティブバイナリ
- 実行環境の
PATH に次のツールが必要
- Chrome または Chromium: ヘッドレスでのストリーム抽出
ffmpeg: トランスコーディング
ffprobe: メディア形式の検出
- macOSではHomebrewでインストールできる
brew install --cask stupside/tap/castor
- ソースビルドには Go 1.26+ とCMakeが必要
- whisper.cpp バインディングはcgoを使用し、ローカルでビルドした
libwhisper.a にリンクされる
- ローカルの
replace と事前ビルド済み静的ライブラリが必要なため、go install は動作しない
git clone --recurse-submodules https://github.com/stupside/castor.git
cd castor
make
基本的な利用フロー
castor scan でTV名を見つけ、config.yaml の device に正確な名前とデバイスタイプを指定する
device:
name: "Living Room TV"
type: dlna
- Webページや直接のストリームURLは
cast player で転送する
castor cast player https://example.com/watch/some-video
- 対話型の作品検索にはTMDB APIキーとユーザーが構成したソースが必要で、全コマンドとフラグは
castor --help で確認できる
設定とユーザー提供ソース
config.yaml は現在のディレクトリ、または --config で指定したパスから読み込み、必須項目は転送先となる デバイス設定 のみ
- タイムアウト、探索、キャプチャ、トランスコーディング、ネットワークインターフェース、Chromeナビゲーションにはデフォルト値が用意されている
- シークレット値はGitから除外した
config.local.yaml で上書きするか、CASTOR_SECTION__FIELD 形式の環境変数で指定できる
cast movie、cast episode、対話型ブラウザは、ユーザーが構成したソースに作品IDを代入する
- Castor自体にはソース、カタログ、検索機能は含まれない
- ユーザーが作成した
templates にIDを代入し、各 proxies を前置してページを開いたあと、cast player と同じ方法でストリームを抽出する
- 複数のプロキシは指定された順序で試行する
sources:
- proxies: ["https://your-source.example"]
templates:
movie: "/embed/movie/{itemID}"
episode: "/embed/tv/{itemID}/{season}-{episode}"
TMDB検索と自動字幕
- 対話型ブラウザは作品検索に TMDB APIキー を使用する
- 自動字幕はwhisperで音声を書き起こして映像に挿入し、デフォルトでは無効になっている
- デフォルト言語は英語
- デフォルトモデルは約75MBの
ggml-tiny.en で、自動ダウンロードされる
対応デバイス
- DLNA/UPnP
MediaRenderer:1 プロファイルを実装したTVをサポートする
- Samsungはテスト済みで、LG、Sony Bravia、Panasonic Viera、Philips、Hisense、TCL、VIZIO、Sharpが対応対象
- Kodi、VLC、Plexのようなネットワークプレーヤーも利用できる
castor scan で同一ネットワーク上のデバイスを検索する
- Chromecast対応は実装済みだが、実験的で未テスト
Dockerの制約とネットワーク構成
- Linux専用のDockerイメージはChrome、
ffmpeg、ffprobe を同梱する
- Dockerでは、TVと同じLAN上にある Linuxホスト が必要で、SSDPマルチキャスト検出とCastor再生サーバー接続のために
--network host を使う必要がある
- Docker DesktopのmacOS・Windowsでは
--network host はLANに接続されない
- コンテナはDocker Desktop内部VMのサブネットに配置されるため、
scan でデバイスを見つけられず、転送も失敗する
- macOS・Windowsではネイティブバイナリを使うか、Linux VMをLANにブリッジする必要がある
/config.yaml をマウントして設定を渡し、ボリュームに自動ダウンロードされたwhisperモデルを保持できる
latest の代わりにリリースタグを使えばバージョンを固定できる
メディアパススルーとエンコード
- TVが許容するプロファイルとレベルのH.264映像をすでに再生できるなら、ストリームコピー を使ってCPU使用量をほぼ0に抑える
- TVがコーデックを拒否する場合や字幕を挿入する必要がある場合は再エンコードする
- LinuxのVA-APIやネイティブmacOSバイナリのVideoToolboxのように、実際に動作するハードウェアH.264エンコーダを優先的に選ぶ
- 利用できなければソフトウェアの
libx264 にフォールバックする
- DockerコンテナでIntel GPUのVA-APIを使うには
--device /dev/dri が必要で、--network host だけではGPUは公開されない
用途と制限
- Castorは特定サイトに結び付いたサービスではない 汎用転送ツール
- 映像、カタログ、ソースをホスティングしたりバンドル提供したりはせず、ユーザーが指定し利用権限を持つページ・ストリーム・ソースだけを処理する
- DRMを復号・回避せず、DRM保護サービス は転送できない
- サイト利用規約と現地法を順守する責任はユーザーにあり、合法的な個人・教育用途向けに現状のまま提供される
2件のコメント
わあ、下のコメントにある https://tvexplorer.live/channel/EBS1TV.kr.SD/country/KR 、これすごく便利ですね(笑)
韓国ではブロックされているようですが、海外ではすぐ見られるんでしょうか?
Hacker Newsのコメント
別途回避することなく、チャンネルが公開しているHLSストリームをブラウザで直接再生する TV Explorer を作った。1万件以上の無料チャンネルを収めた公開GitHubリストを活用している
https://tvexplorer.live
他のTVサービスがやっていて、ここではやっていないことが何なのか気になる
ボットが毎回新しいプロフィールのヘッドレスブラウザを起動しなければならない状況はばかげている。Cloudflareはボットを止められないのに双方のリソースだけを浪費させ、接続記録とパスワード をNSAに渡しているようなものなので、昔のインターネットに戻りたい
「ChromecastやAirPlayがなく、ノートPCのWeb動画をTVに送れなかったので作った」という説明だが、Claudeが作ったように見える
Turnstileの本質は、ヘッドレスブラウザを検出して回避しにくくすることだと理解していたが、単にチェックマークのクリックをまねるだけで本当に通過できるのか疑問だ
実際のセキュリティよりも、Cloudflareが人間とボットを区別せず集計した ブロックされたユーザー数 をマーケティングに使う偽のセキュリティのほうが重要に見える
チェックボックスは一部にすぎず、それ以前までにブラウザのすべての動作やイベント応答を観察して ボットである可能性 に応じて追加認証の有無を決めている
たいてい海賊版ツールは少なくとももっともらしい否認の余地を残すものだが、ここでは今週末公開の 制作費2億5000万ドルの大作 までストリーミングできると売り込んでいる
エミュレータAzaharと、ゲームを自動復号する違法フォークのAzahar Plusも似ているが、改めて見るとこのプロジェクトは 違法ストリーミングサイトを内蔵 している
15年以上前の普通のSamsung TVで即座に動作した。https://vsembed.ru/movies/latest/page-1.json のようなすべてのJSONページを解析するよう 自前の検索機能を書く のが最善なのか気になる
説明に文脈が足りず、何に使うツールなのか、海賊版用なのか が分かりにくい
トレントを使うのと 手間が大差なく、あえて使う理由が分からない
macOSのDocker版では TVを見つけられない可能性がある
「ランダムなフィンガープリントとステルススクリプトで自動化を隠すヘッドレスChromeを実行する」という部分で 信頼を失った
navigator、Audio API、Canvas APIだけを変更しているようだ。非常に基本的な水準なので 簡単に検出される可能性 が高い