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

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