TOC
以前DLNA(BubbleUPnP)で音楽構築してみましたが今回はSubsonic APIを使用します。
BubbleUPnPでリモート再生を含めたDLNAな音楽ネットワークの構築
DLNAとSubSonicの概要
DLNA
ネットワーク上のマルチメディアコンテンツを再生するためにAV機器メーカーの業界団体DLNAアライアンス(解散)によって策定された、デジュールスタンダードなプロトコルです。 機器発見の下位レイヤーにはUPnP(≒ECHONET)、著作権保護対応としてDTCP-IPを使用可能で、BDレコーダーに保存されているテレビ番組はDTCP-IP対応のDLNA機器で再生できるようになっています。
現在は事業として認証のみ継続しているようで、別途OpenHomeがネットワークオーディオのデファクトスタンダードとなるよう活動しているようです。
Subsonic
現在はプロプライエタリで月額USD1のサブスク利用が中心のサービス・商品です。 ネットワーク上のコンテンツを再生するという点ではDLNAと一緒ですが、DLNAと比較すると単純なクライアント・サーバーモデルになっています。
Subsonic API
SubSonicがサーバーとクライアント間で使用しているAPIで、仕様は公開されています。
サーバーとクライアントでSubsonic APIを実装することで、Subsonic互換の音楽ネットワークを構築することができます。
DLNAとSubsonicの出自の違いからくる使われ方の違い
どちらもマルチメディアコンテンツをネットワーク経由で利用するソリューションに変わりはないはずですが、それでもDLNA自体に対する一般ユーザーの情報の少なさやDLNAとSubsonic API実装のプロダクトの種類の違い(裾野の広さ)はかなり差があると感じています。
一般のガジェットユーザーとしてはDLNAはDLNAアライアンスがDLNAアライアンスの会員へ公開したプロトコルであるため、オープンソースプロダクトが基本的に存在しないことから選択肢が非常に少ないことが残念なところです。
BubbleUPnP等の実装はリバースエンジニアリングでプロトコルを解析して実装しているものと推測しますが、それが使い方にそぐわない場合には利用すること自体が難しくなってしまいます。
SubsonicにはDLNAにあるDMC/DMRという役割は(おそらく)ないというデメリットはありますが、Subsonicのサーバー自体がWebフロントエンドを兼ねていて、ブラウザからアクセスするだけで音楽再生ができるというユーザーフレンドリーさはDLNAには存在しえないメリットです。Subsonicのサーバー実装はJavaで作られており、WARをデプロイできればサーバー環境を選ばずに使えた手軽さもDLNAとは比べ物にならない守備範囲の広さです。
DLNAクライアントは動画を再生することに使われることが多かったからか、プレイリストを作ってコンテンツを連続再生することが考慮されていない印象を受けますが、Subsonicは音楽再生が中心なので、作成したプレイリストをサーバー側で保持し、クライアント側で次の曲をキャッシュすることでギャップレス再生に対応することも実現しています。(プレイリストとギャップレス再生はOpenHomeでかなり改善されているそうです)
また、DLNAでは対応コーデックが狭く、mp4でもMPEG2-TSでないと再生できない機器がかなり多く、mkvなど以ての外となっている場合がほとんどです。またDLNAサーバーではFLACは問答無用でmp3とかにトランスコードするものがあり、そうするとそもそも音質にはこだわれないこともあります。端的にいうと、組み合わせによりますが、汎用性が狭いです。
Subsonic APIを実装したプロダクト
ここからが本番で、Subsonic APIを実装しているプロダクトをさっくり調べて比較をしていきます。
Subsonic APIのサーバー実装
Subsonic
- リファレンス実装
- プロプライエタリ(バージョン6より前はLGPL)
- メンテされている?(最新は2019年リリースの6.1.6)
- Javaで実装
- 対応プラットフォームはWindows, Mac OS X, deb, rpm, war, スタンドアロンバージョン
Navidrome
- メンテされている
- Goで実装
- dockerイメージあり。386 amd64 arm64 armv6 armv7
- docker-composeのサンプルあり
- 今回使用
Airsonic-Advanced
GitHub - airsonic-advanced/airsonic-advanced
- メンテされている(最新の安定版リリースは2020年)
- Javaで実装
- 新し目の技術のキャッチアップは早い方
- warで配布
gonic
GitHub - sentriz/gonic: music streaming server / subsonic server API implementation
- メンテされている
- Goで実装
- dockerイメージあり。amc64 arm64 armv6 armv7
- docker-composeのサンプルあり
Subsonicのクライアント実装
Sonixd
GitHub - jeffvli/sonixd: A full-featured Subsonic/Jellyfin compatible desktop music player
- メンテされている
- TypeScriptで実装
- Windows, Mac OS X(x64, arm64), Linux(x86, x64, arm64) LinuxはAppImageでも提供
Subsonic Music Streamer
Subsonic Music Streamer - Google Play のアプリ
- Android向けリファレンス実装
- メンテされている?
Ultrasonic
- メンテされている
- 評価が高い
- 今回使用
DSub for Subsonic
DSub for Subsonic - Google Play のアプリ
DSub | F-Droid - Free and Open Source Android App Repository
- メンテされている
- Google Playからだと有料(買い切り)だがF-Droidからなら無料でインストール可能
- 今回使用
Navidrome(Subsonic互換サーバー)を使ってみる
SubsonicのサーバーとしてNavidromeをRaspberry Pi 4(8GB)で使ってみます。Dockerイメージが提供されていて、docker-composeもサンプルが示されているので、それに乗っかりました。rootless dockerでコンテナを実行します。
Dockerをrootlessに変更してrootユーザーの呪縛から開放される
Dockerコンテナから参照させるホストのディレクトリは2つです。
- 管理DB /mnt/usbhdd1/var/navidrome_data
- 音楽データ(ここに再生したいファイルを置く) /mnt/usbhdd1/var/navidrome_music
先にこの2つのディレクトリを作って、rootless dockerのユーザーに割り当てられている166535にownerとgroupを変更します。
# mkdir /mnt/usbhdd1/var/navidrome_{data,music}
# chown 166535:166535 /mnt/usbhdd1/var/navidome_{data,music}
$ ls -ld /mnt/usbhdd1/var/navidrome_{data,music}
drwxrwxr-x 1 166535 166535 0 7月 28 19:09 /mnt/usbhdd1/var/navidrome_data
drwxrwxr-x 1 166535 166535 0 7月 28 19:09 /mnt/usbhdd1/var/navidrome_music
rootless dockerを実行するユーザーの任意のディレクトリに以下の内容でdocker-compose.yml
を作成します。
version: "3"
services:
navidrome:
image: deluan/navidrome:latest
user: 1000:1000 # should be owner of volumes
ports:
- "4533:4533"
restart: unless-stopped
environment:
# Optional: put your config options customization here. Examples:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: ""
volumes:
- "/mnt/usbhdd1/var/navidrome_data:/data"
- "/mnt/usbhdd1/var/navidrome_music:/music:ro"
docker-compose.yml
を作ったディレクトリでイメージからコンテナを起動します。
$ docker-compose up -d
しばらくしたら、ブラウザから http://rpi4.internal:4533/ にアクセスします。(ポート番号はdocker-compose.ymlに指定した4533、ホスト名はRaspberry Piです)
初回アクセス時はadminユーザーを作成します。adminユーザーを作り終わると、アルバム一覧画面が表示されます。
曲にジャケットが指定されていない場合はこんな表示になります。
アルバムの曲一覧はこんな風に表示されて、曲を再生すると画面下にコントロールが表示されます。
UltrasonicとDSub for Subsonic(Subsonic互換クライアント)を使ってみる
SubsonicのクライアントとしてUltrasonicとDSub for Subsonicを使ってみます。どちらも接続先サーバーをNavidromeに向けるだけです。
どちらもSubsonicのリファレンス実装を元にしているようで、初期画面や設定項目は共通しています。
Ultrasonic
まず最初に接続するSubsonicサーバーを指定します。左上の≡をタップして、表示されているサーバー名をタップします(すでに設定後なのでサーバー名が入っています)
サーバーを追加するので、右下の+をタップします。
サーバー情報を入力します。サーバーに接続できるようになるとアルバム一覧画面はこんな風になります。
アルバムから曲を選択して再生するとこんな感じになります。
DSub for Subsonic
DSubの場合は常にコントロールが画面下部に表示されます。
また、かえって厄介なことに、Subsonicのデモサーバーの接続情報がデフォルトで設定されていて、初めて使う人は使い方がわからないと思います。
起動画面左上の≡をタップして一番下にあるSettingに潜ります。
ServersをタップしてからのSubsonicサーバーの設定はUltrasonicと同じなのでそれほど迷うことはないと思います。
Subsonicサーバーに接続すると曲が読み込まれたことがわかります。
アルバム一覧画面はこんな風になります。また、テーマカラーもDarkに変えています。
アルバムから曲を選んで再生するとこんな感じです。
個人的な印象では、Ultrasonicの方がUIがシュッとしていて、DSubの方がプレイリストの編集が簡単です。どちらもいいアプリなので好みで使い分けるのが良いと思います。
スポンサーリンク
comments powered by Disqus