2
0
mirror of https://github.com/koreader/koreader synced 2024-11-18 03:25:46 +00:00
koreader/frontend/apps/cloudstorage/ftpapi.lua
2021-05-16 12:46:26 +02:00

100 lines
2.7 KiB
Lua

local DocumentRegistry = require("document/documentregistry")
local ftp = require("socket.ftp")
local ltn12 = require("ltn12")
local util = require("util")
local url = require("socket.url")
local FtpApi = {
}
function FtpApi:generateUrl(address, user, pass)
local colon_sign = ""
local at_sign = ""
if user ~= "" then
at_sign = "@"
end
if pass ~= "" then
colon_sign = ":"
end
local generated_url = "ftp://" .. user .. colon_sign .. pass .. at_sign .. address:gsub("ftp://", "")
return generated_url
end
function FtpApi:ftpGet(u, command, sink)
local p = url.parse(u)
p.user = util.urlDecode(p.user)
p.password = util.urlDecode(p.password)
p.command = command
p.sink = sink
p.type = "i" -- binary
local r, e = ftp.get(p)
return r, e
end
function FtpApi:listFolder(address_path, folder_path)
local ftp_list = {}
local ftp_file = {}
local type
local extension
local file_name
local tbl = {}
local sink = ltn12.sink.table(tbl)
local ls_ftp, e = self:ftpGet(address_path, "nlst", sink)
if ls_ftp == nil then
return false, e
end
if folder_path == "/" then
folder_path = ""
end
for item in (table.concat(tbl)..'\n'):gmatch'(.-)\r?\n' do
if item ~= '' then
file_name = item:match("([^/]+)$")
extension = item:match("^.+(%..+)$")
if not extension then
type = "folder"
table.insert(ftp_list, {
text = file_name .. "/",
url = string.format("%s/%s",folder_path, file_name),
type = type,
})
--show only file with supported formats
elseif extension and (DocumentRegistry:hasProvider(item)
or G_reader_settings:isTrue("show_unsupported")) then
type = "file"
table.insert(ftp_file, {
text = file_name,
url = string.format("%s/%s",folder_path, file_name),
type = type,
})
end
end
end
--sort
table.sort(ftp_list, function(v1,v2)
return v1.text < v2.text
end)
table.sort(ftp_file, function(v1,v2)
return v1.text < v2.text
end)
for _, files in ipairs(ftp_file) do
table.insert(ftp_list, {
text = files.text,
url = files.url,
type = files.type
})
end
return ftp_list
end
function FtpApi:delete(file_path)
local p = url.parse(file_path)
p.user = util.urlDecode(p.user)
p.password = util.urlDecode(p.password)
p.argument = string.gsub(p.path, "^/", "")
p.command = "dele"
p.check = 250
return ftp.command(p)
end
return FtpApi