File indexing completed on 2024-12-01 03:45:42

0001 /*
0002     This file is part of the syndication library
0003     SPDX-FileCopyrightText: 2006 Frank Osterfeld <osterfeld@kde.org>
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "itemrss2impl.h"
0008 #include "categoryrss2impl.h"
0009 #include "enclosurerss2impl.h"
0010 #include <atom/constants.h>
0011 #include <constants.h>
0012 #include <personimpl.h>
0013 #include <rss2/category.h>
0014 #include <rss2/enclosure.h>
0015 #include <tools.h>
0016 
0017 #include <QDomElement>
0018 #include <QList>
0019 #include <QMultiMap>
0020 #include <QString>
0021 
0022 namespace Syndication
0023 {
0024 ItemRSS2Impl::ItemRSS2Impl(const Syndication::RSS2::Item &item)
0025     : m_item(item)
0026 {
0027 }
0028 
0029 QString ItemRSS2Impl::title() const
0030 {
0031     return m_item.title();
0032 }
0033 
0034 QString ItemRSS2Impl::link() const
0035 {
0036     const QString link = m_item.link();
0037     if (!link.isEmpty()) {
0038         return link;
0039     }
0040 
0041     const QString guid = m_item.guid();
0042     if (m_item.guidIsPermaLink()) {
0043         return guid;
0044     }
0045 
0046     return QString();
0047 }
0048 
0049 QString ItemRSS2Impl::description() const
0050 {
0051     return m_item.description();
0052 }
0053 
0054 QString ItemRSS2Impl::content() const
0055 {
0056     return m_item.content();
0057 }
0058 
0059 QList<PersonPtr> ItemRSS2Impl::authors() const
0060 {
0061     QList<PersonPtr> list;
0062 
0063     PersonPtr ptr = personFromString(m_item.author());
0064 
0065     if (!ptr->isNull()) {
0066         list.append(ptr);
0067     }
0068 
0069     return list;
0070 }
0071 
0072 QString ItemRSS2Impl::language() const
0073 {
0074     return QString();
0075 }
0076 
0077 QString ItemRSS2Impl::id() const
0078 {
0079     QString guid = m_item.guid();
0080     if (!guid.isEmpty()) {
0081         return guid;
0082     }
0083 
0084     return QStringLiteral("hash:%1").arg(calcMD5Sum(title() + description() + link() + content()));
0085 }
0086 
0087 time_t ItemRSS2Impl::datePublished() const
0088 {
0089     return m_item.pubDate();
0090 }
0091 
0092 time_t ItemRSS2Impl::dateUpdated() const
0093 {
0094     // Some RSS feeds contain atom elements - return atom:dateUpdated if present
0095     const QString updstr = m_item.extractElementTextNS(Atom::atom1Namespace(), QStringLiteral("updated"));
0096     if (!updstr.isEmpty()) {
0097         return parseDate(updstr, ISODate);
0098     } else {
0099         return datePublished();
0100     }
0101 }
0102 
0103 QList<Syndication::EnclosurePtr> ItemRSS2Impl::enclosures() const
0104 {
0105     const QList<Syndication::RSS2::Enclosure> encs = m_item.enclosures();
0106 
0107     QList<Syndication::EnclosurePtr> list;
0108     list.reserve(encs.size());
0109 
0110     std::transform(encs.cbegin(), encs.cend(), std::back_inserter(list), [this](const Syndication::RSS2::Enclosure &e) {
0111         return EnclosureRSS2ImplPtr(new EnclosureRSS2Impl(m_item, e));
0112     });
0113 
0114     return list;
0115 }
0116 
0117 QList<Syndication::CategoryPtr> ItemRSS2Impl::categories() const
0118 {
0119     const QList<Syndication::RSS2::Category> cats = m_item.categories();
0120 
0121     QList<Syndication::CategoryPtr> list;
0122     list.reserve(cats.size());
0123 
0124     std::transform(cats.cbegin(), cats.cend(), std::back_inserter(list), [](const Syndication::RSS2::Category &c) {
0125         return CategoryRSS2ImplPtr(new CategoryRSS2Impl(c));
0126     });
0127 
0128     return list;
0129 }
0130 
0131 int ItemRSS2Impl::commentsCount() const
0132 {
0133     const QString cstr = m_item.extractElementTextNS(slashNamespace(), QStringLiteral("comments"));
0134     bool ok = false;
0135     int comments = cstr.toInt(&ok);
0136     return ok ? comments : -1;
0137 }
0138 
0139 QString ItemRSS2Impl::commentsLink() const
0140 {
0141     return m_item.comments();
0142 }
0143 
0144 QString ItemRSS2Impl::commentsFeed() const
0145 {
0146     QString t = m_item.extractElementTextNS(commentApiNamespace(), QStringLiteral("commentRss"));
0147     if (t.isNull()) {
0148         t = m_item.extractElementTextNS(commentApiNamespace(), QStringLiteral("commentRSS"));
0149     }
0150     return t;
0151 }
0152 
0153 QString ItemRSS2Impl::commentPostUri() const
0154 {
0155     return m_item.extractElementTextNS(commentApiNamespace(), QStringLiteral("comment"));
0156 }
0157 
0158 Syndication::SpecificItemPtr ItemRSS2Impl::specificItem() const
0159 {
0160     return Syndication::SpecificItemPtr(new Syndication::RSS2::Item(m_item));
0161 }
0162 
0163 QMultiMap<QString, QDomElement> ItemRSS2Impl::additionalProperties() const
0164 {
0165     QMultiMap<QString, QDomElement> ret;
0166 
0167     const auto unhandledElements = m_item.unhandledElements();
0168     for (const QDomElement &i : unhandledElements) {
0169         ret.insert(i.namespaceURI() + i.localName(), i);
0170     }
0171 
0172     return ret;
0173 }
0174 
0175 } // namespace Syndication