最近のスマートデバイスは語りかけるだけで、さまざまなコンテンツを表示してくれます。しかしながら、距離・発音・ネットワークなどさまざまな事情で、期待通りのコンテンツを表示してくれないこともあるでしょう。そこで今回は、より確実に特定のコンテンツを表示するために、Googleのスマートデバイス向けにCLIから任意のコンテンツデータをキャストする方法を紹介しましょう。
CATT:Cast All The Things
CATTはローカル・インターネット上のコンテンツをGoogleのChromecastやNest Hubに配信するPython製のツールです。
主に指定のYouTube動画や公開されたプレイリストを再生するためのツールとして作成されているものの、VimeoやSpotifyなどのサービスにも部分的に対応していますし、ローカルのファイルやHTTP経由のストリーミングデータの再生も可能となっています。つまり「OK、グーグル」では指定しづらいコンテンツも、CLIから確実に再生できるのです。
PyPIで公開されているため、インストール方法としてはpipxを使うかpip3を使うかの二択が有力な選択肢となります。CATTではpipxを推奨しているものの、Ubuntu 21.04のpipx 0.12.3.1では、Python 3.9でうまく動かない問題を抱えています。よって21.04ではpip3を、それ以外ではpipx/pip3で好きなほうを使うと良いでしょう[1]。
まずはpipxでインストールする方法です。
次にpip3でインストールする方法です。
pipx/pip3でインストールしたコマンドは、「~/.local/bin/
」に保存されます。Ubuntuの場合はログイン時に「~/.local/bin/
」が存在した場合のみ、環境変数PATHに「~/.local/bin/
」を追加する設定になっています。よってもし初めてpip3/pipxでインストールしたときなど、そこで「~/.local/bin/
」が作られた場合は、一度ログインし直してPATHが通るようにしておきましょう。もちろん「~/.local/bin/COMMAND
」のようにフルパスで指定してもかまいません。
まずはコマンドのヘルプを表示してみます。
いろいろなコマンドが存在するものの、「YouTube only」って付いているものも多いですね。おおよそ次のようなカテゴリにわけられます。
-
コンテンツおよびウェブページのキャスト
-
cast/cast_site
-
Castデバイスの管理
-
scan/save/restore
-
Castデバイスのラベルと優先順位
-
set_alias/set_default/del_alias/del_default
-
再生・停止コントロール
-
ffwd/rewind/pause/play/play_toggle/seek/skip/stop
-
音量コントロール
-
volume/volumedown/volumeup
-
再生中の状態表示
-
info/status
-
YouTube用の再生キューの操作
-
add/clear/remove
コマンド名だけで何をするかはイメージできると思います。オプション等の詳細が知りたい場合は「catt COMMAND -h
」を実行してください。
さて、まずはscanコマンドでどんなCastデバイスが存在するかを確認してみましょう。
上記の例だと「キッチン」と名前の付けられたNest Hubと、「テレビ」と名前の付けられたChromecast Ultraが存在していることがわかります。キャスト先はIPアドレスもしくは名前を指定することになります。
もし英語名が良ければ、「cast -s 名前 set_alias 別名
」のように別名を付けてしまうと良いでしょう。これらの設定は「~/.config/catt/
」以下に保存されます。
試しにYouTubeの適当な動画を再生してみましょう。Castデバイスは家族がいるスペースにあることも多いのと、CATTではボリュームが大きめに出るため、無難かつ健全で多少大きな音でも許される動画を選ぶのが安全です。
ここでは第500回の「Ubuntuで!YouTuberに俺はなる!(後編)」から、仰向けTVチャンネルの「PCの電源に車用ヘッドライトバルブをつないだら危険すぎた」を再生することにします。
無事に再生できたでしょうか。音量を調整したい場合は、volumedown/volumeup
で上下させるか、volume
で0から100の間の数字を指定します。
同様に早送り・巻き戻しはffwd/rewind
です。一時停止・再開はpause/play
となります。また再生を終了したい場合は、stop
を呼び出してください。
cast
の代わりにcast_site
でウェブページを表示できます。とはいえスクロールなどはCastデバイス次第な部分もあるため、表示するとしたらインタラクティブな操作が不要な動画ページになるでしょう。
ローカルのファイルを再生する
CATTを用いてキャストする際の最大の利点が、特別なサーバーを用意することなく、ローカルのファイルをCastデバイスで再生できることです。たとえば「~/ミュージック/
」以下の音楽ファイルは次のように再生できます。
Castデバイスによってサポートしているメディアフォーマットは異なるので注意してください。たとえばMPEG-2 Videoは現時点でどのデバイスもサポートしていないため、なんらかのトランスコードが必要になります。
ローカルファイルの再生の際はYouTubeと異なり、ブロックモードで再生します。つまり再生が完了するまではcattコマンドから戻ってきません。ボリューム等を調整したいなら、別途端末を開いてそこから操作してください。
再生キューやプレイリストといった機能もありません。ただしCLIなのでちょっとしたスクリプトでプレイリスト相当の操作ができます。たとえば単純な例だと、次のコマンドを実行すればローカルにあるm4aファイルをすべて順番に再生してくれます。
Ubuntuの場合、各種リモートストレージをマウントすれば、ローカルファイルシステムにアクセスするとのと同じような操作が可能になります。
たとえばNextcloudにコンテンツを保存している場合、Nextcloudクライアントなどで同期すれば、普通のファイルアクセスが可能になります。また、NextcloudはWebDAVサーバーとしてもアクセス可能です。WebDAVとしてマウントしてしまえば、クライアントに比べてアクセスに時間はかかるものの、クライアントのインストールなくアクセスできます。
WebDAV用のアドレスは、NextcloudのウェブUI左下にある「設定」から取得可能です。マウントするためにはdavfs2パッケージのインストールが必要です。またGNOMEならファイルブラウザーがWebDAVに対応しているため、こちらからマウントする方法もあるでしょう。
ファイルブラウザーの場合は、左のペインから「他の場所」を選び、ウィンドウの下部にある「サーバーアドレスを入力」に先ほど取得したアドレスを入力してください。入力する際にはアドレスの「https」を「davs」に置き換えるようにしてください。
マウントがうまくいけば、ファイルブラウザーからNextcloud上のファイルにアクセスできます。また、マウント先は次の手順で確認できます。
上記の「dev:
」で始まるのがマウント先です。少し長く複雑なファイルパスになるため、cattコマンドを使う前にディレクトリに移動してからcastコマンドを使うと良いでしょう。
DLNA経由のファイルを再生する
ネットワーク上にDLNAサーバーが存在する場合、DLNAサーバー上のコンテンツをキャスト可能です。問題はコンテンツのURLをCLIからどう取得するかですが、あまり良い方法は見つけられませんでした[2]。
結局のところUPnPをサポートするライブラリを利用して、ターゲットのDLNAサーバーに合わせて、自作してしまうのが一番手っ取り早いらしく、インターネット上でもいくつかもの作例が見つかります。
依存関係が少ない方法だと、socatコマンドとシェルスクリプトで作られたツールなんかも存在します。今回はこれを使ってみましょう。
まずはDLNAサーバーをリストアップします。
今回応答したのは、CuBox上にインストールされたMiniDLNA(現在はReadyMediaと呼ばれているもの)です。simple-dnla-browserはサーバーの検索時に「urn:schemas-upnp-org:device:MediaServer:1
」を指定するため、それ以外は検索対象外となってしまいます。もし求めるサーバーが見つからないようなら、他のツールの利用も検討してください。
このツールの便利なところは、「ファイル名」で検索にも対応しているところです。
「-v
」オプションもつけるとファイル名を元にしたタイトルも表示してくれるので便利です。
あとはこのURLをcattコマンドに渡すだけです。
これでDLNA上のコンテンツもCLIからCastデバイスにキャストできました。
在宅勤務においては、BGM/BGVの内容や再生方法も自由度があがっています。これを機にスマートデバイスを利用した環境構築も検討してみてはいかがでしょうか。