Skip to content

Commit 96af73e

Browse files
Merge branch 'Sudashiii:master' into master
2 parents 0fa98d0 + 33a53a5 commit 96af73e

18 files changed

Lines changed: 1921 additions & 1674 deletions

File tree

koreaderPlugins/sake.koplugin/_meta.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ return {
44
fullname = _("Sake"),
55
description = _([[Svelte and Koreader Ecosystem - Syncs your books and progress.]]),
66
author = "Sascha Lorenz",
7-
version = "0.9.2",
7+
version = "0.9.5",
88
}

koreaderPlugins/sake.koplugin/main.lua

Lines changed: 89 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,52 @@ local function loadUpdaterModule()
5454
return true, mod_or_err, sake_dir, plugins_root
5555
end
5656

57+
local function readUpdaterVersion(plugins_root)
58+
if not plugins_root then
59+
return nil, "Cannot determine plugins root"
60+
end
61+
62+
local meta_path = plugins_root .. "/sakeUpdater.koplugin/_meta.lua"
63+
local ok, meta_or_err = pcall(dofile, meta_path)
64+
if not ok or type(meta_or_err) ~= "table" then
65+
return nil, "Failed to read Sake Updater _meta.lua"
66+
end
67+
if not meta_or_err.version then
68+
return nil, "Sake Updater _meta.lua has no version"
69+
end
70+
71+
return tostring(meta_or_err.version)
72+
end
73+
74+
local function parseVersion(version)
75+
local parts = {}
76+
for n in tostring(version or ""):gmatch("(%d+)") do
77+
table.insert(parts, tonumber(n))
78+
end
79+
if #parts == 0 then
80+
return nil
81+
end
82+
return parts
83+
end
84+
85+
local function isVersionAtLeast(version, minimum)
86+
local a = parseVersion(version)
87+
local b = parseVersion(minimum)
88+
if not a or not b then
89+
return false
90+
end
91+
92+
local max_len = math.max(#a, #b)
93+
for i = 1, max_len do
94+
local av = a[i] or 0
95+
local bv = b[i] or 0
96+
if av > bv then return true end
97+
if av < bv then return false end
98+
end
99+
100+
return true
101+
end
102+
57103
function Sake:startDeferredProgressWatcher()
58104
if self.progress_watcher_active then
59105
return
@@ -374,47 +420,50 @@ function Sake:openPluginVersionPicker()
374420
return
375421
end
376422

377-
UIManager:show(InfoMessage:new{
378-
text = _("Loading plugin versions..."),
379-
timeout = 1
380-
})
381-
382-
UIManager:scheduleIn(0.1, function()
383-
local ok, result_or_err = self.updater:listReleases()
384-
if not ok then
385-
logger.warn("[Sake] Plugin release list failed: " .. tostring(result_or_err))
386-
UIManager:show(InfoMessage:new{
387-
text = _("Could not load plugin versions: ") .. tostring(result_or_err),
388-
timeout = 6
389-
})
390-
return
391-
end
423+
local updater_version, updater_version_err = readUpdaterVersion(self.plugins_root)
424+
if not updater_version or not isVersionAtLeast(updater_version, "1.1.0") then
425+
logger.warn("[Sake] Specific version install blocked. Updater version: " .. tostring(updater_version or updater_version_err))
426+
UIManager:show(InfoMessage:new{
427+
text = _("Install Specific Plugin Version requires Sake Updater 1.1.0 or newer."),
428+
timeout = 6
429+
})
430+
return
431+
end
392432

393-
local result = result_or_err
394-
if not result.releases or #result.releases == 0 then
395-
UIManager:show(InfoMessage:new{
396-
text = _("No plugin versions available."),
397-
timeout = 4
398-
})
399-
return
400-
end
433+
local ok, result_or_err = self.updater:listReleases()
434+
if not ok then
435+
logger.warn("[Sake] Plugin release list failed: " .. tostring(result_or_err))
436+
UIManager:show(InfoMessage:new{
437+
text = _("Could not load plugin versions: ") .. tostring(result_or_err),
438+
timeout = 6
439+
})
440+
return
441+
end
401442

402-
Dialogs.showPluginVersionPicker(self.ctx, {
403-
current_version = result.current_version,
404-
releases = result.releases,
405-
on_select = function(release)
406-
if release and tostring(release.version or "") == tostring(result.current_version or "") then
407-
UIManager:show(InfoMessage:new{
408-
text = _("That plugin version is already installed."),
409-
timeout = 4
410-
})
411-
return
412-
end
413-
414-
self:performPluginUpdateWithRelease(release)
415-
end,
443+
local result = result_or_err
444+
if not result.releases or #result.releases == 0 then
445+
UIManager:show(InfoMessage:new{
446+
text = _("No plugin versions available."),
447+
timeout = 4
416448
})
417-
end)
449+
return
450+
end
451+
452+
Dialogs.showPluginVersionPicker(self.ctx, {
453+
current_version = result.current_version,
454+
releases = result.releases,
455+
on_select = function(release)
456+
if release and tostring(release.version or "") == tostring(result.current_version or "") then
457+
UIManager:show(InfoMessage:new{
458+
text = _("That plugin version is already installed."),
459+
timeout = 4
460+
})
461+
return
462+
end
463+
464+
self:performPluginUpdateWithRelease(release)
465+
end,
466+
})
418467
end
419468

420469
function Sake:onDispatcherRegisterActions()
@@ -443,6 +492,7 @@ function Sake:init()
443492
self.bg_error_messages = {}
444493
self.progress_watcher_active = false
445494
self.updater = nil
495+
self.plugins_root = nil
446496
local device_name = tostring(self.settings.device_name or "Not Set")
447497
local api_url = (self.settings.api_url ~= "" and self.settings.api_url or "Not Set")
448498
logger.info("[Sake] Initialized. Device: " .. device_name .. " | URL: " .. api_url)
@@ -464,6 +514,7 @@ function Sake:init()
464514
sake_plugin_dir = sake_plugin_dir,
465515
plugins_root = plugins_root,
466516
})
517+
self.plugins_root = plugins_root
467518
logger.info("[Sake] Updater module loaded.")
468519
else
469520
logger.warn("[Sake] Updater module not loaded: " .. tostring(updater_mod_or_err))

koreaderPlugins/sake.koplugin/ui/dialogs.lua

Lines changed: 25 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ local _ = require("gettext")
99
local Settings = require("core/settings")
1010

1111
local Dialogs = {}
12-
local RELEASES_PER_PAGE = 6
1312

1413
local function trim(value)
1514
return tostring(value or ""):gsub("^%s+", ""):gsub("%s+$", "")
@@ -137,85 +136,41 @@ local function buildReleaseLabel(release)
137136
end
138137

139138
function Dialogs.showPluginVersionPicker(ctx, opts)
140-
local releases = opts.releases or {}
141-
local total_pages = math.max(1, math.ceil(#releases / RELEASES_PER_PAGE))
142-
143-
local function showPage(page_number)
144-
local dialog
145-
local buttons = {}
146-
local start_index = ((page_number - 1) * RELEASES_PER_PAGE) + 1
147-
local end_index = math.min(#releases, page_number * RELEASES_PER_PAGE)
148-
149-
for index = start_index, end_index do
150-
local release = releases[index]
151-
table.insert(buttons, {
152-
{
153-
text = buildReleaseLabel(release),
154-
enabled = release.is_current ~= true,
155-
callback = function()
156-
UIManager:close(dialog)
157-
if opts.on_select then
158-
opts.on_select(release)
159-
end
160-
end,
161-
},
162-
})
163-
end
164-
165-
if total_pages > 1 then
166-
table.insert(buttons, {
167-
{
168-
text = _("Previous"),
169-
enabled = page_number > 1,
170-
callback = function()
171-
UIManager:close(dialog)
172-
showPage(page_number - 1)
173-
end,
174-
},
175-
{
176-
text = _("Next"),
177-
enabled = page_number < total_pages,
178-
callback = function()
179-
UIManager:close(dialog)
180-
showPage(page_number + 1)
181-
end,
182-
},
183-
})
184-
end
139+
local dialog
140+
local buttons = {}
185141

142+
for _, release in ipairs(opts.releases or {}) do
143+
local selected_release = release
186144
table.insert(buttons, {
187145
{
188-
text = _("Close"),
146+
text = buildReleaseLabel(selected_release),
147+
enabled = selected_release.is_current ~= true,
189148
callback = function()
190149
UIManager:close(dialog)
150+
if opts.on_select then
151+
opts.on_select(selected_release)
152+
end
191153
end,
192154
},
193155
})
194-
195-
local title = _("Select a Sake plugin version to install.")
196-
.. "\n"
197-
.. _("Installed: ")
198-
.. tostring(opts.current_version or "?")
199-
200-
if total_pages > 1 then
201-
title = title
202-
.. "\n"
203-
.. _("Page ")
204-
.. tostring(page_number)
205-
.. "/"
206-
.. tostring(total_pages)
207-
end
208-
209-
dialog = ButtonDialog:new{
210-
title = title,
211-
buttons = buttons,
212-
shrink_unneeded_width = true,
213-
}
214-
215-
UIManager:show(dialog)
216156
end
217157

218-
showPage(1)
158+
table.insert(buttons, {
159+
{
160+
text = _("Close"),
161+
callback = function()
162+
UIManager:close(dialog)
163+
end,
164+
},
165+
})
166+
167+
dialog = ButtonDialog:new{
168+
title = (_("Select a Sake plugin version to install.") .. "\n" .. _("Installed: ") .. tostring(opts.current_version or "?")),
169+
buttons = buttons,
170+
rows_per_page = { 7, 6, 5, 4 },
171+
}
172+
173+
UIManager:show(dialog)
219174
end
220175

221176
return Dialogs

koreaderPlugins/sakeUpdater.koplugin/_meta.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ return {
55
fullname = _("Sake Updater"),
66
description = _([[Provides update checks and installer support for Sake plugin.]]),
77
author = "Sascha Lorenz",
8-
version = "1.0",
8+
version = "1.1.0",
99
}

sake/src/lib/client/routes/updateLibraryBookMetadata.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export interface UpdateLibraryBookMetadataRequest {
2222
googleBooksId?: string | null;
2323
openLibraryKey?: string | null;
2424
amazonAsin?: string | null;
25+
createdAt?: string | null;
2526
}
2627

2728
interface UpdateLibraryBookMetadataResponse {

sake/src/lib/features/library/components/LibraryDetailOverviewTab/LibraryDetailOverviewTab.svelte

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,17 @@
154154
<div>
155155
<p class="detail-v2-caption">Date Added</p>
156156
<div class="detail-v2-date-added">
157-
<strong>{formatDate(selectedBook.createdAt)}</strong>
158-
{#if selectedBook.createdAt}
159-
<span>{formatTime(selectedBook.createdAt)}</span>
157+
{#if isEditingMetadata}
158+
<input
159+
class="detail-v2-input"
160+
type="datetime-local"
161+
bind:value={metadataDraft.createdAt}
162+
/>
163+
{:else}
164+
<strong>{formatDate(selectedBook.createdAt)}</strong>
165+
{#if selectedBook.createdAt}
166+
<span>{formatTime(selectedBook.createdAt)}</span>
167+
{/if}
160168
{/if}
161169
</div>
162170
</div>

0 commit comments

Comments
 (0)