Ubuntu Weekly Recipe

第668回CATTでCLIからGoogle系スマートデバイスにキャストする

最近のスマートデバイスは語りかけるだけで、さまざまなコンテンツを表示してくれます。しかしながら、距離・発音・ネットワークなどさまざまな事情で、期待通りのコンテンツを表示してくれないこともあるでしょう。そこで今回は、より確実に特定のコンテンツを表示するために、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でインストールする方法です。

$ sudo apt install pipx
$ pipx install catt

次にpip3でインストールする方法です。

$ sudo apt install python3-pip
$ pip3 install catt

pipx/pip3でインストールしたコマンドは、~/.local/bin/に保存されます。Ubuntuの場合はログイン時に~/.local/bin/が存在した場合のみ、環境変数PATHに~/.local/bin/を追加する設定になっています。よってもし初めてpip3/pipxでインストールしたときなど、そこで~/.local/bin/が作られた場合は、一度ログインし直してPATHが通るようにしておきましょう。もちろん~/.local/bin/COMMANDのようにフルパスで指定してもかまいません。

まずはコマンドのヘルプを表示してみます。

$ catt --help
Usage: catt [OPTIONS] COMMAND [ARGS]...

Options:
  -d, --device NAME_OR_IP  Select Chromecast device.
  --version                Show the version and exit.
  -h, --help               Show this message and exit.

Commands:
  add           Add a video to the queue (YouTube only).
  cast          Send a video to a Chromecast for playing.
  cast_site     Cast any website to a Chromecast.
  clear         Clear the queue (YouTube only).
  del_alias     Delete the alias name of the selected device.
  del_default   Delete the default device.
  ffwd          Fastforward a video by TIME duration.
  info          Show complete information about the currently-playing video.
  pause         Pause a video.
  play          Resume a video after it has been paused.
  play_toggle   Toggle between playing and paused state.
  remove        Remove a video from the queue (YouTube only).
  restore       Return Chromecast to saved state.
  rewind        Rewind a video by TIME duration.
  save          Save the current state of the Chromecast for later use.
  scan          Scan the local network and show all Chromecasts and their IPs.
  seek          Seek the video to TIME position.
  set_alias     Set an alias name for the selected device.
  set_default   Set the selected device as default.
  skip          Skip to end of content.
  status        Show some information about the currently-playing video.
  stop          Stop playing.
  volume        Set the volume to LVL [0-100].
  volumedown    Turn down volume by a DELTA increment.
  volumeup      Turn up volume by a DELTA increment.
  write_config  DEPRECATED: Please use "set_default".

いろいろなコマンドが存在するものの、⁠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デバイスが存在するかを確認してみましょう。

$ catt scan
Scanning Chromecasts...
192.168.0.10 - キッチン - Google Inc. Google Nest Hub
192.168.0.11 - テレビ - Google Inc. Chromecast Ultra

上記の例だと「キッチン」と名前の付けられたNest Hubと、⁠テレビ」と名前の付けられたChromecast Ultraが存在していることがわかります。キャスト先はIPアドレスもしくは名前を指定することになります。

もし英語名が良ければ、cast -s 名前 set_alias 別名のように別名を付けてしまうと良いでしょう。これらの設定は~/.config/catt/以下に保存されます。

試しにYouTubeの適当な動画を再生してみましょう。Castデバイスは家族がいるスペースにあることも多いのと、CATTではボリュームが大きめに出るため、無難かつ健全で多少大きな音でも許される動画を選ぶのが安全です。

ここでは第500回のUbuntuで!YouTuberに俺はなる!(後編)から、仰向けTVチャンネルのPCの電源に車用ヘッドライトバルブをつないだら危険すぎたを再生することにします。

$ catt -d テレビ cast https://www.youtube.com/watch?v=kTh-_1mNhPs
Casting remote file https://www.youtube.com/watch?v=kTh-_1mNhPs...
Playing "PCの電源に車用ヘッドライトバルブをつないだら危険すぎた" on "テレビ"...

無事に再生できたでしょうか。音量を調整したい場合は、volumedown/volumeupで上下させるか、volumeで0から100の間の数字を指定します。

$ catt -d テレビ volume 50

同様に早送り・巻き戻しはffwd/rewindです。一時停止・再開はpause/playとなります。また再生を終了したい場合は、stopを呼び出してください。

$ catt -d テレビ stop

castの代わりにcast_siteでウェブページを表示できます。とはいえスクロールなどはCastデバイス次第な部分もあるため、表示するとしたらインタラクティブな操作が不要な動画ページになるでしょう。

ローカルのファイルを再生する

CATTを用いてキャストする際の最大の利点が、特別なサーバーを用意することなく、ローカルのファイルをCastデバイスで再生できることです。たとえば~/ミュージック/以下の音楽ファイルは次のように再生できます。

