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
Maekkelrajter

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

AW: Cover in WMP Format

  Alt 14. Apr 2018, 15:40
Der Thread hat ja einen hochinteressanten Verlauf genommen, nachdem das eigentliche Problem herausgearbeitet worden war. Die 'PRIV' - Frames hatte ich bisher überhaupt nicht auf dem Schirm. Daraufhin habe ich mal meinen eigenen MP3-Bestand mit dem von dir verlinkten Tool iDesiccate durchforstet und etliche Dateien mit solchen Frames gefunden. Wahrscheinlch sind sie irgendwann einmal durch einen nicht ausreichend restriktiv konfigurierten WMP kontaminiert worden
In meinem eigenen Programm, dessen Kernfunktion die Anonymisierung von Audiodateien (MP3 und M4A) ist, sind diese PRIV-Frames zum Glück irrelevant. Dort werden die wichtigsten Tags incl. Cover ausgelesen und gesichert. Anschließend werden alle ID3 -Tags komplett aus der Datei entfernt. Zum Schluss werden nur die ausgewählten Tags in die Datei zurückgeschrieben. Damit sollte aller kryptischer Mist entsorgt sein (hoffe ich).

Dein Projekt habe ich mir mal in die IDE geladen und angesehen. Testen werde ich das Programm allerdings (vorläufig) nicht, alldieweil ich auf absehbare Zeit keine WMP-Plugins einzusetzen gedenke.

Eine Anmerkung kann ich mir allerdings nicht verkneifen: Das Englisch in dem Readme-Text ist, vorsichtig ausgedrückt, verbesserungsfähig. Vorschläge:

Delphi-Quellcode:
  
  pString := 'the application writes PRIV: Frames to MP3 Tag' + #13#10 +
    'this is necessary so that the visual plugins for WMP work properly'  + #13#10 + // Vorschlag: 'necessary to make the visual...'
    'without having create the Mp3 tag via WMP (Windows Media Player)'  + #13#10 + // Vorschlag: 'without having created...'
    'a file called AlbumArtSmall.jpg is required in the Search path' + #13#10 +
    #13#10 +
    'WARNING: after execute the function over DoIt, process can''t be stopped' + #13#10 + // Vorschlag: 'after executing...'
    #13#10 +
    'Artist' + #13#10 +
    'Album' + #13#10 +
    'Title' + #13#10 +
    'Year' + #13#10 +
    'Track' + #13#10 +
    'Genre' + #13#10 +
    'Comment' + #13#10 +
     #13#10 +
    'are not changed' + #13#10 +
    'if your use more entries in the Mp3 tag' + #13#10 +
    'please close the application, or your data will be lost!';
Ich bitte um Nachsicht, dass ich den Oberlehrer in mir mal wieder nicht im Zaum halten konnte

Gruß LP
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Cover in WMP Format

  Alt 14. Apr 2018, 15:54
Zitat:
Eine Anmerkung kann ich mir allerdings nicht verkneifen: Das Englisch in dem Readme-Text ist, vorsichtig ausgedrückt, verbesserungsfähig. Vorschläge:
Danke für die Berichtigung.
Aber muss dazu sagen.. habe nie English in der Schule gelernt das bisschen das ich kann
habe ich mir mit der zeit angeeignet Gewohnheit eben wenn man viel English lesen muss gezwungener weise.

Habe ja hier schon gesagt was ich von meinem English halte
https://www.delphipraxis.net/1399132-post20.html

Aber kein Problem..

Hier das Update habe noch zwei kleine Probleme behoben.
btw.. Habe es nach Multimedia verschieben lassen da es ja jetzt darum geht.
Danke an die Admins!


gruss

Geändert von EWeiss (11. Jul 2019 um 16:15 Uhr)
  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, 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
 
#4

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
 
#5

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
 
#6

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
 
#7

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
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


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 21:06 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