Entwickler-Ecke
Sonstiges (Delphi) - WPL Playlist Parsen
seji - Di 13.10.09 18:25
Titel: WPL Playlist Parsen
Hallo zusammen,
wie ihr sicher seht bin ich gnaz neu hier und hab auch gleich ne frage(hab nämlich erst vor paar tagen angefangen delphi zu lernen).
Und zwar bin ich gerade dabei ein Programm zu schreiben das die mp3's/wma's etc. in der playlist extraiert, sprich also kopiert an den Ort wo der user es möchte.
Mit normalen m3u Playlist funktioniert mein Programm, soweit so gut. Jetzt möchte ich aber auch noch eine unterstützung für wpl (windows Media Player) hinzufügen, nur hier komm ich mit dem parsen der playlist leider nicht so ganz klar. hier mal mein code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110:
| library wpl;
uses SysUtils, Classes, Mp3FileUtils;
{$R *.res} function parsewpl(path:String):TStrings; stdcall; var InFile : TextFile; quelle : String; List:TStrings; next_mediasrc:Integer; Position_seq:Integer; Position_tid:Integer; filename:String; stream: TFilestream; Id3v2Tag: TId3v2Tag; Artist:String; Title:String; Mp3Title:String;
begin next_mediasrc:=0; List:=TStringList.Create; assignFile (InFile, path); reset (InFile); while not eof (InFile) do begin
readln (InFile, quelle);
if next_mediasrc=1 then begin quelle:=Trim(quelle); filename:=quelle; Delete(filename,1,12); Position_tid := Pos('tid', filename); if Position_tid <> 0 then begin Position_tid:=Position_tid-2; Delete(filename,Position_tid,Length(filename));
end else begin Delete(filename,(Length(filename)-2),Length(filename)); end;
Id3v2Tag := TId3v2Tag.Create; stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite); Id3v2Tag.ReadFromStream(stream); stream.free; Artist:=Id3v2Tag.Artist; Title:=Id3v2Tag.Title; Mp3Title:=Artist+' - '+Title;
List.Add(filename); List.Add(Mp3Title); end;
Position_seq := Pos('<seq>', quelle); if Position_seq <> 0 then begin next_mediasrc:=1; end;
if filename=' ' then begin next_mediasrc:=0; end else begin next_mediasrc:=1; end;
filename:=''; Mp3Title:=''; end;CloseFile (Infile); parsewpl:=List;
end; exports parsewpl;
begin
end. |
Das ganze rufe ich dann hier in meiner Form auf (nur der relevante Teil):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
| Position_wpl := Pos('.wpl',playlistfile_String); if Position_wpl <> 0 then begin Form1.Memo1.Lines.Add('['+TimeToStr(Time)+'] '+'WPL Playlist, Benutzer wpl Parser....'); Parsearray:=parsewpl(path); end else begin Form1.Memo1.Lines.Add('['+TimeToStr(Time)+'] '+'M3U Playlist, Benutzer m3u Parser....'); Parsearray:=parsem3u(path); end;
count_temp:=Parsearray.Count; count_temp:=count_temp/2; Form1.Memo1.Lines.Add('['+TimeToStr(Time)+'] '+'Prüfe Ordner...'); if DirectoryExists(pathcopyto) then begin Form1.Memo1.Lines.Add('['+TimeToStr(Time)+'] '+'Ordner OK'); end else begin Form1.Memo1.Lines.Add('['+TimeToStr(Time)+'] '+'Ordner existiert nicht...Erstelle benötigte Ordner'); ForceDirectories(pathcopyto); end;
if OS='Windows XP' then begin
if DirectoryExists('C:\Dokumente und Einstellungen\All Users\Temp\') then begin end else begin ForceDirectories('C:\Dokumente und Einstellungen\All Users\Temp\'); end;
Parsearray.SaveToFile('C:\Dokumente und Einstellungen\All Users\Temp\parsed_playlist.txt'); copy('C:\Dokumente und Einstellungen\All Users\Temp\parsed_playlist.txt',pathcopyto); end; if OS='Windows Vista' then begin
if DirectoryExists('C:\Users\All Users\Temp\') then begin end else begin ForceDirectories('C:\Users\All Users\Temp\'); end;
Parsearray.SaveToFile('C:\Users\All Users\Temp\parsed_playlist.txt'); copy('C:\Users\All Users\Temp\parsed_playlist.txt',pathcopyto); end;
if OS='Windows 7' then begin
if DirectoryExists('C:\Users\All Users\Temp\') then begin end else begin ForceDirectories('C:\Users\All Users\Temp\'); end;
Parsearray.SaveToFile('C:\Users\All Users\Temp\parsed_playlist.txt'); copy('C:\Users\All Users\Temp\parsed_playlist.txt',pathcopyto); end;
Form1.Memo1.Lines.Add('['+TimeToStr(Time)+'] '+'Fertig');
end; |
Sobald ich dann die dll aufrufe, also das Parsen an sich bekomme ich folgenden Fehler:
Der Fehler kommt erst seitdem ich das mit dem id3tag eingefügt habe. den benötige ich um an den dateinamen der mp3 zu kommen bzw. mir einen zu basteln.
Weil aus : D:\Music\album1\Interpret - blubb.mp3 bekommt ich das net hin weil ich ja nicht vorhher weiß wieviel unterordner etc. der user hat.
Also fakt ist das ich irgendwas mit dem id3tag falsch mache, ich wieß bloß nciht was. hab mich eigentlich sehr genau an die D oku von mp3fileutils (
http://www.delphi-forum.de/viewtopic.php?t=51410&highlight=mp3fileutils) gehalten.
Oder viell. hat hier jemand ne bessere idee an den filenamen zu kommen.
Ich hoffe ihr könnt mir helfen.
Danke schonmal
Gruß Seji
Moderiert von
Narses: Bild als Anhang hochgeladen.
Gausi - Di 13.10.09 20:11
Was hat denn der ID3-Tag mit dem Dateinamen zu tun? :gruebel:
Fest steht, dass du ungültige Dateinamen erzeugst, wie es aussieht ein Leerstring. Wo der genau herkommt, kann ich jetzt nicht sagen, der Code ist nicht grade ein Musterbeispiel für Übersichtlichkeit. ;-)
seji - Di 13.10.09 21:05
Gausi hat folgendes geschrieben : |
Was hat denn der ID3-Tag mit dem Dateinamen zu tun? :gruebel:
Fest steht, dass du ungültige Dateinamen erzeugst, wie es aussieht ein Leerstring. Wo der genau herkommt, kann ich jetzt nicht sagen, der Code ist nicht grade ein Musterbeispiel für Übersichtlichkeit. ;-) |
Hallo gausi, danke für deine antwort.
Also das mit der Leerstring....soweit war ich auch schon. Naja warum ich den id3tag brauch. Ich brauch den damit ich beim kopieren sagen kann: D:\music\album\artist - song.mp3 nach E:\export\artist - song.mp3
Ich mein ich muss ja einen (ziel)Dateinamen angeben oder? Deshalb dachte ich den bastle ich mithilfe des id3tags zusammen weil den Namen aus dem Quelldateinamen
in meinen augen "unmöglich" schien.
Daher wollte ich das dann ungefähr so den Dateinamen mir zusammenbasteln: Dateiname=id3tag.artist+id3tag.titel+.mp3
Ich hoffe ich konnte dir mein Problem nun etwas näher bringen.
Gruß Seji
Gausi - Di 13.10.09 21:31
Ok, du willst also eine Datei von einem Ort zu einem anderen kopieren, und dabei den Dateinamen beibehalten. Was spricht da gegen die Funktion ExtractFilename?
Edit: Oh, das hatte ich eben vergessen: :welcome: in der Entwickler-Ecke! :D
seji - Di 13.10.09 22:27
Wow die Funktion is ja geil! man muss nur wissen das es sowas gibt :-)
Damit werde ich mal weitermachen,der fehler kommt jedenfalls nicht mehr.
Jetzt muss mal noch bisschen weiterprogrammieren, danke vielmals!
gruß Seji
Gausi - Mi 14.10.09 11:08
Zur Not kann man sich sowas aber auch mit elementaren Mitteln selbst basteln:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function GetFilename(aString: String): String; var lastSlash, i: Integer; begin lastSlash := 0; for i := 1 to length(aString) do if aString[i] = '\' then lastSlash := i;
result := ''; if lastSlash > 0 then for i := lastSlash + 1 to length(aString) do result := result + aString[i]; end; |
Dabei ganz bewusst auf Pos, PosEx, Copy, LastDelimiter und den ganzen Kram verzichtet. ;-)
Ich bin ja durchaus ein Fan von ID3-Tags, aber für manche Probleme gibt es halt doch bessere Lösungsansätze. :mrgreen:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!