$ catt -d キッチン cast ~/ミュージック/music.m4a
Casting local file ~/ミュージック/music.m4a...
Playing "Music" on "キッチン"...
Serving local file(s).
192.168.0.10 - - [22/May/2021 23:23:33] "GET /?loaded_from_catt HTTP/1.1" 206 - audio/mp4 - 12.60 MB

Castデバイスによってサポートしているメディアフォーマットは異なるので注意してください。たとえばMPEG-2 Videoは現時点でどのデバイスもサポートしていないため、なんらかのトランスコードが必要になります。

ローカルファイルの再生の際はYouTubeと異なり、ブロックモードで再生します。つまり再生が完了するまではcattコマンドから戻ってきません。ボリューム等を調整したいなら、別途端末を開いてそこから操作してください。

再生キューやプレイリストといった機能もありません。ただしCLIなのでちょっとしたスクリプトでプレイリスト相当の操作ができます。たとえば単純な例だと、次のコマンドを実行すればローカルにあるm4aファイルをすべて順番に再生してくれます。

$ find . -name '*.m4a' -exec catt -d キッチン cast {} \;

Ubuntuの場合、各種リモートストレージをマウントすれば、ローカルファイルシステムにアクセスするとのと同じような操作が可能になります。

たとえばNextcloudにコンテンツを保存している場合、Nextcloudクライアントなどで同期すれば、普通のファイルアクセスが可能になります。また、NextcloudはWebDAVサーバーとしてもアクセス可能です。WebDAVとしてマウントしてしまえば、クライアントに比べてアクセスに時間はかかるものの、クライアントのインストールなくアクセスできます。

WebDAV用のアドレスは、NextcloudのウェブUI左下にある「設定」から取得可能です。マウントするためにはdavfs2パッケージのインストールが必要です。またGNOMEならファイルブラウザーがWebDAVに対応しているため、こちらからマウントする方法もあるでしょう。

ファイルブラウザーの場合は、左のペインから「他の場所」を選び、ウィンドウの下部にある「サーバーアドレスを入力」に先ほど取得したアドレスを入力してください。入力する際にはアドレスの「https」「davs」に置き換えるようにしてください。

マウントがうまくいけば、ファイルブラウザーからNextcloud上のファイルにアクセスできます。また、マウント先は次の手順で確認できます。

$ ls $XDG_RUNTIME_DIR/gvfs/
'dav:host=(サーバーアドレス),ssl=true,prefix=%2Fremote.php%2Fdav%2Ffiles%2F(ユーザー名)'

上記のdev:で始まるのがマウント先です。少し長く複雑なファイルパスになるため、cattコマンドを使う前にディレクトリに移動してからcastコマンドを使うと良いでしょう。

DLNA経由のファイルを再生する

ネットワーク上にDLNAサーバーが存在する場合、DLNAサーバー上のコンテンツをキャスト可能です。問題はコンテンツのURLをCLIからどう取得するかですが、あまり良い方法は見つけられませんでした[2]⁠。

結局のところUPnPをサポートするライブラリを利用して、ターゲットのDLNAサーバーに合わせて、自作してしまうのが一番手っ取り早いらしく、インターネット上でもいくつかもの作例が見つかります。

依存関係が少ない方法だと、socatコマンドとシェルスクリプトで作られたツールなんかも存在します。今回はこれを使ってみましょう。

$ sudo apt install socat
$ wget https://raw.githubusercontent.com/javier-lopez/learn/master/sh/tools/simple-dlna-browser
$ chmod +x simple-dlna-browser

まずはDLNAサーバーをリストアップします。

$ ./simple-dlna-browser -L
http://192.168.0.27:8200/rootDesc.xml (CuBox)

今回応答したのは、CuBox上にインストールされたMiniDLNA(現在はReadyMediaと呼ばれているもの)です。simple-dnla-browserはサーバーの検索時にurn:schemas-upnp-org:device:MediaServer:1を指定するため、それ以外は検索対象外となってしまいます。もし求めるサーバーが見つからないようなら、他のツールの利用も検討してください。

このツールの便利なところは、⁠ファイル名」で検索にも対応しているところです。

$ ./simple-dlna-browser -s 192.168.0.27 -v ファイル
http://192.168.0.27:8200/MediaItems/345.mp4 - ファイル1
http://192.168.0.27:8200/MediaItems/346.mp4 - ファイル2
http://192.168.0.27:8200/MediaItems/347.mp4 - ファイル3
http://192.168.0.27:8200/MediaItems/348.mp4 - ファイル4

-vオプションもつけるとファイル名を元にしたタイトルも表示してくれるので便利です。

あとはこのURLをcattコマンドに渡すだけです。

$ catt -d テレビ cast http://192.168.0.27:8200/MediaItems/348.mp4
Casting remote file http://192.168.0.27:8200/MediaItems/348.mp4...
Playing "348" on "テレビ"...

これでDLNA上のコンテンツもCLIからCastデバイスにキャストできました。

在宅勤務においては、BGM/BGVの内容や再生方法も自由度があがっています。これを機にスマートデバイスを利用した環境構築も検討してみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