Add more info to json content + better handling of optionality

This commit is contained in:
Luis Ángel San Martín 2024-01-07 10:52:27 +01:00
parent b4951fcb1a
commit 5728d4bb18
10 changed files with 148 additions and 73 deletions

View File

@ -4,12 +4,10 @@
#include "db_helper.h"
#include "comic_db.h"
#include "folder.h"
#include "yacreader_libraries.h"
#include "yacreader_server_data_helper.h"
#include "qnaturalsorting.h"
#include <ctime>
using stefanfrings::HttpRequest;
@ -35,9 +33,11 @@ void ComicFullinfoController_v2::service(HttpRequest &request, HttpResponse &res
void ComicFullinfoController_v2::serviceContent(const int &libraryId, const qulonglong &comicId, HttpResponse &response)
{
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(libraryId);
ComicDB comic = DBHelper::getComicInfo(libraryId, comicId);
QJsonObject json = YACReaderServerDataHelper::fullComicToJSON(libraryId, comic);
QJsonObject json = YACReaderServerDataHelper::fullComicToJSON(libraryId, libraryUuid, comic);
QJsonDocument output(json);

View File

@ -3,6 +3,7 @@
#include "db_helper.h"
#include "comic_db.h"
#include "yacreader_libraries.h"
#include "yacreader_server_data_helper.h"
using stefanfrings::HttpRequest;
@ -25,12 +26,14 @@ void FavoritesControllerV2::service(HttpRequest &request, HttpResponse &response
void FavoritesControllerV2::serviceContent(const int library, HttpResponse &response)
{
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library);
QList<ComicDB> comics = DBHelper::getFavorites(library);
QJsonArray items;
for (const ComicDB &comic : comics) {
items.append(YACReaderServerDataHelper::comicToJSON(library, comic));
items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic));
}
QJsonDocument output(items);

View File

@ -6,6 +6,7 @@
#include "comic_db.h"
#include "folder.h"
#include "yacreader_libraries.h"
#include "yacreader_server_data_helper.h"
#include "qnaturalsorting.h"
@ -41,6 +42,8 @@ void FolderContentControllerV2::serviceContent(const int &library, const qulongl
#ifdef QT_DEBUG
auto started = std::chrono::high_resolution_clock::now();
#endif
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library);
QList<LibraryItem *> folderContent = DBHelper::getFolderSubfoldersFromLibrary(library, folderId);
QList<LibraryItem *> folderComics = DBHelper::getFolderComicsFromLibrary(library, folderId);
@ -56,10 +59,10 @@ void FolderContentControllerV2::serviceContent(const int &library, const qulongl
for (QList<LibraryItem *>::const_iterator itr = folderContent.constBegin(); itr != folderContent.constEnd(); itr++) {
if ((*itr)->isDir()) {
currentFolder = (Folder *)(*itr);
items.append(YACReaderServerDataHelper::folderToJSON(library, *currentFolder));
items.append(YACReaderServerDataHelper::folderToJSON(library, libraryUuid, *currentFolder));
} else {
currentComic = (ComicDB *)(*itr);
items.append(YACReaderServerDataHelper::comicToJSON(library, *currentComic));
items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, *currentComic));
}
}

View File

@ -3,6 +3,7 @@
#include "db_helper.h"
#include "comic_db.h"
#include "yacreader_libraries.h"
#include "yacreader_server_data_helper.h"
using stefanfrings::HttpRequest;
@ -28,12 +29,14 @@ void ReadingComicsControllerV2::service(HttpRequest &request, HttpResponse &resp
void ReadingComicsControllerV2::serviceContent(const int &library, HttpResponse &response)
{
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library);
QList<ComicDB> readingComics = DBHelper::getReading(library);
QJsonArray comics;
for (const ComicDB &comic : readingComics) {
comics.append(YACReaderServerDataHelper::comicToJSON(library, comic));
comics.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic));
}
QJsonDocument output(comics);

View File

