Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Microsoft Mp3 und Pics (https://www.delphipraxis.net/171667-microsoft-mp3-und-pics.html)

ATS3788 18. Nov 2012 09:56

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

Gausi 18. Nov 2012 11:01

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.

ATS3788 18. Nov 2012 13:57

AW: Microsoft Mp3 und Pics
 
Danke Gausi
werde meine Erkundungen
veröffentlichen sobald ich dazu komme

EWeiss 18. Nov 2012 14:32

AW: Microsoft Mp3 und Pics
 
Zitat:

sobald ich dazu komme
Ich denke du meinst falls du irgendwelche erfolge zu verzeichnen hast.

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

Sir Rufo 18. Nov 2012 14:51

AW: Microsoft Mp3 und Pics
 
Auf StackOverflow gibt es was zu der GUID - allerdings in englisch und C++, aber evtl. hilft es weiter

http://stackoverflow.com/questions/7...e-using-taglib

ATS3788 18. Nov 2012 19:31

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.

Gausi 19. Nov 2012 06:33

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.

angos 19. Nov 2012 14:28

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:

Zitat von ATS3788 (Beitrag 1191838)
[...] Nur wie bildet MikroUserUnfreundlich
diese GUID oder wie sich diese ID auch immer nennt

Eine GUID wird unabhängig des Verwendungszwecks aufgebaut, daher wird dir das nicht weiterhelfen. Siehe: GUID und UUID

Gruß

EWeiss 19. Nov 2012 14:44

AW: Microsoft Mp3 und Pics
 
Zitat:

Zitat von angos (Beitrag 1191918)
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:

Zitat von ATS3788 (Beitrag 1191838)
[...] Nur wie bildet MikroUserUnfreundlich
diese GUID oder wie sich diese ID auch immer nennt

Eine GUID wird unabhängig des Verwendungszwecks aufgebaut, daher wird dir das nicht weiterhelfen. Siehe: GUID und UUID

Gruß

Das ist die art der verschleierungstechnik von MS.
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

ATS3788 19. Nov 2012 22:00

AW: Microsoft Mp3 und Pics
 
Sir Rufo hat das richtige dazu geschrieben, bin dabei das für Delphi umzusetzen

divBy0 20. Nov 2012 08:57

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.

Gausi 20. Nov 2012 13:52

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:
function GetPrivateFrame(aOwnerID: AnsiString; Content: TStream): Boolean;
. 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.

EWeiss 20. Nov 2012 14:29

AW: Microsoft Mp3 und Pics
 
Zitat:

Du sagtest einmal, dass die GUID nicht im mp3-File zu sehen ist
Aber als Datei-Name denke da hast was falsch interpretiert.

Zitat:

AlbumArt_{79A094C5-71C5-46EC-9276-666196504245}_Large.jpg
gruss

Gausi 20. Nov 2012 14:42

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

EWeiss 20. Nov 2012 16:10

AW: Microsoft Mp3 und Pics
 
Zitat:

Oder gibt es pro Ordner immer nur eine Cover-Datei (ggf. in unterschiedlichen Größen)?
Jo Folder.jpg, _Small und _Large

gruss

ATS3788 21. Nov 2012 09:07

AW: Microsoft Mp3 und Pics
 
Delphi-Quellcode:

function 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;
Gausi hast schon recht, ich dachte da steckt vielleicht ein Algoritmus
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
http://social.msdn.microsoft.com/For...-436f053c58cf/
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:

Nun weiss ich wenigstens was eine GUID ist


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