libid3: Tags in Schleife einlesen und verarbeiten.
-
Hallo,
Ich versuche einen Ordner, der MP3 dateien enthält mit Hilfe der libid3 Bibliothek zu verarbeiten. Die Grundidee ist, dass ersteinmal jeder Titel und Interpret einer Datei erfasst wird:
void sort(string choose_dir, string music_dir) { ID3_Tag worktag; ID3_Frame *frame1; DIR *workdir, *musicdir; struct dirent *entry; string workfile; string a=".."; string b="."; char artist[1024], title[1024]; workdir = opendir(choose_dir.c_str()); musicdir = opendir(music_dir.c_str()); do { entry = readdir(workdir); if(entry && entry->d_name != a && entry->d_name != b) { string mp3, part1; part1=entry->d_name; mp3=choose_dir+part1; worktag.Link(mp3.c_str()); frame1=worktag.Find(ID3FID_TITLE); frame1->Field ( ID3FN_TEXT ).Get ( artist, 1024 ); string path; path="/home/serbud/test/"+part1; rename(mp3.c_str(),path.c_str()); cout << artist<<endl; //cout << entry->d_name<<endl; } }while(entry); closedir(workdir); }Jedoch passiert bei Aufruf folgendes: (wobei wir annehmen dass 'track1' der tatsächliche Titel eines Stückes ist und alle anderen Stücke andere Titel haben.)
Track 1 Track 1 Track 1 Track 1 Track 1 Track 4 Track 1 Track 1 Track 1...und so weiter. Ich verzweifle noch, weiß nicht weshlab dies der Fall ist. Lasse ich die Dateinamen (nicht den Tag Inhalt!) nacheinander ausgeben, treten keine Probleme auf.
-
Keine Ahnung, das offensichtlichste wäre natürlich, dass die alle den gleichen Tag haben. Als Buffer für den Titel verwendest du aus unerklärlichen Gründen ja auch die Variable "artist". Ich weiß nicht wie libid3 funktioniert, aber auffällig ist der Link()-Aufruf am ID3-Tag Objekt in Zeile 30. Eventuell erlaubt es die Library ein solches Objekt nur einmal zu "linken" (was auch immer das heißen mag). Versuch mal die Definition von "worktag" in die Schleife zu verlagern, der Compiler sorgt dann dafür, dass sich die Variable in jedem Schleifendurchlauf "wie frisch deklariert" verhält.
-
Ich versuche zur Zeit auch diese Library zu verwenden, bin aber beim Benutzen weniger erfolgreich als du.
Ich bekomme noch lauter Linking-Fehler. Aber ich hab mir die Dokumentation schonmal angekuckt und hab da noch iwas mit Clear() im Kopf; habs auch mal rausgesucht:http://id3lib.sourceforge.net/api/class_i_d3___tag.html#a3
Edit:Rechtschreibung
-
*Seufz*
Vielen herzlichen Dank, daran lag's.
-
Und siehe da: Der gleiche Fehler erneut:
do { worktag.Clear(); entry =readdir(sortdir); if(entry) { string next = entry->d_name; if (next.find("mp3") != string::npos) { char artist[1024], title[1024]; string nextfile = usersortdir+next; worktag.Link(nextfile.c_str()); frame1 = worktag.Find(ID3FID_TITLE); frame1->Field ( ID3FN_TEXT ).Get ( artist, 1024 ); cout <<artist<<endl; } } }while(entry);
-
Ich habe bei mir jetzt erstmal hinbekommen die Lib richtig einzubinden, falls ich in den nächsten Tagen auf ähnliche Probleme stoße meld ich mich nochmal.