diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index 32cbcc00c..b9da5e95a 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -24,7 +24,7 @@ https://github.com/sponsors/martinrotter - + none diff --git a/src/librssguard/services/owncloud/owncloudnetworkfactory.cpp b/src/librssguard/services/owncloud/owncloudnetworkfactory.cpp index 92fe6399b..2710fed1a 100644 --- a/src/librssguard/services/owncloud/owncloudnetworkfactory.cpp +++ b/src/librssguard/services/owncloud/owncloudnetworkfactory.cpp @@ -19,9 +19,9 @@ OwnCloudNetworkFactory::OwnCloudNetworkFactory() : m_url(QString()), m_fixedUrl(QString()), m_downloadOnlyUnreadMessages(false), m_forceServerSideUpdate(false), - m_authUsername(QString()), m_authPassword(QString()), m_batchSize(OWNCLOUD_DEFAULT_BATCH_SIZE), m_urlUser(QString()), - m_urlStatus(QString()), m_urlFolders(QString()), m_urlFeeds(QString()), m_urlMessages(QString()), - m_urlFeedsUpdate(QString()), m_urlDeleteFeed(QString()), m_urlRenameFeed(QString()) {} + m_authUsername(QString()), m_authPassword(QString()), m_batchSize(OWNCLOUD_DEFAULT_BATCH_SIZE), + m_urlUser(QString()), m_urlStatus(QString()), m_urlFolders(QString()), m_urlFeeds(QString()), + m_urlMessages(QString()), m_urlFeedsUpdate(QString()), m_urlDeleteFeed(QString()), m_urlRenameFeed(QString()) {} OwnCloudNetworkFactory::~OwnCloudNetworkFactory() = default; @@ -81,25 +81,25 @@ OwnCloudStatusResponse OwnCloudNetworkFactory::status(const QNetworkProxy& custo headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); - NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlStatus, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QByteArray(), - result_raw, - QNetworkAccessManager::Operation::GetOperation, - headers, - false, - {}, - {}, - custom_proxy); + NetworkResult network_reply = + NetworkFactory::performNetworkOperation(m_urlStatus, + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), + QByteArray(), + result_raw, + QNetworkAccessManager::Operation::GetOperation, + headers, + false, + {}, + {}, + custom_proxy); OwnCloudStatusResponse status_response(network_reply.m_networkError, QString::fromUtf8(result_raw)); - qDebugNN << LOGSEC_NEXTCLOUD - << "Raw status data is:" << QUOTE_W_SPACE_DOT(result_raw); + qDebugNN << LOGSEC_NEXTCLOUD << "Raw status data is:" << QUOTE_W_SPACE_DOT(result_raw); if (network_reply.m_networkError != QNetworkReply::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Obtaining status info failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Obtaining status info failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); } @@ -113,21 +113,22 @@ OwnCloudGetFeedsCategoriesResponse OwnCloudNetworkFactory::feedsCategories(const headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); - NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlFolders, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QByteArray(), - result_raw, - QNetworkAccessManager::Operation::GetOperation, - headers, - false, - {}, - {}, - custom_proxy); + NetworkResult network_reply = + NetworkFactory::performNetworkOperation(m_urlFolders, + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), + QByteArray(), + result_raw, + QNetworkAccessManager::Operation::GetOperation, + headers, + false, + {}, + {}, + custom_proxy); if (network_reply.m_networkError != QNetworkReply::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Obtaining of categories failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Obtaining of categories failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); return OwnCloudGetFeedsCategoriesResponse(network_reply.m_networkError); } @@ -136,8 +137,9 @@ OwnCloudGetFeedsCategoriesResponse OwnCloudNetworkFactory::feedsCategories(const // Now, obtain feeds. network_reply = NetworkFactory::performNetworkOperation(m_urlFeeds, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), QByteArray(), result_raw, QNetworkAccessManager::Operation::GetOperation, @@ -148,8 +150,7 @@ OwnCloudGetFeedsCategoriesResponse OwnCloudNetworkFactory::feedsCategories(const custom_proxy); if (network_reply.m_networkError != QNetworkReply::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Obtaining of feeds failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Obtaining of feeds failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); return OwnCloudGetFeedsCategoriesResponse(network_reply.m_networkError); } @@ -167,21 +168,22 @@ bool OwnCloudNetworkFactory::deleteFeed(const QString& feed_id, const QNetworkPr headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); - NetworkResult network_reply = NetworkFactory::performNetworkOperation(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QByteArray(), - raw_output, - QNetworkAccessManager::Operation::DeleteOperation, - headers, - false, - {}, - {}, - custom_proxy); + NetworkResult network_reply = + NetworkFactory::performNetworkOperation(final_url, + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), + QByteArray(), + raw_output, + QNetworkAccessManager::Operation::DeleteOperation, + headers, + false, + {}, + {}, + custom_proxy); if (network_reply.m_networkError != QNetworkReply::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Obtaining of categories failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Obtaining of categories failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); return false; } @@ -210,21 +212,22 @@ bool OwnCloudNetworkFactory::createFeed(const QString& url, int parent_id, const headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); - NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlFeeds, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), - result_raw, - QNetworkAccessManager::Operation:: PostOperation, - headers, - false, - {}, - {}, - custom_proxy); + NetworkResult network_reply = + NetworkFactory::performNetworkOperation(m_urlFeeds, + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), + QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), + result_raw, + QNetworkAccessManager::Operation::PostOperation, + headers, + false, + {}, + {}, + custom_proxy); if (network_reply.m_networkError != QNetworkReply::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Creating of category failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Creating of category failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); return false; } @@ -247,21 +250,22 @@ bool OwnCloudNetworkFactory::renameFeed(const QString& new_name, headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); - NetworkResult network_reply = NetworkFactory::performNetworkOperation( - final_url, - qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(), - QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), - result_raw, - QNetworkAccessManager::Operation::PutOperation, - headers, - false, - {}, - {}, - custom_proxy); + NetworkResult network_reply = + NetworkFactory::performNetworkOperation(final_url, + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), + QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), + result_raw, + QNetworkAccessManager::Operation::PutOperation, + headers, + false, + {}, + {}, + custom_proxy); if (network_reply.m_networkError != QNetworkReply::NetworkError::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Renaming of feed failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Renaming of feed failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); return false; } @@ -285,22 +289,23 @@ OwnCloudGetMessagesResponse OwnCloudNetworkFactory::getMessages(int feed_id, con headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); - NetworkResult network_reply = NetworkFactory::performNetworkOperation(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QByteArray(), - result_raw, - QNetworkAccessManager::Operation::GetOperation, - headers, - false, - {}, - {}, - custom_proxy); + NetworkResult network_reply = + NetworkFactory::performNetworkOperation(final_url, + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), + QByteArray(), + result_raw, + QNetworkAccessManager::Operation::GetOperation, + headers, + false, + {}, + {}, + custom_proxy); OwnCloudGetMessagesResponse msgs_response(network_reply.m_networkError, QString::fromUtf8(result_raw)); if (network_reply.m_networkError != QNetworkReply::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Obtaining messages failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Obtaining messages failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); } @@ -315,22 +320,22 @@ QNetworkReply::NetworkError OwnCloudNetworkFactory::triggerFeedUpdate(int feed_i headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); - NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_urlFeedsUpdate.arg(authUsername(), - QString::number(feed_id)), - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), - QByteArray(), - raw_output, - QNetworkAccessManager::Operation::GetOperation, - headers, - false, - {}, - {}, - custom_proxy); + NetworkResult network_reply = + NetworkFactory::performNetworkOperation(m_urlFeedsUpdate.arg(authUsername(), QString::number(feed_id)), + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), + QByteArray(), + raw_output, + QNetworkAccessManager::Operation::GetOperation, + headers, + false, + {}, + {}, + custom_proxy); if (network_reply.m_networkError != QNetworkReply::NetworkError::NoError) { - qCriticalNN << LOGSEC_NEXTCLOUD - << "Feeds update failed with error" + qCriticalNN << LOGSEC_NEXTCLOUD << "Feeds update failed with error" << QUOTE_W_SPACE_DOT(network_reply.m_networkError); } @@ -365,8 +370,9 @@ NetworkResult OwnCloudNetworkFactory::markMessagesRead(RootItem::ReadStatus stat QByteArray output; return NetworkFactory::performNetworkOperation(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), output, QNetworkAccessManager::Operation::PutOperation, @@ -410,8 +416,9 @@ NetworkResult OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance i QByteArray output; return NetworkFactory::performNetworkOperation(final_url, - qApp->settings()->value(GROUP(Feeds), - SETTING(Feeds::UpdateTimeout)).toInt(), + qApp->settings() + ->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)) + .toInt(), QJsonDocument(json).toJson(QJsonDocument::JsonFormat::Compact), output, QNetworkAccessManager::Operation::PutOperation, @@ -438,9 +445,9 @@ void OwnCloudNetworkFactory::setDownloadOnlyUnreadMessages(bool dowload_only_unr m_downloadOnlyUnreadMessages = dowload_only_unread_messages; } -OwnCloudResponse::OwnCloudResponse(QNetworkReply::NetworkError response, const QString& raw_content) : - m_networkError(response), m_rawContent(QJsonDocument::fromJson(raw_content.toUtf8()).object()), - m_emptyString(raw_content.isEmpty()) {} +OwnCloudResponse::OwnCloudResponse(QNetworkReply::NetworkError response, const QString& raw_content) + : m_networkError(response), m_rawContent(QJsonDocument::fromJson(raw_content.toUtf8()).object()), + m_emptyString(raw_content.isEmpty()) {} OwnCloudResponse::~OwnCloudResponse() = default; @@ -512,10 +519,12 @@ RootItem* OwnCloudGetFeedsCategoriesResponse::feedsCategories(bool obtain_icons) if (!icon_path.isEmpty()) { QByteArray icon_data; - if (NetworkFactory::performNetworkOperation(icon_path, DOWNLOAD_TIMEOUT, - QByteArray(), icon_data, - QNetworkAccessManager::Operation::GetOperation).m_networkError == - QNetworkReply::NetworkError::NoError) { + if (NetworkFactory::performNetworkOperation(icon_path, + DOWNLOAD_TIMEOUT, + QByteArray(), + icon_data, + QNetworkAccessManager::Operation::GetOperation) + .m_networkError == QNetworkReply::NetworkError::NoError) { // Icon downloaded, set it up. QPixmap icon_pixmap; @@ -537,9 +546,7 @@ RootItem* OwnCloudGetFeedsCategoriesResponse::feedsCategories(bool obtain_icons) if (feed->title().isEmpty()) { if (feed->source().isEmpty()) { // We cannot add feed which has no title and no url to RSS Guard!!! - qCriticalNN << LOGSEC_NEXTCLOUD - << "Skipping feed with custom ID" - << QUOTE_W_SPACE(feed->customId()) + qCriticalNN << LOGSEC_NEXTCLOUD << "Skipping feed with custom ID" << QUOTE_W_SPACE(feed->customId()) << "from adding to RSS Guard because it has no title and url."; continue; } @@ -551,21 +558,21 @@ RootItem* OwnCloudGetFeedsCategoriesResponse::feedsCategories(bool obtain_icons) // NOTE: Starting with News 15.1.0, top-level feeds do not have parent folder ID 0, but JSON "null". // Luckily, if folder ID is not convertible to int, then default 0 value is returned. cats.value(QString::number(item[QSL("folderId")].toInt(0)))->appendChild(feed); - qDebugNN << LOGSEC_NEXTCLOUD - << "Custom ID of next fetched processed feed is" + qDebugNN << LOGSEC_NEXTCLOUD << "Custom ID of next fetched processed feed is" << QUOTE_W_SPACE_DOT(feed->customId()); } return parent; } -OwnCloudGetMessagesResponse::OwnCloudGetMessagesResponse(QNetworkReply::NetworkError response, const QString& raw_content) +OwnCloudGetMessagesResponse::OwnCloudGetMessagesResponse(QNetworkReply::NetworkError response, + const QString& raw_content) : OwnCloudResponse(response, raw_content) {} OwnCloudGetMessagesResponse::~OwnCloudGetMessagesResponse() = default; -QListOwnCloudGetMessagesResponse::messages() const { - QListmsgs; +QList OwnCloudGetMessagesResponse::messages() const { + QList msgs; auto json_items = m_rawContent[QSL("items")].toArray(); for (const QJsonValue& message : qAsConst(json_items)) { @@ -587,6 +594,11 @@ QListOwnCloudGetMessagesResponse::messages() const { enclosure.m_mimeType = message_map[QSL("enclosureMime")].toString(); enclosure.m_url = enclosure_link; + + if (enclosure.m_mimeType.isEmpty()) { + enclosure.m_mimeType = QSL("image/png"); + } + msg.m_enclosures.append(enclosure); } @@ -595,6 +607,15 @@ QListOwnCloudGetMessagesResponse::messages() const { msg.m_isRead = !message_map[QSL("unread")].toBool(); msg.m_title = message_map[QSL("title")].toString(); msg.m_url = message_map[QSL("url")].toString(); + + if (msg.m_title.simplified().isEmpty()) { + msg.m_title = message_map[QSL("mediaDescription")].toString(); + } + + if (msg.m_title.simplified().isEmpty()) { + msg.m_title = msg.m_url; + } + msgs.append(msg); }