Playlist auslesen

Heinzi1991

Erfahrenes Mitglied
Hallo liebe Community!

Hab ein kleines Problem mit einem Programm!

Also ich habe eine m3u - datei und eine txt - datei und die sollen eingelesen werden und in eine verkettete liste gespeichert werden!

meine verkette liste schaut so aus:
Code:
typedef struct playlist
{
char title;
char file;
char artist;
char album;
int year;
char comment;
int tracknr;
char genre;
int duration;
int size;
char id3version;
struct playlist *next;
} PLAYLIST;

so nun möchte ich gerne das er meine m3u datei einliest; und natürlich die tags richtig in die liste einspeichert, nur weiß ich nicht richtig wie!

hoffe mir kann jemand helfen!
 
Hallo

Könntest du vielleicht ein Beispiel einer .m3u Datei posten?
Zudem verstehe ich nicht ganz, was aus der von dir angesprochenen .txt geworden ist.
Dein Struct scheint mir etwas kritisch: title, file, artist, album, comment, genre, id3version können alle keinen string, sondern nur ein Zeichen speichern. Du meinst wohl char* statt char.

Grundsätzlich: Datei per fgets() einlesen und dann die char* mallocieren und in diesen Bereich dann kopieren.

Gruss
cwriter
 
also meine m3u datei schaut so aus:

Code:
# comment line
4.mp3
5.mp3
#another comment line
6.mp3

beginnt die zeile mit '#' dann soll sie übersprungen werden!
so diese gebe ich in der commando line ein, also ist es argv[1] und meine txt - datei stehen nur genres drinnen und wird auch in der commando line eingegeben also argv[2]!

und jetzt will ich die informationen die in der mp3 datei, also interpret etc als id3tags eingespeichert sind in meine liste einspeichern, damit ich dann mit der liste weiter arbeiten kann!

will zum beispiel dann mit einer funktion die show show heist so etwas erstellen

Code:
prog> show title,artist,id3version,tracknr
title: vier
artist: blabla
id3version: ID3v1.1
tracknr: 1
----------------------
title: fünf
artist: blabla1
id3version: ID3v1.1
tracknr: Unknown

usw.
 
Uh, .mp3-Meta auszulesen ist nicht ganz so einfach.
Hier siehst du, wo diese sich befinden: http://www.dreamincode.net/forums/topic/47881-reading-id3-tags-from-mp3/
Nun zum eigentlichen pseudo-Code:
Code:
file = fopen("DIE_TXT_DATEI","rb");
while(fgets(temp,size_of_temp,file) != NULL)
{ 
    if(temp[0] == '#') continue; //Comment
    if(temp[strlen(temp)] == '\n') temp[strlen(temp)] = '\0'; //Das '\n' wollen wir nicht 
    FILE* f = fopen(temp,"rb");
    if(f == NULL) //usw....
    fseek(f, -128, SEEK_END);
    char meta[129]; //1 mehr schadet nie
    fread(meta,1,128,f);
    //meta aufsplitten und in das Struct kopieren
}

Hilft dir das weiter?

Gruss
cwriter
 
ja also ich kenn mich einigermaßen aus, aber kannst du mir das noch einmal kurz erklären! so richtig hab ich das nicht verstanden, wie man jetzt den artist[30] string in den struct kopiert!
 
Nun, du definierst dein struct am besten mit den gleichen Grössen:
char title[30];
char artist[30];
...
(Alles im Link angegeben).
Dann kannst du direkt per memcpy(&dein_struct,meta+3, 125) die Daten kopieren (die Reihenfolge der einzelnen strings muss aber stimmen).
Dabei kannst du auch nach den "offiziellen" Angaben deine eigenen einfügen.

Ansonsten geht der mühsame Weg so: memcpy(dein_struct.title, meta+3, 30);, dann memcpy(dein_struct.artist,meta+33,30); usw.

Gruss
cwriter
 
ok aber passt das mit meinem struct playlist *next, da es dann weiter geht wenn es mehr als eine mp3 datei gibt? oder soll ich das auch am besten umschreiben
 
Wieso sollte das nicht gehen?
Ich bin nicht gerade der Experte für verkettete Listen (mag ich nicht sonderlich, ich arbeite lieber mit arrays ;-) ), aber soweit ich weiss, referenzierst du ja nur das nächste struct.

Gruss
cwriter
 
so bin jetzt deinen pseudo - code durchgegangen und wollte in programmieren, aber hab zurzeit nur eine tief - phase, und versteh gar nichts mehr!
 
Konkreter?

Du hast einfach 2 Dateien. Die eine (die m3u-Datei) wird zeilenweise ausgelesen. Die Zeilen sind der Pfad zur Datei. Dann nimmst du diesen Pfad, öffnest damit die .mp3-Datei, setzt den Cursor in der Datei auf Schluss - 128 (128 Bytes vor Schluss) und liest diese 128 Bytes in einen char- oder bytearray. Dieser Bytearray entspricht dann einem struct.

Ansonsten: Was genau verstehst du nicht?

Gruss
cwriter
 
Zuletzt bearbeitet:
Zurück