Page 1 sur 2

Suivre la progression d'un téléchargement de fichier

Publié : lun. 29/mai/2017 15:51
par falsam
Suite à discussion sur le chat de PureBasic, ce code met en oeuvre la fonction ReceiveHTTPMemory() en mode Asynchrone et la fonction GetHTTPHeader() pour connaitre la taille du fichier à télécharger.

Code : Tout sélectionner

Define.s Url, Header, Line
Define.i Size

Procedure.s GetHTTPHeaderElement(HeaderContent.s, Element.s)
  Protected.i ipos1, ipos2
  
  Element + ":"
  ipos1 = FindString(LCase(HeaderContent), LCase(Element), 0)
  ipos2 = FindString(LCase(HeaderContent), #CR$, ipos1)
  
  If ipos1 < ipos2
    ProcedureReturn Mid(HeaderContent, ipos1 + Len(Element), ipos2 - (ipos1 + Len(Element)))  
  EndIf  
EndProcedure

InitNetwork()

;Fichier à télécharger
Url = "http://www.purebasic.com/download/PureBasic_Demo.zip"

Debug "Fichier à télécharger " + GetFilePart(Url) + #CRLF$

;Quel est la taille du fichier
Header =  GetHTTPHeader(Url)
Size = Val(GetHTTPHeaderElement(Header, "Content-Length"))

Debug "Taille du fichier à télécharger : "  + Size + #CRLF$

;Debut du téléchargement
Telechargement = ReceiveHTTPMemory(Url, #PB_HTTP_Asynchronous)

If Telechargement
  Repeat
    Progression = HTTPProgress(Telechargement)
    Select Progression
      Case #PB_Http_Success
        *Memoire = FinishHTTP(Telechargement)
        
        ;Création du fichier reçu
        CreateFile(0, GetFilePart(Url))
        WriteData(0, *Memoire, MemorySize(*Memoire))
        CloseFile(0)
        
        Debug "Téléchargement terminé (Taille: " + MemorySize(*Memoire) + ") 100% " 
        FreeMemory(*Memoire)
        End
        
      Case #PB_Http_Failed
        Debug "Le téléchargement a échoué"
        End
        
      Case #PB_Http_Aborted
        Debug "Le téléchargement a été interrompu"
        End
        
      Default
        Debug "Téléchargement en cours: " + Progression + " octets reçus " + StrF((Progression / Size) * 100, 0) + "%"   
        
    EndSelect
    
    Delay(500) ; Libérer le CPU
  ForEver
Else
  Debug "Erreur de téléchargement"
EndIf
résultat
Un exemple de déroulement a écrit :Taille du fichier à télécharger : 3610921

Téléchargement en cours: 0 octets reçus 0%
Téléchargement en cours: 717663 octets reçus 20%
Téléchargement en cours: 1636647 octets reçus 45%
Téléchargement en cours: 2552799 octets reçus 71%
Téléchargement en cours: 3473199 octets reçus 96%
Téléchargement terminé (Taille: 3610921) 100%

Re: Suivre la progression d'un téléchargement de fichier

Publié : lun. 29/mai/2017 16:47
par falsam
Gally m'ayant fourni une procédure permettant d'extraire une donnée du header, le code du premier message est modifié en conséquence.

Il est vrai que la procédure GetHTTPHeaderElement(HeaderContent.s, Element.s) est plus avantageuse que ce que j'avais fait.

■ Exemple : GetHTTPHeaderElement(Header, "Content-Length") pour trouver la taille du fichier à télécharger.
La variable Header est initialisée au préalable par GetHTTPHeader(Url).

Merci Gally.

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 7:25
par GallyHC
Bonjour,

Ce code m'a bien aider ^^. Sinon j'ai fait une toute petite modification à "GetHTTPHeaderElement()" en ajoutant un "Trim()", pour éviter l'espace avant le texte.

Code : Tout sélectionner

Procedure.s GetHTTPHeaderElement(HeaderContent.s, Element.s)
;
;
;
  Protected.i ipos1, ipos2
  ;  
  Element + ":"
  ipos1 = FindString(LCase(HeaderContent), LCase(Element), 0)
  ipos2 = FindString(LCase(HeaderContent), #CR$, ipos1)
  If ipos1 < ipos2
    ProcedureReturn Trim(Mid(HeaderContent, ipos1 + Len(Element), ipos2 - (ipos1 + Len(Element))))
  EndIf  
  
EndProcedure
Cordialement,
GallyHC

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 9:39
par Ar-S
Toujours bon à avoir ce genre de proce merci.

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 14:57
par falsam
GallyHC a écrit :en ajoutant un "Trim()", pour éviter l'espace avant le texte.
ça ne fonctionne pas gally. La longueur du fichier n'est pas retournée.

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 15:09
par Marc56
Version avec expression régulière pour extraire la taille du fichier dans l'entête :wink:
(remplace GetHTTPHeaderElement)

Code : Tout sélectionner

Define.s Url
Define.i Size

InitNetwork()

;Fichier à télécharger
Url = "http://www.purebasic.com/download/OgreAssimpConverter.zip"

If CreateRegularExpression(0, "Content-Length: (\d+)")
     ExamineRegularExpression(0, GetHTTPHeader(Url))
     While NextRegularExpressionMatch(0)
          Size = Val(RegularExpressionGroup(0, 1))
     Wend
EndIf


Debug "Taille du fichier à télécharger : "  + Size + #CRLF$

;Debut du téléchargement
Telechargement = ReceiveHTTPMemory("http://www.purebasic.com/download/OgreAssimpConverter.zip", #PB_HTTP_Asynchronous)

If Telechargement
  Repeat
    Progression = HTTPProgress(Telechargement)
    Select Progression
      Case #PB_Http_Success
        *Memoire = FinishHTTP(Telechargement)
        Debug "Téléchargement terminé (Taille: " + MemorySize(*Memoire) + ") 100% "
        FreeMemory(*Memoire)
        End
       
      Case #PB_Http_Failed
        Debug "Le téléchargement a échoué"
        End
       
      Case #PB_Http_Aborted
        Debug "Le téléchargement a été interrompu"
        End
       
      Default
        Debug "Téléchargement en cours: " + Progression + " octets reçus " + StrF((Progression / Size) * 100, 0) + "%"   
       
    EndSelect
   
    Delay(500) ; Libérer le CPU
  ForEver
Else
  Debug "Erreur de téléchargement"
EndIf 

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 15:16
par falsam
Dans la version précédente du code, le fichier n'était pas crée. C'est chose faite avec cette nouvelle version.

Dans un souci de simplicité, le fichier est downloadé dans le dossier courant du code.

Le fichier téléchargé est la version de démonstration de PureBasic.

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 15:24
par falsam
@Marc: Bien la version avec expression régulière !! Par contre quand on crée l'exécutable le poids est doublé. Bon ok ça reste dérisoire.

J'aime beaucoup. Merci.

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 20:57
par celtic88
il m'a plu et voilà ma contribution

Code : Tout sélectionner

InitNetwork()

#PBHTTP_QUERY_VERSION="#VERSION" ; http version
#PBHTTP_QUERY_RESPONSECODE="#RESPONSECODE" ; status code
#PBHTTP_QUERY_RESPONSEREASON="#RESPONSEREASON"; status code description
#PBHTTP_QUERY_DATE="Date:";server date
#PBHTTP_QUERY_CONTENT_TYPE="Content-Type:";mime type ;https://github.com/miguelmota/mime-ext/blob/master/src/data/mime_types.txt
#PBHTTP_QUERY_CONTENT_LENGTH = "Content-Length:";size of content
#PBHTTP_QUERY_COOKIE="Set-Cookie:";cookie
#PBHTTP_QUERY_LAST_MODIFIED="Last-Modified:";creation or last modified file
#PBHTTP_QUERY_ETAG="ETag:";etag 
#PBHTTP_QUERY_ACCEPT_RANGES="Accept-Ranges:"; accept Ranges
#PBHTTP_QUERY_LOCATION="Location:"; location to redirect link
#PBHTTP_QUERY_CONTENT_DISPOSITION="Content-Disposition:";name of file
#PBHTTP_QUERY_EXPIRES="Expires:";Expires

Procedure.s PBHTTP_HeaderGetQuery(Header.s,QueryType.s)
  For f=1 To CountString(Header,#CRLF$)
    Hi$= StringField(Header,f,#CRLF$)
    If Left(Hi$,5) = "HTTP/" 
      Select QueryType
        Case #PBHTTP_QUERY_VERSION
          ProcedureReturn StringField(Hi$,1,Chr(32))
        Case #PBHTTP_QUERY_RESPONSECODE
          ProcedureReturn StringField(Hi$,2,Chr(32))
        Case #PBHTTP_QUERY_RESPONSEREASON
          ProcedureReturn StringField(Hi$,3,Chr(32))
      EndSelect
    ElseIf Left(Hi$,Len(QueryType)) = QueryType
      ProcedureReturn Mid(Hi$,Len(QueryType)+2)
    EndIf
  Next
EndProcedure

EnTete$ = GetHTTPHeader("http://www.purebasic.com/download/PureBasic.lzx")
Debug EnTete$
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_VERSION)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_RESPONSECODE)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_RESPONSEREASON)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_DATE)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_CONTENT_TYPE)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_CONTENT_LENGTH)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_COOKIE)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_LAST_MODIFIED)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_ETAG)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_ACCEPT_RANGES)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_LOCATION)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_CONTENT_DISPOSITION)
Debug PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_EXPIRES)

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 21:39
par JohnJohnsonSHERMAN
Comme d'hab, celtic, encore du travail propre et efficace à conserver :) Merci !

