AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Cover in WMP Format

Ein Thema von EWeiss · begonnen am 31. Mär 2018 · letzter Beitrag vom 15. Apr 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
905 Beiträge
 
Delphi 12 Athens
 
#1

AW: Cover in WMP Format

  Alt 14. Apr 2018, 16:23
zu den PRIV-Frames nochmal: Dass dadurch der Fehler hier behoben werden konnte, liegt an der Schusseligkeit des Plugin-Entwicklers. Wenn ohnehin ein Fallback auf das normale Cover "AlbumArtSmall.jpg" genommen wird, dann sollte dieser Fallback auch genommen werden, wenn im ID3-Tag keine GUID für das Coverart gefunden werden kann. Dass man das Plugin fixen kann, in dem man Datenmüll in die Datei schreibt ist einfach nur ... kaputt.

Ansonsten haben PRIV-Frames ja durchaus ihren Nutzen. Sie können allerdings in der Tat bei der Weitergabe persönliche Daten enthalten, das ist richtig. Das gilt aber auch für andere Möglichkeiten, zusätzliche Daten in den ID3-Tag zu schreiben. Einige Tagger/Ripper/Player nutzen diverse "Usertext"-Frames, andere mehrere "Kommentar"-Frames. Und der WMP ist nicht der einzige Player, der die PRIV-Frames nutzt.
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Cover in WMP Format

  Alt 14. Apr 2018, 16:35
zu den PRIV-Frames nochmal: Dass dadurch der Fehler hier behoben werden konnte, liegt an der Schusseligkeit des Plugin-Entwicklers. Wenn ohnehin ein Fallback auf das normale Cover "AlbumArtSmall.jpg" genommen wird, dann sollte dieser Fallback auch genommen werden, wenn im ID3-Tag keine GUID für das Coverart gefunden werden kann. Dass man das Plugin fixen kann, in dem man Datenmüll in die Datei schreibt ist einfach nur ... kaputt.

Ansonsten haben PRIV-Frames ja durchaus ihren Nutzen. Sie können allerdings in der Tat bei der Weitergabe persönliche Daten enthalten, das ist richtig. Das gilt aber auch für andere Möglichkeiten, zusätzliche Daten in den ID3-Tag zu schreiben. Einige Tagger/Ripper/Player nutzen diverse "Usertext"-Frames, andere mehrere "Kommentar"-Frames. Und der WMP ist nicht der einzige Player, der die PRIV-Frames nutzt.
Ja auch ITune (Apple) tun das bei ihren Urheberrecht geschützten MP3 Dateien.

btw.. Hab da noch ein Problem.
Ich habe mp3Tags in Version ID3_v1
Dein mp3fileUtils meldet mir aber das kein Tag gefunden wurde aber er ist definitiv als ID3_v1 enthalten.

Wollte jetzt noch deine error messagen an einem String (Label) übergeben wie?
Sind ja enums.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
905 Beiträge
 
Delphi 12 Athens
 
#3

AW: Cover in WMP Format

  Alt 14. Apr 2018, 17:26
ID3_v1 und ID3_v2 sind zwei völlig unterschiedliche Dinge, daher sind das auch zwei Klassen bei Mp3FileUtils. Innerhalb dieser beiden Tag-Versionen wird dann unterschieden zwischen v1.0 und 1.1 bzw. v2.2 (fast nicht mehr zu finden), v2.3 und v2.4.

In der Regel macht man das bei MP3-Dateien so, dass man zuerst nach einem ID3v2-Tag sucht. Falls der nicht da ist, nimmt man den ID3v1-Tag. Dieser ist aber sehr restriktiv und kann außer Interpret, Titel, Album, Kommentar, Jahr, Genre und Track-Nr. (letzteres nur v1.1) keine weiteren Daten enthalten. Wenn man weitere Daten schreiben will, sollte man in dem Fall die Daten aus dem ID3v1-Tag übernehmen in einen neu zu erstellenden ID3v2-Tag.

Für die Ausgabe des Fehlers müsste man noch ein sinnvolles String-Array definieren
MP3ErrorString: Array[TMP3Error] of String = ( ... ) Wundert mich grade ein bisschen, dass ich das damals nicht mit dabei gepackt habe.
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Cover in WMP Format

  Alt 14. Apr 2018, 17:32
