プログラミング

先々週かな、カラオケやった時にmp3のタグからアーティストや曲名を検索して引っ張ってくるようなアプリがなくて不便だよねって話になったので、思い立って作ってみようと思った。前はガサ入れ参号ってソフトがあったんだけど、VISTA以降は動かなくなってしまったので。ライブラリ系のアプリに入れて管理すれば済む話だけどどこでも使えるわけではないし、エクスプローラの検索はできないこともないけどポンと入れて検索できるわけではない。曖昧な条件で判定してくれないし。なのでざっくりと検索して引っ張ってくるようなのを頑張ってコーディングしてて、ようやく目途が立ってきた。
Visual Studio 2012 Expresa for Desktopを入れて慣れないC#のプログラムを始めてみた。@ITが役立ちすぎる。プログラミング自体10年もやっていなかったので、Shellでちょっとコードを書くとかそのくらいしかできない身には構造体とか継承とかもうなんだっけって話。配列と参照なんかも難しい。それでもどうにか形にはなってきて、Windowのアプリケーションとして動くものと検索のアルゴリズムを並行で書きつつたまにドッキングしてを繰り返して、あいまい検索と複数単語の検索時の条件分岐を書けばとりあえずの仕組みはできるところまでになった。チェックボックスの状態から分岐条件書いて過不足なく動くように検証するのは結構面倒かも。
最初はID3タグを扱えるライブラリをNuGetで入れて使えば終わるかと思ったんだけど対応しているID3v2タグの種類が少なすぎて却下。結局仕様書を見ながら分岐書いてタグ解析して文字列引っ張るコードを自分で書く羽目になった。上手くないなぁとしか言いようがない読みにくいコードで挫けそうになる。文字列で全部処理できればいいんだけど、文字コードの違いがあるのでchar型よりもbyte型で処理した方が楽って分かったり、タグフレームの解析時にない文字探して配列外参照を起こしまくったりともう慣れないことこの上ない。どうにかこうにかタグを引っ張れるようになった時にはちょっと報われた気分だった。
WindowsのFormアプリにするときにもどこに宣言を書くのかファイルが分かれてて混乱したり、イベントハンドラの理解が足りなかったりでひっかかる。ListViewの書き方が一番面倒だったかな。Itemを追加する方法を理解してからは思ってた以上にさくさく進んだ。検索対象のフォルダを変えたら変な文字列が出るようになって悩んだけど、WMPで取り込んだ時につけられるタグが仕様から外れているのが原因だったりで、バイナリエディタも活躍しまくり。
サブフォルダ以下の検索をするかどうかにメイン関数に再帰使ったりもしていたんだけど、処理的に最初にファイルリストを作成する段階で再起をぶん回した方が楽だし、ファイル数をあらかじめ把握できるのでプログレスバーの表示なんかにも使えそうだ。検索対象と曖昧さの許容度合いとスペース区切りの文字列で複数条件をANDORで検索するとか実装すればとりあえずの完成を見るのだけど、空白と空行などの扱いをとにかく厳しくチェックしないと条件が上手くいかないなぁと悩んだり。Trimとループ回してのIsNullOrEmptyでガンガン削ってどうにかなりそうなのでもうちょいがんばるぞっと。とりあえず出来たら、プログレスバーでの進行状況の表示と途中で中断できるようにするところをできたらいいな。