Re: Suivre la progression d'un téléchargement de fichier

Publié : mar. 30/mai/2017 22:28
par falsam
Merci pour cette contribution Celtic :wink:

Re: Suivre la progression d'un téléchargement de fichier

Publié : mer. 31/mai/2017 13:11
par celtic88
pas de quoi les mec :wink:
code bonus youtube video downloader avec progress :)

j ai pas tro tester

Code : Tout sélectionner

InitNetwork()

Structure YoutubDownloadLinks
  Title.s;{1024}
  Url.s  ;{1024}
  bitrate.l
  Mimetype.s;{1024}
  QualityFps.s;{1024}
  Resolution.s;{1024}
EndStructure

#PBHTTP_QUERY_VERSION="#VERSION" ; http version
#PBHTTP_QUERY_RESPONSECODE="#RESPONSECODE" ; status code
#PBHTTP_QUERY_RESPONSEREASON="#RESPONSEREASON"; status code description
#PBHTTP_QUERY_DATE="Date:";server date
#PBHTTP_QUERY_CONTENT_TYPE="Content-Type:";mime type ;https://github.com/miguelmota/mime-ext/blob/master/src/data/mime_types.txt
#PBHTTP_QUERY_CONTENT_LENGTH = "Content-Length:";size of content
#PBHTTP_QUERY_COOKIE="Set-Cookie:";cookie
#PBHTTP_QUERY_LAST_MODIFIED="Last-Modified:";creation or last modified file
#PBHTTP_QUERY_ETAG="ETag:";etag 
#PBHTTP_QUERY_ACCEPT_RANGES="Accept-Ranges:"; accept Ranges
#PBHTTP_QUERY_LOCATION="Location:"; location to redirect link
#PBHTTP_QUERY_CONTENT_DISPOSITION="Content-Disposition:";name of file
#PBHTTP_QUERY_EXPIRES="Expires:"                        ;Expires

