Ooops
November 30, 2020, 01:42:51 AM

Author Topic: [bb] BlitzLeech by BlitzSupport [ 1+ years ago ]  (Read 602 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] BlitzLeech by BlitzSupport [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : BlitzLeech
Author : BlitzSupport
Posted : 1+ years ago

Description : UPDATE: Fixed stupid case-sensitivity bug!

This is a rough attempt at a file downloader, sorta like GoZilla or something, except a) it doesn't resume yet (doh!) and b) it needs Blitz to support threads before it'll be properly useable/fast...

Note that it'll download into 'path$' (default: "C:"), and it's not particularly reliable yet! Read the disclaimer in the code :)


Code :
Code: BlitzBasic
  1. ; -----------------------------------------------------------------------------
  2. ; BlitzLeech -- simple HTTP 1.1 downloader... james @ hi - toro . com
  3. ; -----------------------------------------------------------------------------
  4.  
  5. ; Instructions/disclaimers/excuses...
  6.  
  7. ; Paste URLs into top text field. Click Leech. Slow due to unthreaded-ness and
  8. ; some hackiness to try and work around it a little... delays expected on
  9. ; connection and disconnection from server, hence apparent freeze-ups! List-view
  10. ; NOT properly updated, so don't worry. Abort or Exit will clean everything up,
  11. ; though the downloaded files will remain...
  12.  
  13. ; -----------------------------------------------------------------------------
  14. ; Hacky work-in-progress! Judge not beta code lest ye beta code be judged, etc.
  15. ; -----------------------------------------------------------------------------
  16.  
  17.  
  18.  
  19. ; CHANGE TO SUIT...
  20.  
  21. Global path$ = "C:"     ; Temp download folder -- careful, in case you have other
  22.                                                 ; files here with the same name as a download!
  23.  
  24.  
  25.  
  26.  
  27.  
  28. ; -----------------------------------------------------------------------------
  29. ; Name of download program...
  30. ; -----------------------------------------------------------------------------
  31.  
  32. Global Leecher$ = "BlitzLeech Plus"
  33.  
  34. Global list
  35.  
  36. ; -----------------------------------------------------------------------------
  37. ; Download type... [NOT ALL RELEVANT. TO BE SORTED!]
  38. ; -----------------------------------------------------------------------------
  39.  
  40. Type Download
  41.  
  42.         Field folder$
  43.         Field filename$
  44.         Field savestream
  45.        
  46.         Field listpos
  47.  
  48.         Field webstream
  49.        
  50.         Field url$
  51.         Field host$
  52.         Field file$
  53.         Field header$
  54.         Field totalbytes
  55.         Field currentbyte
  56.         Field date$
  57.         Field server$
  58.         Field content$
  59.         Field reply$
  60.  
  61. End Type
  62.  
  63. ; -----------------------------------------------------------------------------
  64. ; StartDownload -- starts downloading a file...
  65. ; -----------------------------------------------------------------------------
  66.  
  67. ; NOTE: This part causes a delay. This is because it has to connect to the
  68. ; server and then wait for it to reply. This could only really be avoided
  69. ; by creating a new thread for each download, which ain't gonna happen soon!
  70.  
  71. Function StartDownload.Download (url$, folder$, filename$ = "")
  72.  
  73.         ; -------------------------------------------------------------------------
  74.         ; Create new download...
  75.         ; -------------------------------------------------------------------------
  76.  
  77.         d.Download = New Download
  78.        
  79.         dlistpos = -1
  80.        
  81.         ; -------------------------------------------------------------------------
  82.         ; Remove "http://" from URL if it's there...
  83.         ; -------------------------------------------------------------------------
  84.        
  85.         If Left (url$, 7) = "http://" Then url$ = Right (url$, Len (url$) - 7)
  86.         durl = url$
  87.  
  88.         ; -------------------------------------------------------------------------
  89.         ; Split into host ("www.whatever.com") and remote filename ("/text/test.txt")...
  90.         ; -------------------------------------------------------------------------
  91.  
  92.         slash = Instr (url$, "/")
  93.         If slash
  94.                 dhost = Left (url$, slash - 1)
  95.                 dfile = Right (url$, Len (url$) - slash + 1)
  96.         Else
  97.                 dhost$ = url$
  98.                 dfile$ = "/"
  99.         EndIf
  100.  
  101.         ; -------------------------------------------------------------------------
  102.         ; Local folder (add trailing slash if missing)...
  103.         ; -------------------------------------------------------------------------
  104.  
  105.         If Right (folder$, 1) <> "" Then folder$ = folder$ + ""
  106.         dfolder$ = folder$
  107.  
  108.         ; -------------------------------------------------------------------------
  109.         ; Filename...
  110.         ; -------------------------------------------------------------------------
  111.  
  112.         If filename$ = ""
  113.                 If dfile = "/"
  114.                         filename$ = "Unknown file.txt"
  115.                 Else
  116.                         For findSlash = Len (dfile$) To 1 Step - 1
  117.                                 testForSlash$ = Mid (dfile$, findSlash, 1)
  118.                                 If testForSlash$ = "/"
  119.                                         filename$ = Right (dfile$, Len (dfile$) - findSlash)
  120.                                         Exit
  121.                                 EndIf
  122.                         Next
  123.                         If filename$ = "" Then filename$ = "Unknown file.txt"
  124.                 EndIf
  125.         EndIf
  126.  
  127.         dfilename$ = filename$
  128.        
  129.         ; -------------------------------------------------------------------------
  130.         ; Open connection to server...
  131.         ; -------------------------------------------------------------------------
  132.  
  133.         dwebstream = OpenTCPStream (dhost, 80)
  134.        
  135.         If dwebstream
  136.  
  137.                 ; ---------------------------------------------------------------------
  138.                 ; Send request header...
  139.                 ; ---------------------------------------------------------------------
  140.        
  141.                 WriteLine dwebstream, "GET " + dfile + " HTTP/1.1"
  142.                 WriteLine dwebstream, "Host: " + dhost
  143.                 WriteLine dwebstream, "User-Agent: "+ Leecher$
  144.                 WriteLine dwebstream, "Accept: */*"
  145.                 WriteLine dwebstream, ""
  146.  
  147.                 ; ---------------------------------------------------------------------
  148.                 ; Server replies with several lines followed by a blank line...
  149.                 ; ---------------------------------------------------------------------
  150.                
  151.                 Repeat
  152.  
  153.                         ; -----------------------------------------------------------------
  154.                         ; Read one line of server's response header...
  155.                         ; -----------------------------------------------------------------
  156.                        
  157.                         dheader = ReadLine (dwebstream)
  158.  
  159.                         d
  160. eply = "" ; Reset reply string...
  161.  
  162.                         ; -----------------------------------------------------------------
  163.                         ; Replies are in the form of "Blah: xxxx" (note colon and space)...
  164.                         ; -----------------------------------------------------------------
  165.                        
  166.                         pos = Instr (dheader, ": ")
  167.                         If pos
  168.                                 d
  169. eply = Left (dheader, pos + 1)
  170.                         EndIf
  171.  
  172.                         ; -----------------------------------------------------------------
  173.                         ; ReplyContent () gets the actual information for each line...
  174.                         ; -----------------------------------------------------------------
  175.  
  176.                         Select Lower (d
  177. eply)
  178.                                 Case "content-length: "
  179.                                         d       otalbytes = ReplyContent (d)
  180.                                 Case "date: "
  181.                                         ddate = ReplyContent (d)
  182.                                 Case "server: "
  183.                                         dserver = ReplyContent (d)
  184.                                 Case "content-type: "
  185.                                         dcontent = ReplyContent (d)
  186.                                 Default
  187.                                         If gotReply = 0 Then initialReply$ = dheader: gotReply = 1
  188.                         End Select
  189.  
  190.                 Until dheader = "" Or (Eof (dwebstream))
  191.  
  192.                 ; ---------------------------------------------------------------------
  193.                 ; Fie size is zero? Weird. Oh, well, end of download...
  194.                 ; ---------------------------------------------------------------------
  195.                
  196.                 If d    otalbytes = 0
  197.                         CloseTCPStream dwebstream
  198.                         Delete d
  199.                         Return Null
  200.                 EndIf
  201.                
  202.                 ; ---------------------------------------------------------------------
  203.                 ; Create new file to write downloaded bytes into...
  204.                 ; ---------------------------------------------------------------------
  205.  
  206.                 dsavestream = WriteFile (dfolder + dfilename)
  207.  
  208.                 ; ---------------------------------------------------------------------
  209.                 ; Couldn't create file? Too bad. End of download...
  210.                 ; ---------------------------------------------------------------------
  211.  
  212.                 If Not dsavestream
  213.                         CloseTCPStream dwebstream
  214.                         Delete d
  215.                         Return Null
  216.                 EndIf
  217.  
  218.                 ; ---------------------------------------------------------------------
  219.                 ; Got all the information we need to continue the download...
  220.                 ; ---------------------------------------------------------------------
  221.                
  222.                 Return d
  223.                
  224.         Else
  225.  
  226.                 ; ---------------------------------------------------------------------
  227.                 ; Failed to connect to server...
  228.                 ; ---------------------------------------------------------------------
  229.  
  230.                 Delete d
  231.                 Return Null
  232.  
  233.         EndIf
  234.  
  235. End Function
  236.  
  237. ; -----------------------------------------------------------------------------
  238. ; UpdateDownloads -- updates downloads and returns number of active downloads...
  239. ; -----------------------------------------------------------------------------
  240.  
  241. Function UpdateDownloads ()
  242.  
  243.         ; -------------------------------------------------------------------------
  244.         ; Go through each .Download...
  245.         ; -------------------------------------------------------------------------
  246.  
  247.         For d.Download = Each Download
  248.  
  249.                 ; ---------------------------------------------------------------------
  250.                 ; Count downloads still ongoing...
  251.                 ; ---------------------------------------------------------------------
  252.  
  253.                 downloads = downloads + 1
  254.  
  255.                 If Not Eof (dwebstream)
  256.  
  257.                         ; -----------------------------------------------------------------
  258.                         ; Still receiving from server, so write bytes to local file...
  259.                         ; -----------------------------------------------------------------
  260.  
  261.                         For a = 1 To 10
  262.                                 If Not Eof (dwebstream)
  263.                                         WriteByte dsavestream, ReadByte (dwebstream)
  264.                                         dcurrentbyte = dcurrentbyte + 1
  265.                                         ModifyGadgetItem list, dlistpos, durl + " (" + dcurrentbyte + " / " + d otalbytes + " bytes)"
  266.                                 Else
  267.                                         Exit
  268.                                 EndIf
  269.                         Next
  270.  
  271.                 Else
  272.  
  273.                         ; -----------------------------------------------------------------
  274.                         ; Server's all done. End of download... [ADD FILE SIZE CHECK!]
  275.                         ; -----------------------------------------------------------------
  276.  
  277.                         RemoveGadgetItem list, dlistpos
  278.                         ClearGadgetItems list
  279.                         For d2.Download = Each Download
  280.                                 If d2 <> d
  281.                                         AddGadgetItem list, d2url + " (" + d2currentbyte + " / " + d2   otalbytes + " bytes)", True
  282.                                         d2listpos = SelectedGadgetItem (list)
  283.                                 EndIf
  284.                         Next
  285.                        
  286.                         CloseFile dsavestream
  287.                         CloseTCPStream dwebstream
  288. ;                       Notify durl + " complete!"
  289.                         Delete d
  290.                        
  291.                         downloads = downloads - 1
  292.                        
  293.                 EndIf
  294.  
  295.         Next
  296.  
  297.         ; -------------------------------------------------------------------------
  298.         ; Return number of downloads still ongoing...
  299.         ; -------------------------------------------------------------------------
  300.  
  301.         Return downloads
  302.  
  303. End Function
  304.  
  305. ; -----------------------------------------------------------------------------
  306. ; ReplyContent -- just strips left-side of server reply ("Blah: " part)...
  307. ; -----------------------------------------------------------------------------
  308.  
  309. Function ReplyContent$ (d.Download)
  310.         Return Right (dheader, Len (dheader) - Len (d
  311. eply))
  312. End Function
  313.  
  314. ; -----------------------------------------------------------------------------
  315. ; Percent -- returns percentage of 'current byte' / 'total bytes' ...
  316. ; -----------------------------------------------------------------------------
  317.  
  318. Function Percent# (part#, total#)
  319.         Return part / total
  320. End Function
  321.  
  322. ; -----------------------------------------------------------------------------
  323. ; AbortDownloads -- safely abort all downloads (eg. on quitting early)...
  324. ; -----------------------------------------------------------------------------
  325.  
  326. Function AbortDownloads ()
  327.         For d.Download = Each Download
  328.                 CloseFile dsavestream
  329.                 CloseTCPStream dwebstream
  330.                 Delete d
  331.                 ClearGadgetItems list
  332.         Next
  333. End Function
  334.  
  335. ; -----------------------------------------------------------------------------
  336. ; D E M O . . .
  337. ; -----------------------------------------------------------------------------
  338.  
  339. Function CenterWindow (title$, width, height, group = 0, style = 15)
  340.         Return CreateWindow (title$, (ClientWidth (Desktop ()) / 2) - (width / 2), (ClientHeight (Desktop ()) / 2) - (height / 2), width, height, group, style)
  341. End Function
  342.  
  343. Const EVENT_None                = $0            ; No event (eg. a WaitEvent timeout)
  344. Const EVENT_KeyDown             = $101          ; Key pressed
  345. Const EVENT_KeyUp               = $102          ; Key released
  346. Const EVENT_ASCII               = $103          ; ASCII key pressed
  347. Const EVENT_MouseDown   = $201          ; Mouse button pressed
  348. Const EVENT_MouseUp             = $202          ; Mouse button released
  349. Const EVENT_MouseMove   = $203          ; Mouse moved
  350. Const EVENT_Gadget              = $401          ; Gadget clicked
  351. Const EVENT_Move                = $801          ; Window moved
  352. Const EVENT_Size                = $802          ; Window resized
  353. Const EVENT_Close               = $803          ; Window closed
  354. Const EVENT_Front               = $804          ; Window brought to front
  355. Const EVENT_Menu                = $1001         ; Menu item selected
  356. Const EVENT_LostFocus   = $2001         ; App lost focus
  357. Const EVENT_GotFocus    = $2002         ; App got focus
  358. Const EVENT_Timer               = $4001         ; Timer event occurred
  359.  
  360. AppTitle Leecher$
  361.  
  362. window = CenterWindow (Leecher$, 400, 300, 0, 1 + 2)
  363. SetMinWindowSize window, 340, 200
  364.  
  365. url = CreateTextField (5, 5, ClientWidth (window) - 80, 25, window)
  366. go = CreateButton ("Leech!", ClientWidth (window) - 70, 5, 65, 25, window)
  367. list = CreateListBox (5, 35, ClientWidth (window) - 10, ClientHeight (window) - 110, window)
  368. prog = CreateProgBar (5, ClientHeight (window) - 65, ClientWidth (window) - 10, 25, window)
  369. abort = CreateButton ("Abort all downloads", 5, ClientHeight (window) - 30, 150, 25, window)
  370. quit = CreateButton ("Exit program", ClientWidth (window) - 160, ClientHeight (window) - 30, 150, 25, window)
  371.  
  372. SetGadgetLayout url, 1, 1, 1, 0
  373. SetGadgetLayout go, 0, 1, 1, 0
  374. SetGadgetLayout list, 1, 1, 1, 1
  375. SetGadgetLayout prog, 1, 1, 0, 1
  376. SetGadgetLayout abort, 1, 0, 0, 1
  377. SetGadgetLayout quit, 0, 1, 0, 1
  378.  
  379. ActivateGadget url
  380.  
  381. Repeat
  382.  
  383.         e = WaitEvent (10)
  384.        
  385.         Select e
  386.                 Case EVENT_Gadget
  387.        
  388.                         Select EventSource ()
  389.  
  390.                                 Case url
  391.                                         If EventData () = 13
  392.                                                 leech$ = TextFieldText (url)
  393.                                                 If leech$ <> ""
  394.                                                         DisableGadget url
  395.                                                         DisableGadget go
  396.                                                         dl.Download = StartDownload (leech$, path$, "")
  397.                                                         If dl = Null
  398.                                                                 Notify "Download of " + Chr (34) + leech$ + Chr (34) + " failed!"
  399.                                                         Else
  400.                                                                 count = count + 1
  401.                                                                 AddGadgetItem list, dlurl + " (" + dlcurrentbyte + " / " + dl   otalbytes + " bytes)", True
  402.                                                                 dllistpos = SelectedGadgetItem (list)
  403.                                                         EndIf
  404.                                                         SetGadgetText url, ""
  405.                                                         EnableGadget url
  406.                                                         EnableGadget go
  407.                                                         ActivateGadget url
  408.                                                 EndIf
  409.                                         EndIf
  410.                                 Case go
  411.                                         leech$ = TextFieldText (url)
  412.                                         If leech$ <> ""
  413.                                                 DisableGadget url
  414.                                                 DisableGadget go
  415.                                                 dl.Download = StartDownload (leech$, path$, "")
  416.                                                 If dl = Null
  417.                                                         Notify "Download of " + Chr (34) + leech$ + Chr (34) + " failed!"
  418.                                                 Else
  419.                                                         count = count + 1
  420.                                                         AddGadgetItem list, dlurl + " (" + dlcurrentbyte + " / " + dl   otalbytes + " bytes)", True
  421.                                                         dllistpos = SelectedGadgetItem (list)
  422.                                                 EndIf
  423.                                                 SetGadgetText url, ""
  424.                                                 EnableGadget url
  425.                                                 EnableGadget go
  426.                                                 ActivateGadget url
  427.                                         EndIf
  428.                                 Case abort
  429.                                         AbortDownloads ()
  430.                                         UpdateProgBar prog, 0
  431.                                 Case quit
  432.                                         AbortDownloads ()
  433.                                         UpdateProgBar prog, 0
  434.                                         End
  435.                                 Case list
  436.                                         pos = SelectedGadgetItem (list)
  437.                                         For dl.Download = Each Download
  438.                                                 If dllistpos = pos
  439.                                                         message$ = "Folder: " + dlfolder
  440.                                                         message$ = message$ + Chr (10) + "Filename: " + dlfilename
  441.                                                         message$ = message$ + Chr (10) + "List position: " + dllistpos + " (check = " + pos + ")"
  442.                                                         message$ = message$ + Chr (10) + "URL: " + dlurl
  443.                                                         message$ = message$ + Chr (10) + "Host: " + dlhost
  444.                                                         message$ = message$ + Chr (10) + "File: " + dlfile
  445.                                                         message$ = message$ + Chr (10) + "Header: " + dlheader
  446.                                                         message$ = message$ + Chr (10) + "Total bytes: " + dl   otalbytes
  447.                                                         message$ = message$ + Chr (10) + "Current byte: " + dlcurrentbyte
  448.                                                         message$ = message$ + Chr (10) + "Date: " + dldate
  449.                                                         message$ = message$ + Chr (10) + "Server: " + dlserver
  450.                                                         message$ = message$ + Chr (10) + "Content: " + dlcontent
  451.                                                         message$ = message$ + Chr (10) + "Reply: " + dl
  452. eply
  453.                                                         Notify message$
  454.                                                         Exit
  455.                                                 EndIf
  456.                                         Next
  457.                                                                        
  458.                         End Select
  459.                                
  460.         End Select
  461.  
  462.         UpdateDownloads ()
  463.  
  464.         pos = SelectedGadgetItem (list)
  465.         For dl.Download = Each Download
  466.                 If dllistpos = pos
  467.                         UpdateProgBar prog, Percent (dlcurrentbyte, dl  otalbytes)
  468.                 EndIf
  469.         Next
  470.  
  471. Until e = EVENT_Close
  472.  
  473. End


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal