fix article decoding for newscloud news, fixes #814

This commit is contained in:
Martin Rotter 2022-10-05 09:17:14 +02:00
parent a165aac4ce
commit 4b5de586da
2 changed files with 142 additions and 121 deletions

View file

@ -24,7 +24,7 @@
<url type="donation">https://github.com/sponsors/martinrotter</url> <url type="donation">https://github.com/sponsors/martinrotter</url>
<content_rating type="oars-1.1" /> <content_rating type="oars-1.1" />
<releases> <releases>
<release version="4.2.5" date="2022-09-30"/> <release version="4.2.5" date="2022-10-05"/>
</releases> </releases>
<content_rating type="oars-1.0"> <content_rating type="oars-1.0">
<content_attribute id="violence-cartoon">none</content_attribute> <content_attribute id="violence-cartoon">none</content_attribute>

View file

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