Gerbera + DockerでDLNAサーバーを立てる

# 概要
miniDLNAを試食してみたものの、なんとなくスキャン精度に難があった。
別のDLNAサーバー クライアントを探していたところで、
現在進行系のプロダクトのGerberaを試してみようと思った。

しかし、CentOS 7では手近なパッケージもなく。
ビルドしようにもCMAKEの要求バージョンを満たすことも出来なかった。。。。
(Raspberry Pi向けCentOS 8もまだ来ていないので、8は手が出せない。。。)

しかし、Gerberaコンテナもあったので、Dockerの勉強も兼ねて、
転がっていた仮想環境のCentOS 7でGerberaコンテナにチャレンジした次第。

そんな、Docker処女童貞の備忘録です。

# 環境
* x86_64 (Virtual Box上の仮想マシンでテスト)
* CentOS 7 (≒ 7.7.1908)
* Docker
* Gerbera (Docker image)
* cifs-utils

```:topology
┌───────────────────────────────────────────┐
│ Virtual Box                               │
├───────────────────────────────────────────┤
│ ┌───────────────────────────────────────┐ │
│ │ Cent OS 7 (x86_64)                    │ │
│ ├───────────────────────────────────────┤ │
│ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │
│ │ ┃ media folder                      ┃----------(SMB)---------->
│ │ ┃ (mount from external file server) ┃ │ │
│ │ ┗━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━┛ │ │
│ │ ┌───────── │ ───────────────────────┐ │ │
│ │ │ docker   │                        │ │ │
│ │ ├───────── │ ───────────────────────┤ │ │
│ │ │ ┏━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┓ │ │ │
│ │ │ ┃ Gerbera container             ┠─┼─┼ <-----(udp:1900)--------
│ │ │ ┃                               ┠─┼─┼ <-----(tcp/udp:49152)---
│ │ │ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │ │ │
│ │ └───────────────────────────────────┘ │ │
│ └───────────────────────────────────────┘ │
└───────────────────────────────────────────┘
```


# 構築
## ⓪ 方針
* オリジナルのイメージを使う(再ビルドなし)。
* 設定ファイルの変更あり。dockerからマウントして使用する。
    * ポートはデフォルトから変更なし。
      * udp:1900
      * tcp/udp:49152
    * メディア フォルダのパスの追加・変更もなし。
* メディア フォルダ(実体)もdockerからマウントする。
    * /rootがデフォルトで自動更新対象のパスになっているため、<br />
      /root配下にマウントする。

## ① Dockerイメージのダウンロード

* gerbera/gerbera - Docker Hub <br />
https://hub.docker.com/r/gerbera/gerbera

```shell:shell
docker pull gerbera/gerbera
```

## ② イメージから設定ファイルを抜き出し
イメージから直接はコピーが出来ないので、一時的にコンテナを作成する。
(コンテナ名：gerbera-tmp)
設定ファイルをコピー、後コンテナを削除する。

※ ファイルを抜き出すだけならネットワークが無くても問題はないが
　コンテナの起動には失敗するため一応入れておく。
　必要があればshellを立ち上げて、調査目的にも使用できるので。

```shell:shell
docker run -dit --net=host --name gerbera-tmp gerbera/gerbera
docker ps -a
docker cp gerbera-tmp:/root/.config/gerbera/config.xml config.xml
docker stop gerbera-tmp
docker rm gerbera-tmp     #早速コンテナ削除
```

## ③ 設定ファイルを編集
いくつか設定を変更する。

ここでは、デフォルトでの設定ではm4aの扱いがなく、
mp4がvideoとしてもaudioとしても扱われるため、その修正を行う。
(他サーバー名とか必要があれば、適宜修正を)

※ 注意
 m4aは単純に動画のない音声トラックのみのmp4。
 Appleが勝手に決めたm4aという拡張子は、正式な仕様ではないので、
 必要だと感じない場合は変更不要。

```shell:shell
vi config.xml
```