@ -3,6 +3,7 @@
#include "db_helper.h"
#include "comic_db.h"
#include "yacreader_libraries.h"
#include "yacreader_server_data_helper.h"
using stefanfrings::HttpRequest;
@ -28,12 +29,14 @@ void ReadingListContentControllerV2::service(HttpRequest &request, HttpResponse
void ReadingListContentControllerV2::serviceContent(const int &library, const qulonglong &readingListId, HttpResponse &response)
{
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library);
QList<ComicDB> comics = DBHelper::getReadingListFullContent(library, readingListId);
QJsonArray items;
for (const ComicDB &comic : comics) {
items.append(YACReaderServerDataHelper::comicToJSON(library, comic));
items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic));
}
QJsonDocument output(items);

View File

@ -2,6 +2,7 @@
#include "db_helper.h"
#include "reading_list.h"
#include "yacreader_libraries.h"
#include "yacreader_server_data_helper.h"
using stefanfrings::HttpRequest;
@ -26,12 +27,14 @@ void ReadingListsControllerV2::service(HttpRequest &request, HttpResponse &respo
void ReadingListsControllerV2::serviceContent(const int library, HttpResponse &response)
{
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library);
QList<ReadingList> readingLists = DBHelper::getReadingLists(library);
QJsonArray items;
for (QList<ReadingList>::const_iterator itr = readingLists.constBegin(); itr != readingLists.constEnd(); itr++) {
items.append(YACReaderServerDataHelper::readingListToJSON(library, *itr));
items.append(YACReaderServerDataHelper::readingListToJSON(library, libraryUuid, *itr));
}
QJsonDocument output(items);

View File

@ -3,6 +3,7 @@
#include "db_helper.h"
#include "comic_db.h"
#include "yacreader_libraries.h"
#include "yacreader_server_data_helper.h"
#include <QUrl>
@ -30,12 +31,14 @@ void TagContentControllerV2::service(HttpRequest &request, HttpResponse &respons
void TagContentControllerV2::serviceContent(const int &library, const qulonglong &tagId, HttpResponse &response)
{
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(library);
QList<ComicDB> comics = DBHelper::getLabelComics(library, tagId);
QJsonArray items;
for (const ComicDB &comic : comics) {
items.append(YACReaderServerDataHelper::comicToJSON(library, comic));
items.append(YACReaderServerDataHelper::comicToJSON(library, libraryUuid, comic));
}
QJsonDocument output(items);

View File

@ -4,13 +4,9 @@
#include "yacreader_libraries.h"
#include "reading_list.h"
#include "../static.h"
#include "yacreader_global.h"
#include "yacreader_server_data_helper.h"
#include "QsLog.h"
using stefanfrings::HttpRequest;
using stefanfrings::HttpResponse;
@ -26,10 +22,12 @@ void TagsControllerV2::service(HttpRequest &request, HttpResponse &response)
QList<Label> labels = DBHelper::getLabels(libraryId);
auto libraryUuid = DBHelper::getLibraries().getLibraryIdFromLegacyId(libraryId);
QJsonArray items;
for (QList<Label>::const_iterator itr = labels.constBegin(); itr != labels.constEnd(); itr++) {
items.append(YACReaderServerDataHelper::labelToJSON(libraryId, *itr));
items.append(YACReaderServerDataHelper::labelToJSON(libraryId, libraryUuid, *itr));
}
QJsonDocument output(items);

View File

@ -1,5 +1,35 @@
#include "yacreader_server_data_helper.h"
void variantToJson(const QString &name, QMetaType::Type type, const QVariant &value, QJsonObject &json)
{
if (value.isNull() || !value.isValid()) {
return;
}
switch (type) {
case QMetaType::Bool:
json[name] = value.toBool();
break;
case QMetaType::Int:
json[name] = value.toInt();
break;
case QMetaType::Float:
json[name] = value.toFloat();
break;
case QMetaType::Double:
json[name] = value.toDouble();
break;
case QMetaType::LongLong:
json[name] = value.toLongLong();
break;
case QMetaType::QString:
json[name] = value.toString();
break;
default:
break;
}
}
QString YACReaderServerDataHelper::folderToYSFormat(const qulonglong libraryId, const Folder &folder)
{
return QString("f\x1F\t%1\x1F\t%2\x1F\t%3\x1F\t%4\x1F\t%5\x1E\r\n")
@ -23,13 +53,16 @@ QString YACReaderServerDataHelper::comicToYSFormat(const qulonglong libraryId, c
.arg(comic.info.read ? 1 : 0);
}
QJsonObject YACReaderServerDataHelper::folderToJSON(const qulonglong libraryId, const Folder &folder)
QJsonObject YACReaderServerDataHelper::folderToJSON(const qulonglong libraryId, const QUuid libraryUuid, const Folder &folder)
{
QJsonObject json;
json["type"] = "folder";
json["id"] = QString::number(folder.id);
json["library_id"] = QString::number(libraryId);
if (!libraryUuid.isNull()) {
json["library_uuid"] = libraryUuid.toString();
}
json["folder_name"] = folder.name;
json["num_children"] = folder.numChildren;
json["first_comic_hash"] = folder.firstChildHash;
@ -40,93 +73,116 @@ QJsonObject YACReaderServerDataHelper::folderToJSON(const qulonglong libraryId,
json["file_type"] = static_cast<typename std::underlying_type<YACReader::FileType>::type>(folder.type);
json["added"] = folder.added;
json["updated"] = folder.updated;
// 9.14
json["parent_id"] = QString::number(folder.parentId);
json["path"] = folder.path;
return json;
}
QJsonObject YACReaderServerDataHelper::comicToJSON(const qulonglong libraryId, const ComicDB &comic)
QJsonObject YACReaderServerDataHelper::comicToJSON(const qulonglong libraryId, const QUuid libraryUuid, const ComicDB &comic)
{
QJsonObject json;
json["type"] = "comic";
json["id"] = QString::number(comic.id);
json["parent_id"] = QString::number(comic.parentId); // 9.14
json["library_id"] = QString::number(libraryId);
if (!libraryUuid.isNull()) {
json["library_uuid"] = libraryUuid.toString();
}
json["file_name"] = comic.name;
json["file_size"] = QString::number(comic.getFileSize());
json["hash"] = comic.info.hash;
json["cover_page"] = comic.info.coverPage.toInt(); // 9.13
json["path"] = comic.path; // 9.14
json["current_page"] = comic.info.currentPage;
json["num_pages"] = comic.info.numPages.toInt();
json["read"] = comic.info.read;
json["cover_size_ratio"] = comic.info.coverSizeRatio.toFloat();
json["title"] = comic.info.title.toString();
json["number"] = comic.info.number.toInt(); // 9.13 legacy, kept for compatibility with old clients
json["universal_number"] = comic.info.number.toString(); // 9.13, text based number
json["last_time_opened"] = comic.info.lastTimeOpened.toLongLong();
auto type = comic.info.type.value<YACReader::FileType>();
json["manga"] = type == YACReader::FileType::Manga; // legacy, kept for compatibility with old clients
json["file_type"] = comic.info.type.toInt(); // 9.13
json["cover_size_ratio"] = comic.info.coverSizeRatio.toFloat();
// legacy
json["number"] = comic.info.number.toInt();
variantToJson("cover_page", QMetaType::Int, comic.info.coverPage, json);
variantToJson("title", QMetaType::QString, comic.info.title, json);
variantToJson("universal_number", QMetaType::QString, comic.info.number, json);
variantToJson("last_time_opened", QMetaType::LongLong, comic.info.lastTimeOpened, json);
variantToJson("added", QMetaType::LongLong, comic.info.added, json);
return json;
}
QJsonObject YACReaderServerDataHelper::fullComicToJSON(const qulonglong libraryId, const ComicDB &comic)
QJsonObject YACReaderServerDataHelper::fullComicToJSON(const qulonglong libraryId, const QUuid libraryUuid, const ComicDB &comic)
{
QJsonObject json = comicToJSON(libraryId, comic);
QJsonObject json = comicToJSON(libraryId, libraryUuid, comic);
json["volume"] = comic.info.volume.toString();
json["total_volume_count"] = comic.info.count.toInt();
json["genre"] = comic.info.genere.toString();
json["date"] = comic.info.date.toString();
json["synopsis"] = comic.info.synopsis.toString();
variantToJson("volume", QMetaType::QString, comic.info.volume, json);
variantToJson("total_volume_count", QMetaType::Int, comic.info.count, json);
variantToJson("genre", QMetaType::QString, comic.info.genere, json);
variantToJson("date", QMetaType::QString, comic.info.date, json);
variantToJson("synopsis", QMetaType::QString, comic.info.synopsis, json);
// 9.13
json["count"] = comic.info.count.toInt();
json["story_arc"] = comic.info.storyArc.toString();
json["arc_number"] = comic.info.arcNumber.toString();
json["arc_count"] = comic.info.arcCount.toInt();
json["writer"] = comic.info.writer.toString();
json["penciller"] = comic.info.penciller.toString();
json["inker"] = comic.info.inker.toString();
json["colorist"] = comic.info.colorist.toString();
json["letterer"] = comic.info.letterer.toString();
json["cover_artist"] = comic.info.coverArtist.toString();
json["publisher"] = comic.info.publisher.toString();
json["format"] = comic.info.format.toString();
json["color"] = comic.info.color.toBool();
json["age_rating"] = comic.info.ageRating.toString();
json["editor"] = comic.info.editor.toString();
json["characters"] = comic.info.characters.toString();
json["notes"] = comic.info.notes.toString();
json["added"] = comic.info.added.toLongLong();
json["editor"] = comic.info.editor.toString();
json["imprint"] = comic.info.imprint.toString();
json["teams"] = comic.info.teams.toString();
json["locations"] = comic.info.locations.toString();
json["series"] = comic.info.series.toString();
json["alternate_series"] = comic.info.alternateSeries.toString();
json["alternate_number"] = comic.info.alternateNumber.toString();
json["alternate_count"] = comic.info.alternateCount.toInt();
json["language_iso"] = comic.info.languageISO.toString();
json["series_group"] = comic.info.seriesGroup.toString();
json["main_character_or_team"] = comic.info.mainCharacterOrTeam.toString();
json["review"] = comic.info.review.toString();
json["tags"] = comic.info.tags.toString();
auto type = comic.info.type.value<YACReader::FileType>();
json["manga"] = type == YACReader::FileType::Manga; // legacy, kept for compatibility with old clients
json["file_type"] = comic.info.type.toInt(); // 9.13
variantToJson("count", QMetaType::Int, comic.info.count, json);
variantToJson("story_arc", QMetaType::QString, comic.info.storyArc, json);
variantToJson("arc_number", QMetaType::QString, comic.info.arcNumber, json);
variantToJson("arc_count", QMetaType::Int, comic.info.arcCount, json);
variantToJson("writer", QMetaType::QString, comic.info.writer, json);
variantToJson("penciller", QMetaType::QString, comic.info.penciller, json);
variantToJson("inker", QMetaType::QString, comic.info.inker, json);
variantToJson("colorist", QMetaType::QString, comic.info.colorist, json);
variantToJson("letterer", QMetaType::QString, comic.info.letterer, json);
variantToJson("cover_artist", QMetaType::QString, comic.info.coverArtist, json);
variantToJson("publisher", QMetaType::QString, comic.info.publisher, json);
variantToJson("format", QMetaType::QString, comic.info.format, json);
variantToJson("color", QMetaType::Bool, comic.info.color, json);
variantToJson("age_rating", QMetaType::QString, comic.info.ageRating, json);
variantToJson("editor", QMetaType::QString, comic.info.editor, json);
variantToJson("characters", QMetaType::QString, comic.info.characters, json);
variantToJson("notes", QMetaType::QString, comic.info.notes, json);
variantToJson("imprint", QMetaType::QString, comic.info.imprint, json);
variantToJson("teams", QMetaType::QString, comic.info.teams, json);
variantToJson("locations", QMetaType::QString, comic.info.locations, json);
variantToJson("series", QMetaType::QString, comic.info.series, json);
variantToJson("alternate_series", QMetaType::QString, comic.info.alternateSeries, json);
variantToJson("alternate_number", QMetaType::QString, comic.info.alternateNumber, json);
variantToJson("alternate_count", QMetaType::Int, comic.info.alternateCount, json);
variantToJson("language_iso", QMetaType::QString, comic.info.languageISO, json);
variantToJson("series_group", QMetaType::QString, comic.info.seriesGroup, json);
variantToJson("main_character_or_team", QMetaType::QString, comic.info.mainCharacterOrTeam, json);
variantToJson("review", QMetaType::QString, comic.info.review, json);
variantToJson("tags", QMetaType::QString, comic.info.tags, json);
// 9.14
json["rating"] = comic.info.rating;
variantToJson("comic_vine_id", QMetaType::QString, comic.info.comicVineID, json);
variantToJson("original_cover_size", QMetaType::QString, comic.info.originalCoverSize, json);
json["edited"] = comic.info.edited;
json["has_been_opened"] = comic.info.hasBeenOpened;
json["bookmark1"] = comic.info.bookmark1;
json["bookmark2"] = comic.info.bookmark2;
json["bookmark3"] = comic.info.bookmark3;
json["brightness"] = comic.info.brightness;
json["contrast"] = comic.info.contrast;
json["gamma"] = comic.info.gamma;
return json;
}
QJsonObject YACReaderServerDataHelper::readingListToJSON(const qulonglong libraryId, const ReadingList &readingList)
QJsonObject YACReaderServerDataHelper::readingListToJSON(const qulonglong libraryId, const QUuid libraryUuid, const ReadingList &readingList)
{
QJsonObject json;
json["type"] = "reading_list";
json["id"] = QString::number(readingList.getId());
json["library_id"] = QString::number(libraryId);
if (!libraryUuid.isNull()) {
json["library_uuid"] = libraryUuid.toString();
}
json["reading_list_name"] = readingList.getName();
// TODO
@ -136,13 +192,16 @@ QJsonObject YACReaderServerDataHelper::readingListToJSON(const qulonglong librar
return json;
}
QJsonObject YACReaderServerDataHelper::labelToJSON(const qulonglong libraryId, const Label &label)
QJsonObject YACReaderServerDataHelper::labelToJSON(const qulonglong libraryId, const QUuid libraryUuid, const Label &label)
{
QJsonObject json;
json["type"] = "label";
json["id"] = QString::number(label.getId());
json["library_id"] = QString::number(libraryId);
if (!libraryUuid.isNull()) {
json["library_uuid"] = libraryUuid.toString();
}
json["label_name"] = label.getName();
json["color_id"] = label.getColorID();

View File

@ -12,11 +12,11 @@ public:
static QString folderToYSFormat(const qulonglong libraryId, const Folder &folder);
static QString comicToYSFormat(const qulonglong libraryId, const ComicDB &comic);
static QJsonObject folderToJSON(const qulonglong libraryId, const Folder &folder);
static QJsonObject comicToJSON(const qulonglong libraryId, const ComicDB &comic);
static QJsonObject fullComicToJSON(const qulonglong libraryId, const ComicDB &comic);
static QJsonObject readingListToJSON(const qulonglong libraryId, const ReadingList &readingList);
static QJsonObject labelToJSON(const qulonglong libraryId, const Label &label);
static QJsonObject folderToJSON(const qulonglong libraryId, const QUuid libraryUuid, const Folder &folder);
static QJsonObject comicToJSON(const qulonglong libraryId, const QUuid libraryUuid, const ComicDB &comic);
static QJsonObject fullComicToJSON(const qulonglong libraryId, const QUuid libraryUuid, const ComicDB &comic);
static QJsonObject readingListToJSON(const qulonglong libraryId, const QUuid libraryUuid, const ReadingList &readingList);
static QJsonObject labelToJSON(const qulonglong libraryId, const QUuid libraryUuid, const Label &label);
private:
YACReaderServerDataHelper();