1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
#!/usr/bin/env lua
local util = require 'lib/util'
local def_headr = {
['User-Agent'] = 'cia',
['Accept-Encoding'] = 'gzip, deflate, br'
}
local head_to_args = function (t)
local args = {}
for k, v in pairs(t) do
args[#args + 1] = '-H' .. k .. ": " .. v
end
return args
end
local get = function (url, headr, args)
local fetch, hcode, def_args
def_args = {
'curl',
'--silent',
'--compressed',
'--write-out',
'%{http_code}',
'--globoff',
'--location',
url,
}
args = util.array_merge(def_args, args)
headr = util.table_merge(def_headr, headr)
args = util.array_merge(args, head_to_args(headr))
fetch = util.run(args)
-- hcode can be nil, it means curl was't able to fulfill the http request, either
-- because curl package is broken or mpv killed it prematurely. we can exit
-- out of retry loop early if hcode is nil since there's no point in retrying
hcode = fetch:match('%d*$')
fetch = fetch:gsub('%s*%d*$', '')
return fetch, tonumber(hcode)
end
local zip_to_local_file = function (url, headr, out, retries)
local tries, hcode, zip, zcode
tries = 0
zip = os.tmpname()
repeat
_, hcode = get(url, headr, { '-o'.. zip })
tries = tries + 1
until hcode == 200 or tries > retries
if hcode == 200 then
zcode = util.zip_ext_first(zip, out)
end
os.remove(zip)
return (hcode == 200) and zcode
end
return {
get = get,
zip_to_local_file = zip_to_local_file,
}
|