Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local tape = peripheral.find "tape_drive"
- local url, opt = ...
- if not tape then error "Tape drive required." end
- if not url then error "Specify a URL to download. This may need to be in quotes." end
- if opt == "range" then
- print "Fetching in range mode"
- -- horrible bodge to fetch content length as CC appears to mess it up
- local test = http.get { url = url, binary = true, headers = { Range = "bytes=0-1" } }
- local headers = test.getResponseHeaders()
- test.close()
- local range = headers["Content-Range"]
- if not range then error "range not supported?" end
- local z = tonumber(range:match "0%-1/(%d+)")
- print("total size is", z / 1e6, "MB")
- local pos = 0
- local chunk_size = 6e6 -- maximum is 12MB
- if z > tape.getSize() then printError "tape too small, will be truncated" end
- while true do
- local was = pos
- pos = pos + chunk_size
- local range = ("bytes=%d-%d"):format(was, pos - 1)
- local h = http.get { url = url, binary = true, headers = { Range = range } }
- tape.write(h.readAll())
- h.close()
- print("fetched up to", pos / 1e6, "MB")
- if pos > z then print "done!" break end
- end
- print "written successfully"
- return
- end
- print "Downloading..."
- local h = http.get(url, nil, true) -- binary mode
- local data = h.readAll()
- h.close()
- print "Downloaded."
- if opt ~= "norestart" then
- print "Seeking to start."
- tape.seek(-tape.getPosition())
- end
- if #data > (tape.getSize() - tape.getPosition()) then printError "WARNING: Data is longer than tape." end
- tape.write(data)
- print "Data written."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement