Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "3600"
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: release64/signed

- name: Replace with signed executables
Expand Down Expand Up @@ -374,7 +374,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "3600"
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: ci/win/Output/signed

- name: Replace with signed installer
Expand Down Expand Up @@ -487,7 +487,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "3600"
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: release64/signed

- name: Replace with signed executables
Expand Down Expand Up @@ -540,7 +540,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "3600"
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: ci/win/Output/signed

- name: Replace with signed installer
Expand Down Expand Up @@ -636,6 +636,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: 'release/signed'

- name: Replace executables with signed versions
Expand Down Expand Up @@ -683,6 +684,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: 'ci/win/Output/signed'

- name: Replace with signed installer and cleanup
Expand Down Expand Up @@ -772,7 +774,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_executables.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "3600"
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: release/signed

- name: Replace with signed executables
Expand Down Expand Up @@ -825,7 +827,7 @@ jobs:
artifact-configuration-slug: 'zipped-files'
github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: "3600"
wait-for-completion-timeout-in-seconds: "7200"
output-artifact-directory: ci/win/Output/signed

- name: Replace with signed installer
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

Version counting is based on semantic versioning (Major.Feature.Patch)

## 9.16.2

### YACReaderLibrary
* New customizable User Agent string to use it with Comic Vine. It can be set in YACReaderLibrary.ini in the [ComicVine] section using the `COMIC_VINE_USER_AGENT` key.
* Prevent crash when opening the folders context menu if a folder is not selected.
* Fix crash when using the `Set type` menu on libraries.

## 9.16.1

### YACReaderLibrary
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
#include <QJsonDocument>
#include <QJsonObject>

ComicVineAllVolumeComicsRetriever::ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, QObject *parent)
: QObject(parent), volumeURLString(volumeURLString)
ComicVineAllVolumeComicsRetriever::ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, const QString &userAgent, QObject *parent)
: QObject(parent), volumeURLString(volumeURLString), userAgent(userAgent)
{
}

Expand All @@ -19,7 +19,7 @@ void ComicVineAllVolumeComicsRetriever::getAllVolumeComics()

void ComicVineAllVolumeComicsRetriever::getAllVolumeComics(int range)
{
HttpWorker *search = new HttpWorker(volumeURLString.arg(range));
HttpWorker *search = new HttpWorker(volumeURLString.arg(range), userAgent);
connect(search, &HttpWorker::dataReady, this, &ComicVineAllVolumeComicsRetriever::appendVolumeComicsInfo);
connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::timeOut);
connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::finished);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class ComicVineAllVolumeComicsRetriever : public QObject
{
Q_OBJECT
public:
explicit ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, QObject *parent = nullptr);
explicit ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, const QString &userAgent, QObject *parent = nullptr);
void getAllVolumeComics();

protected:
Expand All @@ -21,6 +21,7 @@ protected slots:

protected:
QString volumeURLString;
QString userAgent;
QList<QByteArray> jsonResponses;

QString consolidateJSON();
Expand Down
35 changes: 25 additions & 10 deletions YACReaderLibrary/comic_vine/comic_vine_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ ComicVineClient::ComicVineClient(QObject *parent)
settings = new QSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat); // TODO unificar la creación del fichero de config con el servidor
settings->beginGroup("ComicVine");
baseURL = settings->value(COMIC_VINE_BASE_URL, "https://comicvine.gamespot.com/api").toString();
userAgent = settings->value(COMIC_VINE_USER_AGENT, DEFAULT_USER_AGENT).toString();
}

