From 1cd863580806cc8b05e2c71bfda144b87dbd46bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Mon, 6 Jan 2025 09:24:07 +0100 Subject: [PATCH 01/90] Use QProcess as intented by parsing the input command arguments --- CHANGELOG.md | 5 +++ YACReaderLibrary/library_comic_opener.cpp | 44 +++++++++++++++++++---- common/yacreader_global.h | 2 +- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b695de3c7..511fe01c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ Version counting is based on semantic versioning (Major.Feature.Patch) +## WIP (9.15.1) + +### YACReaderLibrary +* Improve flexibility of the open comic in third party app setting so more complex commands can be used. e.g. `open -a "/Applications/My Reader.app" "{comic_file_path}"`. + ## 9.15.0 ### YACReader diff --git a/YACReaderLibrary/library_comic_opener.cpp b/YACReaderLibrary/library_comic_opener.cpp index 595cdbf77..ede63f33b 100644 --- a/YACReaderLibrary/library_comic_opener.cpp +++ b/YACReaderLibrary/library_comic_opener.cpp @@ -47,15 +47,45 @@ bool YACReader::openComic(const ComicDB &comic, return yacreaderFound; } +QStringList parseCommand(const QString &input) +{ + QRegularExpression regex(R"((?:\"([^\"]*)\")|(\S+))"); + QStringList result; + auto it = regex.globalMatch(input); + while (it.hasNext()) { + QRegularExpressionMatch match = it.next(); + if (match.hasMatch()) { + result << (match.captured(1).isEmpty() ? match.captured(2) : match.captured(1)); + } + } + return result; +} + bool YACReader::openComicInThirdPartyApp(const QString &command, const QString &path) { - QString mutableCommand = command; - QString fullCommand; - if (mutableCommand.contains("{comic_file_path}")) { - fullCommand = mutableCommand.replace("{comic_file_path}", "\"" + path + "\""); - } else { - fullCommand = mutableCommand + " \"" + path + "\""; + QStringList parsed = parseCommand(command); + if (parsed.isEmpty()) { + qDebug() << "Empty command"; + return false; + } + + QString program = parsed.takeFirst(); + QStringList rawArguments = parsed; + QStringList arguments; + + auto placeholderFound = false; + for (auto argument : rawArguments) { + if (argument.contains("{comic_file_path}")) { + placeholderFound = true; + arguments << argument.replace("{comic_file_path}", path); + } else { + arguments << argument; + } + } + + if (!placeholderFound) { + arguments << path; } - return QProcess::startDetached(fullCommand, {}); + return QProcess::startDetached(program, arguments); } diff --git a/common/yacreader_global.h b/common/yacreader_global.h index b8a13bba0..c3b19e95a 100644 --- a/common/yacreader_global.h +++ b/common/yacreader_global.h @@ -8,7 +8,7 @@ class QLibrary; -#define VERSION "9.15.0" +#define VERSION "9.15.1" // Used to check if the database needs to be updated, the version is stored in the database. // This value is only incremented when the database structure changes. From 31971c23482df323c5c1ef39add5045f2b4120de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20A=CC=81ngel=20San=20Marti=CC=81n=20Rodri=CC=81guez?= Date: Mon, 6 Jan 2025 10:24:16 +0100 Subject: [PATCH 02/90] Don't use scroll animations on macos by default, it where hdpi scroll is most likely to be used --- CHANGELOG.md | 2 ++ YACReader/configuration.h | 11 ++++++++++- YACReader/options_dialog.cpp | 8 +++++++- custom_widgets/whats_new_dialog.cpp | 3 +++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 511fe01c1..64b27a84c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Version counting is based on semantic versioning (Major.Feature.Patch) ## WIP (9.15.1) +### YACReader +* Don't use scroll animations on macos by default, it where hdpi scroll is most likely to be used. ### YACReaderLibrary * Improve flexibility of the open comic in third party app setting so more complex commands can be used. e.g. `open -a "/Applications/My Reader.app" "{comic_file_path}"`. diff --git a/YACReader/configuration.h b/YACReader/configuration.h index a16941176..fe29803ea 100644 --- a/YACReader/configuration.h +++ b/YACReader/configuration.h @@ -84,7 +84,16 @@ class Configuration : public QObject bool getDoNotTurnPageOnScroll() { return settings->value(DO_NOT_TURN_PAGE_ON_SCROLL, false).toBool(); } bool getUseSingleScrollStepToTurnPage() { return settings->value(USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE, false).toBool(); } void setDisableScrollAnimation(bool b) { settings->setValue(DISABLE_SCROLL_ANIMATION, b); } - bool getDisableScrollAnimation() { return settings->value(DISABLE_SCROLL_ANIMATION, false).toBool(); } + bool getDisableScrollAnimation() + { +#ifdef Q_OS_MACOS + auto defaultValue = true; +#else + auto defaultValue = false; +#endif + + return settings->value(DISABLE_SCROLL_ANIMATION, defaultValue).toBool(); + } }; #endif diff --git a/YACReader/options_dialog.cpp b/YACReader/options_dialog.cpp index 5d006a6a9..6f443dbbd 100644 --- a/YACReader/options_dialog.cpp +++ b/YACReader/options_dialog.cpp @@ -286,7 +286,13 @@ void OptionsDialog::restoreOptions(QSettings *settings) doNotTurnPageOnScroll->setChecked(settings->value(DO_NOT_TURN_PAGE_ON_SCROLL, false).toBool()); useSingleScrollStepToTurnPage->setChecked(settings->value(USE_SINGLE_SCROLL_STEP_TO_TURN_PAGE, false).toBool()); - disableScrollAnimations->setChecked(settings->value(DISABLE_SCROLL_ANIMATION, false).toBool()); + +#ifdef Q_OS_MACOS + auto defaultDisableScrollAnimationsValue = true; +#else + auto defaultDisableScrollAnimationsValue = false; +#endif + disableScrollAnimations->setChecked(settings->value(DISABLE_SCROLL_ANIMATION, defaultDisableScrollAnimationsValue).toBool()); } void OptionsDialog::updateColor(const QColor &color) diff --git a/custom_widgets/whats_new_dialog.cpp b/custom_widgets/whats_new_dialog.cpp index 68195d2ed..c09472913 100644 --- a/custom_widgets/whats_new_dialog.cpp +++ b/custom_widgets/whats_new_dialog.cpp @@ -54,6 +54,7 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent) " • Bump PDF render size
" " • Fix trackpad scrolling, it makes using trackpads more responsive and natural
" " • Added more info to Help -> System info
" + " • Don't use scroll animations on macos by default, it where hdpi scroll is most likely to be used and it causes scroll issues. (new 9.15.1)
" "
" "YACReaderLibrary
" " • Fix headers in the table view getting stuck in a non-movable state
" @@ -69,6 +70,8 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent) " • Fix occasional crashes when using automatic library updates
" " • Add setting to hide the \"Continue Reading...\" banner from the home view
" " • Improve Grid and Flow Info comics view scroll performance
" + " • Improve flexibility of the open comic in third party app setting so more complex commands can be used. e.g. `open -a \"/Applications/My Reader.app" + "{comic_file_path}\"` (new 9.15.1)
" "
" "YACReaderLibraryServer
" " • New command --system-info to print information about the execution environment and available resources (including what image formats are supported and what libraries are used by the app).
" From 89d16b620ac7d6aba6b847122c8a8ce055927fde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 26 Jan 2025 11:22:43 +0100 Subject: [PATCH 03/90] Use the right data index for getting the rating --- CHANGELOG.md | 1 + custom_widgets/yacreader_table_view.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64b27a84c..508961ad8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Version counting is based on semantic versioning (Major.Feature.Patch) ### YACReaderLibrary * Improve flexibility of the open comic in third party app setting so more complex commands can be used. e.g. `open -a "/Applications/My Reader.app" "{comic_file_path}"`. +* Fix setting the comic rating in the table view. ## 9.15.0 diff --git a/custom_widgets/yacreader_table_view.cpp b/custom_widgets/yacreader_table_view.cpp index 1526357cb..7e291e89d 100644 --- a/custom_widgets/yacreader_table_view.cpp +++ b/custom_widgets/yacreader_table_view.cpp @@ -285,7 +285,7 @@ QWidget *YACReaderRatingDelegate::createEditor(QWidget *parent, void YACReaderRatingDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - int rating = ((ComicItem *)index.internalPointer())->data(11).toInt(); + int rating = ((ComicItem *)index.internalPointer())->data(ComicModel::Rating).toInt(); StarRating starRating(rating); From bfc0e1bc956ce6105531941803200d1a8bdb1f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 26 Jan 2025 13:55:59 +0100 Subject: [PATCH 04/90] Update aqtinstall syntax to the latest version --- azure-pipelines-windows-template-qt6.yml | 2 +- azure-pipelines-windows-template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index d6a8f3753..2f8362909 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -21,7 +21,7 @@ jobs: - script: | pip install aqtinstall mkdir C:\Qt - python -m aqt install -O c:\Qt ${{ parameters.qt_version }} windows desktop ${{ parameters.qt_aqt_spec }} -m qt5compat qtmultimedia qtimageformats + python -m aqt install-qt windows desktop ${{ parameters.qt_version }} ${{ parameters.qt_aqt_spec }} -O c:\Qt ${{ parameters.qt_version }} -m qt5compat qtmultimedia qtimageformats dir C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin choco install -y wget choco install innosetup diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index afbe1c7de..d907b65b8 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -21,7 +21,7 @@ jobs: - script: | pip install aqtinstall mkdir C:\Qt - python -m aqt install -O c:\Qt ${{ parameters.qt_version }} windows desktop ${{ parameters.qt_aqt_spec }} + python -m aqt install-qt windows desktop ${{ parameters.qt_version }} ${{ parameters.qt_aqt_spec }} -O c:\Qt ${{ parameters.qt_version }} dir C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin choco install -y wget choco install innosetup From af1af3976d95342141eddcab151bf2817e9fe66f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sun, 26 Jan 2025 14:36:04 +0100 Subject: [PATCH 05/90] Remove extra parameter from aqt --- azure-pipelines-windows-template-qt6.yml | 2 +- azure-pipelines-windows-template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines-windows-template-qt6.yml b/azure-pipelines-windows-template-qt6.yml index 2f8362909..35cefeed6 100644 --- a/azure-pipelines-windows-template-qt6.yml +++ b/azure-pipelines-windows-template-qt6.yml @@ -21,7 +21,7 @@ jobs: - script: | pip install aqtinstall mkdir C:\Qt - python -m aqt install-qt windows desktop ${{ parameters.qt_version }} ${{ parameters.qt_aqt_spec }} -O c:\Qt ${{ parameters.qt_version }} -m qt5compat qtmultimedia qtimageformats + python -m aqt install-qt windows desktop ${{ parameters.qt_version }} ${{ parameters.qt_aqt_spec }} -O c:\Qt -m qt5compat qtmultimedia qtimageformats dir C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin choco install -y wget choco install innosetup diff --git a/azure-pipelines-windows-template.yml b/azure-pipelines-windows-template.yml index d907b65b8..866c990b9 100644 --- a/azure-pipelines-windows-template.yml +++ b/azure-pipelines-windows-template.yml @@ -21,7 +21,7 @@ jobs: - script: | pip install aqtinstall mkdir C:\Qt - python -m aqt install-qt windows desktop ${{ parameters.qt_version }} ${{ parameters.qt_aqt_spec }} -O c:\Qt ${{ parameters.qt_version }} + python -m aqt install-qt windows desktop ${{ parameters.qt_version }} ${{ parameters.qt_aqt_spec }} -O c:\Qt dir C:\Qt\${{ parameters.qt_version }}\${{ parameters.qt_spec }}\bin choco install -y wget choco install innosetup From c148a96d7f206eea551cc6c22a3292b7573ef5c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 27 Mar 2025 20:19:08 +0100 Subject: [PATCH 06/90] Add static methods to get the data paths in a library --- YACReaderLibrary/yacreader_libraries.cpp | 17 ++++++++++++++++- YACReaderLibrary/yacreader_libraries.h | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/YACReaderLibrary/yacreader_libraries.cpp b/YACReaderLibrary/yacreader_libraries.cpp index 4e3f13f60..b5e63714d 100644 --- a/YACReaderLibrary/yacreader_libraries.cpp +++ b/YACReaderLibrary/yacreader_libraries.cpp @@ -228,7 +228,7 @@ QString YACReaderLibrary::getPath() const QString YACReaderLibrary::getDBPath() const { - return path + "/.yacreaderlibrary"; + return YACReaderLibrary::libraryDataPath(path); } int YACReaderLibrary::getLegacyId() const @@ -251,6 +251,21 @@ bool YACReaderLibrary::operator!=(const YACReaderLibrary &other) const return !(*this == other); } +QString YACReaderLibrary::libraryDataPath(const QString &libraryPath) +{ + return QDir(libraryPath).filePath(".yacreaderlibrary"); +} + +QString YACReaderLibrary::libraryDatabasePath(const QString &libraryPath) +{ + return QDir(YACReaderLibrary::libraryDataPath(libraryPath)).filePath("library.ydb"); +} + +QString YACReaderLibrary::libraryCoversFolderPath(const QString &libraryPath) +{ + return QDir(YACReaderLibrary::libraryDataPath(libraryPath)).filePath("covers"); +} + QDataStream &operator<<(QDataStream &out, const YACReaderLibrary &library) { out << library.name << library.path << library.legacyId << library.id; diff --git a/YACReaderLibrary/yacreader_libraries.h b/YACReaderLibrary/yacreader_libraries.h index e7e8c86d2..763c6b53d 100644 --- a/YACReaderLibrary/yacreader_libraries.h +++ b/YACReaderLibrary/yacreader_libraries.h @@ -55,6 +55,10 @@ class YACReaderLibrary friend QDataStream &operator>>(QDataStream &in, YACReaderLibrary &library); operator QString() const { return QString("%1 [%2, %3, %4]").arg(name, QString::number(legacyId), id.toString(QUuid::WithoutBraces), path); } + static QString libraryDataPath(const QString &libraryPath); // libraryPath + /.yacreaderlibrary + static QString libraryDatabasePath(const QString &libraryPath); // libraryPath + /.yacreaderlibrary/library.ydb + static QString libraryCoversFolderPath(const QString &libraryPath); // libraryPath + /.yacreaderlibrary/covers + private: QString name; QString path; From 4e675d4326dac95f72361b47253f176ced50861c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 27 Mar 2025 20:28:21 +0100 Subject: [PATCH 07/90] Use YACReaderLibrary to create paths in ConsoleUILibraryCreator --- YACReaderLibraryServer/console_ui_library_creator.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/YACReaderLibraryServer/console_ui_library_creator.cpp b/YACReaderLibraryServer/console_ui_library_creator.cpp index 8933c5a07..3af2c8cac 100644 --- a/YACReaderLibraryServer/console_ui_library_creator.cpp +++ b/YACReaderLibraryServer/console_ui_library_creator.cpp @@ -33,7 +33,7 @@ void ConsoleUILibraryCreator::createLibrary(const QString &name, const QString & return; } - libraryCreator->createLibrary(cleanPath, QDir::cleanPath(pathDir.absolutePath() + "/.yacreaderlibrary")); + libraryCreator->createLibrary(cleanPath, YACReaderLibrary::libraryDataPath(cleanPath)); connect(libraryCreator, &LibraryCreator::finished, this, &ConsoleUILibraryCreator::done); connect(libraryCreator, &LibraryCreator::comicAdded, this, &ConsoleUILibraryCreator::newComic); @@ -62,7 +62,7 @@ void ConsoleUILibraryCreator::updateLibrary(const QString &path) LibraryCreator *libraryCreator = new LibraryCreator(settings); QString cleanPath = QDir::cleanPath(pathDir.absolutePath()); - libraryCreator->updateLibrary(cleanPath, QDir::cleanPath(pathDir.absolutePath() + "/.yacreaderlibrary")); + libraryCreator->updateLibrary(cleanPath, YACReaderLibrary::libraryDataPath(cleanPath)); connect(libraryCreator, &LibraryCreator::finished, this, &ConsoleUILibraryCreator::done); connect(libraryCreator, &LibraryCreator::comicAdded, this, &ConsoleUILibraryCreator::newComic); @@ -85,8 +85,8 @@ void ConsoleUILibraryCreator::addExistingLibrary(const QString &name, const QStr } QString cleanPath = QDir::cleanPath(pathDir.absolutePath()); - if (!QDir(cleanPath + "/.yacreaderlibrary").exists()) { - std::cout << "No library database found in directory." << std::endl; + if (!QDir(YACReaderLibrary::libraryDataPath(cleanPath)).exists()) { + std::cout << "No data folder found in path: " << cleanPath.toStdString() << std::endl; return; } @@ -135,7 +135,7 @@ void ConsoleUILibraryCreator::rescanXMLInfoLibrary(const QString &path) connect(scanner, &XMLInfoLibraryScanner::finished, &eventLoop, &QEventLoop::quit); std::cout << "Scanning comics"; - scanner->scanLibrary(cleanPath, QDir::cleanPath(pathDir.absolutePath() + "/.yacreaderlibrary")); + scanner->scanLibrary(cleanPath, YACReaderLibrary::libraryDataPath(cleanPath)); eventLoop.exec(); } From 5aa637fdbe838b9077f87ebfcb2fb06fb7337932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 27 Mar 2025 21:19:12 +0100 Subject: [PATCH 08/90] Use YACReaderLibrary::libraryDataPath in YACReaderLibraries::getDBPath --- YACReaderLibrary/yacreader_libraries.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/YACReaderLibrary/yacreader_libraries.cpp b/YACReaderLibrary/yacreader_libraries.cpp index b5e63714d..f24c15fbf 100644 --- a/YACReaderLibrary/yacreader_libraries.cpp +++ b/YACReaderLibrary/yacreader_libraries.cpp @@ -62,7 +62,7 @@ QString YACReaderLibraries::getPath(const QUuid &id) QString YACReaderLibraries::getDBPath(int id) { - return getPath(id) + "/.yacreaderlibrary"; + return YACReaderLibrary::libraryDataPath(getPath(id)); } QString YACReaderLibraries::getName(int id) From d4b7c6dd8aeba322ec121b3a59fcac50200c10cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Sat, 29 Mar 2025 11:31:53 +0100 Subject: [PATCH 09/90] Extract library paths methods to it's own struct in yacreader_global.h and use it everywhere --- YACReaderLibrary/create_library_dialog.cpp | 5 +- YACReaderLibrary/db/comic_model.cpp | 4 +- YACReaderLibrary/db/data_base_management.cpp | 18 +++--- YACReaderLibrary/db/data_base_management.h | 2 +- YACReaderLibrary/db_helper.cpp | 59 ++++++++++++------- .../libraries_update_coordinator.cpp | 4 +- YACReaderLibrary/library_window.cpp | 36 +++++------ YACReaderLibrary/properties_dialog.cpp | 3 +- .../controllers/v2/covercontroller_v2.cpp | 8 +-- YACReaderLibrary/yacreader_libraries.cpp | 25 ++------ YACReaderLibrary/yacreader_libraries.h | 4 -- .../console_ui_library_creator.cpp | 8 +-- YACReaderLibraryServer/libraries_updater.cpp | 8 ++- common/comic_db.cpp | 2 +- common/yacreader_global.h | 37 +++++++++++- 15 files changed, 133 insertions(+), 90 deletions(-) diff --git a/YACReaderLibrary/create_library_dialog.cpp b/YACReaderLibrary/create_library_dialog.cpp index 397ae6369..8fbce0930 100644 --- a/YACReaderLibrary/create_library_dialog.cpp +++ b/YACReaderLibrary/create_library_dialog.cpp @@ -1,4 +1,5 @@ #include "create_library_dialog.h" +#include "yacreader_global.h" #include #include @@ -6,6 +7,8 @@ #include #include +using namespace YACReader; + CreateLibraryDialog::CreateLibraryDialog(QWidget *parent) : QDialog(parent) { @@ -87,7 +90,7 @@ void CreateLibraryDialog::create() QFileInfo f(path->text()); if (f.exists() && f.isDir() && f.isWritable()) { if (!libraries.contains(nameEdit->text())) { - emit createLibrary(QDir::cleanPath(path->text()), QDir::cleanPath(path->text()) + "/.yacreaderlibrary", nameEdit->text()); + emit createLibrary(QDir::cleanPath(path->text()), LibraryPaths::libraryDataPath(QDir::cleanPath(path->text())), nameEdit->text()); close(); } else emit libraryExists(nameEdit->text()); diff --git a/YACReaderLibrary/db/comic_model.cpp b/YACReaderLibrary/db/comic_model.cpp index cf75b03e8..6c29a6869 100644 --- a/YACReaderLibrary/db/comic_model.cpp +++ b/YACReaderLibrary/db/comic_model.cpp @@ -11,6 +11,7 @@ #include "comic_db.h" #include "db_helper.h" #include "reading_list_model.h" + #ifdef use_unarr #include #endif @@ -489,11 +490,10 @@ int ComicModel::rowCount(const QModelIndex &parent) const QStringList ComicModel::getPaths(const QString &_source) { QStringList paths; - QString source = _source + "/.yacreaderlibrary/covers/"; QList::ConstIterator itr; for (itr = _data.constBegin(); itr != _data.constEnd(); itr++) { QString hash = (*itr)->data(ComicModel::Hash).toString(); - paths << source + hash + ".jpg"; + paths << LibraryPaths::coverPath(_source, hash); } return paths; diff --git a/YACReaderLibrary/db/data_base_management.cpp b/YACReaderLibrary/db/data_base_management.cpp index 18c6229c1..2397eb6f5 100644 --- a/YACReaderLibrary/db/data_base_management.cpp +++ b/YACReaderLibrary/db/data_base_management.cpp @@ -4,6 +4,7 @@ #include "initial_comic_info_extractor.h" #include "check_new_version.h" #include "db_helper.h" +#include "yacreader_libraries.h" #include "QsLog.h" @@ -118,15 +119,15 @@ QSqlDatabase DataBaseManagement::createDatabase(QString dest) return db; } -QSqlDatabase DataBaseManagement::loadDatabase(QString path) +QSqlDatabase DataBaseManagement::loadDatabase(QString libraryDataPath) { - if (!QFile::exists(path + "/library.ydb")) { + if (!QFile::exists(libraryDataPath + "/library.ydb")) { return QSqlDatabase(); } QString threadId = QString::number((long long)QThread::currentThreadId(), 16); - QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", path + threadId); - db.setDatabaseName(path + "/library.ydb"); + QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", libraryDataPath + threadId); + db.setDatabaseName(libraryDataPath + "/library.ydb"); if (!db.open()) { return QSqlDatabase(); } @@ -667,7 +668,8 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest) QString basePath = QString(dest).remove("/.yacreaderlibrary/library.ydb"); QString path = basePath + getComic.record().value("path").toString(); int coverPage = getComic.record().value("coverPage").toInt(); - InitialComicInfoExtractor ie(path, basePath + "/.yacreaderlibrary/covers/" + hash + ".jpg", coverPage); + auto coverPath = LibraryPaths::coverPath(basePath, hash); + InitialComicInfoExtractor ie(path, coverPath, coverPage); ie.extract(); } } @@ -851,7 +853,7 @@ int DataBaseManagement::compareVersions(const QString &v1, const QString v2) return 0; } -bool DataBaseManagement::updateToCurrentVersion(const QString &path) +bool DataBaseManagement::updateToCurrentVersion(const QString &libraryDataPath) { bool pre7 = false; bool pre7_1 = false; @@ -861,7 +863,7 @@ bool DataBaseManagement::updateToCurrentVersion(const QString &path) bool pre9_13 = false; bool pre9_14 = false; - QString fullPath = path + "/library.ydb"; + QString fullPath = libraryDataPath + "/library.ydb"; if (compareVersions(DataBaseManagement::checkValidDB(fullPath), "7.0.0") < 0) pre7 = true; @@ -966,7 +968,7 @@ bool DataBaseManagement::updateToCurrentVersion(const QString &path) QImageReader thumbnail; while (selectQuery.next()) { - thumbnail.setFileName(path % "/covers/" % selectQuery.value(1).toString() % ".jpg"); + thumbnail.setFileName(libraryDataPath % "/covers/" % selectQuery.value(1).toString() % ".jpg"); float coverSizeRatio = static_cast(thumbnail.size().width()) / thumbnail.size().height(); updateCoverInfo.bindValue(":coverSizeRatio", coverSizeRatio); diff --git a/YACReaderLibrary/db/data_base_management.h b/YACReaderLibrary/db/data_base_management.h index e24505020..17219890d 100644 --- a/YACReaderLibrary/db/data_base_management.h +++ b/YACReaderLibrary/db/data_base_management.h @@ -46,7 +46,7 @@ class DataBaseManagement : public QObject static QSqlDatabase createDatabase(QString name, QString path); static QSqlDatabase createDatabase(QString dest); // carga una base de datos desde la ruta path - static QSqlDatabase loadDatabase(QString path); + static QSqlDatabase loadDatabase(QString libraryDataPath); static QSqlDatabase loadDatabaseFromFile(QString path); static bool createTables(QSqlDatabase &database); static bool createComicInfoTable(QSqlDatabase &database, QString tableName); diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 320402724..54f2fe8a9 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -21,10 +21,14 @@ #include "data_base_management.h" #include "folder.h" #include "yacreader_libraries.h" +#include "yacreader_global.h" #include "qnaturalsorting.h" #include "QsLog.h" + +using namespace YACReader; + // server YACReaderLibraries DBHelper::getLibraries() @@ -40,7 +44,7 @@ QList DBHelper::getFolderSubfoldersFromLibrary(qulonglong library QString connectionName = ""; QList list; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); list = DBHelper::getFoldersFromParent(folderId, db, false); connectionName = db.connectionName(); @@ -82,7 +86,7 @@ QList DBHelper::getFolderComicsFromLibrary(qulonglong libraryId, QString connectionName = ""; QList list; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); list = DBHelper::getComicsFromParent(folderId, db, sort); connectionName = db.connectionName(); @@ -98,7 +102,7 @@ quint32 DBHelper::getNumChildrenFromFolder(qulonglong libraryId, qulonglong fold QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QSqlQuery selectQuery(db); selectQuery.prepare("SELECT count(*) FROM folder WHERE parentId = :parentId and id <> 1"); @@ -126,7 +130,7 @@ qulonglong DBHelper::getParentFromComicFolderId(qulonglong libraryId, qulonglong QString connectionName = ""; Folder f; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); f = DBHelper::loadFolder(id, db); connectionName = db.connectionName(); @@ -141,7 +145,7 @@ ComicDB DBHelper::getComicInfo(qulonglong libraryId, qulonglong id) QString connectionName = ""; ComicDB comic; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); bool found; comic = DBHelper::loadComic(id, db, found); @@ -157,7 +161,7 @@ QList DBHelper::getSiblings(qulonglong libraryId, qulonglong parentId) QString connectionName = ""; QList comics; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); comics = DBHelper::getSortedComicsFromParent(parentId, db); connectionName = db.connectionName(); } @@ -174,7 +178,7 @@ QString DBHelper::getFolderName(qulonglong libraryId, qulonglong id) QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QSqlQuery selectQuery(db); // TODO check selectQuery.prepare("SELECT name FROM folder WHERE id = :id"); selectQuery.bindValue(":id", id); @@ -198,7 +202,7 @@ Folder DBHelper::getFolder(qulonglong libraryId, qulonglong id) QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QSqlQuery selectQuery(db); // TODO check selectQuery.prepare("SELECT * FROM folder WHERE id = :id"); selectQuery.bindValue(":id", id); @@ -259,7 +263,7 @@ QList DBHelper::getLabelComics(qulonglong libraryId, qulonglong labelId QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QSqlQuery selectQuery(db); selectQuery.prepare("SELECT c.id,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " @@ -300,7 +304,7 @@ QList DBHelper::getFavorites(qulonglong libraryId) QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QSqlQuery selectQuery(db); selectQuery.prepare("SELECT c.id,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " @@ -341,7 +345,7 @@ QList DBHelper::getReading(qulonglong libraryId) QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QSqlQuery selectQuery(db); selectQuery.prepare("SELECT c.id,c.parentId,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio,ci.number " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " @@ -381,7 +385,7 @@ QList DBHelper::getReadingLists(qulonglong libraryId) QList list; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QSqlQuery selectQuery("SELECT * from reading_list WHERE parentId IS NULL ORDER BY name DESC", db); @@ -420,7 +424,7 @@ QList DBHelper::getReadingListFullContent(qulonglong libraryId, qulongl QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); QList ids; ids << readingListId; @@ -618,7 +622,7 @@ void DBHelper::update(qulonglong libraryId, ComicInfo &comicInfo) QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); DBHelper::update(&comicInfo, db); connectionName = db.connectionName(); } @@ -872,6 +876,10 @@ Folder DBHelper::updateChildrenInfo(qulonglong folderId, QSqlDatabase &db) } } + if (folder.numChildren == subfolders.count() + comics.count() && folder.firstChildHash == coverHash) { + return folder; + } + folder.numChildren = subfolders.count() + comics.count(); folder.firstChildHash = coverHash; @@ -894,6 +902,9 @@ Folder DBHelper::updateChildrenInfo(qulonglong folderId, QSqlDatabase &db) void DBHelper::updateChildrenInfo(QSqlDatabase &db) { + // measure time + auto start = std::chrono::high_resolution_clock::now(); + QSqlQuery selectQuery(db); // TODO check selectQuery.prepare("SELECT id FROM folder f WHERE f.parentId = 1 AND f.id <> 1"); selectQuery.exec(); @@ -901,6 +912,12 @@ void DBHelper::updateChildrenInfo(QSqlDatabase &db) while (selectQuery.next()) { DBHelper::updateChildrenInfo(selectQuery.value(0).toULongLong(), db); } + + auto end = std::chrono::high_resolution_clock::now(); + + QString time = QString::number(std::chrono::duration_cast(end - start).count()); + QString message = "updateChildrenInfo took " + time + "ms"; + QLOG_INFO() << message; } void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) @@ -908,7 +925,7 @@ void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); bool found; ComicDB comic = DBHelper::loadComic(comicInfo.id, db, found); @@ -929,7 +946,7 @@ void DBHelper::setComicAsReading(qulonglong libraryId, const ComicInfo &comicInf QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); bool found; ComicDB comic = DBHelper::loadComic(comicInfo.id, db, found); @@ -970,7 +987,7 @@ void DBHelper::updateFromRemoteClient(qulonglong libraryId, const ComicInfo &com QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); bool found; ComicDB comic = DBHelper::loadComic(comicInfo.id, db, found); @@ -1009,7 +1026,7 @@ QMap> DBHelper::updateFromRemoteClient(const QMap &comics) QString libraryPath = DBHelper::getLibraries().getPath(libraries.getId(name)); QString connectionName = ""; { - QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); + QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath)); db.transaction(); @@ -1595,7 +1612,7 @@ QList