From f8e09fa58983b5bbe050d62f59618e9da3364512 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Fri, 17 May 2024 09:34:21 +0200 Subject: [PATCH] try to enhance new approach to datetime parsing --- .../src/gmailnetworkfactory.cpp | 8 ++-- .../src/gmailnetworkfactory.h | 5 ++- .../src/parsers/atomparser.cpp | 4 +- .../src/parsers/atomparser.h | 2 +- .../src/parsers/feedparser.cpp | 18 +++++++-- .../src/parsers/feedparser.h | 13 +++++-- .../src/parsers/icalparser.cpp | 38 ++++++------------- .../src/parsers/icalparser.h | 14 ++++--- .../src/parsers/jsonparser.cpp | 5 ++- .../src/parsers/jsonparser.h | 2 +- .../src/parsers/rdfparser.cpp | 5 ++- .../src/parsers/rdfparser.h | 2 +- .../src/parsers/rssparser.cpp | 10 +++-- .../src/parsers/rssparser.h | 2 +- .../src/parsers/sitemapparser.cpp | 4 +- .../src/parsers/sitemapparser.h | 2 +- src/librssguard-standard/src/standardfeed.cpp | 8 ++++ src/librssguard-standard/src/standardfeed.h | 4 ++ .../src/standardserviceroot.cpp | 26 ++++++++++--- src/librssguard/miscellaneous/textfactory.cpp | 16 ++++++-- 20 files changed, 115 insertions(+), 73 deletions(-) diff --git a/src/librssguard-gmail/src/gmailnetworkfactory.cpp b/src/librssguard-gmail/src/gmailnetworkfactory.cpp index 17836ef90..ca327ee2e 100644 --- a/src/librssguard-gmail/src/gmailnetworkfactory.cpp +++ b/src/librssguard-gmail/src/gmailnetworkfactory.cpp @@ -511,7 +511,7 @@ void GmailNetworkFactory::onAuthFailed() { }}); } -bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id) const { +bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id) { // Assign correct main labels/states. auto labelids = json[QSL("labelIds")].toArray().toVariantList(); @@ -569,10 +569,10 @@ bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, msg.m_url = QSL("https://mail.google.com/mail/u/0/#all/%1").arg(msg.m_customId); msg.m_createdFromFeed = true; - msg.m_created = TextFactory::parseDateTime(headers[QSL("Date")]); + msg.m_created = TextFactory::parseDateTime(headers[QSL("Date")], &m_dateTimeFormat); if (!msg.m_created.isValid()) { - msg.m_created = TextFactory::parseDateTime(headers[QSL("date")]); + msg.m_created = TextFactory::parseDateTime(headers[QSL("date")], &m_dateTimeFormat); } if (msg.m_title.isEmpty()) { @@ -695,7 +695,7 @@ QMap GmailNetworkFactory::getMessageMetadata(const QString& ms QList GmailNetworkFactory::obtainAndDecodeFullMessages(const QStringList& message_ids, const QString& feed_id, - const QNetworkProxy& custom_proxy) const { + const QNetworkProxy& custom_proxy) { QHash msgs; int next_message = 0; QString bearer = m_oauth2->bearer(); diff --git a/src/librssguard-gmail/src/gmailnetworkfactory.h b/src/librssguard-gmail/src/gmailnetworkfactory.h index d4bdf226d..4ae5a62a5 100644 --- a/src/librssguard-gmail/src/gmailnetworkfactory.h +++ b/src/librssguard-gmail/src/gmailnetworkfactory.h @@ -74,10 +74,10 @@ class GmailNetworkFactory : public QObject { void onAuthFailed(); private: - bool fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id) const; + bool fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id); QList obtainAndDecodeFullMessages(const QStringList& message_ids, const QString& feed_id, - const QNetworkProxy& custom_proxy) const; + const QNetworkProxy& custom_proxy); QStringList decodeLiteMessages(const QString& messages_json_data, QString& next_page_token) const; QString sanitizeEmailAuthor(const QString& author) const; @@ -86,6 +86,7 @@ class GmailNetworkFactory : public QObject { private: GmailServiceRoot* m_service; QString m_username; + QString m_dateTimeFormat; int m_batchSize; bool m_downloadOnlyUnreadMessages; OAuth2Service* m_oauth2; diff --git a/src/librssguard-standard/src/parsers/atomparser.cpp b/src/librssguard-standard/src/parsers/atomparser.cpp index 9c558bc47..99c5e8a01 100644 --- a/src/librssguard-standard/src/parsers/atomparser.cpp +++ b/src/librssguard-standard/src/parsers/atomparser.cpp @@ -334,14 +334,14 @@ QString AtomParser::xmlMessageDescription(const QDomElement& msg_element) const return summary; } -QDateTime AtomParser::xmlMessageDateCreated(const QDomElement& msg_element) const { +QDateTime AtomParser::xmlMessageDateCreated(const QDomElement& msg_element) { QString updated = xmlTextsFromPath(msg_element, m_atomNamespace, QSL("updated"), true).join(QSL(", ")); if (updated.simplified().isEmpty()) { updated = xmlTextsFromPath(msg_element, m_atomNamespace, QSL("modified"), true).join(QSL(", ")); } - return TextFactory::parseDateTime(updated); + return TextFactory::parseDateTime(updated, &m_dateTimeFormat); } QString AtomParser::xmlMessageId(const QDomElement& msg_element) const { diff --git a/src/librssguard-standard/src/parsers/atomparser.h b/src/librssguard-standard/src/parsers/atomparser.h index addf9a431..562f2626a 100644 --- a/src/librssguard-standard/src/parsers/atomparser.h +++ b/src/librssguard-standard/src/parsers/atomparser.h @@ -26,7 +26,7 @@ class AtomParser : public FeedParser { virtual QString xmlMessageTitle(const QDomElement& msg_element) const; virtual QString xmlMessageDescription(const QDomElement& msg_element) const; - virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const; + virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element); virtual QString xmlMessageId(const QDomElement& msg_element) const; virtual QString xmlMessageUrl(const QDomElement& msg_element) const; virtual QList xmlMessageEnclosures(const QDomElement& msg_element) const; diff --git a/src/librssguard-standard/src/parsers/feedparser.cpp b/src/librssguard-standard/src/parsers/feedparser.cpp index 736bd0c12..cc8b8075d 100644 --- a/src/librssguard-standard/src/parsers/feedparser.cpp +++ b/src/librssguard-standard/src/parsers/feedparser.cpp @@ -15,6 +15,8 @@ #include #include +FeedParser::FeedParser() {} + FeedParser::FeedParser(QString data, DataType is_xml) : m_dataType(is_xml), m_data(std::move(data)), m_mrssNamespace(QSL("http://search.yahoo.com/mrss/")) { if (m_data.isEmpty()) { @@ -104,7 +106,7 @@ QString FeedParser::jsonMessageAuthor(const QJsonObject& msg_element) const { return {}; } -QDateTime FeedParser::jsonMessageDateCreated(const QJsonObject& msg_element) const { +QDateTime FeedParser::jsonMessageDateCreated(const QJsonObject& msg_element) { return {}; } @@ -136,7 +138,7 @@ QString FeedParser::objMessageUrl(const QVariant& msg_element) const { return {}; } -QString FeedParser::objMessageDescription(const QVariant& msg_element) const { +QString FeedParser::objMessageDescription(const QVariant& msg_element) { return {}; } @@ -144,7 +146,7 @@ QString FeedParser::objMessageAuthor(const QVariant& msg_element) const { return {}; } -QDateTime FeedParser::objMessageDateCreated(const QVariant& msg_element) const { +QDateTime FeedParser::objMessageDateCreated(const QVariant& msg_element) { return {}; } @@ -398,6 +400,14 @@ QStringList FeedParser::xmlTextsFromPath(const QDomElement& element, return result; } +QString FeedParser::dateTimeFormat() const { + return m_dateTimeFormat; +} + +void FeedParser::setDateTimeFormat(const QString& dt_format) { + m_dateTimeFormat = dt_format; +} + QString FeedParser::feedAuthor() const { return QL1S(""); } @@ -422,7 +432,7 @@ QString FeedParser::xmlMessageAuthor(const QDomElement& msg_element) const { return {}; } -QDateTime FeedParser::xmlMessageDateCreated(const QDomElement& msg_element) const { +QDateTime FeedParser::xmlMessageDateCreated(const QDomElement& msg_element) { return {}; } diff --git a/src/librssguard-standard/src/parsers/feedparser.h b/src/librssguard-standard/src/parsers/feedparser.h index b23d5cb54..e23641846 100644 --- a/src/librssguard-standard/src/parsers/feedparser.h +++ b/src/librssguard-standard/src/parsers/feedparser.h @@ -23,6 +23,7 @@ class FeedParser { Other }; + FeedParser(); explicit FeedParser(QString data, DataType is_xml = DataType::Xml); virtual ~FeedParser(); @@ -36,6 +37,9 @@ class FeedParser { // Returns list of all messages from the feed. virtual QList messages(); + QString dateTimeFormat() const; + void setDateTimeFormat(const QString& dt_format); + protected: virtual QString feedAuthor() const; @@ -45,7 +49,7 @@ class FeedParser { virtual QString xmlMessageUrl(const QDomElement& msg_element) const; virtual QString xmlMessageDescription(const QDomElement& msg_element) const; virtual QString xmlMessageAuthor(const QDomElement& msg_element) const; - virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const; + virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element); virtual QString xmlMessageId(const QDomElement& msg_element) const; virtual QList xmlMessageEnclosures(const QDomElement& msg_element) const; virtual QList xmlMessageCategories(const QDomElement& msg_element) const; @@ -57,7 +61,7 @@ class FeedParser { virtual QString jsonMessageUrl(const QJsonObject& msg_element) const; virtual QString jsonMessageDescription(const QJsonObject& msg_element) const; virtual QString jsonMessageAuthor(const QJsonObject& msg_element) const; - virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) const; + virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) ; virtual QString jsonMessageId(const QJsonObject& msg_element) const; virtual QList jsonMessageEnclosures(const QJsonObject& msg_element) const; virtual QList jsonMessageCategories(const QJsonObject& msg_element) const; @@ -67,9 +71,9 @@ class FeedParser { virtual QVariantList objMessageElements(); virtual QString objMessageTitle(const QVariant& msg_element) const; virtual QString objMessageUrl(const QVariant& msg_element) const; - virtual QString objMessageDescription(const QVariant& msg_element) const; + virtual QString objMessageDescription(const QVariant& msg_element) ; virtual QString objMessageAuthor(const QVariant& msg_element) const; - virtual QDateTime objMessageDateCreated(const QVariant& msg_element) const; + virtual QDateTime objMessageDateCreated(const QVariant& msg_element) ; virtual QString objMessageId(const QVariant& msg_element) const; virtual QList objMessageEnclosures(const QVariant& msg_element) const; virtual QList objMessageCategories(const QVariant& msg_element) const; @@ -87,6 +91,7 @@ class FeedParser { protected: DataType m_dataType; QString m_data; + QString m_dateTimeFormat; QDomDocument m_xml; QJsonDocument m_json; QString m_mrssNamespace; diff --git a/src/librssguard-standard/src/parsers/icalparser.cpp b/src/librssguard-standard/src/parsers/icalparser.cpp index 3f3c3d8f0..666280d53 100644 --- a/src/librssguard-standard/src/parsers/icalparser.cpp +++ b/src/librssguard-standard/src/parsers/icalparser.cpp @@ -106,17 +106,17 @@ QString IcalParser::objMessageUrl(const QVariant& msg_element) const { return comp.url(); } -QString IcalParser::objMessageDescription(const QVariant& msg_element) const { +QString IcalParser::objMessageDescription(const QVariant& msg_element) { const IcalendarComponent& comp_base = msg_element.value(); const EventComponent& comp = static_cast(comp_base); bool has_dt; - auto son = comp.startsOn(m_iCalendar.m_tzs, &has_dt).toLocalTime(); + auto son = comp.startsOn(m_iCalendar.m_tzs, &has_dt, &m_dateTimeFormat).toLocalTime(); QString formaton = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat) : QLocale().dateFormat(QLocale::FormatType::LongFormat); - auto soff = comp.endsOn(m_iCalendar.m_tzs, &has_dt).toLocalTime(); + auto soff = comp.endsOn(m_iCalendar.m_tzs, &has_dt, &m_dateTimeFormat).toLocalTime(); QString formatoff = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat) : QLocale().dateFormat(QLocale::FormatType::LongFormat); @@ -142,11 +142,11 @@ QString IcalParser::objMessageAuthor(const QVariant& msg_element) const { return comp.organizer(); } -QDateTime IcalParser::objMessageDateCreated(const QVariant& msg_element) const { +QDateTime IcalParser::objMessageDateCreated(const QVariant& msg_element) { const IcalendarComponent& comp_base = msg_element.value(); const EventComponent& comp = static_cast(comp_base); - QDateTime dat = comp.startsOn(m_iCalendar.m_tzs); + QDateTime dat = comp.startsOn(m_iCalendar.m_tzs, nullptr, &m_dateTimeFormat); return dat; } @@ -347,13 +347,12 @@ QDateTime IcalendarComponent::fixupDate(QDateTime dat, } } -QDateTime EventComponent::startsOn(const QMap& time_zones, bool* had_dt) const { +QDateTime EventComponent::startsOn(const QMap& time_zones, bool* had_dt, QString* dt_format) const { QString modifiers; - QString dt_format; bool has_dt; - QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTSTART"), modifiers).toString(), &dt_format); + QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTSTART"), modifiers).toString(), dt_format); - dat = fixupDate(dat, dt_format, time_zones, modifiers, &has_dt); + dat = fixupDate(dat, *dt_format, time_zones, modifiers, &has_dt); if (had_dt != nullptr) { *had_dt = has_dt; @@ -362,13 +361,12 @@ QDateTime EventComponent::startsOn(const QMap& time_zones, b return dat; } -QDateTime EventComponent::endsOn(const QMap& time_zones, bool* had_dt) const { +QDateTime EventComponent::endsOn(const QMap& time_zones, bool* had_dt, QString* dt_format) const { QString modifiers; - QString dt_format; bool has_dt; - QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTEND"), modifiers).toString(), &dt_format); + QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTEND"), modifiers).toString(), dt_format); - dat = fixupDate(dat, dt_format, time_zones, modifiers, &has_dt); + dat = fixupDate(dat, *dt_format, time_zones, modifiers, &has_dt); if (had_dt != nullptr) { *had_dt = has_dt; @@ -396,17 +394,3 @@ QString EventComponent::location() const { QString EventComponent::description() const { return getPropertyValue(QSL("DESCRIPTION")).toString(); } - -QDateTime EventComponent::created(const QMap& time_zones) const { - QString modifiers; - QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("CREATED"), modifiers).toString()); - - return fixupDate(dat, {}, time_zones, modifiers); -} - -QDateTime EventComponent::lastModified(const QMap& time_zones) const { - QString modifiers; - QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("LAST-MODIFIED"), modifiers).toString()); - - return fixupDate(dat, {}, time_zones, modifiers); -} diff --git a/src/librssguard-standard/src/parsers/icalparser.h b/src/librssguard-standard/src/parsers/icalparser.h index 566586ba5..23a150e51 100644 --- a/src/librssguard-standard/src/parsers/icalparser.h +++ b/src/librssguard-standard/src/parsers/icalparser.h @@ -31,15 +31,17 @@ Q_DECLARE_METATYPE(IcalendarComponent) class EventComponent : public IcalendarComponent { public: - QDateTime startsOn(const QMap& time_zones = {}, bool* had_dt = nullptr) const; - QDateTime endsOn(const QMap& time_zones = {}, bool* had_dt = nullptr) const; + QDateTime startsOn(const QMap& time_zones = {}, + bool* had_dt = nullptr, + QString* dt_format = nullptr) const; + QDateTime endsOn(const QMap& time_zones = {}, + bool* had_dt = nullptr, + QString* dt_format = nullptr) const; QString title() const; QString url() const; QString organizer() const; QString location() const; QString description() const; - QDateTime created(const QMap& time_zones = {}) const; - QDateTime lastModified(const QMap& time_zones = {}) const; }; Q_DECLARE_METATYPE(EventComponent) @@ -81,9 +83,9 @@ class IcalParser : public FeedParser { virtual QVariantList objMessageElements(); virtual QString objMessageTitle(const QVariant& msg_element) const; virtual QString objMessageUrl(const QVariant& msg_element) const; - virtual QString objMessageDescription(const QVariant& msg_element) const; + virtual QString objMessageDescription(const QVariant& msg_element); virtual QString objMessageAuthor(const QVariant& msg_element) const; - virtual QDateTime objMessageDateCreated(const QVariant& msg_element) const; + virtual QDateTime objMessageDateCreated(const QVariant& msg_element); virtual QString objMessageId(const QVariant& msg_element) const; virtual QList objMessageEnclosures(const QVariant& msg_element) const; virtual QList objMessageCategories(const QVariant& msg_element) const; diff --git a/src/librssguard-standard/src/parsers/jsonparser.cpp b/src/librssguard-standard/src/parsers/jsonparser.cpp index af49b56bb..8353ad22a 100644 --- a/src/librssguard-standard/src/parsers/jsonparser.cpp +++ b/src/librssguard-standard/src/parsers/jsonparser.cpp @@ -199,10 +199,11 @@ QString JsonParser::jsonMessageAuthor(const QJsonObject& msg_element) const { } } -QDateTime JsonParser::jsonMessageDateCreated(const QJsonObject& msg_element) const { +QDateTime JsonParser::jsonMessageDateCreated(const QJsonObject& msg_element) { return TextFactory::parseDateTime(msg_element.contains(QSL("date_modified")) ? msg_element[QSL("date_modified")].toString() - : msg_element[QSL("date_published")].toString()); + : msg_element[QSL("date_published")].toString(), + &m_dateTimeFormat); } QString JsonParser::jsonMessageId(const QJsonObject& msg_element) const { diff --git a/src/librssguard-standard/src/parsers/jsonparser.h b/src/librssguard-standard/src/parsers/jsonparser.h index 73faf512f..6a053d6db 100644 --- a/src/librssguard-standard/src/parsers/jsonparser.h +++ b/src/librssguard-standard/src/parsers/jsonparser.h @@ -25,7 +25,7 @@ class JsonParser : public FeedParser { virtual QString jsonMessageUrl(const QJsonObject& msg_element) const; virtual QString jsonMessageDescription(const QJsonObject& msg_element) const; virtual QString jsonMessageAuthor(const QJsonObject& msg_element) const; - virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) const; + virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) ; virtual QString jsonMessageId(const QJsonObject& msg_element) const; virtual QList jsonMessageEnclosures(const QJsonObject& msg_element) const; virtual QString jsonMessageRawContents(const QJsonObject& msg_element) const; diff --git a/src/librssguard-standard/src/parsers/rdfparser.cpp b/src/librssguard-standard/src/parsers/rdfparser.cpp index c9273f3fe..96f73920a 100644 --- a/src/librssguard-standard/src/parsers/rdfparser.cpp +++ b/src/librssguard-standard/src/parsers/rdfparser.cpp @@ -257,11 +257,12 @@ QString RdfParser::xmlMessageAuthor(const QDomElement& msg_element) const { return msg_element.elementsByTagNameNS(m_dcElNamespace, QSL("creator")).at(0).toElement().text(); } -QDateTime RdfParser::xmlMessageDateCreated(const QDomElement& msg_element) const { +QDateTime RdfParser::xmlMessageDateCreated(const QDomElement& msg_element) { return TextFactory::parseDateTime(msg_element.elementsByTagNameNS(m_dcElNamespace, QSL("date")) .at(0) .toElement() - .text()); + .text(), + &m_dateTimeFormat); } QString RdfParser::xmlMessageId(const QDomElement& msg_element) const { diff --git a/src/librssguard-standard/src/parsers/rdfparser.h b/src/librssguard-standard/src/parsers/rdfparser.h index bd2918a04..7b1fadd05 100644 --- a/src/librssguard-standard/src/parsers/rdfparser.h +++ b/src/librssguard-standard/src/parsers/rdfparser.h @@ -23,7 +23,7 @@ class RdfParser : public FeedParser { virtual QString xmlMessageTitle(const QDomElement& msg_element) const; virtual QString xmlMessageDescription(const QDomElement& msg_element) const; virtual QString xmlMessageAuthor(const QDomElement& msg_element) const; - virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const; + virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element); virtual QString xmlMessageId(const QDomElement& msg_element) const; virtual QString xmlMessageUrl(const QDomElement& msg_element) const; virtual QList xmlMessageEnclosures(const QDomElement& msg_element) const; diff --git a/src/librssguard-standard/src/parsers/rssparser.cpp b/src/librssguard-standard/src/parsers/rssparser.cpp index 5a1e8b849..635d7751a 100644 --- a/src/librssguard-standard/src/parsers/rssparser.cpp +++ b/src/librssguard-standard/src/parsers/rssparser.cpp @@ -280,15 +280,17 @@ QString RssParser::xmlMessageAuthor(const QDomElement& msg_element) const { return author; } -QDateTime RssParser::xmlMessageDateCreated(const QDomElement& msg_element) const { - QDateTime date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("pubDate")).toElement().text()); +QDateTime RssParser::xmlMessageDateCreated(const QDomElement& msg_element) { + QDateTime date_created = + TextFactory::parseDateTime(msg_element.namedItem(QSL("pubDate")).toElement().text(), &m_dateTimeFormat); if (date_created.isNull()) { - date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("date")).toElement().text()); + date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("date")).toElement().text(), &m_dateTimeFormat); } if (date_created.isNull()) { - date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("dc:modified")).toElement().text()); + date_created = + TextFactory::parseDateTime(msg_element.namedItem(QSL("dc:modified")).toElement().text(), &m_dateTimeFormat); } return date_created; diff --git a/src/librssguard-standard/src/parsers/rssparser.h b/src/librssguard-standard/src/parsers/rssparser.h index e74404599..2a4ce97d9 100644 --- a/src/librssguard-standard/src/parsers/rssparser.h +++ b/src/librssguard-standard/src/parsers/rssparser.h @@ -24,7 +24,7 @@ class RssParser : public FeedParser { virtual QString xmlMessageTitle(const QDomElement& msg_element) const; virtual QString xmlMessageDescription(const QDomElement& msg_element) const; virtual QString xmlMessageAuthor(const QDomElement& msg_element) const; - virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const; + virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element); virtual QString xmlMessageId(const QDomElement& msg_element) const; virtual QString xmlMessageUrl(const QDomElement& msg_element) const; virtual QList xmlMessageEnclosures(const QDomElement& msg_element) const; diff --git a/src/librssguard-standard/src/parsers/sitemapparser.cpp b/src/librssguard-standard/src/parsers/sitemapparser.cpp index 6d35ed7b5..98966feed 100644 --- a/src/librssguard-standard/src/parsers/sitemapparser.cpp +++ b/src/librssguard-standard/src/parsers/sitemapparser.cpp @@ -263,7 +263,7 @@ QString SitemapParser::xmlMessageDescription(const QDomElement& msg_element) con return xmlRawChild(msg_element.elementsByTagNameNS(sitemapVideoNamespace(), QSL("description")).at(0).toElement()); } -QDateTime SitemapParser::xmlMessageDateCreated(const QDomElement& msg_element) const { +QDateTime SitemapParser::xmlMessageDateCreated(const QDomElement& msg_element) { QString str_date = msg_element.elementsByTagNameNS(sitemapNamespace(), QSL("lastmod")).at(0).toElement().text(); if (str_date.isEmpty()) { @@ -271,7 +271,7 @@ QDateTime SitemapParser::xmlMessageDateCreated(const QDomElement& msg_element) c msg_element.elementsByTagNameNS(sitemapNewsNamespace(), QSL("publication_date")).at(0).toElement().text(); } - return TextFactory::parseDateTime(str_date); + return TextFactory::parseDateTime(str_date, &m_dateTimeFormat); } QString SitemapParser::xmlMessageId(const QDomElement& msg_element) const { diff --git a/src/librssguard-standard/src/parsers/sitemapparser.h b/src/librssguard-standard/src/parsers/sitemapparser.h index d6bebd4f2..19895d113 100644 --- a/src/librssguard-standard/src/parsers/sitemapparser.h +++ b/src/librssguard-standard/src/parsers/sitemapparser.h @@ -23,7 +23,7 @@ class SitemapParser : public FeedParser { virtual QString xmlMessageTitle(const QDomElement& msg_element) const; virtual QString xmlMessageUrl(const QDomElement& msg_element) const; virtual QString xmlMessageDescription(const QDomElement& msg_element) const; - virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const; + virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element); virtual QString xmlMessageId(const QDomElement& msg_element) const; virtual QList xmlMessageEnclosures(const QDomElement& msg_element) const; diff --git a/src/librssguard-standard/src/standardfeed.cpp b/src/librssguard-standard/src/standardfeed.cpp index 5b74f0675..1c8741931 100644 --- a/src/librssguard-standard/src/standardfeed.cpp +++ b/src/librssguard-standard/src/standardfeed.cpp @@ -426,6 +426,14 @@ bool StandardFeed::removeItself() { return DatabaseQueries::deleteFeed(database, this, getParentServiceRoot()->accountId()); } +QString StandardFeed::dateTimeFormat() const { + return m_dateTimeFormat; +} + +void StandardFeed::setDateTimeFormat(const QString& dt_format) { + m_dateTimeFormat = dt_format; +} + QString StandardFeed::lastEtag() const { return m_lastEtag; } diff --git a/src/librssguard-standard/src/standardfeed.h b/src/librssguard-standard/src/standardfeed.h index 0bb8038e3..7f64925ba 100644 --- a/src/librssguard-standard/src/standardfeed.h +++ b/src/librssguard-standard/src/standardfeed.h @@ -107,6 +107,9 @@ class StandardFeed : public Feed { QString lastEtag() const; void setLastEtag(const QString& etag); + QString dateTimeFormat() const; + void setDateTimeFormat(const QString& dt_format); + public slots: void fetchMetadataForItself(); @@ -119,6 +122,7 @@ class StandardFeed : public Feed { Type m_type; QString m_postProcessScript; QString m_encoding; + QString m_dateTimeFormat; NetworkFactory::NetworkAuthentication m_protection = NetworkFactory::NetworkAuthentication::NoAuthentication; QString m_username; QString m_password; diff --git a/src/librssguard-standard/src/standardserviceroot.cpp b/src/librssguard-standard/src/standardserviceroot.cpp index 4a941f51f..6cea9dbc7 100644 --- a/src/librssguard-standard/src/standardserviceroot.cpp +++ b/src/librssguard-standard/src/standardserviceroot.cpp @@ -322,36 +322,50 @@ QList StandardServiceRoot::obtainNewMessages(Feed* feed, // Feed data are downloaded and encoded. // Parse data and obtain messages. QList messages; + FeedParser* parser; switch (f->type()) { case StandardFeed::Type::Rss0X: case StandardFeed::Type::Rss2X: - messages = RssParser(formatted_feed_contents).messages(); + parser = new RssParser(formatted_feed_contents); break; case StandardFeed::Type::Rdf: - messages = RdfParser(formatted_feed_contents).messages(); + parser = new RdfParser(formatted_feed_contents); break; case StandardFeed::Type::Atom10: - messages = AtomParser(formatted_feed_contents).messages(); + parser = new AtomParser(formatted_feed_contents); break; case StandardFeed::Type::Json: - messages = JsonParser(formatted_feed_contents).messages(); + parser = new JsonParser(formatted_feed_contents); break; case StandardFeed::Type::iCalendar: - messages = IcalParser(formatted_feed_contents).messages(); + parser = new IcalParser(formatted_feed_contents); break; case StandardFeed::Type::Sitemap: - messages = SitemapParser(formatted_feed_contents).messages(); + parser = new SitemapParser(formatted_feed_contents); + break; default: break; } + if (!f->dateTimeFormat().isEmpty()) { + parser->setDateTimeFormat(f->dateTimeFormat()); + } + + messages = parser->messages(); + + if (!parser->dateTimeFormat().isEmpty()) { + f->setDateTimeFormat(parser->dateTimeFormat()); + } + + delete parser; + for (Message& mess : messages) { mess.m_feedId = feed->customId(); } diff --git a/src/librssguard/miscellaneous/textfactory.cpp b/src/librssguard/miscellaneous/textfactory.cpp index 7943fadcc..4454e8f1f 100644 --- a/src/librssguard/miscellaneous/textfactory.cpp +++ b/src/librssguard/miscellaneous/textfactory.cpp @@ -87,9 +87,15 @@ QDateTime TextFactory::parseDateTime(const QString& date_time, QString* used_dt_ return QDateTime(); } + QLocale locale(QLocale::Language::C); + QStringList built_in_patterns = dateTimePatterns(true); + QDateTime dt; - static QLocale locale(QLocale::Language::C); - static QStringList date_patterns = dateTimePatterns(true); + QStringList date_patterns = built_in_patterns; + + if (used_dt_format != nullptr && !used_dt_format->isEmpty()) { + built_in_patterns.prepend(*used_dt_format); + } // QDateTime dt1 = locale.toDateTime("GMT", "t"); // QString dt2 = dt1.toString(); @@ -126,12 +132,16 @@ QStringList TextFactory::dateTimePatterns(bool with_tzs) { QStringList pat; pat << QSL("yyyy-MM-ddTHH:mm:ss"); + pat << QSL("yyyy-MM-ddTHH:mm:ss.zzz"); pat << QSL("yyyy-MM-ddThh:mm:ss"); pat << QSL("yyyy-MM-dd HH:mm:ss.z"); + pat << QSL("yyyy-MM-ddThh:mm"); + pat << QSL("yyyyMMddThhmmss"); pat << QSL("yyyyMMdd"); pat << QSL("yyyy"); + pat << QSL("yyyy-MM-dd"); pat << QSL("yyyy-MM"); @@ -143,7 +153,7 @@ QStringList TextFactory::dateTimePatterns(bool with_tzs) { pat << QSL("ddd, dd MMM yy HH:mm:ss"); pat << QSL("ddd, d MMM yyyy HH:mm:ss"); - // Thu, 07 Mar 2024 01 : 12 : 13 GMT + pat << QSL("ddd, MM/dd/yyyy - HH:mm"); pat << QSL("dd MMM yyyy hh:mm:ss"); pat << QSL("dd MMM yyyy");