プログラム:複数のMP3ファイルからID3タグを取得する
習作なのだが、指定したディレクトリ以下にあるファイルからID3タグ(v1.0/1.1とv2.3)を取得するJavaプログラムを作ってみました。
こちらからLHAで固めたファイルをダウンロードできます。
使い方は、DOS窓(コマンドプロンプト)からmp3filelistディレクトリの上(LHAファイルを展開したときはMP3FileListディレクトリになる)に移動して以下の様に入力して実行してください。<ディレクトリ>にはMP3のファイルがあるディレクトリを指定してください。
>java mp3filelist/MP3FileListMain <ディレクトリ>
指定したディレクトリ以下(サブディレクトリも検索します)のファイルからID3タグを取得して、csv風のデータを標準出力に表示します。ファイルに保存する場合はリダイレクトしてください。(わからない場合は"DOS リダイレクト"でググれ)
ID3タグのv1.0/1.1とv2.3が設定されている場合は、両方とも出力するようにしています。それが嫌なら改造してね。
●注意・免責:
- このプログラムは、習作のため、動作を保証しません。何らかの被害があっても、当方は一切の責任を負いません。ミスが見つかったらこっそり直すかもしれませんし、直さないかもしれません。Javaのセオリーに従っていない変な構造になっているかもしれませんが、見直ししていないからです。すみません。
- そんなに難しい作りではないのですが、わからない場合はいい機会だと思って勉強してください。質問されても猫並みの気まぐれさで回答するかもしれませんし、しないかもしれません。
- 勝手に改造してもらっても構いませんが、Javaの発展のため、そのソースプログラムは必ず公開してください。
ちなみに改造してビルドする場合は(packageにしているので)mp3filelistディレクトリではなく、その上のディレクトリで以下の様に実行してください。
>javac mp3filelist/*.java
#いやね、このプログラムを途中まで作って放置していたらmp3filelistディレクトリでコンパイルしてエラー出てきて困ってしまった思い出があるので・・・。
« 訃報:広川太一郎 | トップページ | 昨日のプログラムについて »
MESSAGE
投稿: ISHMAel back | 2008年3月15日 (土) 15時26分
MESSAGE
投稿: ISHMAel back | 2008年3月22日 (土) 06時22分
javaプログラミング初心者の大滝拓馬と申します。
今、貴方様が作成された複数のMP3ファイルからID3タグを取得するプログラムをご利用したいのですが実行するとディレクトリを引数に指定してと表示さてしまいます。
どの部文の引数にディレクトリのパスを指定すればよいのかわかりません。教えてください。
よろしくお願いいたします。
投稿: otaki takuma | 2012年2月19日 (日) 14時15分
あー、たぶん、ディレクトリ名に空白が入っているんじゃないですか?たとえばC:\Program Filesとか。
この場合、ダブルクォーテーションで括ってください。"C:\Program Files" という感じで。
>java mp3filelist/MP3FileListMain "C:\Program Files"
となります。
そうでないならフルパスを指定してみてください。
引数に空白を入れるときはダブルクォーテーション"で括らないと、2つの引数”C:\Program”、”Files”として見られてしまうので、それでディレクトリを見に行ってしまいます。
そのディレクトリがないと
「引数に指定したのは、ディレクトリではない
引数にディレクトリを指定して」
と出力されます。
出力内容については勉強する機会なのでプログラムを読んでみてください。(^ ^;)だいぶ前なので忘れてます。
投稿: 炬燵犬 | 2012年2月19日 (日) 19時40分
風をこじらせてしまいお礼の言葉がおそくなってしまい誠に申し訳ございませんでした。
初心者にも関わらず親切に教えて頂いたおかげでプログラムをご利用することができました。
本当に感謝しております。
ありがとうございました。
投稿: 大滝拓馬です。 | 2012年2月21日 (火) 04時07分
ご丁寧にありがとうございます。当方は、ゆる~くやっておりますので、堅苦しいことはうっちゃってくださいな。
とはいえ、成功したかどうか教えていただけるのは、ありがたいです。
Javaは、シンプルにかつ拘って凝ることができる言語(オブジェクト指向言語)ですので、楽しみながら色々作ってみてくださいねー。
投稿: 炬燵犬 | 2012年2月21日 (火) 23時44分
現在、アーティスト名が同じ場合の時には重複しないでアーティスト名を取得できるようプログラムを作成しています。
Mainクラスのプログラム中のMP3Tagクラス内の二番目のtryの文をHashSetを用いて
try {
HashSet hs = new HashSet();
for(int i = 0; objMP3List.size() > i; i++) {
MP3Info objMP3Info = (MP3Info)objMP3List.get(i);
String artist = objMP3Info.getArtist();
if(!hs.contains(artist)){
System.out.print(artist +",");
hs.add(artist);
}
と書き直し、import java.util.HashSet;を追加してコンパイルは成功したのですが、実行すると重複しているアーティスト名も表示されて困っています。
どうすれば重複せずに取り出せるかアドバイス頂けませんでしょうか。よろしくお願いいたします。
投稿: 大滝拓馬です | 2012年2月24日 (金) 23時13分
ふむぅ。
HashSetのインスタンスを作るところを間違ってますな。MP3TagクラスのoutputFiles()は、サブディレクトリを検索するため再帰してますし。このままだとHashSetクラスのインスタンスを毎回newしているので中身が空になります。当然、重複を判定できないです。
MP3Tagクラスのメンバ変数として、インスタンスを生成しないと。(HashSetインスタンスを初期化が場合により必要)
private static HashSet hs = new HashSet();
あと、HashSetのようにジェネリッククラス使った方が良さげです。
分かりにくいソースでは有りますが、よく読んで、いろいろやってみるのも勉強ですぜ。お仕事でプログラムを読んでいると、ワケワカなソースが多いですし・・・。慣れておいても損はないっす。
投稿: 炬燵犬 | 2012年2月25日 (土) 16時43分
インスタンスを作る場所が間違っておりました。MP3Tagクラス内にインスタンスを生成したら実行結果で上手くアーティスト名を重複せずに取得することができました。
お忙しい中アドバイスを頂きまして本当に感謝しております。本当にありがとうございました。
投稿: 大滝拓馬です。 | 2012年2月26日 (日) 00時49分