Habe es gerade gemacht bekomme aber Probleme.

Delphi-Quellcode:
const
  cMP3Error : Array[TMP3Error] of String = (
    'MP3ERR_None',
    'MP3ERR_NoFile',
    'MP3ERR_FOpenCrt',
    'MP3ERR_FOpenR',
    'MP3ERR_FOpenRW',
    'MP3ERR_FOpenW',
    'MP3ERR_SRead',
    'MP3ERR_SWrite',
    'ID3ERR_Cache',
    'ID3ERR_NoTag',
    'ID3ERR_Invalid_Header',
    'ID3ERR_Compression',
    'ID3ERR_Unclassified',
    'MPEGERR_NoFrame'
   );
Wie kann ich die jetzt auswerten ?

Delphi-Quellcode:
var
   error : TMP3Error;
...
lblMessageVal.Caption := cMP3Error[Error];
bekomme dann immer nur MP3ERR_None zurück obwohl ein Fehler aufgetreten ist.

Zitat:
Wenn man weitere Daten schreiben will, sollte man in dem Fall die Daten aus dem ID3v1-Tag übernehmen in einen neu zu erstellenden ID3v2-Tag.
Es reicht mir im Moment mal wenn ich die error message auswerten kann.

Darauf kann ich reagieren und ändere mit MP3Tag auf 2.3

gruss

Geändert von EWeiss (14. Apr 2018 um 17:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Cover in WMP Format

  Alt 14. Apr 2018, 17:46
Zeig mal Code wo Du error einen Wert zuordnest.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Cover in WMP Format

  Alt 14. Apr 2018, 17:48
Zeig mal Code wo Du error einen Wert zuordnest.
Delphi-Quellcode:
    Error := MP3ERR_None; //<<<
        Picdata.LoadFromFile(Picfile);

        // basic converting
        v23Tag.Artist := MP3Tags.Artist;
        v23Tag.Album := MP3Tags.Album;
        v23Tag.Title := MP3Tags.Title;
        v23Tag.Year := MP3Tags.Year;
    try
      If (MP3Tags.ReadFromFile(mp3File) = MP3ERR_None) Then
      begin

        v23Tag.Track := MP3Tags.Track;
        v23Tag.Genre := MP3Tags.Genre;
        v23Tag.Comment := MP3Tags.Comment;

        if MP3Tags.Rating = 0 then
          v23Tag.Rating := 128 // 3 Sterne
        else
        v23Tag.Rating := MP3Tags.Rating;

        for i := 1 to 16 do
        begin
           b := Random(255);
           GUID.Write(b, 1);
        end;

        v23Tag.SetPrivateFrame('WM/WMCollectionID', GUID);
        v23Tag.SetPrivateFrame('WM/WMCollectionGroupID', GUID);

        v23Tag.SetPicture('image/jpeg', 0, '*', PicData);
        v23Tag.WriteToFile(mp3file);

      end else
      begin
        lblMessageVal.Caption := cMP3Error[Error];
      end;
gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Cover in WMP Format

  Alt 14. Apr 2018, 17:53
Error := MP3ERR_None; //<<<
Du solltest eine Fehlerabfrage einbauen die error auch bei einem Fehler aktualisiert.
Entweder hab ich Tomaten auf den Augen, aber ich seh nur in Zeile 1 das error gefüttert wird?!

Also so hier in etwa:
Delphi-Quellcode:
 end else
      begin
        Error := MP3ERR_NoFile;
        lblMessageVal.Caption := cMP3Error[Error];
      end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Apr 2018 um 18:01 Uhr)
  Mit Zitat antworten Zitat
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
157 Beiträge
 
Delphi 12 Athens
 
#8

AW: Cover in WMP Format

  Alt 14. Apr 2018, 22:46
@ Eweiss:

Gerade habe ich mir dein Tool PrivFramesWriter nochmal genau angeschaut. Dabei fiel mir auf, dass du eine Stringlist instantiierst, aber nicht freigibst:
Delphi-Quellcode:
procedure TForm1.btnSearchClick(Sender: TObject);
var
  List: TStringList;
  IntI: Integer;
  Mask: array[0..0] of string;
