Add support for storing and serving the new comic filters format

It's already implemented on iOS and next is supporting it on Android.
This commit is contained in:
Luis Ángel San Martín
2025-06-14 09:56:33 +02:00
parent a4ab11d44d
commit b7fb45a331
10 changed files with 191 additions and 40 deletions

View File

@ -81,7 +81,13 @@ static QString fields = "title,"
"seriesGroup,"
"mainCharacterOrTeam,"
"review,"
"tags";
"tags,"
// new 9.16 fields
"imageFiltersJson,"
"lastTimeImageFiltersSet,"
"lastTimeCoverSet,"
"usesExternalCover,"
"lastTimeMetadataSet";
DataBaseManagement::DataBaseManagement()
: QObject(), dataBasesList()
@ -284,7 +290,13 @@ bool DataBaseManagement::createComicInfoTable(QSqlDatabase &database, QString ta
"seriesGroup TEXT,"
"mainCharacterOrTeam TEXT,"
"review TEXT,"
"tags TEXT"
"tags TEXT,"
// new 9.16 fields
"imageFiltersJson TEXT,"
"lastTimeImageFiltersSet INTEGER DEFAULT 0,"
"lastTimeCoverSet INTEGER DEFAULT 0,"
"usesExternalCover BOOLEAN DEFAULT 0,"
"lastTimeMetadataSet INTEGER DEFAULT 0"
")");
return queryComicInfo.exec();
@ -862,6 +874,7 @@ bool DataBaseManagement::updateToCurrentVersion(const QString &libraryPath)
bool pre9_8 = false;
bool pre9_13 = false;
bool pre9_14 = false;
bool pre9_16 = false;
QString libraryDatabasePath = LibraryPaths::libraryDatabasePath(libraryPath);
@ -879,6 +892,8 @@ bool DataBaseManagement::updateToCurrentVersion(const QString &libraryPath)
pre9_13 = true;
if (compareVersions(DataBaseManagement::checkValidDB(libraryDatabasePath), "9.14.0") < 0)
pre9_14 = true;
if (compareVersions(DataBaseManagement::checkValidDB(libraryDatabasePath), "9.16.0") < 0)
pre9_16 = true;
QString connectionName = "";
bool returnValue = true;
@ -1080,6 +1095,22 @@ bool DataBaseManagement::updateToCurrentVersion(const QString &libraryPath)
}
}
if (pre9_16) {
{ // comic_info
QStringList columnDefs;
columnDefs << "imageFiltersJson TEXT";
columnDefs << "lastTimeImageFiltersSet INTEGER DEFAULT 0";
columnDefs << "lastTimeCoverSet INTEGER DEFAULT 0";
columnDefs << "usesExternalCover BOOLEAN DEFAULT 0";
columnDefs << "lastTimeMetadataSet INTEGER DEFAULT 0";
bool successAddingColumns = addColumns("comic_info", columnDefs, db);
returnValue = returnValue && successAddingColumns;
}
}
if (returnValue) {
QSqlQuery updateVersion(db);
updateVersion.prepare("UPDATE db_info SET "

View File

@ -712,7 +712,14 @@ void DBHelper::update(ComicInfo *comicInfo, QSqlDatabase &db)
"seriesGroup = :seriesGroup,"
"mainCharacterOrTeam = :mainCharacterOrTeam,"
"review = :review,"
"tags = :tags"
"tags = :tags,"
// new 9.16 fields
"imageFiltersJson = :imageFiltersJson,"
"lastTimeImageFiltersSet = :lastTimeImageFiltersSet,"
"lastTimeCoverSet = :lastTimeCoverSet,"
"usesExternalCover = :usesExternalCover,"
"lastTimeMetadataSet = :lastTimeMetadataSet"
//--
" WHERE id = :id");
@ -790,6 +797,12 @@ void DBHelper::update(ComicInfo *comicInfo, QSqlDatabase &db)
updateComicInfo.bindValue(":review", comicInfo->review);
updateComicInfo.bindValue(":tags", comicInfo->tags);
updateComicInfo.bindValue(":imageFiltersJson", comicInfo->imageFiltersJson);
updateComicInfo.bindValue(":lastTimeImageFiltersSet", comicInfo->lastTimeImageFiltersSet);
updateComicInfo.bindValue(":lastTimeCoverSet", comicInfo->lastTimeCoverSet);
updateComicInfo.bindValue(":usesExternalCover", comicInfo->usesExternalCover);
updateComicInfo.bindValue(":lastTimeMetadataSet", comicInfo->lastTimeMetadataSet);
updateComicInfo.exec();
QLOG_INFO() << updateComicInfo.lastError().databaseText();
@ -962,6 +975,41 @@ void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo)
QSqlDatabase::removeDatabase(connectionName);
}
void DBHelper::updateImageFilters(qulonglong libraryId, const ComicInfo &comicInfo)
{
QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(LibraryPaths::libraryDataPath(libraryPath));
bool found;
ComicDB comic = DBHelper::loadComic(comicInfo.id, db, found);
if (found && comic.info.lastTimeImageFiltersSet.toULongLong() < comicInfo.lastTimeImageFiltersSet.toULongLong()) {
QSqlQuery updateComicInfo(db);
updateComicInfo.prepare("UPDATE comic_info SET "
"lastTimeImageFiltersSet = :lastTimeImageFiltersSet, "
"imageFiltersJson = :imageFiltersJson "
" WHERE id = :id ");
updateComicInfo.bindValue(":lastTimeImageFiltersSet", comicInfo.lastTimeImageFiltersSet.toULongLong());
updateComicInfo.bindValue(":imageFiltersJson", comicInfo.imageFiltersJson);
updateComicInfo.bindValue(":id", comic.info.id);
auto ret = updateComicInfo.exec();
if (!ret) {
QLOG_ERROR() << "Error updating image filters for comic ID:" << comicInfo.id;
QLOG_ERROR() << updateComicInfo.lastError().databaseText();
QLOG_ERROR() << updateComicInfo.lastError().text();
}
}
connectionName = db.connectionName();
}
QSqlDatabase::removeDatabase(connectionName);
}
void DBHelper::setComicAsReading(qulonglong libraryId, const ComicInfo &comicInfo)
{
QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
@ -1944,6 +1992,12 @@ ComicInfo DBHelper::getComicInfoFromQuery(QSqlQuery &query, const QString &idKey
int review = record.indexOf("review");
int tags = record.indexOf("tags");
int imageFiltersJson = record.indexOf("imageFiltersJson");
int lastTimeImageFiltersSet = record.indexOf("lastTimeImageFiltersSet");
int lastTimeCoverSet = record.indexOf("lastTimeCoverSet");
int usesExternalCover = record.indexOf("usesExternalCover");
int lastTimeMetadataSet = record.indexOf("lastTimeMetadataSet");
ComicInfo comicInfo;
comicInfo.hash = query.value(hash).toString();
@ -2026,6 +2080,14 @@ ComicInfo DBHelper::getComicInfoFromQuery(QSqlQuery &query, const QString &idKey
comicInfo.tags = query.value(tags);
//--
// new 9.16 fields
comicInfo.imageFiltersJson = query.value(imageFiltersJson);
comicInfo.lastTimeImageFiltersSet = query.value(lastTimeImageFiltersSet);
comicInfo.lastTimeCoverSet = query.value(lastTimeCoverSet);
comicInfo.usesExternalCover = query.value(usesExternalCover).toBool();
comicInfo.lastTimeMetadataSet = query.value(lastTimeMetadataSet);
//--
comicInfo.existOnDb = true;
return comicInfo;

View File

@ -72,6 +72,7 @@ public:
static Folder updateChildrenInfo(qulonglong folderId, QSqlDatabase &db);
static void updateChildrenInfo(QSqlDatabase &db);
static void updateProgress(qulonglong libraryId, const ComicInfo &comicInfo);
static void updateImageFilters(qulonglong libraryId, const ComicInfo &comicInfo);
static void setComicAsReading(qulonglong libraryId, const ComicInfo &comicInfo);
[[deprecated("Server v1")]] static void updateFromRemoteClient(qulonglong libraryId, const ComicInfo &comicInfo);
static void updateReadingRemoteProgress(const ComicInfo &comicInfo, QSqlDatabase &db);

View File

@ -34,7 +34,6 @@ void UpdateComicControllerV2::service(HttpRequest &request, HttpResponse &respon
ComicInfo info;
info.currentPage = currentPage;
info.id = comicId;
DBHelper::updateProgress(libraryId, info);
if (data.length() > 1) {
if (data.at(1).isEmpty() == false) {
@ -43,8 +42,23 @@ void UpdateComicControllerV2::service(HttpRequest &request, HttpResponse &respon
info.id = nextComicId.toULongLong();
DBHelper::setComicAsReading(libraryId, info);
}
if (data.length() > 2) {
QStringList imageFiltersData = data.at(2).split("\t");
auto epoch = imageFiltersData.at(0).toULongLong();
QString imageFiltersJson = imageFiltersData.at(1);
ComicInfo imageFiltersInfo;
imageFiltersInfo.id = comicId;
imageFiltersInfo.lastTimeImageFiltersSet = epoch;
imageFiltersInfo.imageFiltersJson = imageFiltersJson.isEmpty() ? QVariant() : imageFiltersJson;
DBHelper::updateImageFilters(libraryId, imageFiltersInfo);
}
}
DBHelper::updateProgress(libraryId, info);
error = false;
updatedLibraryId = libraryId;
updatedComicId = comicId;

View File

@ -170,6 +170,12 @@ QJsonObject YACReaderServerDataHelper::fullComicToJSON(const qulonglong libraryI
json["brightness"] = comic.info.brightness;
json["contrast"] = comic.info.contrast;
json["gamma"] = comic.info.gamma;
// 9.16
variantToJson("image_filters_json", QMetaType::QString, comic.info.imageFiltersJson, json);
variantToJson("last_time_image_filters_set", QMetaType::LongLong, comic.info.lastTimeImageFiltersSet, json);
variantToJson("last_time_cover_set", QMetaType::LongLong, comic.info.lastTimeCoverSet, json);
variantToJson("uses_external_cover", QMetaType::Bool, comic.info.usesExternalCover, json);
variantToJson("last_time_metadata_set", QMetaType::LongLong, comic.info.lastTimeMetadataSet, json);
return json;
}