```xml:config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config version="2" xmlns="http://mediatomb.cc/config/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mediatomb.cc/config/2 http://mediatomb.cc/config/2.xsd">
  <import hidden-files="no">
    <mappings>
      <extension-mimetype ignore-unknown="no">
        <!-- .mp4をvideoとして定義. -->
        + <map from="mp4" to="video/mp4"/>
        <!-- .m4aをaudioとして定義. -->
        + <map from="m4a" to="audio/mp4"/>
        <!-- .aacをaudioとして定義. -->
        + <map from="aac" to="audio/aac"/>
      </extension-mimetype>
      <mimetype-contenttype>
        <!-- 音声コンテンツのMP4はm4aに変更. -->
        - <treat mimetype="audio/mp4" as="mp4"/>
        + <treat mimetype="audio/mp4" as="m4a"/>
        <!-- aac (ADTS AAC)を追加. -->
        + <treat mimetype="audio/aac" as="aac"/>
      </mimetype-contenttype>
    </mappings>
  </import>
</config>
```

## ④ 編集した設定ファイルをホストOSに配置
環境に応じて、良い感じの場所に。
今回はイメージと同様のパスに配置。
(パーミッションも同様に664)

```shell:shell
mkdir -p /root/.config/gerbera/
cp config.xml /root/.config/gerbera/config.xml
chmod 644 /root/.config/gerbera/config.xml
ls -la /root/.config/gerbera/config.xml
```

## ⑤ コンテナ起動
言語を指定しないで起動すると、国際文字の含むファイル名を
iconvで変換かけようとしてエラーになり、DBに登録されない。
しかし、コンテナにインストールされているロケールも最小限しかないため環境変数に「C.UTF-8」を指定する。
(そもそもUTF-8で処理が正しく進行していればiconvの変換は不要なので、ロケール自体はさして重要ではない)


```shell:shell
docker run \
--privileged \
-dit \
-e LANG=C.UTF-8 \
--restart=always \
--net=host \
-p 1900:1900/udp \
-p 49152:49152 \
-p 49152:49152/udp \
-v /root/.config/gerbera/config.xml:/root/.config/gerbera/config.xml \
-v ${ホストのメディア フォルダ}:/root/${任意のフォルダ名} \
--name gerbera \
gerbera/gerbera

```


ロシア語でもiconvエラーが発生していた様なので、割とハマりやすい問題？
(デフォルトはPOSIX？ISO-8859-1？)
・Invalid or incomplete multibyte or wide character · Issue #170 · gerbera/gerbera
https://github.com/gerbera/gerbera/issues/170#issuecomment-354635224



## ⑨ 確認など

* URL <br />
http://localhost:49152/

```shell:shell
# コンテナの確認
docker ps -a

# log確認
docker logs -f gerbera

# shell起動
docker exec -it gerbera /bin/bash
```


# 感触
* 総括としては、あまり魅力がない
* 相性が悪いクライアントが多い
   * DLNA
     * Windows Media Player ⇒ 一覧の参照すらできない。
     * windows版 MediaMonkey ⇒ 参照はできるが、再生ができない。
   * Browser
     * windows版 chrome ⇒ MP4(H264+AAC) などの動画が再生できない(ものがある)。<br />
     ※ windows版 firefox、android版chromeなどは特に問題なく再生できる。
* BubbleUPnP ServerのProxy経由では割と安定的 (BubbleUPnP Server 優秀すぎる)
* 折角のWEB UIの操作性が悪すぎ
   * Ajaxメインで作られているため、メディアを開いたあと戻ると最初からやり直し。
   * 今どきの時代で、、、そのUIて。。。
* サーバーとしての動作は、miniDLNAのほうが安定している様に感じる。。。

# 余談
* CIFSってSMBv1の中のDialectだったと思うのだけど。。。
* Windows 10ではSMBv1系の機能を「SMB1.0 / CIFS」と表現して、SMBv1もろとも殺しにかかっているんだけど。
* SMB2.0以降もSamba(UNIX系プロダクト)ではCIFSって言葉使い続けるのかな・・・・？


# 参考 (感謝)
* Gerbera - A free media server. Stream your media to devices on your home network.
https://gerbera.io/

* gerbera/gerbera - Docker Hub
https://hub.docker.com/r/gerbera/gerbera

* Dockerコンテナの作成、起動～停止まで - Qiita
https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53

* Docker上 で MiniDLNA を動かす - Qiita
https://qiita.com/flny/items/63976669a6f58976fa93

* Dockerであそぶ（４）Apacheの設定を変える | TECH Projin
https://tech.pjin.jp/blog/2015/12/03/docker%E3%81%A7%E3%81%82%E3%81%9D%E3%81%B6%EF%BC%88%EF%BC%94%EF%BC%89apache%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B/

* 複数のMiniDLNAインスタンスを起動して、アクセス制御する - Qiita
https://qiita.com/flny/items/e328941d421a78669704