Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- 00 00 - width
- -- 00 00 - height
- -- 00 00 00 - palette 0
- -- 00 00 00 - palette 1
- -- 00 00 00 - palette 2
- -- 00 00 00 - palette 3
- -- 00 00 00 - palette 4
- -- 00 00 00 - palette 5
- -- 00 00 00 - palette 6
- -- 00 00 00 - palette 7
- -- 00 00 00 - palette 8
- -- 00 00 00 - palette 9
- -- 00 00 00 - palette 10
- -- 00 00 00 - palette 11
- -- 00 00 00 - palette 12
- -- 00 00 00 - palette 13
- -- 00 00 00 - palette 14
- -- 00 00 00 - palette 15
- -- 00 - PIXELS width*height
- -- JSON METADATA
- args = {...}
- if #args == 0 then
- printError("No url passed")
- return
- end
- mon = peripheral.find("monitor")
- tape_drive = peripheral.find("tape_drive")
- skip_audio = true
- if tape_drive then
- print("Continuing with audio")
- skip_audio = false
- end
- function epoch()
- return os.epoch() / 100000
- end
- local function _StringIOwrite(self, _v)
- if #self.buffer > 0 then
- _lb = self.buffer[#self.buffer]
- _a = _v:sub(0, self.bufferlength - #_lb)
- _lb = _lb .. _a
- _v = _v:sub(#_a + 1, -1)
- self.buffer[#self.buffer] = _lb
- end
- while #_v ~= 0 do
- _lb = _v:sub(0, self.bufferlength)
- _v = _v:sub(self.bufferlength + 1, -1)
- table.insert(self.buffer, _lb)
- end
- self.size = self.size + #_v
- return #_v
- end
- local function _StringIOread(self, _c)
- _c = _c or 1
- local _r = ""
- while _c > 0 do
- if #self.buffer == 0 then
- break
- end
- local _t = math.min(_c, #self.buffer[1])
- _c = _c - _t
- _r = _r .. self.buffer[1]:sub(1, _t)
- self.buffer[1] = self.buffer[1]:sub(_t + 1, -1)
- if #self.buffer[1] == 0 then
- table.remove(self.buffer, 1)
- end
- end
- return _r
- end
- local function _StringIObread(self, _c)
- _c = _c or 1
- local _r = ""
- while _c > 0 do
- if #self.buffer == 0 then
- break
- end
- local _t = math.min(_c, #self.buffer[1])
- _c = _c - _t
- _r = _r .. self.buffer[1]:sub(1, _t)
- self.buffer[1] = self.buffer[1]:sub(_t + 1, -1)
- if #self.buffer[1] == 0 then
- table.remove(self.buffer, 1)
- end
- end
- function splitbytes(str)
- if #str > 0 then
- return string.byte(str:sub(1,1)), splitbytes(str:sub(2))
- end
- end
- return splitbytes(_r)
- end
- function StringIO(_buffer)
- _table = {
- ['write'] = _StringIOwrite,
- ['read'] = _StringIOread,
- ['bread'] = _StringIObread,
- ['bufferlength'] = 1024,
- ['buffer'] = {},
- ['index'] = 0,
- ['size'] = 0
- }
- if _buffer then
- _table:write(_buffer)
- end
- return _table
- end
- function parseCCI(sio)
- width = bit.blshift(sio:bread(), 8) + sio:bread()
- height = bit.blshift(sio:bread(), 8) + sio:bread()
- palette = {}
- for i=0, 15 do
- palette[2^i] = {
- sio:bread()/255,
- sio:bread()/255,
- sio:bread()/255
- }
- end
- _buffer = StringIO()
- _buffer.bufferlength = width
- _hex = {'00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff'}
- pxl = 0
- for _=1, width*height do
- pxl = pxl + 1
- _v = sio:bread()
- if _v then
- -- _val = string.format("%x", _v)
- _val = _hex[_v + 1]
- if #_val == 1 then
- _val = "0" .. _val
- end
- _buffer:write(_val)
- else
- break
- end
- if pxl % 50000 == 0 then
- sleep(0)
- end
- end
- blitmap = _buffer.buffer
- for i, k in pairs(palette) do
- mon.setPaletteColour(i, k[1], k[2], k[3])
- end
- for y, blitline in pairs(blitmap) do
- mon.setCursorPos(1, y)
- mon.blit((" "):rep(#blitline), blitline, blitline)
- end
- end
- url = "ws://63.141.246.170:15065/playback"
- w, h = mon.getSize()
- pt, pa = 0, 0
- ft, fa = 0, 0
- print("Connecting")
- ws, error = http.websocket(url)
- print("Connected")
- payload = {
- ['url'] = args[1],
- ['skip-audio'] = skip_audio,
- ['width'] = w,
- ['height'] = h
- }
- _payload = json.encode(payload)
- print("Sent payload: " .. _payload)
- ws.send(_payload)
- print("Waiting for audio")
- audioresp = StringIO()
- while true do
- resp = ws.receive()
- if resp == "aeof" then
- print("Received eof")
- break
- end
- audioresp:write(resp)
- ws.send("achk")
- end
- if skip_audio == false then
- print("Seeking audio and writing")
- tape_drive.stop()
- tape_drive.seek(-tape_drive.getSize())
- while true do
- aresp = audioresp:read(audioresp.bufferlength*100)
- if aresp == "" then
- break
- end
- print(#aresp)
- tape_drive.write(aresp)
- sleep(0)
- end
- print("Finished dumping audio")
- tape_drive.seek(-tape_drive.getSize())
- end
- print("Waiting for video response")
- if skip_audio == false then
- print("Starting tape drive")
- tape_drive.play()
- -- sleep(1)
- end
- ws.send("vst")
- while true do
- resp = ws.receive()
- ws.send("vfr")
- if resp == "eof" then
- break
- end
- start = epoch()
- parseCCI(StringIO(resp))
- end
- if skip_audio == false then
- tape_drive.stop()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement