![]() |
Microsoft Mp3 und Pics
Hallo
Also Microsoft scanned wohl den aktuellen Ordner nach MP3's und erstellt SuperHidden so was als Cover. (Dies ist nur eine Vermutung, bitte verbessert mich) AlbumArt_{79A094C5-71C5-46EC-9276-666196504245}_Large.jpg Hat jemand eine Ahnung wie man das zu einer MP3 zuordnen kann. Schönen Sonntag noch |
AW: Microsoft Mp3 und Pics
Soweit ich weiß, speichert Microsoft (bzw. der Windows Media Player) verschiedene weitere Daten im ID3-Tag. Könnte sein, dass diese ID im Dateinamen auch in einem Private-Frame (PRIV) des ID3-Tags der zugehörigen mp3-Datei auftaucht. Öffne das mp3-File mal in einem Hex-Editor, ob du diese ID da findest.
|
AW: Microsoft Mp3 und Pics
Danke Gausi
werde meine Erkundungen veröffentlichen sobald ich dazu komme |
AW: Microsoft Mp3 und Pics
Zitat:
Dazu kann ich nur sagen das ich mich schon seit Jahren mit dem problem beschäftige die Ordner struktur sowie _Small, _Large und Folder *.jpg dem WMP Plugin Albumart3D zu zuordnen. Meine erfahrung/researchen haben dazu geführt das ich zu der überzeugung gekommen bin das es hier keine offenen Bibiliotheken bzw. möglichkeiten gibt diese ID-Tags auszulesen und gegebenfalls diesen Plugin zu übergeben. Habe es mit einigen API's der WMP-Typelib versucht aber bisher keine Ergebnisse erzielen können. Trotzdem wünsche ich dir Erfolg dabei der mir leider verwehrt blieb ;) So das meine Library leider unvollständig ist. :oops: gruss |
AW: Microsoft Mp3 und Pics
Auf StackOverflow gibt es was zu der GUID - allerdings in englisch und C++, aber evtl. hilft es weiter
![]() |
AW: Microsoft Mp3 und Pics
Danke Sir Rufo
Schaue ich mir gleich an. EWeiss - Du hast recht so trivial mach es Mikroschrott einem nicht. Ich habe mir das mal mit dem Hex DingsBums:roll: mal angeschaut. Nix zu sehen das Mp3 File wird nicht angetatscht. Nur wie bildet MikroUserUnfreundlich diese GUID oder wie sich diese ID auch immer nennt. Ich bleibe dran C++ kann ich eh bisserl und da sind jo so viele nette Leute Weltweit, die ein tolles Hobby haben das sich Programmieren nennt. |
AW: Microsoft Mp3 und Pics
Wenn ich das richtig sehe, wird auf Stackoverflow genau meine Idee verfolgt. Wenn diese ID im File aber nicht zu sehen ist, dann wird das auch nicht weiterhelfen.
|
AW: Microsoft Mp3 und Pics
Ich habe mal nach einer solchen GUID gegoogelt. Da gabs direkt mehrere Treffer zum gleichen Album. Wahrscheinlich ist das einfach die microsoftsche Datenbank-Tabellen-ID für das Album.
Ansonsten findet sich in der dektop.ini des Ordners ebenfalls die GUID wieder. EDIT: Zitat:
![]() ![]() Gruß |
AW: Microsoft Mp3 und Pics
Zitat:
Auf was es letztendlich ankommt sind die endungen der GUID's _large _small_ folder.jpg. small befindet sich in der MP3 selbst wieder wenn als Tag addiert während large das Vorschaubild ist. Folder.jpg ist wohl das Album Cover welches dann auch von anderen Playern verwendet werden kann\wird. Alles sehr verworren das ganze habe bis heute noch kein einziges Cover an AlbumArt3D üergeben können obwohl ich die korrekte SourceURL an das Plugin geschickt habe. Wird jetzt leicht was OT von meiner seite.. soll wohl so sein das man vergeblich daran herumwerkelt das problem zu lösen. Du kannst da selbst nichts zuordnen es sei denn so wie Gausi sagt das sich das Cover direkt im Tag befindet aber mit der GUID hat das nichts zu tun. gruss |
AW: Microsoft Mp3 und Pics
Sir Rufo hat das richtige dazu geschrieben, bin dabei das für Delphi umzusetzen
|
AW: Microsoft Mp3 und Pics
Prüf doch mal nach, ob der WMP die JPGs nicht in die MP3s schreibt und evtl. die AlbumArt-Datei nur übrig bleibt.
|
AW: Microsoft Mp3 und Pics
Öhm, ich bin verwirrt. Du sagtest einmal, dass die GUI nicht im mp3-File zu sehen ist, und jetzt willst du die doch daraus extrahieren? :gruebel: Oder ist die da dann doch in einem anderen Format enthalten?
Nebenbei können meine Mp3FileUtils auch Private-Frames lesen und schreiben, dazu gibt es da die Methode
Delphi-Quellcode:
. OwnerID wäre sowas wie "WM/WMCollectionID", Content ein Stream, wo die Daten rein sollen (zum selberparsen, da in den Private-Frames beliebige Daten stehen können, nicht nur Text), und Result gibt an, ob der Frame überhaupt vorhanden war oder nicht.
function GetPrivateFrame(aOwnerID: AnsiString; Content: TStream): Boolean;
|
AW: Microsoft Mp3 und Pics
Zitat:
Zitat:
|
AW: Microsoft Mp3 und Pics
Und wie ordnet man einem mp3-File dann die richtige Cover-Datei zu? Oder gibt es pro Ordner immer nur eine Cover-Datei (ggf. in unterschiedlichen Größen)?
Denn in dem Code auf Stackoverflow wird ja im ID3-Tag nach dieser GUID gesucht, also sollte die ja dann darin zu finden sein (ggf. in einer anderen Codierung, die als Dateiname nicht gültig wäre). |
AW: Microsoft Mp3 und Pics
Zitat:
gruss |
AW: Microsoft Mp3 und Pics
Delphi-Quellcode:
Gausi hast schon recht, ich dachte da steckt vielleicht ein Algoritmusfunction getAlbumGUID(filename : string; var GUID : TGUID) : boolean; const TAG_INDICATOR_LENGTH = 3; TAG_TYPE = 'ID3'; TAG_MAJOR = 3; TAG_MINOR = 0; HEADER_SIZE_BEGIN = 6; HEADER_SIZE_END = 9; EXTENDED_HEADER_POS = 5; EXTENDED_HEADER_SIZE_LENGTH = 4; FRAME_HEADER_LENGTH = 10; FRAME_ID_LENGTH = 4; FRAME_MEDIA_PLAYER_OWNER1 = 'WM/WMCollectionID'; FRAME_MEDIA_PLAYER_OWNER2 = 'WM/WMCollectionGroupID'; FRAME_MEDIA_PLAYER_ID = 'PRIV'; FRAME_SIZE_BEGIN = 4; FRAME_SIZE_END = 7; retValue = false; HEADER_LENGTH = 10; var Stream : TFileStream; Header10 : array[0..HEADER_LENGTH-1] of byte; extHeaderData : array[0..EXTENDED_HEADER_SIZE_LENGTH-1] of byte; frameHeader : array[0..FRAME_HEADER_LENGTH-1] of byte; i : integer; tagType : string[TAG_INDICATOR_LENGTH]; majorVersion : integer; minorVersion : integer; extHeader : LongBool; extHeaderSize : integer; tagSize : integer; currPos : integer; frameType : string; frameLength : integer; owner : pAnsiChar; FrameData : pAnsiChar; b : byte; Test : array [0..2000] of AnsiChar; begin try // read in file Stream := TFileStream.Create(filename , fmOpenRead); Stream.Position := 0; stream.Read(Header10, HEADER_LENGTH); tagType := ''; for i := 0 to TAG_INDICATOR_LENGTH do tagType := tagType + AnsiChar(Header10[i]); majorVersion := integer(Header10[TAG_INDICATOR_LENGTH]); minorVersion := integer(Header10[TAG_INDICATOR_LENGTH + 1]); if (tagType = TAG_TYPE) and (majorVersion = TAG_MAJOR) and (minorVersion = TAG_MINOR) then begin // get extended header bit extHeader := bool(Header10[EXTENDED_HEADER_POS] and $10); // get size of extended header extHeaderSize := 0; if extHeader then begin Stream.seek(HEADER_LENGTH, soBeginning); Stream.read(extHeaderData, EXTENDED_HEADER_SIZE_LENGTH); for i := 0 to EXTENDED_HEADER_SIZE_LENGTH do begin extHeaderSize := ROL(extHeaderSize , 8); extHeaderSize := extHeaderSize or extHeaderData[i]; end; extHeaderSize := extHeaderSize + EXTENDED_HEADER_SIZE_LENGTH; end; // get size of tag. // 4 bytes with the most significant bit ignored tagSize := 0; for i := HEADER_SIZE_BEGIN to HEADER_SIZE_END do begin tagSize := ROL(tagSize, 7); tagSize := tagSize or (Header10[i] and $7f); end; // tagSize includes extended header tagSize := tagSize + HEADER_LENGTH; // read tags currPos := HEADER_LENGTH + extHeaderSize; while (currPos < tagSize) do begin Stream.seek(currPos, soBeginning); Stream.read(frameHeader, FRAME_HEADER_LENGTH); frameType := ''; // frame id for i := 0 to FRAME_ID_LENGTH -1 do frameType := frameType + char(frameHeader[i]); // frame length frameLength := 0; for i := FRAME_SIZE_BEGIN to FRAME_SIZE_END do begin frameLength := ROL(frameLength, 8); frameLength := frameLength or frameHeader[i]; end; if frameType = FRAME_MEDIA_PLAYER_ID then begin frameData := nil; GetMem(frameData , frameLength); fillChar(frameData^ , frameLength , 0); stream.read(frameData^, frameLength); owner := frameData; if (owner = FRAME_MEDIA_PLAYER_OWNER1) or (owner = FRAME_MEDIA_PLAYER_OWNER2) then begin CopyMemory ( @guid, frameData + length(owner) , SizeOf(TGUID)); CopyMemory ( @Test, frameData + length(owner) , SizeOf(TGUID)); Result := true; exit; end; if frameData <> nil then FreeMem(frameData); end; currPos := currPos + FRAME_HEADER_LENGTH + frameLength; end; end; finally if frameData <> nil then FreeMem(frameData); Stream.Free; end; Result := false; end; dahinter den ich nicht erkenne, hier wird nur ein vorhandenes GUID in 'WM/WMCollectionID' oder WM/WMCollectionGroupID' erzeugt. Trotzdem hat es Spass gemacht das zu übersetzen Von unseren Kollegen von Visual Basic ![]() Werde ich mir mal die Tage anschauen. Des weiteren habe ich ein MP3 mit CDEx geripped. (Dire Straits Making Movies ( Microsoft generiert wie auch immer die GUID nur Desktop.ini [.ShellClassInfo] FolderType=MusicAlbum MusicBuyUrl=http://redir.metaservices.microsoft.com/redir/buynow/?providerName=AMG&albumID=D16C59EC-A3B1-4EBC-B275-40A1500BF58A&a_id=R%20%20%20%20%205888&album=Makin g%20Movies&artistID=FD91FC7F-CDEE-4DE9-89D4-4984E307AFB9&p_id=P%20%20%20%20%204101&artist=Dire %20Straits&locale=407&geoid=5e&version=12.0.9200.1 6420&userlocale=407 die GUID AlbumArt_{D16C59EC-A3B1-4EBC-B275-40A1500BF58A}_Large.jpg Wie generieren sie diese GUID Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 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