AURにあったfuppesのPKGBUILDでDLNAサーバを立ててxbox360で使おうとしたがSQL関連っぽいエラーが出るのでそれをどうにかする

前書き

これはAURにあったfuppes-svnのPKGBUILDを使ってインストールした時に起きました
fuppesのsvn版で、リビジョンは692だったと思う

症状

色んなサイトを参考にしたのち、fuppesを使ってxbox360が認識するDLNAサーバを立てた後に
いざ、xbox360で再生だぜ!!!!と意気込んだら再生できるファイルはありませんというようなメッセージが出てきて(はっきり覚えてない)

DLNAサーバ側には

    unhandled sort order
    your device requested a sort order that is currently not supported by FUPPES. This is not a bug as FUPPES correctly specifies it's sorting capabilities but your device seems to ignore it.
    please file a feature request containing the following lines:

    === CUT ===
    +upnp:class,+dc:title
    === CUT ===
    SQL select error: near "limit": syntax error :: select   o.OBJECT_ID, o.TYPE, o.TITLE, o.REF_ID, o.VREF_ID,   d.*, CASE   WHEN o.DEVICE is NULL   THEN o.PATH   ELSE  (select PATH from OBJECTS where DEVICE is NULL and OBJECT_ID = o.VREF_ID) END AS PATH, CASE   WHEN o.DEVICE is NULL   THEN o.FILE_NAME   ELSE  (select FILE_NAME from OBJECTS where DEVICE is NULL and OBJECT_ID = o.VREF_ID) END AS FILE_NAME from   OBJECTS o   left join OBJECT_DETAILS d on (d.ID = o.DETAIL_ID) where   o.PARENT_ID = 21 and   o.TYPE < 200 and   o.DEVICE = 'xbox' and   o.VISIBLE = 1 order by  limit 0, 1000

xbox360でアクセスする毎にこんなエラーが出てる場合のお話。
FUPPESのバグじゃないって書いてあると読んだけどxbox360側にpatchなんて当てれないのでFUPPESを修正することにする

何をするのか

最終的には安定してそうなバージョンを使用するのですがコンパイルがなぜか通らないので通るようにしてから
ライブラリの一部の関数名が変更されているのでそれも変更するpatchを当てるだけ
恐らくlibavなんたらに変更があったからだと思う

注意

このpatchを当てても./configureの時に--enable-transcoder-ffmpegオプションがあるとコンパイルに失敗すると思います
よくわからなかったのでそこまでコンパイルできるように対応してません

patch

このpatchはfuppes-0.660用で
http://tenet.dl.sourceforge.net/project/fuppes/fuppes/SVN-660/fuppes-0.660.tar.gz
ソースコード自体はここから落とせます。他は試してません

先ほど貼ったソースコードに以下のpatchを貼り付けます

コンパイル時のincludeのエラーを取り除くpatch
https://github.com/silenvx/PKGBUILD/blob/master/fuppes/fix_includes.diff

コンパイル時の変数のエラーとlibmetadata_libavformat.soのエラーを取り除くpatch
https://github.com/silenvx/PKGBUILD/blob/master/fuppes/fix_libmetadata_libavformat.so.diff

コンパイル時の名前空間のエラーを取り除くpatch
https://github.com/silenvx/PKGBUILD/blob/master/fuppes/fix_namespace.diff

よくわからないけどPKGBUILDに付属しているpatch(必要なのかは知りません)
https://aur.archlinux.org/packages/fu/fuppes-svn/fuppes-svn.tar.gz
この.tar.gzに入っている fix_regexp_crash.diff です。ほかはたぶんいらない

の計、4つです(書いたのは3つ)

archlinuxを使っている人は、私はいじったPKGBUILDをgithub上に置くことにしたので

    % git clone https://github.com/silenvx/PKGBUILD.git
    % cd PKGBUILD/fuppes/
    % makepkg -i

をしたほうがPKGBUILDを書く手間などが省けて早いし簡単かもしれない

ここより下は読む必要はありません

エラーを取り除くのにやった時の手順

まずはエラーメッセージでソースコード内を検索する

    find . -type f -print0|xargs -0 grep -n 'unhandled sort order'

すると./src/lib/UPnPActions/UPnPActionFactory.cppの501行目にあるらしいので見に行く

ある文字列をpart.compare()関数を使って戻り値が0かどうかを見ていて
どれも戻り値が0ではなかった場合にこのエラーメッセージが出る模様。
if文を眺めているとpart.compare("upnp:class")のif文がコメントアウトされていた。
エラーメッセージには

    +upnp:class,+dc:title