begin
  edSearchpath.Text := GetFolder(CSIDL_DRIVES, 'Select search path');
  lstSearch.Clear;

  If edSearchpath.Text <> 'then
  begin
     Mask[0] := '.mp3';
     List := TStringList.Create;

     FindMediaFiles(List, edSearchpath.Text, Mask, True);
     lblCount.Caption := IntToStr(List.Count);
     ProgressCounter:= List.Count;
     lblProgress.Caption := IntToStr(ProgressCounter);

     if List.Count > 0 then
     begin
       btnDoIt.Enabled := true;
       Setlength(failed, List.Count);
     end;

     for IntI := 0 to List.Count - 1 do
       lstSearch.Items.Add(List[IntI]);

  end;
end;

Sollte das nicht so aussehen:

Delphi-Quellcode:
procedure TForm1.btnSearchClick(Sender: TObject);
var
  List: TStringList;
  IntI: Integer;
  Mask: array[0..0] of string;
begin
  edSearchpath.Text := GetFolder(CSIDL_DRIVES, 'Select search path');
  lstSearch.Clear;
  List := TStringList.Create;
  try
    If edSearchpath.Text <> 'then
    begin
      Mask[0] := '.mp3';
      FindMediaFiles(List, edSearchpath.Text, Mask, True);
      lblCount.Caption := IntToStr(List.Count);
      ProgressCounter:= List.Count;
      lblProgress.Caption := IntToStr(ProgressCounter);
      if List.Count > 0 then
      begin
        btnDoIt.Enabled := true;
        Setlength(failed, List.Count);
      end;
      for IntI := 0 to List.Count - 1 do
      lstSearch.Items.Add(List[IntI]);
    end;
  finally
    FreeAndNil(List)
  end;
end;
Gruß LP

Geändert von Maekkelrajter (14. Apr 2018 um 23:07 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Cover in WMP Format

  Alt 15. Apr 2018, 09:25
Zitat:
Gerade habe ich mir dein Tool PrivFramesWriter nochmal genau angeschaut.
Unser Tool!

Auf jeden fall hast du recht.

Keine Entschuldigung, aber im Eifer des Gefechts habe ich nur auf das Ergebnis geachtet als darauf Programmtechnisch alles korrekt zu machen.
List wird ja nach dem addieren zur Listbox nicht mehr benötigt muss also Frei gegeben werden.

Danke für die Info.

EDIT:
Würde aber die TStringlist erst erstellen wenn sie auch benötigt wird.
Warum ein Objekt initialisieren wenn ich damit nichts tun kann, also wenn das suchen abgebrochen wird.
Macht also nur sinn wenn ich anschließend damit auch Arbeiten will\kann.

gruss

Geändert von EWeiss (15. Apr 2018 um 09:43 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Cover in WMP Format

  Alt 15. Apr 2018, 09:36
Korrigiert so wäre es richtig.

Delphi-Quellcode:
procedure TForm1.btnSearchClick(Sender: TObject);
var
  List: TStringList;
  IntI: Integer;
  Mask: array[0..0] of string;
begin
  edSearchpath.Text := GetFolder(CSIDL_DRIVES, 'Select search path');

  If edSearchpath.Text <> 'then
  begin
     if lstSearch.Count > 0 then
       lstSearch.clear;
     try
       List := TStringList.Create;
       Mask[0] := '.mp3';

       FindMediaFiles(List, edSearchpath.Text, Mask, True);
       lblCount.Caption := IntToStr(List.Count);
       ProgressCounter:= List.Count;
       lblProgress.Caption := IntToStr(ProgressCounter);

       if List.Count > 0 then
       begin
         btnDoIt.Enabled := true;
         Setlength(failed, List.Count);
       end;

       for IntI := 0 to List.Count - 1 do
         lstSearch.Items.Add(List[IntI]);
     finally
       FreeAndNil(List);
     end;
  end;
end;
Man könnte das alles noch etwas schöner machen.
Zum Beispiel wenn ein Fehler auftritt (Tag nicht gefunden)
Die aktuelle Zeile Gelb färben so das man den Pfad bzw. die Datei erkennen kann die keinen gültigen 2.3 Tag besitzt.
Habe das mal versucht aber bei mir wird diese Zeile immer wieder mit grün über pinselt.

Nun bin kein VCL Freak eher das Gegenteil aber das ist ja bekannt.

Noch ein Pic für @KodeZwerg

gruss

Geändert von EWeiss (11. Jul 2019 um 15:50 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz