fix #1593 cannot download from COPS OPDS server

and get rid of the ugly baseurl workaround for "Internet Archive",
actually the url building of all these catalogs is perfectly
handled with `url.absolute(base, relative)`.
pull/1636/head
chrox 9 years ago
parent 96f48c0956
commit 5ec384efb5

@ -39,7 +39,7 @@ local OPDSCatalog = InputContainer:extend{
{
title = "Internet Archive",
subtitle = "Internet Archive Catalog",
baseurl = "http://bookserver.archive.org/catalog/",
url = "http://bookserver.archive.org/catalog/",
},
},
onExit = function() end,

@ -174,7 +174,6 @@ function OPDSBrowser:genItemTableFromRoot()
text = server.title,
content = server.subtitle,
url = server.url,
baseurl = server.baseurl,
})
end
local added_servers = G_reader_settings:readSetting("opds_servers") or {}
@ -183,7 +182,6 @@ function OPDSBrowser:genItemTableFromRoot()
text = server.title,
content = server.subtitle,
url = server.url,
baseurl = server.baseurl,
deletable = true,
editable = true,
})
@ -283,40 +281,18 @@ function OPDSBrowser:getCatalog(feed_url)
end
end
function OPDSBrowser:genItemTableFromURL(item_url, base_url)
local catalog = self:getCatalog(item_url or base_url)
return self:genItemTableFromCatalog(catalog, item_url, base_url)
function OPDSBrowser:genItemTableFromURL(item_url)
local catalog = self:getCatalog(item_url)
return self:genItemTableFromCatalog(catalog, item_url)
end
function OPDSBrowser:genItemTableFromCatalog(catalog, item_url, base_url)
function OPDSBrowser:genItemTableFromCatalog(catalog, item_url)
local item_table = {}
if catalog then
local feed = catalog.feed or catalog
local function build_href(href)
if href:match("^http://") then
return href
elseif href:match("^//") then
local parsed = url.parse(item_url or base_url)
if parsed and parsed.scheme then
return parsed.scheme .. ":" .. href
else
return "http:" .. href
end
elseif base_url then
return base_url .. "/" .. href
elseif item_url then
local parsed = url.parse(item_url)
-- get rid of query field of base url
parsed.query = nil
-- update item url with href parts(mostly path and query)
for k, v in pairs(url.parse(href) or {}) do
if k == "path" then
v = "/" .. v
end
parsed[k] = v
end
return url.build(parsed)
end
--DEBUG("building href", item_url, href)
return url.absolute(item_url, href)
end
local hrefs = {}
if feed.link then
@ -333,7 +309,6 @@ function OPDSBrowser:genItemTableFromCatalog(catalog, item_url, base_url)
if feed.entry then
for i, entry in ipairs(feed.entry) do
local item = {}
item.baseurl = base_url
item.acquisitions = {}
if entry.link then
for i, link in ipairs(entry.link) do
@ -343,6 +318,7 @@ function OPDSBrowser:genItemTableFromCatalog(catalog, item_url, base_url)
if link.rel and link.rel:match(self.acquisition_rel) then
table.insert(item.acquisitions, {
type = link.type,
--DEBUG("building acquisition url", link);
href = build_href(link.href),
})
end
@ -378,8 +354,8 @@ function OPDSBrowser:genItemTableFromCatalog(catalog, item_url, base_url)
return item_table
end
function OPDSBrowser:updateCatalog(url, baseurl)
local menu_table = self:genItemTableFromURL(url, baseurl)
function OPDSBrowser:updateCatalog(url)
local menu_table = self:genItemTableFromURL(url)
if #menu_table > 0 then
--DEBUG("menu table", menu_table)
self:swithItemTable(nil, menu_table)
@ -390,8 +366,8 @@ function OPDSBrowser:updateCatalog(url, baseurl)
end
end
function OPDSBrowser:appendCatalog(url, baseurl)
local new_table = self:genItemTableFromURL(url, baseurl)
function OPDSBrowser:appendCatalog(url)
local new_table = self:genItemTableFromURL(url)
for i, item in ipairs(new_table) do
table.insert(self.item_table, item)
end
@ -495,9 +471,8 @@ function OPDSBrowser:onMenuSelect(item)
else
table.insert(self.paths, {
url = item.url,
baseurl = item.baseurl,
})
if not self:updateCatalog(item.url, item.baseurl) then
if not self:updateCatalog(item.url) then
table.remove(self.paths)
end
end
@ -610,7 +585,7 @@ function OPDSBrowser:onReturn()
local path = self.paths[#self.paths]
if path then
-- return to last path
self:updateCatalog(path.url, path.baseurl)
self:updateCatalog(path.url)
else
-- return to root path, we simply reinit opdsbrowser
self:init()

Loading…
Cancel
Save