ComicVineClient::~ComicVineClient()
Expand All @@ -70,7 +71,9 @@ ComicVineClient::~ComicVineClient()
// CV_SEARCH
void ComicVineClient::search(const QString &query, int page)
{
HttpWorker *search = new HttpWorker(QString(CV_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg(page));
HttpWorker *search = new HttpWorker(
QString(CV_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg(page),
userAgent);
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessVolumesSearchData);
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
connect(search, &QThread::finished, search, &QObject::deleteLater);
Expand All @@ -80,7 +83,9 @@ void ComicVineClient::search(const QString &query, int page)
// CV_EXACT_VOLUME_SEARCH
void ComicVineClient::searchExactVolume(const QString &query, int page)
{
HttpWorker *search = new HttpWorker(QString(CV_EXACT_VOLUME_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg((page - 1) * 100));
HttpWorker *search = new HttpWorker(
QString(CV_EXACT_VOLUME_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg((page - 1) * 100),
userAgent);
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessVolumesSearchData);
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
connect(search, &QThread::finished, search, &QObject::deleteLater);
Expand Down Expand Up @@ -119,7 +124,9 @@ void ComicVineClient::proccessComicDetailData(const QByteArray &data)
// CV_SERIES_DETAIL
void ComicVineClient::getSeriesDetail(const QString &id)
{
HttpWorker *search = new HttpWorker(QString(CV_SERIES_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id));
HttpWorker *search = new HttpWorker(
QString(CV_SERIES_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id),
userAgent);
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessSeriesDetailData);
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
connect(search, &QThread::finished, search, &QObject::deleteLater);
Expand All @@ -128,7 +135,7 @@ void ComicVineClient::getSeriesDetail(const QString &id)

void ComicVineClient::getSeriesCover(const QString &url)
{
auto search = new HttpWorker(url);
auto search = new HttpWorker(url, userAgent);
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::seriesCover);
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
connect(search, &QThread::finished, search, &QObject::deleteLater);
Expand All @@ -138,7 +145,9 @@ void ComicVineClient::getSeriesCover(const QString &url)
// CV_COMIC_IDS
void ComicVineClient::getVolumeComicsInfo(const QString &idVolume, int page)
{
HttpWorker *search = new HttpWorker(QString(CV_COMICS_INFO).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(idVolume).arg((page - 1) * 100));
HttpWorker *search = new HttpWorker(
QString(CV_COMICS_INFO).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(idVolume).arg((page - 1) * 100),
userAgent);
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::processVolumeComicsInfo);
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
connect(search, &QThread::finished, search, &QObject::deleteLater);
Expand All @@ -148,7 +157,7 @@ void ComicVineClient::getVolumeComicsInfo(const QString &idVolume, int page)
void ComicVineClient::getAllVolumeComicsInfo(const QString &idVolume)
{
QString url = QString(CV_COMICS_INFO).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(idVolume);
auto comicsRetriever = new ComicVineAllVolumeComicsRetriever(url);
auto comicsRetriever = new ComicVineAllVolumeComicsRetriever(url, userAgent);

connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::allVolumeComicsInfo, this, &ComicVineClient::volumeComicsInfo);
connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::finished, this, &ComicVineClient::finished);
Expand All @@ -168,7 +177,9 @@ void ComicVineClient::getComicId(const QString &id, int comicNumber)
// CV_COMIC_DETAIL
QByteArray ComicVineClient::getComicDetail(const QString &id, bool &outError, bool &outTimeout)
{
HttpWorker *search = new HttpWorker(QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id));
HttpWorker *search = new HttpWorker(
QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id),
userAgent);

// connect(search,SIGNAL(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &)));
// connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut()));
Expand All @@ -186,7 +197,9 @@ QByteArray ComicVineClient::getComicDetail(const QString &id, bool &outError, bo
// CV_COMIC_DETAIL
void ComicVineClient::getComicDetailAsync(const QString &id)
{
HttpWorker *search = new HttpWorker(QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id));
HttpWorker *search = new HttpWorker(
QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id),
userAgent);

connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessComicDetailData);
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
Expand All @@ -197,7 +210,9 @@ void ComicVineClient::getComicDetailAsync(const QString &id)
// CV_STORY_ARC_DETAIL
QByteArray ComicVineClient::getStoryArcDetail(const QString &id, bool &outError, bool &outTimeout)
{
HttpWorker *search = new HttpWorker(QString(CV_STORY_ARC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id));
HttpWorker *search = new HttpWorker(
QString(CV_STORY_ARC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id),
userAgent);

// connect(search,SIGNAL(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &)));
// connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut()));
Expand All @@ -214,7 +229,7 @@ QByteArray ComicVineClient::getStoryArcDetail(const QString &id, bool &outError,

void ComicVineClient::getComicCover(const QString &url)
{
auto search = new HttpWorker(url);
auto search = new HttpWorker(url, userAgent);
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::comicCover);
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
connect(search, &QThread::finished, search, &QObject::deleteLater);
Expand Down
1 change: 1 addition & 0 deletions YACReaderLibrary/comic_vine/comic_vine_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,6 @@ protected slots:
protected:
QSettings *settings;
QString baseURL;
QString userAgent;
};
#endif // COMIC_VINE_CLIENT_H
59 changes: 43 additions & 16 deletions YACReaderLibrary/db/folder_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,35 @@ void FolderModel::takeUpdatedChildrenInfo(FolderItem *parent, const QModelIndex
}
}

Folder FolderModel::folderFromItem(FolderItem *folderItem)
{
auto name = folderItem->data(FolderModel::Name).toString();
auto parentItem = folderItem->parent();

QString path;
if (parentItem == nullptr) {
parentItem = rootItem;
path = "/";
} else {
path = parentItem->data(Columns::Path).toString() + "/" + name;
}

auto folder = Folder(folderItem->id,
parentItem->id,
name,
path,
folderItem->data(Columns::Completed).toBool(),
folderItem->data(Columns::Finished).toBool(),
folderItem->data(Columns::NumChildren).toInt(),
folderItem->data(Columns::FirstChildHash).toString(),
folderItem->data(Columns::CustomImage).toString(),
folderItem->data(Columns::Type).value<YACReader::FileType>(),
folderItem->data(Columns::Added).toLongLong(),
folderItem->data(Columns::Updated).toLongLong());

return folder;
}

void FolderModel::reload(const QModelIndex &index)
{
// TODO: reload just the content under index for better efficiency
Expand Down Expand Up @@ -790,25 +819,23 @@ FolderModel *FolderModel::getSubfoldersModel(const QModelIndex &mi)
return model;
}

Folder FolderModel::getRootFolder()
{
if (this->rootItem == nullptr) {
return Folder();
}

return folderFromItem(this->rootItem);
}

Folder FolderModel::getFolder(const QModelIndex &mi)
{
auto folderItem = static_cast<FolderItem *>(mi.internalPointer());
auto name = folderItem->data(FolderModel::Name).toString();
auto parentItem = folderItem->parent();
auto folder = Folder(folderItem->id,
parentItem->id,
name,
folderItem->parent()->data(Columns::Path).toString() + "/" + name,
folderItem->data(Columns::Completed).toBool(),
folderItem->data(Columns::Finished).toBool(),
folderItem->data(Columns::NumChildren).toInt(),
folderItem->data(Columns::FirstChildHash).toString(),
folderItem->data(Columns::CustomImage).toString(),
folderItem->data(Columns::Type).value<YACReader::FileType>(),
folderItem->data(Columns::Added).toLongLong(),
folderItem->data(Columns::Updated).toLongLong());
if (!mi.isValid()) {
return Folder();
}

return folder;
auto folderItem = static_cast<FolderItem *>(mi.internalPointer());
return folderFromItem(folderItem);
}

QModelIndex FolderModel::getIndexFromFolderId(qulonglong folderId, const QModelIndex &parent)
Expand Down
3 changes: 3 additions & 0 deletions YACReaderLibrary/db/folder_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ class FolderModel : public QAbstractItemModel
QStringList getSubfoldersNames(const QModelIndex &mi);
FolderModel *getSubfoldersModel(const QModelIndex &mi); // it creates a model that contains just the direct subfolders

Folder getRootFolder();
Folder getFolder(const QModelIndex &mi);
QModelIndex getIndexFromFolderId(qulonglong folderId, const QModelIndex &parent = QModelIndex());
QModelIndex getIndexFromFolder(const Folder &folder, const QModelIndex &parent = QModelIndex());
Expand Down Expand Up @@ -133,6 +134,8 @@ public slots:
// parent contains the current data in the model (parentModelIndex is its index), updated contains fresh info loaded from the DB,
void takeUpdatedChildrenInfo(FolderItem *parent, const QModelIndex &parentModelIndex, FolderItem *updated);

Folder folderFromItem(FolderItem *item);

FolderItem *rootItem; // items tree
QMap<unsigned long long int, FolderItem *> items; // items lookup

Expand Down
6 changes: 4 additions & 2 deletions YACReaderLibrary/library_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -608,8 +608,7 @@ void LibraryWindow::createMenus()
auto typeMenu = new QMenu(tr("Set type"), selectedLibrary);

connect(typeMenu, &QMenu::aboutToShow, this, [=]() {
auto rootIndex = foldersModel->index(0, 0);
auto folder = foldersModel->getFolder(rootIndex);
auto folder = foldersModel->getRootFolder();
setupActions(folder.type);
});

Expand Down Expand Up @@ -2594,6 +2593,9 @@ void LibraryWindow::showFoldersContextMenu(const QPoint &point)
{
QModelIndex sourceMI = foldersModelProxy->mapToSource(foldersView->indexAt(point));

if (!sourceMI.isValid())
return;

auto folder = foldersModel->getFolder(sourceMI);

actions.setFolderAsNormalAction->setCheckable(true);
Expand Down
4 changes: 3 additions & 1 deletion common/check_new_version.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "check_new_version.h"

#include "yacreader_global.h"

#include <QUrl>
#include <QtGlobal>
#include <QStringList>
Expand All @@ -14,7 +16,7 @@
#define PREVIOUS_VERSION_TESTING "6.0.0"

HttpVersionChecker::HttpVersionChecker()
: HttpWorker("https://raw.githubusercontent.com/YACReader/yacreader/master/common/yacreader_global.h")
: HttpWorker("https://raw.githubusercontent.com/YACReader/yacreader/master/common/yacreader_global.h", DEFAULT_USER_AGENT)
{
connect(this, &HttpVersionChecker::dataReady, this, QOverload<const QByteArray &>::of(&HttpVersionChecker::checkNewVersion));
}
Expand Down
6 changes: 3 additions & 3 deletions common/http_worker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@

#define PREVIOUS_VERSION "6.0.0"

HttpWorker::HttpWorker(const QString &urlString)
: QThread(), url(urlString), _error(false), _timeout(false)
HttpWorker::HttpWorker(const QString &urlString, const QString &userAgent)
: QThread(), url(urlString), userAgent(userAgent), _error(false), _timeout(false)
{
}

Expand Down Expand Up @@ -50,7 +50,7 @@ void HttpWorker::run()
auto request = QNetworkRequest(url);

request.setHeader(QNetworkRequest::UserAgentHeader,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0 Safari/537.36");
userAgent);

QNetworkReply *reply = manager.get(request);

Expand Down
Loading
Loading