Reuse previous search

pull/811/head
WS64 10 years ago
parent 298874c4ae
commit f39ffc623a

@ -9,6 +9,8 @@ local Screen = require("ui/screen")
local _ = require("gettext") local _ = require("gettext")
local Font = require("ui/font") local Font = require("ui/font")
local calibre = "metadata.calibre"
local Search = InputContainer:new{ local Search = InputContainer:new{
calibrefile = nil, calibrefile = nil,
search_dialog = nil, search_dialog = nil,
@ -25,7 +27,9 @@ local Search = InputContainer:new{
results = {}, results = {},
libraries = {}, libraries = {},
browse_tags = {}, browse_tags = {},
browse_series = {} browse_series = {},
error = nil,
use_previous_search_results = false
} }
local function unichar (value) local function unichar (value)
@ -63,7 +67,7 @@ local function findcalibre(root)
local fullPath=root .. "/" .. entity local fullPath=root .. "/" .. entity
local mode = lfs.attributes(fullPath,"mode") local mode = lfs.attributes(fullPath,"mode")
if mode == "file" then if mode == "file" then
if entity == "metadata.calibre" or entity == ".metadata.calibre" then if entity == calibre or entity == "." .. calibre then
t = root .. "/" .. entity t = root .. "/" .. entity
end end
elseif mode == "directory" then elseif mode == "directory" then
@ -75,44 +79,62 @@ local function findcalibre(root)
return t return t
end end
function Search:init() function Search:getCalibre(number)
local error = nil
self.data = {}
self.results = {}
-- check if we find the calibre file -- check if we find the calibre file
if SEARCH_LIBRARY_PATH == nil then if number == 1 then
self.calibrefile = findcalibre("/mnt") if SEARCH_LIBRARY_PATH == nil then
if not self.calibrefile then self.calibrefile = findcalibre("/mnt")
error = "SEARCH_LIBRARY_PATH in DEFAULTS.LUA is not set!" if not self.calibrefile then
else self.error = "SEARCH_LIBRARY_PATH in DEFAULTS.LUA is not set!"
settings_changed = true else
end settings_changed = true
end
else
if string.sub(SEARCH_LIBRARY_PATH,string.len(SEARCH_LIBRARY_PATH)) ~= "/" then
SEARCH_LIBRARY_PATH = SEARCH_LIBRARY_PATH .. "/"
end
if io.open(SEARCH_LIBRARY_PATH .. calibre,"r") == nil then
if io.open(SEARCH_LIBRARY_PATH .. "." .. calibre,"r") == nil then
self.error = SEARCH_LIBRARY_PATH .. calibre .. " not found!"
else
self.calibrefile = SEARCH_LIBRARY_PATH .. "." .. calibre
end
else
self.calibrefile = SEARCH_LIBRARY_PATH .. calibre
end
if not (SEARCH_AUTHORS or SEARCH_TITLE or SEARCH_PATH or SEARCH_SERIES or SEARCH_TAGS) then
self.calibrefile = nil
UIManager:show(InfoMessage:new{text = _("You must specify at least one field to search at! (SEARCH_XXX = true in defaults.lua)")})
elseif self.calibrefile == nil then
self.calibrefile = findcalibre("/mnt")
if self.calibrefile then
settings_changed = true
end
end
end
else else
if string.sub(SEARCH_LIBRARY_PATH,string.len(SEARCH_LIBRARY_PATH)) ~= "/" then local dummy
SEARCH_LIBRARY_PATH = SEARCH_LIBRARY_PATH .. "/"
if string.sub(SEARCH_LIBRARY_PATH2,string.len(SEARCH_LIBRARY_PATH2)) ~= "/" then
SEARCH_LIBRARY_PATH2 = SEARCH_LIBRARY_PATH2 .. "/"
end end
if io.open(SEARCH_LIBRARY_PATH .. "metadata.calibre","r") == nil then if io.open(SEARCH_LIBRARY_PATH2 .. calibre,"r") == nil then
if io.open(SEARCH_LIBRARY_PATH .. ".metadata.calibre","r") == nil then if io.open(SEARCH_LIBRARY_PATH2 .. "." .. calibre,"r") ~= nil then
error = SEARCH_LIBRARY_PATH .. "metadata.calibre not found!" dummy = SEARCH_LIBRARY_PATH2 .. "." .. calibre
else
self.calibrefile = SEARCH_LIBRARY_PATH .. ".metadata.calibre"
end end
else else
self.calibrefile = SEARCH_LIBRARY_PATH .. "metadata.calibre" dummy = SEARCH_LIBRARY_PATH2 .. calibre
end end
if dummy and dummy ~= self.calibrefile then
if not (SEARCH_AUTHORS or SEARCH_TITLE or SEARCH_PATH or SEARCH_SERIES or SEARCH_TAGS) then self.calibrefile = dummy
else
self.calibrefile = nil self.calibrefile = nil
UIManager:show(InfoMessage:new{text = _("You must specify at least one field to search at! (SEARCH_XXX = true in defaults.lua)")})
elseif self.calibrefile == nil then
self.calibrefile = findcalibre("/mnt")
if self.calibrefile then
settings_changed = true
end
end end
end end
end
function Search:ShowSearch()
if self.calibrefile ~= nil then if self.calibrefile ~= nil then
SEARCH_LIBRARY_PATH = string.gsub(self.calibrefile,"/[^/]*$","") SEARCH_LIBRARY_PATH = string.gsub(self.calibrefile,"/[^/]*$","")
if string.sub(SEARCH_LIBRARY_PATH,string.len(SEARCH_LIBRARY_PATH)) ~= "/" then if string.sub(SEARCH_LIBRARY_PATH,string.len(SEARCH_LIBRARY_PATH)) ~= "/" then
@ -120,6 +142,7 @@ function Search:init()
end end
GLOBAL_INPUT_VALUE = self.search_value GLOBAL_INPUT_VALUE = self.search_value
local dummy = GLOBAL_INPUT_VALUE
self.search_dialog = InputDialog:new{ self.search_dialog = InputDialog:new{
title = _("Search Books"), title = _("Search Books"),
buttons = { buttons = {
@ -128,7 +151,12 @@ function Search:init()
text = _("Find"), text = _("Find"),
enabled = true, enabled = true,
callback = function() callback = function()
self.search_value=self.search_dialog:getInputText() self.search_value = self.search_dialog:getInputText()
if not settings_changed and self.search_value == dummy then
self.use_previous_search_results = true
else
self.use_previous_search_results = false
end
self:close() self:close()
end, end,
}, },
@ -142,12 +170,18 @@ function Search:init()
self.search_dialog:onShowKeyboard() self.search_dialog:onShowKeyboard()
UIManager:show(self.search_dialog) UIManager:show(self.search_dialog)
else else
if error then if self.error then
UIManager:show(InfoMessage:new{text = _(error .. " A search for a metadata.calibre file was not successful!"),}) UIManager:show(InfoMessage:new{text = self.error .. _( " A search for a " .. calibre .. " file was not successful!"),})
end end
end end
end end
function Search:init()
self.error = nil
self.data = {}
self.results = {}
end
function Search:close() function Search:close()
self.search_dialog:onClose() self.search_dialog:onClose()
UIManager:close(self.search_dialog) UIManager:close(self.search_dialog)
@ -206,85 +240,78 @@ function Search:find()
end end
end end
if SEARCH_CASESENSITIVE then if not self.use_previous_search_results then
upsearch = self.search_value self.reults = {}
else self.data = {}
upsearch = string.upper(self.search_value)
end
firstrun = true
self.data[i] = {"-","-","-","-","-","-","-","-"} if SEARCH_CASESENSITIVE then
self.libraries[i] = 1 upsearch = self.search_value
else
upsearch = string.upper(self.search_value)
end
while line do firstrun = true
if line == " }, " or line == " }" then
-- new calibre data set
dummy = "" self.data[i] = {"-","-","-","-","-","-","-","-"}
if SEARCH_AUTHORS then dummy = dummy .. self.data[i][self.authors] end self.libraries[i] = 1
if SEARCH_TITLE then dummy = dummy .. self.data[i][self.title] end
if SEARCH_PATH then dummy = dummy .. self.data[i][self.path] end
if SEARCH_SERIES then
dummy = dummy .. self.data[i][self.series]
self.browse_series[self.data[i][self.series]] = true
end
if SEARCH_TAGS then
dummy = dummy .. self.data[i][self.tags]
self.browse_tags[self.data[i][self.tags]] = true
end
if not SEARCH_CASESENSITIVE then dummy = string.upper(dummy) end
if string.find(dummy,upsearch,nil,true) then while line do
i = i + 1 if line == " }, " or line == " }" then
end -- new calibre data set
self.data[i] = {"-","-","-","-","-","-","-","-"}
if firstrun then
self.libraries[i] = 1
else
self.libraries[i] = 2
end
elseif line == " \"authors\": [" then -- AUTHORS
ReadMultipleLines(self.authors)
elseif line == " \"tags\": [" then -- TAGS
ReadMultipleLines(self.tags)
elseif string.sub(line,1,11) == " \"title\"" then -- TITLE
self.data[i][self.title] = ReplaceHexChars(line,15,3)
elseif string.sub(line,1,11) == " \"lpath\"" then -- LPATH
self.data[i][self.path] = ReplaceHexChars(line,15,3)
elseif string.sub(line,1,12) == " \"series\"" and line ~= " \"series\": null, " then -- SERIES
self.data[i][self.series] = ReplaceHexChars(line,16,3)
elseif string.sub(line,1,18) == " \"series_index\"" and line ~= " \"series_index\": null, " then -- SERIES_INDEX
self.data[i][self.series_index] = ReplaceHexChars(line,21,2)
end
line = f:read()
if not line and firstrun and SEARCH_LIBRARY_PATH2 then dummy = ""
local dummy if SEARCH_AUTHORS then dummy = dummy .. self.data[i][self.authors] .. "\n" end
firstrun = false if SEARCH_TITLE then dummy = dummy .. self.data[i][self.title] .. "\n" end
if f ~= nil then f:close() end if SEARCH_PATH then dummy = dummy .. self.data[i][self.path] .. "\n" end
if SEARCH_SERIES then
dummy = dummy .. self.data[i][self.series] .. "\n"
self.browse_series[self.data[i][self.series]] = true
end
if SEARCH_TAGS then
dummy = dummy .. self.data[i][self.tags] .. "\n"
self.browse_tags[self.data[i][self.tags]] = true
end
if not SEARCH_CASESENSITIVE then dummy = string.upper(dummy) end
if string.sub(SEARCH_LIBRARY_PATH2,string.len(SEARCH_LIBRARY_PATH2)) ~= "/" then if string.find(dummy,upsearch,nil,true) then
SEARCH_LIBRARY_PATH2 = SEARCH_LIBRARY_PATH2 .. "/" i = i + 1
end
if io.open(SEARCH_LIBRARY_PATH2 .. "metadata.calibre","r") == nil then
if io.open(SEARCH_LIBRARY_PATH2 .. ".metadata.calibre","r") ~= nil then
dummy = SEARCH_LIBRARY_PATH2 .. ".metadata.calibre"
end end
else self.data[i] = {"-","-","-","-","-","-","-","-"}
dummy = SEARCH_LIBRARY_PATH2 .. "metadata.calibre" if firstrun then
self.libraries[i] = 1
else
self.libraries[i] = 2
end
elseif line == " \"authors\": [" then -- AUTHORS
ReadMultipleLines(self.authors)
elseif line == " \"tags\": [" then -- TAGS
ReadMultipleLines(self.tags)
elseif string.sub(line,1,11) == " \"title\"" then -- TITLE
self.data[i][self.title] = ReplaceHexChars(line,15,3)
elseif string.sub(line,1,11) == " \"lpath\"" then -- LPATH
self.data[i][self.path] = ReplaceHexChars(line,15,3)
elseif string.sub(line,1,12) == " \"series\"" and line ~= " \"series\": null, " then -- SERIES
self.data[i][self.series] = ReplaceHexChars(line,16,3)
elseif string.sub(line,1,18) == " \"series_index\"" and line ~= " \"series_index\": null, " then -- SERIES_INDEX
self.data[i][self.series_index] = ReplaceHexChars(line,21,2)
end end
if dummy and dummy ~= self.calibrefile then line = f:read()
self.calibrefile = dummy
f = io.open(self.calibrefile) if not line and firstrun then
line = f:read() if f ~= nil then f:close() end
firstrun = false
self:getCalibre(2)
if self.calibrefile then
f = io.open(self.calibrefile)
line = f:read()
end
end end
end end
end i = i - 1
i = i - 1
if i > 0 then
self.data[i + 1] = nil
self.count = i self.count = i
end
if self.count > 0 then
self.data[self.count + 1] = nil
self:showresults() self:showresults()
else else
UIManager:show(InfoMessage:new{text = _("No match for " .. self.search_value)}) UIManager:show(InfoMessage:new{text = _("No match for " .. self.search_value)})
@ -322,38 +349,39 @@ function Search:showresults()
self.search_menu.close_callback = function() self.search_menu.close_callback = function()
UIManager:close(menu_container) UIManager:close(menu_container)
end end
if not self.use_previous_search_results then
local i = 1 self.results = {}
while i <= self.count do local i = 1
local dummy = _("Title: ") .. (self.data[i][self.title] or "-") .. "\n \n" .. while i <= self.count do
_("Author(s): ") .. (self.data[i][self.authors2] or "-") .. "\n \n" .. local dummy = _("Title: ") .. (self.data[i][self.title] or "-") .. "\n \n" ..
_("Tags: ") .. (self.data[i][self.tags2] or "-") .. "\n \n" .. _("Author(s): ") .. (self.data[i][self.authors2] or "-") .. "\n \n" ..
_("Series: ") .. (self.data[i][self.series] or "-") _("Tags: ") .. (self.data[i][self.tags2] or "-") .. "\n \n" ..
if self.data[i][self.series] ~= "-" then _("Series: ") .. (self.data[i][self.series] or "-")
dummy = dummy .. " (" .. tostring(self.data[i][self.series_index]):gsub(".0$","") .. ")" if self.data[i][self.series] ~= "-" then
end dummy = dummy .. " (" .. tostring(self.data[i][self.series_index]):gsub(".0$","") .. ")"
dummy = dummy .. "\n \n" .. _("Path: ") end
local libpath dummy = dummy .. "\n \n" .. _("Path: ")
if self.libraries[i] == 1 then local libpath
libpath = SEARCH_LIBRARY_PATH if self.libraries[i] == 1 then
else libpath = SEARCH_LIBRARY_PATH
libpath = SEARCH_LIBRARY_PATH2 else
libpath = SEARCH_LIBRARY_PATH2
end
local book = libpath .. self.data[i][self.path]
table.insert(self.results, {
info = dummy,
notchecked = true,
path = libpath .. self.data[i][self.path],
text = self.data[i][self.authors] .. ": " .. self.data[i][self.title],
callback = function()
if book then
showReaderUI(book)
end
end
})
i = i + 1
end end
local book = libpath .. self.data[i][self.path]
table.insert(self.results, {
info = dummy,
notchecked = true,
path = libpath .. self.data[i][self.path],
text = self.data[i][self.authors] .. ": " .. self.data[i][self.title],
callback = function()
if book then
showReaderUI(book)
end
end
})
i = i + 1
end end
self.search_menu:swithItemTable("Search Results", self.results) self.search_menu:swithItemTable("Search Results", self.results)
UIManager:show(menu_container) UIManager:show(menu_container)
end end

Loading…
Cancel
Save