Vdownload - multiple téléchargeur de fichiers

Contenu du snippet

Permet de télécharger des fichiers sur Internet. Vous pouvez en télécharger simultanément autant que vous voulez. Renvoi si vous le voulez à un alias que vous avez défini les informations de progression (taille du fichier, bits copiés, pourcentage et taux de transfert) et vous informe quand un téléchargement est fini.

Source / Exemple :


;vdownload - Créé le vendredi 16 Janvier 2004 par Had`S - Version 1.0

;$vdownload(name|_,AP|_,AF|_,url,emplacement).[bin|txt]

;name = Nom du téléchargement. Il est évidemment préférable de mettre des noms différents (ou de mettre _) si vous faites plusieurs téléchargement en même temps. Si vous mettez _ le nom sera généré aléatoirement. Le nom du socket sera toujours vdownload_S  où S est le nom du socket défini ou le nom du socket généré aléatoirement.
;AP = Alias de progression. Le snippet renvoi à l'alias que vous mettez: $1=taille total du fichier, $2=bits-copiés, $3=pourcentage, $4=taux de transfert en bits/s, si vous mettez _ alors le snippet ne renverra pas les informations de progression à un alias.
;AF  = Alias de fin. Le snippet exécute l'alias que vous mettez quand le téléchargement est fini.
;url  = adresse du fichier à télécharger sur Internet.
;emplacement = emplacement où le fichier téléchargé sera enregistré.
;Par défaut, le snippet analyse le type de données (binaire ou texte) du fichier à télécharger afin d'écrire avec le type de données le plus approprié au fichier. Vous pouvez forcer le snippet à écrire les données en binaire ou en texte normal en mettant comme propriété : bin (binaire)ou txt (texte normal).

;/vdownload <name|wildcard>  <== pour annuler un ou plusieurs téléchargements.

;Exemples d'utilisation inclus à la fin du code.

alias vdownload {
  ;Si l'alias a été exécuté sous la forme d'un $identifeur...
  if ($isid) {
    if ($0 <  5) return Manque des paramètres
    if ($1 == _) var %u = $r(a,z) $+ $r(1,9999) $+ $r(a,z) $+ $r(a,z) $+ $r(1,99) $+ $r(a,z)
    else { if ($sockopen(download_ $+ $1)) return Erreur! Socket déja ouvert! | var %u = $1 }
    ;Ecriture dans la hashtable
    if ($2 != _) hadd -m vdownload %u $+ _progs $2
    if ($3 != _) hadd -m vdownload %u $+ _fin $3
    hadd -m vdownload %u $+ _host $gettok($iif($mid($4,1,7) == http:// && $len($4) > 7,$mid($4,8),$4),1,47)
    hadd  vdownload %u $+ _file / $+ $gettok($iif($mid($4,1,7) == http:// && $len($4) > 7,$mid($4,8),$4),2-,47)
    hadd vdownload %u $+ _dest $5-
    hadd vdownload %u $+ _tm $iif($findtok(bin txt,$prop,32),$prop,auto)
    ;Ouverture du socket
    sockopen vdownload_ $+ %u  $hget(vdownload,%u $+ _host) 80
    return OK
  }
  ;L'alias a été exécuté sous la forme d'une /commande...
  else {
    if (!$1) goto end
    sockclose vdownload_ $+ $1-
    if (* !isin $1-) $iif($fopen(vdownload_  $+ $1-),.fclose vdownload_ $+ $1-) | else .fclose vdownload_ $+ $1-)
    if ($hget(vdownload)) {
      hdel -w vdownload $1- $+ _*
      ;Si aucun item n'est présent dans la hashtable, autant la supprimer.
      if (!$hget(vdownload,0).item) .hfree vdownload
    }
    .timervdownload_ $+ $1- off
  }
  :end
}
on *:sockopen:vdownload_*:{
  var %u = $gettok($sockname,2-,95)
  ;Vérification d'erreur..
  if ($sockerr) { echo $color(info)  Erreur ! (1) | vdownload %u | halt }
  sockwrite -n $sockname GET $hget(vdownload,%u $+ _file) HTTP/1.0
  sockwrite -n $sockname  HOST: $hget(vdownload,%u $+ _host)
  sockwrite -n $sockname $crlf
  hadd vdownload %u $+ _header no
  hadd vdownload %u $+ _prog 0 | hadd vdownload %u $+ _tt 0
  hadd vdownload %u $+ _taux 0
}
on *:sockread:vdownload_*:{
  var %u = $gettok($sockname,2,95)
  if ($hget(vdownload,%u $+ _header) == no) {
    ;Donc si on est ici, ça veut dire qu'on s'apprête à recevoir les headers, et donc des informations utiles sur le fichier..
    var %a
    sockread  %a
    ;Analyse et détéction du type de fichier pour permettre au snippet de choisir la méthode d'écriture (binaire ou texte) ..
    if (Content-Type: * iswm %a) {
      hadd vdownload %u $+ _type $gettok(%a,2-,58)
      if ($hget(vdownload,%u $+ _tm) == auto) {
        if (text/plain isin $hget(vdownload,%u $+ _type)) || (text/html isin $hget(vdownload,%u $+ _type)) hadd vdownload %u $+ _tm txt
        else hadd vdownload %u $+ _tm bin
      }
    }
    if (Content-Length: * iswm %a) hadd vdownload %u $+ _taille $gettok(%a,2-,58)
    ;Fin des headers, signalons donc que les headers ont été reçus.
    if (!%a) { hadd vdownload %u $+ _header yes | .timervdownload_ $+ %u 0 1 vdownloadtimer %u }
  }
  else {
    if (!$fopen(vdownload_ $+ %u)) .fopen -no vdownload_ $+ %u " $+ $hget(vdownload,%u $+ _dest) $+ "
    ;Incrémentation du nombre de bits reçus.
    hinc vdownload  %u $+ _prog $sock($sockname).rq
    hinc vdownload  %u $+ _tt $sock($sockname).rq
    ;Exécution de l'alias de progression (si il y en a un) défini par l'utilisateur
    if ($hget(vdownload,%u $+ _progs)) $hget(vdownload,%u $+ _progs) $hget(vdownload,%u $+ _taille) $hget(vdownload,%u $+ _prog) $round($calc(($hget(vdownload,%u $+ _prog) / $hget(vdownload,%u $+ _taille)) *100) ,1) $+ % $hget(vdownload,%u $+ _taux)
    if ($hget(vdownload,%u $+ _tm) == txt) {
      var %b
    ;Utilisation de $sockbr pour lire toute les informations...
      :reading | sockread  -f  %b | if (!$sockbr) return | .fwrite  vdownload_ $+ %u %b $crlf | goto reading
    }
    else { sockread &a | .fwrite -b vdownload_ $+ %u &a }
  }
}
;Pour obtenir le nombre de bits reçus en 1 seconde
alias -l vdownloadtimer {
  if ($hget(vdownload,0).item) {
    hadd vdownload $1 $+ _taux $hget(vdownload,$1 $+ _tt) | hadd vdownload $1 $+ _tt 0
  }
}
on *:sockclose:vdownload_*:{
  ;Fermeture des accès fichiers, et suppresion des données, timer...
  if ($fopen($sockname)) .fclose $sockname
  var %u = $gettok($sockname,2,95) , %fin = $hget(vdownload,$gettok($sockname,2-,95) $+ _fin)
  if ($hget(vdownload)) hdel -w vdownload %u $+ _*
  if (!$hget(vdownload,0).item) .hfree -w vdownload
  .timervdownload_ $+ %u off
  ;Fait la commande de fin rentré par l'utilisateur
  if (%fin) %fin
}

;Exemples
;-Télécharge simplement le logo de Google France et l'ouvre à la fin du téléchargement.
;//var %i = $vdownload(google,_,run google.gif,http://www.google.fr/intl/fr_fr/images/logo.gif,google.gif)

;-Télécharge mIRC 6.12 en affichant la progression et indiquant à la fin que le téléchargement est terminé.
;//var %i = $vdownload(_,progtmp-01-,Echo 4 -s Téléchargement de mIRC Terminé.,http://webperso.easynet.fr/mirc/mirc612.exe,download\\mIRC612.exe)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.