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