有馬総一郎のブログ

(彼氏の事情)

2012年06月20日 20:35:00 JST - 3 minute read - Subsonic

Subsonic構築への道 その7(Subsonic 導入 ソース改造編)

で持ってソースの修正である。Subsonicはちょっと前まで日本語で表示することも出来なかったぐらいなので、ファイルのダウンロードにいたっては化けてて出くる。

有馬総一郎のブログ

有馬総一郎のブログ

有馬総一郎のブログ

直すべきファイルは一つだけ。
subsonic-4.6-src/subsonic-main/src/main/java/net/sourceforge/subsonic/controller/DownloadController.java

直す箇所は4箇所

  • メソッド downloadFile

DownloadController.java

// 2012/06/16 mod 文字化け対応 start
// response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + '\"');
String fileName = new String(file.getName().getBytes("MS932"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + '\"');
// 2012/06/16 mod 文字化け対応 end
  • メソッド downloadFiles

DownloadController.java

// 2012/06/16 mod 文字化け対応 start
// String zipFileName = dir.getName() + ".zip";
String zipFileName = new String(dir.getName().getBytes("MS932"), "ISO-8859-1") + ".zip";
// 2012/06/16 mod 文字化け対応 end
・・・中略・・・
ZipOutputStream out = new ZipOutputStream(response.getOutputStream());
// 2012/06/16 add 文字化け対応 start
out.setEncoding("MS932");
// 2012/06/16 add 文字化け対応 end
  • メソッド downloadDirectory

DownloadController.java

// 2012/06/16 mod 文字化け対応 start
// String zipFileName = file.getName() + ".zip";
String zipFileName = new String(file.getName().getBytes("MS932"), "ISO-8859-1") + ".zip";
// 2012/06/16 mod 文字化け対応 end
・・・中略・・・
ZipOutputStream out = new ZipOutputStream(RangeOutputStream.wrap(response.getOutputStream(), range));
// 2012/06/16 add 文字化け対応 start
out.setEncoding("MS932");
// 2012/06/16 add 文字化け対応 end
  • メソッド downloadPlaylist

DownloadController.java

// 2012/06/16 mod 文字化け対応 start
// String zipFileName = playlist.getName().replaceAll("(\\.m3u)|(\\.pls)", "") + ".zip";
String zipFileName = new String(playlist.getName().replaceAll("(\\.m3u)|(\\.pls)", "").getBytes("MS932"), "ISO-8859-1") + ".zip";
// 2012/06/16 mod 文字化け対応 end
・・・中略・・・
ZipOutputStream out = new ZipOutputStream(RangeOutputStream.wrap(response.getOutputStream(), range));
// 2012/06/16 add 文字化け対応 start
out.setEncoding("MS932");
// 2012/06/16 add 文字化け対応 end

modは//でコメントアウトしている部分を下の行で書き換え。addはそこに追加したってこと。

ソースを直したらコンパイル。やり方は↓で紹介したとおり、 mavenで行う。
Subsonic構築への道 その5(Subsonic 導入 ソースコンパイル編)

ごっそり、warを再配備しても、良いのかも知れないが(駄目?)、classファイルだけ置き換えるだけで修正は反映される。

コンパイルすると subsonic-4.6-src/subsonic-main/target/classes/配下にclassファイルができているので、それをコピーする。

$ cp subsonic-4.6-src/subsonic-main/target/classes/net/sourceforge/subsonic/controller/DownloadController.class /var/lib/tomcat6/webapps/subsonic/WEB-INF/classes/net/sourceforge/subsonic/controller/DownloadController.class

-rw-r--r-- 1 tomcat6 tomcat6  2687 6月 10 23:54 DonateController.class
-rwxrw-r-- 1 xxxxxxx xxxxxxx 14664 6月 20 19:31 DownloadController.class

まあ、別にこのままでも良いけど、何か気持ち悪いので所有ユーザ、グループを変更。

$ sudo chown tomcat6:tomcat6 /var/lib/tomcat6/webapps/subsonic/WEB-INF/classes/net/sourceforge/subsonic/controller/DownloadController.class

アクセス権限も変更。

$sudo chmod 644 /var/lib/tomcat6/webapps/subsonic/WEB-INF/classes/net/sourceforge/subsonic/controller/DownloadController.class

-rw-r--r-- 1 tomcat6 tomcat6 2491 6月 10 23:54 DBController.class
-rw-r--r-- 1 tomcat6 tomcat6 2687 6月 10 23:54 DonateController.class

tomcatを再起動。

$ sudo service tomcat6 restart

有馬総一郎のブログ

有馬総一郎のブログ

有馬総一郎のブログ

めでたくファイル名が文字化けせず、ダウンロードできる。確認としては4つ。

  1. 右上のフレームから「全て追加」の右隣の「ダウンロード」で化けないか?
  2. 右上のフレームのアルバムリストから「D」ダウンロードのアイコンボタンを押下してのダウンローで化けないか?
  3. 右下のプレイリストからプルダウンのプレイリスト操作の下「ダウンロード」操作で化けないか?
  4. 右下のプレイリストからチェックボックスで選択曲をチェックし、プルダウンの曲目の選択の下「ダウンロード」操作で化けないか?

これらで化けなきゃオッケー(画像は足りてないが…化けてないことは確認)

ただ、今流行(?)の韓国語(というか外国語)は文字化けしてしまう。更に他のOS(Ubuntu)だと文字化けを起こす…まあ、圧倒的なシェアを誇るのWindowsに合わせる結果にしたわけで・・・

有馬総一郎のブログ

まあ、直すべきところは分かったので時間があったら、OS対応、多国語対応な方法を考えてみるか…まあ、ある程度満足できる状態になったの20ユーロ寄付した。


追記: 2013-06-29
UTF-8でダウンロードできるようにしました。
Subsonic、ファイルダウンロードをUTF-8で
追記ここまで