aboutsummaryrefslogblamecommitdiff
path: root/lib/curl.lua
blob: f35fcf1dcdcfeb9b212b0fd057c81b036b84a63c (plain) (tree)
1
2
3
4
5
6
7
8
9

                  
                               





                                                 

                                 

                               
                                                        

           
                   

   
                                              
                                    
 













                                                          
 





                                                                                                 
 



                                                       
                                     

   

                                                          
 
                          
                             
 
                                               
 
                           

                                                 


                      




                                                    

   

                  
                                            
 
#!/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, tries)
	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))

	repeat
		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*$')

		tries = tries - 1
	until hcode == '200' or not hcode or tries <= 0

	fetch = fetch:gsub('%s*%d*$', '')
	return fetch, tonumber(hcode)
end

local zip_link_to_file = function (url, headr, out, tries)
	local hcode, zip, rc, args

	zip = os.tmpname()
	args = { '-o'.. zip }

	_, hcode = get(url, headr, args, tries)

	rc = (hcode == 200)
	if rc then
		rc = util.zip_ext_first(zip, out)
	end
	os.remove(zip)

	if hcode and not rc then
		util.error('curl: zip_link_to_file')
	end

	return rc
end

return {
	get = get,
	zip_link_to_file = zip_link_to_file,
}