Subsonic互換サーバーとクライアントで始める音楽ライブラリ

Posted by 雅楽斎 on Sunday, August 7, 2022

TOC

以前DLNA(BubbleUPnP)で音楽構築してみましたが今回はSubsonic APIを使用します。

BubbleUPnPでリモート再生を含めたDLNAな音楽ネットワークの構築

DLNAとSubSonicの概要

DLNA

ネットワーク上のマルチメディアコンテンツを再生するためにAV機器メーカーの業界団体DLNAアライアンス(解散)によって策定された、デジュールスタンダードなプロトコルです。 機器発見の下位レイヤーにはUPnP(≒ECHONET)、著作権保護対応としてDTCP-IPを使用可能で、BDレコーダーに保存されているテレビ番組はDTCP-IP対応のDLNA機器で再生できるようになっています。

現在は事業として認証のみ継続しているようで、別途OpenHomeがネットワークオーディオのデファクトスタンダードとなるよう活動しているようです。

OpenHome

Subsonic

現在はプロプライエタリで月額USD1のサブスク利用が中心のサービス・商品です。 ネットワーク上のコンテンツを再生するという点ではDLNAと一緒ですが、DLNAと比較すると単純なクライアント・サーバーモデルになっています。

Subsonic API

SubSonicがサーバーとクライアント間で使用しているAPIで、仕様は公開されています。

Subsonic

サーバーとクライアントで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

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

Ultrasonic - Google Play のアプリ

  • メンテされている
  • 評価が高い
  • 今回使用

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

起動画面

Ultrasonicメニュー

まず最初に接続するSubsonicサーバーを指定します。左上の≡をタップして、表示されているサーバー名をタップします(すでに設定後なのでサーバー名が入っています)

サーバー選択

サーバーを追加するので、右下の+をタップします。

Subsonicサーバー設定

サーバー情報を入力します。サーバーに接続できるようになるとアルバム一覧画面はこんな風になります。

アルバム一覧画面

アルバムから曲を選択して再生するとこんな感じになります。

曲再生画面

DSub for Subsonic

DSubの場合は常にコントロールが画面下部に表示されます。

起動画面

また、かえって厄介なことに、Subsonicのデモサーバーの接続情報がデフォルトで設定されていて、初めて使う人は使い方がわからないと思います。

デモサーバー

起動画面左上の≡をタップして一番下にあるSettingに潜ります。

設定画面

ServersをタップしてからのSubsonicサーバーの設定はUltrasonicと同じなのでそれほど迷うことはないと思います。

サーバー設定画面

Subsonicサーバー設定画面

Subsonicサーバーに接続すると曲が読み込まれたことがわかります。

サーバー接続画面

アルバム一覧画面はこんな風になります。また、テーマカラーもDarkに変えています。

アルバム一覧画面

アルバムから曲を選んで再生するとこんな感じです。

曲再生画面

個人的な印象では、Ultrasonicの方がUIがシュッとしていて、DSubの方がプレイリストの編集が簡単です。どちらもいいアプリなので好みで使い分けるのが良いと思います。

スポンサーリンク


comments powered by Disqus