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:
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):
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 (
www.delphi-forum.de/...ghlight=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.