Lettore EPUB nativo: ReaderPage (WebView+capitoli+progresso), segno locale in QSettings, sync POST /ajax/bookmark con fallback CSRF, pulsante Leggi nel dettaglio

This commit is contained in:
2026-08-12 14:21:45 +02:00
parent ae15c39421
commit 6f0ca6ed07
10 changed files with 489 additions and 13 deletions
+62
View File
@@ -8,6 +8,8 @@ Page {
property string coverSource: ""
property bool downloading: false
property string downloadError: ""
property bool readingNow: false
property string readingUrl: ""
SilicaFlickable {
anchors.fill: parent
@@ -29,6 +31,14 @@ Page {
visible: source.length > 0
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
text: "Leggi (EPUB)"
visible: page.hasEpubFormat()
enabled: !page.downloading
onClicked: startReading()
}
Label {
x: Theme.horizontalPageMargin
width: parent.width - 2 * Theme.horizontalPageMargin
@@ -157,6 +167,50 @@ Page {
return out.trim()
}
function hasEpubFormat() {
var fmts = bookData.formats
if (!fmts)
return false
for (var i = 0; i < fmts.length; i++)
if (String(fmts[i].format).toLowerCase() === "epub")
return true
return false
}
function firstEpubFormat() {
var fmts = bookData.formats
if (!fmts)
return null
for (var i = 0; i < fmts.length; i++)
if (String(fmts[i].format).toLowerCase() === "epub")
return fmts[i]
return null
}
// estrae l'id numerico calibre da un url di download: /opds/download/<id>/<formato>/
function extractBookId(u) {
var parts = u.split("/")
for (var i = 0; i < parts.length - 1; i++)
if (parts[i] === "download" && parts[i + 1].length > 0
&& !isNaN(parseInt(parts[i + 1])))
return parseInt(parts[i + 1])
return 0
}
function startReading() {
var f = page.firstEpubFormat()
if (!f)
return
var id = page.extractBookId(f.url)
if (id <= 0)
return
page.readingNow = true
page.readingUrl = f.url
page.downloading = true
page.downloadError = ""
downloader.download(resolveUrl(f.url), appSettings.bookFilePath(id, "epub"))
}
function startDownload(format) {
if (page.downloading)
return
@@ -196,11 +250,19 @@ Page {
onFinished: {
page.downloading = false
if (ok) {
if (page.readingNow) {
page.readingNow = false
var id = page.extractBookId(page.readingUrl)
pageStack.push(Qt.resolvedUrl("ReaderPage.qml"),
{ epubPath: path, bookId: id, bookFormat: "epub" })
return
}
page.downloadError = ""
page.downloadNotice = "Salvato in " + path
hideNoticeTimer.restart()
} else {
page.downloadNotice = ""
page.readingNow = false
page.downloadError = "Errore: " + error
}
}