diff --git a/frontend/ui/opdsparser.lua b/frontend/ui/opdsparser.lua
index eba8f8a85..46f8fbfd8 100644
--- a/frontend/ui/opdsparser.lua
+++ b/frontend/ui/opdsparser.lua
@@ -40,6 +40,7 @@ function OPDSParser:createFlatXTable(xlex, curr_element)
local txt
for event, offset, size in xlex:Lexemes() do
txt = ffi.string(xlex.buf + offset, size)
+
if event == luxl.EVENT_START then
if txt ~= "xml" then
-- does current element already have something
@@ -79,6 +80,8 @@ function OPDSParser:parse(text)
-- but will kick the ass of luxl
text = text:gsub("
", "
")
text = text:gsub("
", "
")
+ -- some OPDS catalogs wrap text in a CDATA marker, remove it as it causes parsing problems
+ text = text:gsub("","%1")
local xlex = luxl.new(text, #text)
return self:createFlatXTable(xlex)
end
diff --git a/frontend/ui/widget/opdsbrowser.lua b/frontend/ui/widget/opdsbrowser.lua
index 8bb11ce7b..72bb30f27 100644
--- a/frontend/ui/widget/opdsbrowser.lua
+++ b/frontend/ui/widget/opdsbrowser.lua
@@ -264,11 +264,12 @@ end
function OPDSBrowser:fetchFeed(item_url, username, password)
local request, sink = {}, {}
local parsed = url.parse(item_url)
+ local hostname = parsed.host
local auth = string.format("%s:%s", username, password)
request['url'] = item_url
request['method'] = 'GET'
request['sink'] = ltn12.sink.table(sink)
- request['headers'] = { Authorization = "Basic " .. mime.b64(auth), }
+ request['headers'] = { Authorization = "Basic " .. mime.b64(auth), ["Host"] = hostname, },
logger.info("request", request)
http.TIMEOUT, https.TIMEOUT = 10, 10
local httpRequest = parsed.scheme == 'http' and http.request or https.request
@@ -472,12 +473,13 @@ function OPDSBrowser:downloadFile(item, format, remote_url)
UIManager:scheduleIn(1, function()
logger.dbg("downloading file", local_path, "from", remote_url)
local parsed = url.parse(remote_url)
+ local hostname = parsed.host
http.TIMEOUT, https.TIMEOUT = 20, 20
local httpRequest = parsed.scheme == 'http' and http.request or https.request
local auth = string.format("%s:%s", item.username, item.password)
local __, c = httpRequest {
url = remote_url,
- headers = { Authorization = "Basic " .. mime.b64(auth), },
+ headers = { Authorization = "Basic " .. mime.b64(auth), ["Host"] = hostname, },
sink = ltn12.sink.file(io.open(local_path, "w")),
}
if c == 200 then