Global  MIMELIST.s="atom=application/atom+xml;woff=application/font-woff;woff2=application/font-woff2;jar=application/java-archive;war=application/java-archive;json=application/json;jsonld=application/ld+json;hqx=application/mac-binhex40;webmanifest=application/manifest+json;doc=application/msword;pdf=application/pdf;ps=application/postscript;rss=application/rss+xml;rtf=application/rtf;geojson=application/vnd.geo+json;kml=application/vnd.google-earth.kml+xml;kmz=application/vnd.google-earth.kmz;xls=application/vnd.ms-excel;eot=application/vnd.ms-fontobject;ppt=application/vnd.ms-powerpoint;pptx=application/vnd.openxmlformats-officedocument.presentationml.presentation;xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;docx=application/vnd.openxmlformats-officedocument.wordprocessingml.document;wmlc=application/vnd.wap.wmlc;7z=application/x-7z-compressed;bbaw=application/x-bb-appworld;torrent=application/x-bittorrent;crx=application/x-chrome-extension;cco=application/x-cocoa;ttf=application/x-font-ttf;jardiff=application/x-java-archive-diff;jnlp=application/x-java-jnlp-file;run=application/x-makeself;oex=application/x-opera-extension;pl=application/x-perl;rar=application/x-rar-compressed;rpm=application/x-redhat-package-manager;sea=application/x-sea;swf=application/x-shockwave-flash;sit=application/x-stuffit;tcl=application/x-tcl;webapp=application/x-web-app-manifest+json;crt=application/x-x509-ca-cert;xpi=application/x-xpinstall;xhtml=application/xhtml+xml;xml=application/xml;xsl=application/xslt+xml;zip=application/zip;midi=audio/midi;m4a=audio/mp4;mp3=audio/mpeg;ogg=audio/ogg;ra=audio/x-realaudio;wav=audio/x-wav;otf=font/opentype;bmp=image/bmp;gif=image/gif;jpeg=image/jpeg;png=image/png;svg=image/svg+xml;tiff=image/tiff;wbmp=image/vnd.wap.wbmp;webp=image/webp;ico=image/x-icon;jng=image/x-jng;appcache=text/cache-manifest;css=text/css;html=text/html;mml=text/mathml;txt=text/plain;vcard=text/vcard;xloc=text/vnd.rim.location.xloc;jad=text/vnd.sun.j2me.app-descriptor;wml=text/vnd.wap.wml;vtt=text/vtt;3gp=video/3gpp;mp4=video/mp4;mpeg=video/mpeg;ogv=video/ogg;mov=video/quicktime;webm=video/webm;flv=video/x-flv;mng=video/x-mng;asf=video/x-ms-asf;wmv=video/x-ms-wmv"

