diff --git a/src/post.cpp b/src/post.cpp index 2d3179b..035cfca 100644 --- a/src/post.cpp +++ b/src/post.cpp @@ -27,7 +27,7 @@ Post::Post(QObject *parent) : QObject(parent) } -Post::Post(QJsonObject post, QObject *parent) : QObject(parent) +Post::Post(QJsonObject post, QNetworkAccessManager *networkManager, QObject *parent) : QObject(parent) { mTitle = html2text(post.value("title").toString().trimmed()); mFeedTitle = html2text(post.value("feed_title").toString().trimmed()); @@ -48,6 +48,18 @@ Post::Post(QJsonObject post, QObject *parent) : QObject(parent) QJsonDocument doc(post); QString result(doc.toJson(QJsonDocument::Indented)); mJsonString = result; + + mNetworkManager = networkManager; + cacheImgs(); + + QObject::connect(this, &Post::contentChanged, [this]() { + QJsonObject obj = QJsonDocument::fromJson(mJsonString.toUtf8()).object(); + obj["content"] = QJsonValue(mContent); + QJsonDocument doc(obj); + QString result(doc.toJson(QJsonDocument::Indented)); + mJsonString = result; + emit jsonStringChanged(mJsonString); + }); } Post::~Post() @@ -77,3 +89,42 @@ QString Post::html2text(const QString htmlString) doc.setHtml(htmlString); return doc.toPlainText(); } + +void Post::cacheImgs() +{ + QRegExp imgTagRegex("\\]*src\\s*=\\s*\"([^\"]*)\"[^\\>]*\\>", Qt::CaseInsensitive); + imgTagRegex.setMinimal(true); + QStringList urlmatches; + int offset = 0; + while( (offset = imgTagRegex.indexIn(mContent, offset)) != -1){ + offset += imgTagRegex.matchedLength(); + urlmatches.append(imgTagRegex.cap(1)); // Should hold only src property + } + + for(QString url : urlmatches) { + + if(url.startsWith("http")) { + QNetworkRequest request(url); + QNetworkReply *reply = mNetworkManager->get(request); + + connect(reply, &QNetworkReply::finished, [url, this, reply] () { + if (reply) { + if (reply->error() == QNetworkReply::NoError) { + QVariant mimeType(reply->header(QNetworkRequest::ContentTypeHeader)); + QString imgString = QString("data:") + mimeType.toString() + QString(";base64,") + QString(reply->readAll().toBase64()); + if(mimeType == "image/jpeg" || mimeType == "image/gif" || mimeType == "image/png") + { + mContent = mContent.replace(url, imgString); + emit contentChanged(mContent); + } + } else { + int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + //do some error management + qWarning() << "HTTP error: " << httpStatus; + } + reply->deleteLater(); + } + }); + } + } +} diff --git a/src/post.h b/src/post.h index 56ab9ff..9fa4c73 100644 --- a/src/post.h +++ b/src/post.h @@ -24,6 +24,7 @@ #include #include #include +#include class Post : public QObject { @@ -35,16 +36,16 @@ class Post : public QObject Q_PROPERTY(QString author READ author CONSTANT) Q_PROPERTY(QUrl link READ link CONSTANT) Q_PROPERTY(QDateTime date READ date CONSTANT) - Q_PROPERTY(QString content READ content CONSTANT) + Q_PROPERTY(QString content READ content NOTIFY contentChanged) Q_PROPERTY(QString excerpt READ excerpt CONSTANT) Q_PROPERTY(bool starred READ starred NOTIFY starredChanged) Q_PROPERTY(bool read READ read WRITE setRead NOTIFY readChanged) Q_PROPERTY(bool dontChangeRead READ dontChangeRead WRITE setDontChangeRead NOTIFY dontChangeReadChanged) - Q_PROPERTY(QString jsonString READ jsonString CONSTANT) + Q_PROPERTY(QString jsonString READ jsonString NOTIFY jsonStringChanged) public: Post(QObject *parent = 0); - Post(QJsonObject post, QObject *parent = 0); + Post(QJsonObject post, QNetworkAccessManager *networkManager, QObject *parent = 0); ~Post(); QString title() const { return mTitle; } QString feedTitle() const { return mFeedTitle; } @@ -63,9 +64,11 @@ public: QString jsonString() const { return mJsonString; } signals: + void contentChanged(QString); void starredChanged(bool); void readChanged(bool); void dontChangeReadChanged(bool); + void jsonStringChanged(QString); public slots: @@ -83,7 +86,10 @@ private: bool mRead; bool mDontChangeRead; QString mJsonString; + QString html2text(const QString htmlString); + void cacheImgs(); + QNetworkAccessManager *mNetworkManager; }; #endif // POST_H diff --git a/src/tinytinyrss.cpp b/src/tinytinyrss.cpp index 4806c04..3cc5ae0 100644 --- a/src/tinytinyrss.cpp +++ b/src/tinytinyrss.cpp @@ -62,7 +62,7 @@ void TinyTinyRSS::reload() for(int i = 0; i < posts.count(); i++) { QJsonObject postJson = posts.at(i).toObject(); - Post *post = new Post(postJson, this); + Post *post = new Post(postJson, mNetworkManager, this); connect(post, SIGNAL(readChanged(bool)), this, SLOT(onPostReadChanged(bool))); mPosts.append(post); }