Fixed recent books migration

This commit is contained in:
CaptainFrito 2026-02-02 22:26:23 +07:00
parent 8a82397a79
commit 9572fc3fb2
3 changed files with 57 additions and 32 deletions

View File

@ -79,7 +79,8 @@ bool RecentBooksStore::loadFromFile() {
serialization::readString(inputFile, path); serialization::readString(inputFile, path);
// Title and author will be empty, they will be filled when the book is // Title and author will be empty, they will be filled when the book is
// opened again // opened again
recentBooks.push_back({path, "", "", ""}); std::string fileName = path.substr(path.rfind('/') + 1);
recentBooks.push_back({path, fileName, "", "-"});
} }
} else if (version == 2) { } else if (version == 2) {
// Old version, just read paths, titles and authors // Old version, just read paths, titles and authors
@ -94,7 +95,7 @@ bool RecentBooksStore::loadFromFile() {
serialization::readString(inputFile, author); serialization::readString(inputFile, author);
// Title and author will be empty, they will be filled when the book is // Title and author will be empty, they will be filled when the book is
// opened again // opened again
recentBooks.push_back({path, title, author, ""}); recentBooks.push_back({path, title, author, "-"});
} }
} else { } else {
Serial.printf("[%lu] [RBS] Deserialization failed: Unknown version %u\n", millis(), version); Serial.printf("[%lu] [RBS] Deserialization failed: Unknown version %u\n", millis(), version);

View File

@ -44,8 +44,11 @@ void HomeActivity::loadRecentBooks(int maxBooks, int coverHeight) {
const auto& books = RECENT_BOOKS.getBooks(); const auto& books = RECENT_BOOKS.getBooks();
recentBooks.reserve(std::min(static_cast<int>(books.size()), maxBooks)); recentBooks.reserve(std::min(static_cast<int>(books.size()), maxBooks));
bool mustReloadRecents = false; // We're migrating from an older version of recent books
int progress = 0; int progress = 0;
for (const RecentBook& book : books) { for (const RecentBook& book : books) {
bool mustLoadCover = false;
// Limit to maximum number of recent books // Limit to maximum number of recent books
if (recentBooks.size() >= maxBooks) { if (recentBooks.size() >= maxBooks) {
break; break;
@ -56,51 +59,70 @@ void HomeActivity::loadRecentBooks(int maxBooks, int coverHeight) {
continue; continue;
} }
if (!book.coverBmpPath.empty()) { if (book.coverBmpPath == "-") {
mustReloadRecents = true;
} else {
std::string coverPath = UITheme::getCoverThumbPath(book.coverBmpPath, coverHeight); std::string coverPath = UITheme::getCoverThumbPath(book.coverBmpPath, coverHeight);
if (!SdMan.exists(coverPath.c_str())) { if (!SdMan.exists(coverPath.c_str())) {
std::string lastBookFileName = ""; mustLoadCover = true;
const size_t lastSlash = book.path.find_last_of('/'); }
if (lastSlash != std::string::npos) { }
lastBookFileName = book.path.substr(lastSlash + 1);
if (mustReloadRecents || mustLoadCover) {
std::string lastBookFileName = "";
const size_t lastSlash = book.path.find_last_of('/');
if (lastSlash != std::string::npos) {
lastBookFileName = book.path.substr(lastSlash + 1);
}
Serial.printf("Loading recent book: %s\n", book.path.c_str());
// If epub, try to load the metadata for title/author and cover
if (StringUtils::checkFileExtension(lastBookFileName, ".epub")) {
Epub epub(book.path, "/.crosspoint");
epub.load(false);
// Try to generate thumbnail image for Continue Reading card
if (!showingLoading) {
showingLoading = true;
popupRect = GUI.drawPopup(renderer, "Loading...");
} }
GUI.fillPopupProgress(renderer, popupRect, progress * (100 / maxBooks));
epub.generateThumbBmp(coverHeight);
Serial.printf("Loading recent book: %s\n", book.path.c_str()); if (mustReloadRecents) {
// Update recent book entry with title/author/cover path
// If epub, try to load the metadata for title/author and cover RECENT_BOOKS.addBook(book.path, epub.getTitle(), epub.getAuthor(), epub.getThumbBmpPath());
if (StringUtils::checkFileExtension(lastBookFileName, ".epub")) { recentBooks.push_back({book.path, epub.getTitle(), epub.getAuthor(), epub.getThumbBmpPath()});
Epub epub(book.path, "/.crosspoint"); }
epub.load(false); } else if (StringUtils::checkFileExtension(lastBookFileName, ".xtch") ||
StringUtils::checkFileExtension(lastBookFileName, ".xtc")) {
// Handle XTC file
Xtc xtc(book.path, "/.crosspoint");
if (xtc.load()) {
// Try to generate thumbnail image for Continue Reading card // Try to generate thumbnail image for Continue Reading card
if (!showingLoading) { if (!showingLoading) {
showingLoading = true; showingLoading = true;
popupRect = GUI.drawPopup(renderer, "Loading..."); popupRect = GUI.drawPopup(renderer, "Loading...");
} }
GUI.fillPopupProgress(renderer, popupRect, progress * 30); GUI.fillPopupProgress(renderer, popupRect, progress * (100 / maxBooks));
epub.generateThumbBmp(coverHeight); xtc.generateThumbBmp(coverHeight);
} else if (StringUtils::checkFileExtension(lastBookFileName, ".xtch") ||
StringUtils::checkFileExtension(lastBookFileName, ".xtc")) { if (mustReloadRecents) {
// Handle XTC file // Update recent book entry with title/author/cover path
Xtc xtc(book.path, "/.crosspoint"); RECENT_BOOKS.addBook(book.path, xtc.getTitle(), xtc.getAuthor(), xtc.getThumbBmpPath());
if (xtc.load()) { recentBooks.push_back({book.path, xtc.getTitle(), xtc.getAuthor(), xtc.getThumbBmpPath()});
// Try to generate thumbnail image for Continue Reading card
if (!showingLoading) {
showingLoading = true;
popupRect = GUI.drawPopup(renderer, "Loading...");
}
GUI.fillPopupProgress(renderer, popupRect, progress * 30);
xtc.generateThumbBmp(coverHeight);
} }
} }
} }
} }
recentBooks.push_back(book); if (!mustReloadRecents) {
recentBooks.push_back(book);
}
progress++; progress++;
} }
Serial.printf("Recent books loaded: %d\n", recentBooks.size());
recentsLoaded = true; recentsLoaded = true;
recentsLoading = false; recentsLoading = false;
updateRequired = true; updateRequired = true;

View File

@ -58,9 +58,11 @@ void TxtReaderActivity::onEnter() {
txt->setupCacheDir(); txt->setupCacheDir();
// Save current txt as last opened file and add to recent books // Save current txt as last opened file and add to recent books
APP_STATE.openEpubPath = txt->getPath(); auto filePath = txt->getPath();
auto fileName = filePath.substr(filePath.rfind('/') + 1);
APP_STATE.openEpubPath = filePath;
APP_STATE.saveToFile(); APP_STATE.saveToFile();
RECENT_BOOKS.addBook(txt->getPath(), "", "", ""); RECENT_BOOKS.addBook(filePath, fileName, "", "");
// Trigger first update // Trigger first update
updateRequired = true; updateRequired = true;