Ampacheを無理やりSJISのタグに対応させる

何をするのか

Ampacheは便利なのですが、そのままだと日本語のSJISのタグが付いたmp3などを突っ込むと文字化けしまくる。
WindowsはSJIS以外だとエクスプローラで文字化けするため、意識してないとSJISで管理しちゃうことが多い。

タグを別の文字コードに変換するのは面倒なため、Ampache側をいじることとする。

やり方

注意:かなり雑な方法なので、通常だと問題ない文字コードや特殊な文字などを処理したときに文字化けするかも。

確認環境

ubuntu 16.04 + nginx + php 7.0 + Ampache 3.8.3 (+ getID3 1.9.11)

「mb_detect_encoding」関数を使うので、php-mbstringパッケージをインストールして有効化

もう入っていれば飛ばして問題なし。

sudo apt-get install php7.0-mbstring
sudo systemctl restart php7.0-fpm.service

getID3にSJIS判定を追加

以下のファイルを編集する
– (ampacheインストールディレクトリ)/lib/vendor/james-heinrich/getid3/getid3/getid3.lib.php

この部分のすぐ後に

public static function iconv_fallback($in_charset, $out_charset, $string) {

       if ($in_charset == $out_charset) {
                return $string;
       }

以下を追加する

       if( mb_detect_encoding($string,"SJIS-win",true) ){
                return mb_convert_encoding($string,$out_charset,"SJIS-win");
       }

対応方法についてのメモ

何か問題が起こったときに確認するためのメモ。

getID3について

以下で公開されてる。
https://github.com/JamesHeinrich/getID3

Ampacheではこれを使ってmp3などのタグを処理してるのですが、getID3は本記事時点で最新のv1.9.13でもSJISに対応していない。
とはいえプルリクエストしてどうにかなるものではなさそう。

文字コードに何を使っているのか文字列から判定する必要があるのですが、その対応がとても難しいです。
少なくともPHPの関数だけでは世界中の文字コードを間違いなく判定することはできないと思われる。
なので、対応する文字列を無難な中から取捨選択するしかなさそう。

そもそもSJISなんて使ってるMicrosoftが諸悪の根源に違いない。

getID3に追記した内容について

文字列の判定と変換を、通常では以下の順番でやってる。

  1. [変換前文字コード=変換後文字コード]の場合
  2. …もろもろそれ以外の場合

それをこうする

  1. [変換前文字コード=変換後文字コード]の場合
  2. [変換前文字コード=SJIS]の場合 <= 追加
  3. …もろもろそれ以外の場合

コメント