FlashBuilder4でのデータとサービスでハイフンが入ったタグ名を回避する方法

きっかけ

自宅サーバーにSubsonicというミュージックサーバーを動かしていて、こいつはAPIを使っていろいろクライアントを作れたりする。
実際にいくつかクライアントが公式ページで紹介されている。
そこでAIRを使って自分で遊んでみようと思いたって作る事にした。
FlashBuilder4から新しく使えるようになった「データとサービス」を使うとWebサービスなどのデータがものすごく簡単にアクセスできるようになった。
ところがいざSubsonicAPIを使って「戻り値の型を設定」のウィザードにある自動検出で操作を呼び出して設定しようすると下のようなエラーが出て先に進めず...


ActionScript命名規則の壁

SubsonicAPIXMLかMP3などのバイナリを返してきくるが、XMLのタグにハイフンが含まれているせいであるようだ。
実際にハイフンを除いてウィザードの「サンプルXML/JSON応答を入力」を選び、図の様に入力すると問題無く次に進む。
ググってみたらどうやらXMLパーサーが解析したタグの名前をプロパティ名に充てようとするために起こるらしい。

具体的に言うとXMLに"foo-tag"というタグ名があるとオブジェクトは次の様にマッピングしようとする(多分

HogeObj.foo-tag

ハイフンはマイナス演算子として扱われるためにエラーになるらしい。
回避方法としては[]を使ってインデックスに文字列を指定してアクセスすればいけるらしい。
でも今回はデータとサービスの機能を使いたいしということで却下w

Flaskでproxy的な使い方をする

まずFlaskを簡単に説明するとRubyでいうSinatraにあたるマイクロWebフレームワーク。
詳しく知りたい方はググってください。

で、具体的な方法はFlaskがSubsonicサーバーのフロントエンドになりFlaskのハンドラがurllib2でアクセスしにいってその中のXMLを書き換えるという強引な方法。
こうした理由はHTML5でも使う予定をしてるけどサーバーが返すレスポンスが少しマズいのでaudioタグで再生できないというのが有ったし、いろいろ書き換えて遊ぶためにFlaskを採用した。
まあ最もお前の趣味だろと言われれば否定しないけどw

コード

今回できたコードが以下。
とりあえうず動く確証が欲しかったのでベタ書き&ping.viewのAPIのみしか動きませんが...

#! python
# -*- coding:utf-8 -*-

from flask import Flask
import urllib2

BASEURL = 'http://<subsonic-url>/rest/'

app = Flask(__name__)


@app.route("/ping.view")
def do_ping():
    target_action = "ping.view?u=USERNAME&p=PASSWORD&v=VERSION&c=CLIENTNAME"
    result = urllib2.urlopen(BASEURL + target_action)
    result_body = result.read()
    return result_body.replace("subsonic-response", "subsonicResponse")
    

if __name__ == '__main__':
    app.run(debug=True)

ちなみにユーザー名とかパスワードとか(GETパラメータのu,pの部分)べた書きすればパスワード無しでAPI使えるだだ漏れミュージックサーバーができる。

今後の改良点

上のコードだとAPIの数だけルーティング書かないといけなくなりさすがに面倒臭いのでURLの部分からぶっこ抜いて横流しすれば関数1個で済む。
というコードが書けたらいいなあと思ってる。
あとはデータを弄る関数を分離することぐらいかな。