この文字列があるのでこの文字列があった場合に処理ができなかったと予測した
svn版ではない安定版はないのかと探すと
sourceforgeにfuppesがあって、そこに0.660のtar.gzがあったのでそれを使うことにした
http://tenet.dl.sourceforge.net/project/fuppes/fuppes/SVN-660/fuppes-0.660.tar.gz
これをダウンロードして。先ほどのコメントアウトされていた部分を見てみるとコメントアウトされていないので
0.692の代わりにこれを使おうとコンパイルしようとするとエラーを吐くので
先ほど使っていたバージョンのPKGBUILDに付属していたpatchを参考にしながらいくつかpatchを書くことにしました
まずはinclude関連でだめになってしまうので
コンパイル->エラーを繰り返しして虱潰ししていきます
それでできたpatchがこれです
https://github.com/silenvx/PKGBUILD/blob/master/fuppes/fix_includes.diff

大文字で構成された存在しない変数を使っていたので
検索エンジンで適当に調べて、それっぽい変数に置き換えたpatchを書いたのですが、後で書く奴で一緒に対応したのでpatchは貼らずに飛ばします
(別けた場合はpatchを貼る時に前後の文字が変わってしまって失敗する場合があるので1つにまとめました)

後は名前空間が書かれていなかったのを修正したpatchがこれで
https://github.com/silenvx/PKGBUILD/blob/master/fuppes/fix_namespace.diff

ここまですればコンパイルは通るのですが、rebuild databaseをすると

/usr/bin/fuppes: symbol lookup error: /usr/lib/fuppes/libmetadata_libavformat.so: undefined symbol: av_open_input_file

こんなエラーが出てfuppesが死んでしまいます。原因は恐らく、ライブラリの関数名の変更によるものだと思うのでそれに合わせていじりますがsvn版の同じファイルを見てみたところ、対応するような書き方になっていそうだったので真似して書いたpatchが
https://github.com/silenvx/PKGBUILD/blob/master/fuppes/fix_libmetadata_libavformat.so.diff

最後にバグを直してそうな、PKGBUILDに付属していたpatchを当てます(必要あるか知らぬ)
https://aur.archlinux.org/packages/fu/fuppes-svn/fuppes-svn.tar.gz
ここから落としてきて、fix_regexp_crash.diffをパクります
(直接そのpatchだけを入手する方法は知らない)

ここまでできたら後はpatch当てて、他のサイトを参考に適当にいじれば
たとえ使えるパソコンが低スペでも変換を必要としないならusbを介さずに問題なく簡単にxbox360経由で動画が見れるようになりましたとさ

関係ないけどxbox360でこのfuppes-0.660を使う時は

http://d.hatena.ne.jp/UDONCHAN/20080914/1221376933
こちらのサイトを参考にしました
ただ、このサイトの情報は古いので0.660を使う場合は
fuppes.cfgのいじるところは

    <device name="Xbox 360" virtual="Xbox 360" enabled="true">

これを有効にします。
後は古さなどは関係ないと思いますが、fuppes.cfgの上の方に例で書いてあるように、xbox360でみたい動画などが入っているディレクトリを

    <shared_objects>
        <dir>/mnt/music</dir>
    </shared_objects>

こんな感じで指定します
ちなみにweb上のテキストボックスから半角スペースの入ったディレクトリ名を共有するように送信すると、httpプロトコルの使用上で、+に置き換わってしまって、それを置換しないので認識されないバグがあるみたいなので注意(確かめてないので想像)
この辺のインターフェイス周りはsvn版の方がディレクトリ構造が見れるし使いやすいなあと思った
でも、svn版だとdatabaseの更新をするとサムネイルの生成などをしだしてかなり時間がかかるけど、0.660だとそれがないので早いけど…何か間違ったのかな…

それとvfolder.cfgはソースコードの場所に置いてあるみたいです
これもxbox360で動画ファイルなどを認識させるのに必要なので所定の場所にコピーしましょう
ここまですれば私は再生できました

どうしても共有されないという方はfuppesの起動後にlを数回送信して、logレベルを3にしてからrやvやらuを適当に押して、ディレクトリ名 not foundなどの文字がないか確認することをおすすめします

後書き

正直、いちいちpatchを分ける必要はなかった気しかしないけど、まあいいや…
gistにpatchを上げた時に改行コード関連が面倒くさかったり、毎回個別で上げるのが面倒だったりするのでPKGBUILDごとgithubで管理することにしました

後は関係ないけど
xbox360をやらなさすぎてゲームタグっていうの?アカウントが消されていた…。
プロフィールをダウンロードというのをやってみたのはいいものの進行バーが途中まで進んでエラーが出て失敗する
サポートセンターに電話したところ、数年間オンラインに繋いだりしないと消される場合もあるとのこと
ついでに操作も間違えたのか、セーブデータも吹っ飛んだよ

それと、プロキシ的なものというかダウンロードしてきたファイルをそのままxbox360横流しするようなプログラムを書けばゴールドメンバーシップの有料会員じゃなくてもDLNA経由でxbox360youtubeなどの動画サイトの動画が見れるようになると思うけど、どうなんだろ…できるのかな

後書きの追記 2014/02/15

セキュリティ情報に電話番号追加したらゲームタグのログインできるようになりました!!!!!
xbox360で念願のドリームクラブやります!!!
サポートセンターに嘘つかれてました!!