IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Télécharger l'entête d'un fichier mp3


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Par défaut Télécharger l'entête d'un fichier mp3
    Bonjour je cherche à télécharger l'entête d'un fichier mp3 d'un site pour en extraire uniquement le tag Id3v2 qui se situe au début du fichier
    sans avoir à télécharger le fichier entier.
    J'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    var
      SSL1 : TIdSSLIOHandlerSocketOpenSSL;
      MS: TMemoryStream;
      Url: String;
    begin
      MS := TMemoryStream.Create;
      try
          Url := 'https://98.236.135.12/music/3%20Doors%20Down/The%20Better%20Life/01%20Kryptonite.mp3';
          MS.Clear;
          try
                Ssl1 := Tidssliohandlersocketopenssl.Create(NIL); //Pour Les Adresses Https
                Ssl1.Ssloptions.METHOD := Sslvsslv23;
                Idhttp1.Iohandler := Ssl1;
                Idhttp1.Request.Contenttype := 'text/xml';
                Idhttp1.Request.Charset := 'utf-8';
     
                IdHTTP1.Get(Url, MS);
                except
                on E: EIdHTTPProtocolException do Raise;
              end;
              MS.Position := 0;
              MS.SaveToFile('test.bin');
              Application.ProcessMessages;
          finally
        MS.Free;
        Ssl1.Free;
    end;
    mais je n'arrive pas à mettre une taille de téléchargement

    http://id3.org/id3v2.4.0-structure
    ID3v2 header

    The first part of the ID3v2 tag is the 10 byte tag header, laid out
    as follows:

    ID3v2/file identifier "ID3"
    ID3v2 version $04 00
    ID3v2 flags %abcd0000
    ID3v2 size 4 * %0xxxxxxx

    source:https://github.com/pozitronik/TWinam...ster/ID3v2.pas

    il faut télécharger les 10 premiers octets puis la taille de l’entête est dans 'ID3v2 size 4 * %0xxxxxxx'
    j'ai essayé avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    {*************************************************************************}
    FUNCTION Downhearderfile(CONST Url: STRING; CONST Destinationfilename: STRING): BOOLEAN;
    VAR   Hinet: Hinternet;
          Hfile: Hinternet;
          Localfile: FILE;
          Header : ARRAY[0..9] OF BYTE;
          Tag : TAginfo;
          buffer: array[1..1024] of byte;
          Bytesread: Dword;
          TotalBytesread: Dword;
          Sizetag:Integer;
     
    BEGIN
          Result := FALSE;
          Hinet := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    //      Hinet := Internetopen(PCHAR(APPLICATION.TITLE)), Internet_Open_TYPE_Preconfig,NIL,NIL,0);
          Hfile := Internetopenurl(Hinet,PCHAR(Url),NIL,0,0,0);
          IF Assigned(Hfile) THEN
          BEGIN
                  TotalBytesread:=0;
                  Assignfile(Localfile,Destinationfilename);
                  REWRITE(Localfile,1);
                  Internetreadfile(Hfile,@Header,SIZEOF(Header),Bytesread);
                  TotalBytesread:=TotalBytesread+Bytesread;
                  BLOCKWRITE(Localfile,Header,Bytesread);
                  Sizetag:= Header[6] * $200000 + Header[7] * $4000 + Header[8] * $80 + Header[9] + 10;
                  REPEAT
                         Internetreadfile(Hfile,@BUFFER,SIZEOF(BUFFER),Bytesread);
                         BLOCKWRITE(Localfile,BUFFER,Bytesread);
                         TotalBytesread:=TotalBytesread+Bytesread;
                  UNTIL (Bytesread = 0) OR (TotalBytesread>Sizetag);
                  Closefile(Localfile);
                Result := TRUE;
                Internetclosehandle(Hfile);
          END;
          Internetclosehandle(Hinet);
    END; {Downhearderfile}
    faire
    --> Downhearderfile('https://98.236.135.12/music/3%20Doors%20Down/The%20Better%20Life/01%20Kryptonite.mp3','test.bin')
    mais ne donne rien

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Le loadFromFile ou le Get copie l'intégralité du message. Si tu veux en sauvegarder qu'une partie. Tu dois recopier la longueur voulue du MS dans un MS2
    Si tu veux un exemple je te l'envoie

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Tu peux faire une transaction partielle à l'aide de TIdHttp.Request.Range. Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idHttp1.Request.Range := Format('%d-%d',[TagStart, TagEnd]);
    Il faut cependant que le serveur les accepte, ce qui n'est pas toujours le cas.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu peux faire une transaction partielle à l'aide de TIdHttp.Request.Range. Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idHttp1.Request.Range := Format('%d-%d',[TagStart, TagEnd]);
    Il faut cependant que le serveur les accepte, ce qui n'est pas toujours le cas.
    du coup j'ai fait comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    uses ...
    ID3v2Library
    ...
    var ...
      ID3v2Tag: TID3v2Tag = nil;
    ...
    procedure TForm1.Button1Click(Sender: TObject);
    var
      SSL1 : TIdSSLIOHandlerSocketOpenSSL;
      fmp3: TMemoryStream;
      Url: String;
      ID3v2Size: Cardinal;
    begin
      ID3v2Tag := TID3v2Tag.Create;
      fmp3 := TMemoryStream.Create;
      try
          Url := 'https://98.236.135.12/music/3%20Doors%20Down/The%20Better%20Life/01%20Kryptonite.mp3';
          fmp3.Clear;
          try
                Ssl1 := Tidssliohandlersocketopenssl.Create(NIL); //Pour Les Adresses Https
                Ssl1.Ssloptions.METHOD := Sslvsslv23;
                Idhttp1.Iohandler := Ssl1;
                Idhttp1.Request.Contenttype := 'text/xml';
                Idhttp1.Request.Charset := 'utf-8';
                idHttp1.Request.Range := Format('%d-%d',[0, 9]);
                IdHTTP1.Get(Url, fmp3);
                fmp3.Position := 0;
                IF ID3v2ValidTag(fmp3) THEN
                BEGIN
                       fmp3.Position := 0;
                       ID3v2Size := GetID3v2Size(fmp3);
                       fmp3.Position := 0;
                       idHttp1.Request.Range := Format('%d-%d',[0, ID3v2Size+10]);
                       IdHTTP1.Get(Url, fmp3);
                       fmp3.Position := 0;
                       ID3v2Tag.LoadFromStream(fmp3);
                       memo1.Lines.Add(ID3v2Tag.GetUnicodeText('TIT2')); //* Get Title
                       memo1.Lines.Add(ID3v2Tag.GetUnicodeText('TPE1')); //* Get Artist
                       memo1.Lines.Add(ID3v2Tag.GetUnicodeText('TALB')); //* Get Album
                       memo1.Lines.Add(ID3v2Tag.GetUnicodeText('TYER')); //* Get Year
                END;{}
                except
                on E: EIdHTTPProtocolException do Raise;
              end;
              Application.ProcessMessages;
          finally
        ID3v2Tag.Free;
        fmp3.Free;
        Ssl1.Free;
    end;
    end;
    j'utilise la librairie ID3v2Library (https://www.3delite.hu/Object%20Pasc...v2library.html)
    cela fonctionne merci à vous.
    j'ai peut être oublier des choses mais c'est une approche.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Le code n'est pas très lisible, tu as oublié d'envoyer la requête HTTP

    Une fonction que j'utilise actuellement
    il te suffit d'arrêter une fois la longueur souhaitée est atteinte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetInternetFile('https://98.236.135.12', '/music/3%20Doors%20Down/The%20Better%20Life/01%20Kryptonite.mp3', lFileStream);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    procedure GetInternetFile(const AServerName: string; const AURL: string; AStream: TStream);
    const
      BufferSize = 1024;
      accept: packed array[0..1] of LPWSTR = (PChar('text/*'), nil); // PCTSTR rgpszAcceptTypes[] = {_T(“text/*”), NULL};
    var
      hSession, hHTTP, hReq : HINTERNET;
      Buffer: array[1..BufferSize] of Byte;
      BufferLen: DWORD;
      sAppName: string;
    begin
      AStream.Size := 0;
      sAppName := ExtractFileName(Application.ExeName);
     
      hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      try
        hHTTP := InternetConnect(hSession, PChar(AServerName), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
        try
          hReq := HttpOpenRequest(hHTTP, PChar('GET'), PChar(AURL), nil, nil, @accept, 0, 1);
          try
            if HttpSendRequest(hReq, nil, 0, nil, 0) then
            begin
              BufferLen := 0;
              repeat
                if InternetReadFile(hReq, @Buffer, BufferSize, BufferLen) then
                  AStream.WriteBuffer(Buffer, BufferLen);
     
              until BufferLen = 0;
            end
            else
              raise Exception.Create('HttpOpenRequest failed. ' + SysErrorMessage(GetLastError));
          finally
            InternetCloseHandle(hReq);
          end;
        finally
          InternetCloseHandle(hHTTP);
        end;
      finally
        InternetCloseHandle(hSession);
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recupere les tag d'entete d'un fichier mp3
    Par kirbs dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/10/2006, 17h40
  2. [Débutant][Info] télécharger un fichier mp3
    Par oumani dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/02/2006, 16h17
  3. Réponses: 3
    Dernier message: 17/05/2005, 14h26
  4. Encodage de cd en fichier mp3
    Par clovis dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 08/04/2004, 01h13
  5. Réponses: 3
    Dernier message: 25/07/2002, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo