Autor Beitrag
seji
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 13.10.09 18:25 
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:

ausblenden volle Höhe 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;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }


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
  //List.Add('Media src=1, lets go');
  quelle:=Trim(quelle);
  //List.Add('Quelle: '+quelle);
  filename:=quelle;
  Delete(filename,1,12);
  //List.Add('Cutting1: '+filename) ;
  Position_tid := Pos('tid', filename);
  if Position_tid <> 0 then begin
    //List.Add('tid gefunden..');
    Position_tid:=Position_tid-2;
    Delete(filename,Position_tid,Length(filename));

  end
  else begin
  //List.Add('KEIN tid gefunde..');
  Delete(filename,(Length(filename)-2),Length(filename));
  //List.Add('Cutting2: '+filename) ;
  end;

  //MP3Tag to Title
    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('adde filename...');
 List.Add(filename);
 List.Add(Mp3Title);
 end;


  Position_seq := Pos('<seq>', quelle);
  if Position_seq <> 0 then begin
    next_mediasrc:=1;
    //List.Add('Nächste Runde media src');
  end;

  if filename=' ' then begin
    next_mediasrc:=0;
    //List.Add('Nächste Runde media src');
  end
  else begin
  next_mediasrc:=1;
  end;


 filename:='';
 Mp3Title:='';
end;// End While
//List.Add('schließe datei');
CloseFile (Infile);
parsewpl:=List;



end;
exports
  parsewpl;


begin

end.



Das ganze rufe ich dann hier in meiner Form auf (nur der relevante Teil):


ausblenden volle Höhe 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);
   //ShowMessage('Sorry, WPL Playlists gehen noch nicht....');
  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
// do nothing
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
// do nothing
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
// do nothing
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:

Screenshot

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 user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. ;-)

_________________
We are, we were and will not be.
seji Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 13.10.09 21:05 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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

_________________
We are, we were and will not be.
seji Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 14.10.09 11:08 
Zur Not kann man sich sowas aber auch mit elementaren Mitteln selbst basteln:
ausblenden 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
    // Suche letzten Backslash im String
    if aString[i] = '\' then
        lastSlash := i;

    result := '';
    // nehme alles nach dem letzten \ als Dateiname
    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:

_________________
We are, we were and will not be.