From 07be32072272b129c03c8eb286f4d96cf906508e Mon Sep 17 00:00:00 2001 From: Dylan Calvin Date: Wed, 26 Oct 2022 04:31:16 -0500 Subject: [PATCH] [plugin] OPDS: Add stream from page (#9681) --- plugins/opds.koplugin/opdsbrowser.lua | 81 +++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 11 deletions(-) diff --git a/plugins/opds.koplugin/opdsbrowser.lua b/plugins/opds.koplugin/opdsbrowser.lua index d0f4a27b1..521032256 100644 --- a/plugins/opds.koplugin/opdsbrowser.lua +++ b/plugins/opds.koplugin/opdsbrowser.lua @@ -695,7 +695,42 @@ function OPDSBrowser:downloadFile(item, filename, remote_url) end end -function OPDSBrowser:streamPages(item, remote_url, count) +-- Shows a page number dialog for page streaming. +function OPDSBrowser:jumpToPage(viewer, count) + local input_dialog + input_dialog = InputDialog:new{ + title = _("Enter page number"), + input = "", + input_type = "number", + input_hint = "(" .. "1 - " .. count .. ")", + buttons = { + { + { + text = _("Cancel"), + id = "close", + callback = function() + UIManager:close(input_dialog) + end, + }, + { + text = _("Stream"), + is_enter_default = true, + callback = function() + local page_num = input_dialog:getInputValue() + if page_num then + UIManager:close(input_dialog) + viewer:switchToImageNum(math.min(math.max(1, page_num), count)) + end + end, + }, + } + }, + } + UIManager:show(input_dialog) + input_dialog:onShowKeyboard() +end + +function OPDSBrowser:streamPages(item, remote_url, count, continue) local page_table = {image_disposable = true} setmetatable(page_table, {__index = function (_, key) if type(key) ~= "number" then @@ -752,8 +787,12 @@ function OPDSBrowser:streamPages(item, remote_url, count) -- in Lua 5.2 we could override __len, but this works too viewer._images_list_nb = count UIManager:show(viewer) + if continue then + self:jumpToPage(viewer, count) + end end + function OPDSBrowser:showDownloads(item) local acquisitions = item.acquisitions local filename = item.title @@ -769,16 +808,24 @@ function OPDSBrowser:showDownloads(item) local buttons = {} -- buttons for ButtonDialogTitle - local type_buttons = {} -- file type download buttons + local stream_buttons = {} -- page stream buttons + local download_buttons = {} -- file type download buttons for i = 1, #acquisitions do -- filter out unsupported file types local acquisition = acquisitions[i] if acquisition.stream then -- this is an OPDS PSE stream - table.insert(type_buttons, { + table.insert(stream_buttons, { text = _("Page stream") .. "\u{2B0C}", -- append LEFT RIGHT BLACK ARROW callback = function() - self:streamPages(item, acquisition.href, acquisition.count) + self:streamPages(item, acquisition.href, acquisition.count, false) + UIManager:close(self.download_dialog) + end, + }) + table.insert(stream_buttons, { + text = _("Stream from page") .. "\u{2B0C}", -- append LEFT RIGHT BLACK ARROW + callback = function() + self:streamPages(item, acquisition.href, acquisition.count, true) UIManager:close(self.download_dialog) end, }) @@ -794,7 +841,8 @@ function OPDSBrowser:showDownloads(item) end if filetype then -- supported file type local text = acquisition.title and acquisition.title or string.upper(filetype) - table.insert(type_buttons, { + text = url.unescape(text) + table.insert(download_buttons, { text = text .. "\u{2B07}", -- append DOWNWARDS BLACK ARROW callback = function() self:downloadFile(item, filename .. "." .. string.lower(filetype), acquisition.href) @@ -804,14 +852,25 @@ function OPDSBrowser:showDownloads(item) end end end - if (#type_buttons % 2 == 1) then -- we need even number of type buttons - table.insert(type_buttons, {text = ""}) + -- handles adding download button(s) + if #download_buttons > 0 then + if (#download_buttons % 2 == 1 and #download_buttons > 1) then + table.insert(download_buttons, {text = ""}) + for i = 2, #download_buttons, 2 do + table.insert(buttons, {download_buttons[i - 1], download_buttons[i]}) -- download buttons, two in a row + end + else + -- need the else to handle special case where we have one download button, + -- and it should span the width of the window + table.insert(buttons, download_buttons) + end + table.insert(buttons, {}) -- add separator for stream buttons end - for i = 2, #type_buttons, 2 do - table.insert(buttons, {type_buttons[i - 1], type_buttons[i]}) -- type buttons, two in a row + if #stream_buttons > 0 then + -- Don't need the for loop, there should always be only 2 stream buttons + table.insert(buttons, stream_buttons) + table.insert(buttons, {}) -- separator end - - table.insert(buttons, {}) -- separator table.insert(buttons, { -- action buttons { text = _("Choose folder"),