All pastes #1264559 Raw Edit

Download Script v1

public text v1 · immutable
#1264559 ·published 2008-11-22 21:01 UTC
rendered paste body
;Setup redirection settings
;Usage: $download(<file URL>,[Save Directory],[Save File Name])

on *:START: {
  unset %file_dl.*
}

alias download {
  var %time = $ticks

  ;Settings Variables
  var %directory = $mircdir\download
  var %redirect_limits = 3
  ;End Settings Variables


  ;Determine download directory
  if (!$isid) { var %error = Please use in identifier format: $download(<download URL>,[save directory],[save filename]) | goto error }
  if ($2) %directory = $v1
  if (!$isdir($nofile(%directory))) { var %error = Download directory does not exist. | goto error }

  ;Determine download target properties
  var %url_regex = /(?:\s|\G)((?:(?:http(s?):\/\/|www\.())(?:[\w-]*\.)*?(?:[\w-]*)(?:\.[a-z]{2,5}(?:\.[a-z]{2})?))|(?:http(s?):\/\/(?:\d{1,3}\.){3}\d{1,3}))((?::\d{1,5}?)?)((?:\/\S*)*)(?:\s|$)/i
  var %match = $regex($strip($1-),%url_regex))
  if (!%match) { var %error = Valid URL required for download. | goto error }

  ;;Determine download port
  var %secure = $false
  if ($regml(2)) {
    var %port = 443
    %secure = $true
  }
  else var %port = 80
  if ($regml(3)) %port = $right($v1,-1)

  ;;Determine download host
  var %host = $remove($regml(1),http://,https://)

  ;Set socket information variables
  set %file_dl.path. [ $+ [ %time ] ] $iif($regml(4),$v1,/)
  set %file_dl.head. [ $+ [ %time ] ] 1

  ;Set filename/path
  if ($3) set %file_dl.save. [ $+ [ %time ] ] $v1
  elseif ($regex($gettok($gettok(%file_dl.path. [ $+ [ %time ] ],-1,47\),-1,92),/([^?&#:*"<>]+)/)) set %file_dl.save. [ $+ [ %time ] ] $regml(1)
  else set %file_dl.save. [ $+ [ %time ] ] index.html
  %file_dl.save. [ $+ [ %time ] ] = $+(%directory,$iif($right(%directory,1) !isin \/,/),%file_dl.save. [ $+ [ %time ] ])
  if $exists(%file_dl.save. [ $+ [ %time ] ]) { var %error = File already exists. | goto error }

  sockopen $iif(%secure,-e) download. $+ %time %host %port

  ;Done 
  return Initiated %time
  :error
  $iif($isid,return,echo 4 -a) Error: $iif(%error,$v1,$error)
  reseterror
  unset %file_dl.*. [ $+ [ %time ] ]
}

on *:SOCKOPEN:download.*: {
  if ($sockerr) { download_close $sockname | return }
  sockwrite -nt $sockname GET %file_dl.path. [ $+ [ $gettok($sockname,-1,46) ] ] HTTP/1.1 
  sockwrite -nt $sockname Host: $sock($sockname).addr
  sockwrite -nt $sockname Accept-Language: en-us 
  sockwrite -nt $sockname User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 
  sockwrite -nt $sockname Accept: */*
  sockwrite -nt $sockname Connection: close
  sockwrite -nt $sockname
}

on *:SOCKREAD:download.*: {
  if ($sockerr > 0) return
  var %download_read
  var %time = $gettok($sockname,-1,46)

  :download_read
  ;Process Headers First
  if (%file_dl.head. [ $+ [ %time ] ]) {
    sockread %download_read 
    if (!%download_read) {
      unset %file_dl.head. [ $+ [ %time ] ]
      goto download_read
    }
    if ($regex(redirect,%download_read,/Location:\s(.*?)$/i)) { 
      var %new_page = $iif(!$regex($left($regml(redirect,1),8),/^http(s)?:\/\//i),$+(http,$iif($sock($sockname).ssl,s),://,$sock($sockname).addr,:,$sock($sockname).port,$iif($left($regml(redirect,1),1) != /,/),$regml(redirect,1)),$regml(redirect,1))
      download $sockname %new_page
      download_close $sockname
      return
    }
    if ($regex(range,%download_read,/Accept-Ranges:\s(.*?)$/i)) { 
      set %file_dl.range. [ $+ [ $regml(range,1) ] ]
      goto download_read
    }
    if ($regex(size,%download_read,/Content-Length:\s(.*?)$/i)) { 
      set %file_dl.size. [ $+ [ $regml(size,1) ] ]
      goto download_read
    }
    goto download_read
  }

  ;Headers are done, process file download
  sockread -f &download_read
  bwrite $qt(%file_dl.save. [ $+ [ %time ] ]) -1 $sockbr &download_read
  if ($sockbr == 0) return
  goto download_read

  :error
  echo 4 -a Error: $error
  reseterror
  download_close $sockname
  return
}

on *:SOCKCLOSE:download.*: { 
  echo -a Download complete: $qt(%file_dl.save. [ $+ [ $gettok($sockname,-1,46) ] ]) 
  download_close $sockname
}

alias -l download_close {
  var %time = $gettok($1,-1,46)
  if ($sock(download. $+ %time)) sockclose download. $+ %time
  unset %download.*. [ $+ [ %time ] ]
}