try to enhance new approach to datetime parsing
This commit is contained in:
parent
526c4d62d3
commit
f8e09fa589
20 changed files with 115 additions and 73 deletions
|
@ -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.
|
// Assign correct main labels/states.
|
||||||
auto labelids = json[QSL("labelIds")].toArray().toVariantList();
|
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_url = QSL("https://mail.google.com/mail/u/0/#all/%1").arg(msg.m_customId);
|
||||||
|
|
||||||
msg.m_createdFromFeed = true;
|
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()) {
|
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()) {
|
if (msg.m_title.isEmpty()) {
|
||||||
|
@ -695,7 +695,7 @@ QMap<QString, QString> GmailNetworkFactory::getMessageMetadata(const QString& ms
|
||||||
|
|
||||||
QList<Message> GmailNetworkFactory::obtainAndDecodeFullMessages(const QStringList& message_ids,
|
QList<Message> GmailNetworkFactory::obtainAndDecodeFullMessages(const QStringList& message_ids,
|
||||||
const QString& feed_id,
|
const QString& feed_id,
|
||||||
const QNetworkProxy& custom_proxy) const {
|
const QNetworkProxy& custom_proxy) {
|
||||||
QHash<QString, Message> msgs;
|
QHash<QString, Message> msgs;
|
||||||
int next_message = 0;
|
int next_message = 0;
|
||||||
QString bearer = m_oauth2->bearer();
|
QString bearer = m_oauth2->bearer();
|
||||||
|
|
|
@ -74,10 +74,10 @@ class GmailNetworkFactory : public QObject {
|
||||||
void onAuthFailed();
|
void onAuthFailed();
|
||||||
|
|
||||||
private:
|
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<Message> obtainAndDecodeFullMessages(const QStringList& message_ids,
|
QList<Message> obtainAndDecodeFullMessages(const QStringList& message_ids,
|
||||||
const QString& feed_id,
|
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;
|
QStringList decodeLiteMessages(const QString& messages_json_data, QString& next_page_token) const;
|
||||||
QString sanitizeEmailAuthor(const QString& author) const;
|
QString sanitizeEmailAuthor(const QString& author) const;
|
||||||
|
|
||||||
|
@ -86,6 +86,7 @@ class GmailNetworkFactory : public QObject {
|
||||||
private:
|
private:
|
||||||
GmailServiceRoot* m_service;
|
GmailServiceRoot* m_service;
|
||||||
QString m_username;
|
QString m_username;
|
||||||
|
QString m_dateTimeFormat;
|
||||||
int m_batchSize;
|
int m_batchSize;
|
||||||
bool m_downloadOnlyUnreadMessages;
|
bool m_downloadOnlyUnreadMessages;
|
||||||
OAuth2Service* m_oauth2;
|
OAuth2Service* m_oauth2;
|
||||||
|
|
|
@ -334,14 +334,14 @@ QString AtomParser::xmlMessageDescription(const QDomElement& msg_element) const
|
||||||
return summary;
|
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(", "));
|
QString updated = xmlTextsFromPath(msg_element, m_atomNamespace, QSL("updated"), true).join(QSL(", "));
|
||||||
|
|
||||||
if (updated.simplified().isEmpty()) {
|
if (updated.simplified().isEmpty()) {
|
||||||
updated = xmlTextsFromPath(msg_element, m_atomNamespace, QSL("modified"), true).join(QSL(", "));
|
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 {
|
QString AtomParser::xmlMessageId(const QDomElement& msg_element) const {
|
||||||
|
|
|
@ -26,7 +26,7 @@ class AtomParser : public FeedParser {
|
||||||
|
|
||||||
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageDescription(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 xmlMessageId(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
||||||
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
|
|
||||||
|
FeedParser::FeedParser() {}
|
||||||
|
|
||||||
FeedParser::FeedParser(QString data, DataType is_xml)
|
FeedParser::FeedParser(QString data, DataType is_xml)
|
||||||
: m_dataType(is_xml), m_data(std::move(data)), m_mrssNamespace(QSL("http://search.yahoo.com/mrss/")) {
|
: m_dataType(is_xml), m_data(std::move(data)), m_mrssNamespace(QSL("http://search.yahoo.com/mrss/")) {
|
||||||
if (m_data.isEmpty()) {
|
if (m_data.isEmpty()) {
|
||||||
|
@ -104,7 +106,7 @@ QString FeedParser::jsonMessageAuthor(const QJsonObject& msg_element) const {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime FeedParser::jsonMessageDateCreated(const QJsonObject& msg_element) const {
|
QDateTime FeedParser::jsonMessageDateCreated(const QJsonObject& msg_element) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +138,7 @@ QString FeedParser::objMessageUrl(const QVariant& msg_element) const {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
QString FeedParser::objMessageDescription(const QVariant& msg_element) const {
|
QString FeedParser::objMessageDescription(const QVariant& msg_element) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +146,7 @@ QString FeedParser::objMessageAuthor(const QVariant& msg_element) const {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime FeedParser::objMessageDateCreated(const QVariant& msg_element) const {
|
QDateTime FeedParser::objMessageDateCreated(const QVariant& msg_element) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,6 +400,14 @@ QStringList FeedParser::xmlTextsFromPath(const QDomElement& element,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString FeedParser::dateTimeFormat() const {
|
||||||
|
return m_dateTimeFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FeedParser::setDateTimeFormat(const QString& dt_format) {
|
||||||
|
m_dateTimeFormat = dt_format;
|
||||||
|
}
|
||||||
|
|
||||||
QString FeedParser::feedAuthor() const {
|
QString FeedParser::feedAuthor() const {
|
||||||
return QL1S("");
|
return QL1S("");
|
||||||
}
|
}
|
||||||
|
@ -422,7 +432,7 @@ QString FeedParser::xmlMessageAuthor(const QDomElement& msg_element) const {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime FeedParser::xmlMessageDateCreated(const QDomElement& msg_element) const {
|
QDateTime FeedParser::xmlMessageDateCreated(const QDomElement& msg_element) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ class FeedParser {
|
||||||
Other
|
Other
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FeedParser();
|
||||||
explicit FeedParser(QString data, DataType is_xml = DataType::Xml);
|
explicit FeedParser(QString data, DataType is_xml = DataType::Xml);
|
||||||
virtual ~FeedParser();
|
virtual ~FeedParser();
|
||||||
|
|
||||||
|
@ -36,6 +37,9 @@ class FeedParser {
|
||||||
// Returns list of all messages from the feed.
|
// Returns list of all messages from the feed.
|
||||||
virtual QList<Message> messages();
|
virtual QList<Message> messages();
|
||||||
|
|
||||||
|
QString dateTimeFormat() const;
|
||||||
|
void setDateTimeFormat(const QString& dt_format);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual QString feedAuthor() const;
|
virtual QString feedAuthor() const;
|
||||||
|
|
||||||
|
@ -45,7 +49,7 @@ class FeedParser {
|
||||||
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
|
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageAuthor(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 xmlMessageId(const QDomElement& msg_element) const;
|
||||||
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
||||||
virtual QList<MessageCategory> xmlMessageCategories(const QDomElement& msg_element) const;
|
virtual QList<MessageCategory> xmlMessageCategories(const QDomElement& msg_element) const;
|
||||||
|
@ -57,7 +61,7 @@ class FeedParser {
|
||||||
virtual QString jsonMessageUrl(const QJsonObject& msg_element) const;
|
virtual QString jsonMessageUrl(const QJsonObject& msg_element) const;
|
||||||
virtual QString jsonMessageDescription(const QJsonObject& msg_element) const;
|
virtual QString jsonMessageDescription(const QJsonObject& msg_element) const;
|
||||||
virtual QString jsonMessageAuthor(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 QString jsonMessageId(const QJsonObject& msg_element) const;
|
||||||
virtual QList<Enclosure> jsonMessageEnclosures(const QJsonObject& msg_element) const;
|
virtual QList<Enclosure> jsonMessageEnclosures(const QJsonObject& msg_element) const;
|
||||||
virtual QList<MessageCategory> jsonMessageCategories(const QJsonObject& msg_element) const;
|
virtual QList<MessageCategory> jsonMessageCategories(const QJsonObject& msg_element) const;
|
||||||
|
@ -67,9 +71,9 @@ class FeedParser {
|
||||||
virtual QVariantList objMessageElements();
|
virtual QVariantList objMessageElements();
|
||||||
virtual QString objMessageTitle(const QVariant& msg_element) const;
|
virtual QString objMessageTitle(const QVariant& msg_element) const;
|
||||||
virtual QString objMessageUrl(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 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 QString objMessageId(const QVariant& msg_element) const;
|
||||||
virtual QList<Enclosure> objMessageEnclosures(const QVariant& msg_element) const;
|
virtual QList<Enclosure> objMessageEnclosures(const QVariant& msg_element) const;
|
||||||
virtual QList<MessageCategory> objMessageCategories(const QVariant& msg_element) const;
|
virtual QList<MessageCategory> objMessageCategories(const QVariant& msg_element) const;
|
||||||
|
@ -87,6 +91,7 @@ class FeedParser {
|
||||||
protected:
|
protected:
|
||||||
DataType m_dataType;
|
DataType m_dataType;
|
||||||
QString m_data;
|
QString m_data;
|
||||||
|
QString m_dateTimeFormat;
|
||||||
QDomDocument m_xml;
|
QDomDocument m_xml;
|
||||||
QJsonDocument m_json;
|
QJsonDocument m_json;
|
||||||
QString m_mrssNamespace;
|
QString m_mrssNamespace;
|
||||||
|
|
|
@ -106,17 +106,17 @@ QString IcalParser::objMessageUrl(const QVariant& msg_element) const {
|
||||||
return comp.url();
|
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<IcalendarComponent>();
|
const IcalendarComponent& comp_base = msg_element.value<IcalendarComponent>();
|
||||||
const EventComponent& comp = static_cast<const EventComponent&>(comp_base);
|
const EventComponent& comp = static_cast<const EventComponent&>(comp_base);
|
||||||
|
|
||||||
bool has_dt;
|
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)
|
QString formaton = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat)
|
||||||
: QLocale().dateFormat(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)
|
QString formatoff = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat)
|
||||||
: QLocale().dateFormat(QLocale::FormatType::LongFormat);
|
: QLocale().dateFormat(QLocale::FormatType::LongFormat);
|
||||||
|
|
||||||
|
@ -142,11 +142,11 @@ QString IcalParser::objMessageAuthor(const QVariant& msg_element) const {
|
||||||
return comp.organizer();
|
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<IcalendarComponent>();
|
const IcalendarComponent& comp_base = msg_element.value<IcalendarComponent>();
|
||||||
const EventComponent& comp = static_cast<const EventComponent&>(comp_base);
|
const EventComponent& comp = static_cast<const EventComponent&>(comp_base);
|
||||||
|
|
||||||
QDateTime dat = comp.startsOn(m_iCalendar.m_tzs);
|
QDateTime dat = comp.startsOn(m_iCalendar.m_tzs, nullptr, &m_dateTimeFormat);
|
||||||
|
|
||||||
return dat;
|
return dat;
|
||||||
}
|
}
|
||||||
|
@ -347,13 +347,12 @@ QDateTime IcalendarComponent::fixupDate(QDateTime dat,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime EventComponent::startsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt) const {
|
QDateTime EventComponent::startsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt, QString* dt_format) const {
|
||||||
QString modifiers;
|
QString modifiers;
|
||||||
QString dt_format;
|
|
||||||
bool has_dt;
|
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) {
|
if (had_dt != nullptr) {
|
||||||
*had_dt = has_dt;
|
*had_dt = has_dt;
|
||||||
|
@ -362,13 +361,12 @@ QDateTime EventComponent::startsOn(const QMap<QString, QTimeZone>& time_zones, b
|
||||||
return dat;
|
return dat;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime EventComponent::endsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt) const {
|
QDateTime EventComponent::endsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt, QString* dt_format) const {
|
||||||
QString modifiers;
|
QString modifiers;
|
||||||
QString dt_format;
|
|
||||||
bool has_dt;
|
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) {
|
if (had_dt != nullptr) {
|
||||||
*had_dt = has_dt;
|
*had_dt = has_dt;
|
||||||
|
@ -396,17 +394,3 @@ QString EventComponent::location() const {
|
||||||
QString EventComponent::description() const {
|
QString EventComponent::description() const {
|
||||||
return getPropertyValue(QSL("DESCRIPTION")).toString();
|
return getPropertyValue(QSL("DESCRIPTION")).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime EventComponent::created(const QMap<QString, QTimeZone>& 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<QString, QTimeZone>& time_zones) const {
|
|
||||||
QString modifiers;
|
|
||||||
QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("LAST-MODIFIED"), modifiers).toString());
|
|
||||||
|
|
||||||
return fixupDate(dat, {}, time_zones, modifiers);
|
|
||||||
}
|
|
||||||
|
|
|
@ -31,15 +31,17 @@ Q_DECLARE_METATYPE(IcalendarComponent)
|
||||||
|
|
||||||
class EventComponent : public IcalendarComponent {
|
class EventComponent : public IcalendarComponent {
|
||||||
public:
|
public:
|
||||||
QDateTime startsOn(const QMap<QString, QTimeZone>& time_zones = {}, bool* had_dt = nullptr) const;
|
QDateTime startsOn(const QMap<QString, QTimeZone>& time_zones = {},
|
||||||
QDateTime endsOn(const QMap<QString, QTimeZone>& time_zones = {}, bool* had_dt = nullptr) const;
|
bool* had_dt = nullptr,
|
||||||
|
QString* dt_format = nullptr) const;
|
||||||
|
QDateTime endsOn(const QMap<QString, QTimeZone>& time_zones = {},
|
||||||
|
bool* had_dt = nullptr,
|
||||||
|
QString* dt_format = nullptr) const;
|
||||||
QString title() const;
|
QString title() const;
|
||||||
QString url() const;
|
QString url() const;
|
||||||
QString organizer() const;
|
QString organizer() const;
|
||||||
QString location() const;
|
QString location() const;
|
||||||
QString description() const;
|
QString description() const;
|
||||||
QDateTime created(const QMap<QString, QTimeZone>& time_zones = {}) const;
|
|
||||||
QDateTime lastModified(const QMap<QString, QTimeZone>& time_zones = {}) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(EventComponent)
|
Q_DECLARE_METATYPE(EventComponent)
|
||||||
|
@ -81,9 +83,9 @@ class IcalParser : public FeedParser {
|
||||||
virtual QVariantList objMessageElements();
|
virtual QVariantList objMessageElements();
|
||||||
virtual QString objMessageTitle(const QVariant& msg_element) const;
|
virtual QString objMessageTitle(const QVariant& msg_element) const;
|
||||||
virtual QString objMessageUrl(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 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 QString objMessageId(const QVariant& msg_element) const;
|
||||||
virtual QList<Enclosure> objMessageEnclosures(const QVariant& msg_element) const;
|
virtual QList<Enclosure> objMessageEnclosures(const QVariant& msg_element) const;
|
||||||
virtual QList<MessageCategory> objMessageCategories(const QVariant& msg_element) const;
|
virtual QList<MessageCategory> objMessageCategories(const QVariant& msg_element) const;
|
||||||
|
|
|
@ -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"))
|
return TextFactory::parseDateTime(msg_element.contains(QSL("date_modified"))
|
||||||
? msg_element[QSL("date_modified")].toString()
|
? 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 {
|
QString JsonParser::jsonMessageId(const QJsonObject& msg_element) const {
|
||||||
|
|
|
@ -25,7 +25,7 @@ class JsonParser : public FeedParser {
|
||||||
virtual QString jsonMessageUrl(const QJsonObject& msg_element) const;
|
virtual QString jsonMessageUrl(const QJsonObject& msg_element) const;
|
||||||
virtual QString jsonMessageDescription(const QJsonObject& msg_element) const;
|
virtual QString jsonMessageDescription(const QJsonObject& msg_element) const;
|
||||||
virtual QString jsonMessageAuthor(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 QString jsonMessageId(const QJsonObject& msg_element) const;
|
||||||
virtual QList<Enclosure> jsonMessageEnclosures(const QJsonObject& msg_element) const;
|
virtual QList<Enclosure> jsonMessageEnclosures(const QJsonObject& msg_element) const;
|
||||||
virtual QString jsonMessageRawContents(const QJsonObject& msg_element) const;
|
virtual QString jsonMessageRawContents(const QJsonObject& msg_element) const;
|
||||||
|
|
|
@ -257,11 +257,12 @@ QString RdfParser::xmlMessageAuthor(const QDomElement& msg_element) const {
|
||||||
return msg_element.elementsByTagNameNS(m_dcElNamespace, QSL("creator")).at(0).toElement().text();
|
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"))
|
return TextFactory::parseDateTime(msg_element.elementsByTagNameNS(m_dcElNamespace, QSL("date"))
|
||||||
.at(0)
|
.at(0)
|
||||||
.toElement()
|
.toElement()
|
||||||
.text());
|
.text(),
|
||||||
|
&m_dateTimeFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString RdfParser::xmlMessageId(const QDomElement& msg_element) const {
|
QString RdfParser::xmlMessageId(const QDomElement& msg_element) const {
|
||||||
|
|
|
@ -23,7 +23,7 @@ class RdfParser : public FeedParser {
|
||||||
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
|
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageAuthor(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 xmlMessageId(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
||||||
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
||||||
|
|
|
@ -280,15 +280,17 @@ QString RssParser::xmlMessageAuthor(const QDomElement& msg_element) const {
|
||||||
return author;
|
return author;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime RssParser::xmlMessageDateCreated(const QDomElement& msg_element) const {
|
QDateTime RssParser::xmlMessageDateCreated(const QDomElement& msg_element) {
|
||||||
QDateTime date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("pubDate")).toElement().text());
|
QDateTime date_created =
|
||||||
|
TextFactory::parseDateTime(msg_element.namedItem(QSL("pubDate")).toElement().text(), &m_dateTimeFormat);
|
||||||
|
|
||||||
if (date_created.isNull()) {
|
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()) {
|
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;
|
return date_created;
|
||||||
|
|
|
@ -24,7 +24,7 @@ class RssParser : public FeedParser {
|
||||||
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
|
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageAuthor(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 xmlMessageId(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
||||||
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
||||||
|
|
|
@ -263,7 +263,7 @@ QString SitemapParser::xmlMessageDescription(const QDomElement& msg_element) con
|
||||||
return xmlRawChild(msg_element.elementsByTagNameNS(sitemapVideoNamespace(), QSL("description")).at(0).toElement());
|
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();
|
QString str_date = msg_element.elementsByTagNameNS(sitemapNamespace(), QSL("lastmod")).at(0).toElement().text();
|
||||||
|
|
||||||
if (str_date.isEmpty()) {
|
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();
|
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 {
|
QString SitemapParser::xmlMessageId(const QDomElement& msg_element) const {
|
||||||
|
|
|
@ -23,7 +23,7 @@ class SitemapParser : public FeedParser {
|
||||||
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
|
||||||
virtual QString xmlMessageDescription(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 xmlMessageId(const QDomElement& msg_element) const;
|
||||||
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
|
||||||
|
|
||||||
|
|
|
@ -426,6 +426,14 @@ bool StandardFeed::removeItself() {
|
||||||
return DatabaseQueries::deleteFeed(database, this, getParentServiceRoot()->accountId());
|
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 {
|
QString StandardFeed::lastEtag() const {
|
||||||
return m_lastEtag;
|
return m_lastEtag;
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,9 @@ class StandardFeed : public Feed {
|
||||||
QString lastEtag() const;
|
QString lastEtag() const;
|
||||||
void setLastEtag(const QString& etag);
|
void setLastEtag(const QString& etag);
|
||||||
|
|
||||||
|
QString dateTimeFormat() const;
|
||||||
|
void setDateTimeFormat(const QString& dt_format);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void fetchMetadataForItself();
|
void fetchMetadataForItself();
|
||||||
|
|
||||||
|
@ -119,6 +122,7 @@ class StandardFeed : public Feed {
|
||||||
Type m_type;
|
Type m_type;
|
||||||
QString m_postProcessScript;
|
QString m_postProcessScript;
|
||||||
QString m_encoding;
|
QString m_encoding;
|
||||||
|
QString m_dateTimeFormat;
|
||||||
NetworkFactory::NetworkAuthentication m_protection = NetworkFactory::NetworkAuthentication::NoAuthentication;
|
NetworkFactory::NetworkAuthentication m_protection = NetworkFactory::NetworkAuthentication::NoAuthentication;
|
||||||
QString m_username;
|
QString m_username;
|
||||||
QString m_password;
|
QString m_password;
|
||||||
|
|
|
@ -322,36 +322,50 @@ QList<Message> StandardServiceRoot::obtainNewMessages(Feed* feed,
|
||||||
// Feed data are downloaded and encoded.
|
// Feed data are downloaded and encoded.
|
||||||
// Parse data and obtain messages.
|
// Parse data and obtain messages.
|
||||||
QList<Message> messages;
|
QList<Message> messages;
|
||||||
|
FeedParser* parser;
|
||||||
|
|
||||||
switch (f->type()) {
|
switch (f->type()) {
|
||||||
case StandardFeed::Type::Rss0X:
|
case StandardFeed::Type::Rss0X:
|
||||||
case StandardFeed::Type::Rss2X:
|
case StandardFeed::Type::Rss2X:
|
||||||
messages = RssParser(formatted_feed_contents).messages();
|
parser = new RssParser(formatted_feed_contents);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StandardFeed::Type::Rdf:
|
case StandardFeed::Type::Rdf:
|
||||||
messages = RdfParser(formatted_feed_contents).messages();
|
parser = new RdfParser(formatted_feed_contents);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StandardFeed::Type::Atom10:
|
case StandardFeed::Type::Atom10:
|
||||||
messages = AtomParser(formatted_feed_contents).messages();
|
parser = new AtomParser(formatted_feed_contents);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StandardFeed::Type::Json:
|
case StandardFeed::Type::Json:
|
||||||
messages = JsonParser(formatted_feed_contents).messages();
|
parser = new JsonParser(formatted_feed_contents);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StandardFeed::Type::iCalendar:
|
case StandardFeed::Type::iCalendar:
|
||||||
messages = IcalParser(formatted_feed_contents).messages();
|
parser = new IcalParser(formatted_feed_contents);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case StandardFeed::Type::Sitemap:
|
case StandardFeed::Type::Sitemap:
|
||||||
messages = SitemapParser(formatted_feed_contents).messages();
|
parser = new SitemapParser(formatted_feed_contents);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
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) {
|
for (Message& mess : messages) {
|
||||||
mess.m_feedId = feed->customId();
|
mess.m_feedId = feed->customId();
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,9 +87,15 @@ QDateTime TextFactory::parseDateTime(const QString& date_time, QString* used_dt_
|
||||||
return QDateTime();
|
return QDateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QLocale locale(QLocale::Language::C);
|
||||||
|
QStringList built_in_patterns = dateTimePatterns(true);
|
||||||
|
|
||||||
QDateTime dt;
|
QDateTime dt;
|
||||||
static QLocale locale(QLocale::Language::C);
|
QStringList date_patterns = built_in_patterns;
|
||||||
static QStringList date_patterns = dateTimePatterns(true);
|
|
||||||
|
if (used_dt_format != nullptr && !used_dt_format->isEmpty()) {
|
||||||
|
built_in_patterns.prepend(*used_dt_format);
|
||||||
|
}
|
||||||
|
|
||||||
// QDateTime dt1 = locale.toDateTime("GMT", "t");
|
// QDateTime dt1 = locale.toDateTime("GMT", "t");
|
||||||
// QString dt2 = dt1.toString();
|
// QString dt2 = dt1.toString();
|
||||||
|
@ -126,12 +132,16 @@ QStringList TextFactory::dateTimePatterns(bool with_tzs) {
|
||||||
QStringList pat;
|
QStringList pat;
|
||||||
|
|
||||||
pat << QSL("yyyy-MM-ddTHH:mm:ss");
|
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-ddThh:mm:ss");
|
||||||
pat << QSL("yyyy-MM-dd HH:mm:ss.z");
|
pat << QSL("yyyy-MM-dd HH:mm:ss.z");
|
||||||
|
|
||||||
pat << QSL("yyyy-MM-ddThh:mm");
|
pat << QSL("yyyy-MM-ddThh:mm");
|
||||||
|
|
||||||
pat << QSL("yyyyMMddThhmmss");
|
pat << QSL("yyyyMMddThhmmss");
|
||||||
pat << QSL("yyyyMMdd");
|
pat << QSL("yyyyMMdd");
|
||||||
pat << QSL("yyyy");
|
pat << QSL("yyyy");
|
||||||
|
|
||||||
pat << QSL("yyyy-MM-dd");
|
pat << QSL("yyyy-MM-dd");
|
||||||
pat << QSL("yyyy-MM");
|
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, dd MMM yy HH:mm:ss");
|
||||||
pat << QSL("ddd, d MMM yyyy 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 hh:mm:ss");
|
||||||
pat << QSL("dd MMM yyyy");
|
pat << QSL("dd MMM yyyy");
|
||||||
|
|
Loading…
Add table
Reference in a new issue