へぬもへメモ

https://twitter.com/henumohe

クロスフェード対応google music再生アプリを作りたい その1

前提・問題意識

  • 自宅用にロスレス圧縮した音源を、iPod touchから再生したい
  • Dock端子からポータブルアンプに繋ぎたいので、iPhone,iPodが前提
  • iTunesとalac使えばできるのだが、うちのiPod touchは容量8GB
  • audioGalaxy使いだったが、サービスが終わったのでgoogle musicに移行した
  • 管理が面倒なので、自宅用音源をそのまま外で聞けるようにしたい
  • 音楽をクロスフェード再生したい ←これ大事

作りたいもの

個人的な機能要件

存在するiphonegoogle music再生アプリ

Melodies

再生や検索が高速かつ安定しているので、普段使い中

gBeats

オフライン再生機能搭載。

gMusic

Melodiesと機能は同等だが、よく再生が途中で止まる。

app for Google Music Free

2アカウント切り替え機能搭載。UIがこなれてない、日本語の扱いが下手という理由で使用は見送り

その他アプリ

CloudBeats

Box,Dropbox,Google Drive,Mediafire, SkyDrive上のmp3を再生できる。
0.5~2.5倍速に0.05刻みで変更する機能と、10s,30sずつ前後移動する機能がある。
アーティスト検索やflac再生ができないので音楽プレーヤーとしては使えないが、ラジオ音源や学習用音源を聞くのには最適っぽい。上記サービスを組み合わせれば数十GB利用できる。

ミュージックライブラリ向け クロスフェード対応アプリ

  • My DJ with Crossfade
  • Audieon
  • Quick Mix
  • LouderLogic

次に調べること

  • 既存の音楽アプリでgoogle musicの曲を管理する方法はないか
  • google music以外で音楽管理する方法はあるか

ここまで書いたところで、「iPod touch 64GB買ってきてalacで曲突っ込めばいいんじゃね」ということに気づいた。また日が経ってから考えよう。

Webstemmerの文字コードが解決したと見せかけてしてなかったけど一応再度解決

前回の続き。タイトルがまどろっこしい。
extract.pyのオプションに'-c euc-jp'を入れて解決したと思いきや、日経の文字コードUTF-8で、今度はこちらが文字化けることが発覚。どうも文字コードを指定すること自体が問題らしい。
どうしたら良いか分からず、思いつきで文字コード指定をとっぱらってみた。

#extract.py
def main():
  ...
  (debug, pat_threshold, diffscore_threshold, mainscore_threshold, default_charset, codec_out, strict) \
          = (0, 0.8, 0.5, 50, '', 'utf-8', False)
       #  = (0, 0.8, 0.5, 50, 'iso-8859-1', 'utf-8', False)

文字コード指定が無いときはiso-8859-1でエンコードしていたらしい。本当に完全な思いつきで空白にしてみただけなのだが、これで直ってしまった。
元々HTMLパーサでmetaタグのcharsetから文字コードを取得していたのだけど、どうやらdefault_charsetのほうが優先されてしまってたみたい。

#htmlparser3.py
CHARSET_FIND = re.compile(r'charset\s*=\s*([^">;\s]+)', re.I)
def hook_charset(self, attrs):
  if ('http-equiv' in attrs) and ('content' in attrs):
    m = self.CHARSET_FIND.search(attrs['content'])
    if m:
      self.set_charset(m.group(1))
  elif 'charset' in attrs:
    self.set_charset(attrs['charset'])
  return

問題はmetaタグからcharsetを取得できなかった場合だが、とりあえず文字コード指定の無いHTMLを発見するまでは放置しておくことにした。
きっと次回へ続く。