Procedure.s PBHTTP_HeaderGetQuery(Header.s,QueryType.s)
  For f=1 To CountString(Header,#CRLF$)
    Hi$= StringField(Header,f,#CRLF$)
    If Left(Hi$,5) = "HTTP/" 
      Select QueryType
        Case #PBHTTP_QUERY_VERSION
          ProcedureReturn StringField(Hi$,1,Chr(32))
        Case #PBHTTP_QUERY_RESPONSECODE
          ProcedureReturn StringField(Hi$,2,Chr(32))
        Case #PBHTTP_QUERY_RESPONSEREASON
          ProcedureReturn StringField(Hi$,3,Chr(32))
      EndSelect
    ElseIf Left(Hi$,Len(QueryType)) = QueryType
      ProcedureReturn Mid(Hi$,Len(QueryType)+2)
    EndIf
  Next
EndProcedure

Procedure.s String_Between(Txt.s,sStart.s,sEnd.s)
  Protected fd.l=FindString(Txt,sStart),ilStr.l=Len(sStart),ilen.l = FindString(Txt,sEnd, fd+ilStr)- (fd+ilStr)
  If sEnd = #Null$:ilen=Len(Txt):EndIf
  If fd And ilen:ProcedureReturn Mid(Txt,fd+ilStr,ilen):EndIf
EndProcedure
Procedure YoutubGetDownloadLinks(YoutubWebSource.s,List YoutubDownloadLinksList.YoutubDownloadLinks())
  ClearList(YoutubDownloadLinksList())
  Protected Findytplayer.l=FindString(YoutubWebSource,"<script>var ytplayer"); ytplayer.config.args
  If Findytplayer
    YoutubWebSource = Mid(YoutubWebSource,Findytplayer,FindString(YoutubWebSource,"</script>",Findytplayer)-Findytplayer)
    If YoutubWebSource
      Protected Titel.s=  String_Between(YoutubWebSource,Chr(34)+"title"+Chr(34)+":"+Chr(34),"|")
      Protected linkDownload.s= String_Between(YoutubWebSource,Chr(34)+"url_encoded_fmt_stream_map"+Chr(34)+":"+Chr(34),Chr(34)+","); url_encoded_fmt_stream_map // traditional: contains video and audio streamadaptive_fmts              // DASH: contains video Or audio stream
      If linkDownload
        Protected z.l,add.b,i.l,Ids.s:For i  = 2 To CountString(linkDownload,"url=")+1
          Ids=StringField(linkDownload,i,"url=")
          AddElement(YoutubDownloadLinksList())
          YoutubDownloadLinksList()\Title = Titel
          Ids=StringField(Ids,1,",")
          YoutubDownloadLinksList()\Url =URLDecoder(StringField(Ids,1,"\u0026"))
          add=1
        Next
        ProcedureReturn add
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s Mime_Get_ex(mime$)
  For t = 1 To CountString(MIMELIST,";")
    txt$=StringField(MIMELIST,t,";")
    If StringField(txt$,2,"=")=mime$
      ProcedureReturn StringField(txt$,1,"=")
    EndIf
  Next
EndProcedure

*Buffer = ReceiveHTTPMemory("https://www.youtube.com/watch?v=kkGeOWYOFoA")
If *Buffer
  Taille = MemorySize(*Buffer)    
  NewList YoutubDownloadLinksList.YoutubDownloadLinks()
  If YoutubGetDownloadLinks(PeekS(*Buffer, Taille, #PB_UTF8),YoutubDownloadLinksList())
    ForEach YoutubDownloadLinksList()
      ;YoutubDownloadLinksList()\Title
      While 1
        EnTete$ = GetHTTPHeader(YoutubDownloadLinksList()\Url)
        Debug YoutubDownloadLinksList()\Url
        RedirectCode.s= PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_RESPONSECODE)
        Debug RedirectCode
        If Left(RedirectCode,1)="3"
          Debug "Redirect link: " +PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_LOCATION)
          YoutubDownloadLinksList()\Url=PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_LOCATION)
          Continue
        EndIf
        GetExtensionmime$= Mime_Get_ex(PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_CONTENT_TYPE))
        GetSizeFile.q= Val(PBHTTP_HeaderGetQuery(EnTete$,#PBHTTP_QUERY_CONTENT_LENGTH))
        
        Telechargement= ReceiveHTTPFile(YoutubDownloadLinksList()\Url, YoutubDownloadLinksList()\Title+"."+GetExtensionmime$, #PB_HTTP_Asynchronous)
        If Telechargement
          Repeat
            Progression = HTTPProgress(Telechargement)
            Select Progression
              Case #PB_Http_Success
                Debug "Téléchargement terminé (Taille: " + Str(GetSizeFile) + ")"
                
              Case #PB_Http_Failed
                Debug "Le téléchargement a échoué"
                End
                
              Default
                Debug "Téléchargement en cours: " + Progression + " octets reçus sur : " + Str(GetSizeFile) +" octets " + Str((Progression*100)/GetSizeFile)+ " %"
                
            EndSelect
            
            Delay(500) ; Libérer le CPU
          ForEver
        Else
          Debug "Erreur de téléchargement"
        EndIf
        
        Break
      Wend
    Next
  EndIf
  FreeMemory(*Buffer)
Else
  Debug "Le téléchargement a échoué"
EndIf

Re: Suivre la progression d'un téléchargement de fichier

Publié : mer. 31/mai/2017 17:15
par Ar-S
C'est bon ça. Par contre, selon les videos j'ai obtenu
une fois : erreur ligne 116 : division par 0 interdite. (je n'ai plus l'url)
Le telech a échoué ici : https://www.youtube.com/watch?v=Tpo9WYxLdLY
Une autre est OK : https://www.youtube.com/watch?v=IFLGgKeDWe8
En pb 5.60 x64 et x86

Re: Suivre la progression d'un téléchargement de fichier

Publié : mer. 31/mai/2017 17:24
par venom
@Ar-S

Tes liens renvoie vers des vidéos dead.





@++

Re: Suivre la progression d'un téléchargement de fichier

Publié : mer. 31/mai/2017 17:51
par Ar-S
Bizarre ça. J'ai corrigé. J'ai reussi à en telech une et pas une autre..
Dépend de... Je sais pas quoi.