diff --git a/cantata.qrc b/cantata.qrc index d47c2ed46..71126ee8d 100644 --- a/cantata.qrc +++ b/cantata.qrc @@ -42,6 +42,7 @@ online/icons/cbc.svg online/icons/npr.svg online/icons/itunes.svg +online/icons/gpodder.svg online/podcast_directories.xml streams/icons/digitallyimported.png diff --git a/online/icons/gpodder.svg b/online/icons/gpodder.svg new file mode 100644 index 000000000..10f6888d1 --- /dev/null +++ b/online/icons/gpodder.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/online/podcastsearchdialog.cpp b/online/podcastsearchdialog.cpp index bb814ae22..f0f45c36d 100644 --- a/online/podcastsearchdialog.cpp +++ b/online/podcastsearchdialog.cpp @@ -105,7 +105,7 @@ public: void parseResonse(QIODevice *dev) { if (!dev) { - MessageBox::error(this, i18n("Failed to fetch podcasts")); + MessageBox::error(this, i18n("Failed to fetch podcasts from iTunes")); return; } QJson::Parser parser; @@ -114,11 +114,8 @@ public: MessageBox::error(this, i18n("There was a problem parsing the response from the iTunes Store")); return; } - if (data.toMap().contains(QLatin1String("errorMessage"))) { - MessageBox::error(this, data.toMap()[QLatin1String("errorMessage")].toString()); - return; - } - foreach (const QVariant& resultVariant, data.toMap()[QLatin1String("results")].toList()) { + + foreach (const QVariant &resultVariant, data.toMap()[QLatin1String("results")].toList()) { QVariantMap result(resultVariant.toMap()); if (result[QLatin1String("kind")].toString() != QLatin1String("podcast")) { continue; @@ -134,6 +131,56 @@ public: } }; +class GPodderSearchPage : public PodcastSearchPage +{ +public: + GPodderSearchPage(QWidget *p) : PodcastSearchPage(p) { } + + void doSearch() + { + QString text=search->text().trimmed(); + if (text.isEmpty()) { + return; + } + + QUrl url(QLatin1String("http://gpodder.net/search.json")); + #if QT_VERSION < 0x050000 + QUrl &query=url; + #else + QUrlQuery query; + #endif + query.addQueryItem(QLatin1String("q"), text); + #if QT_VERSION >= 0x050000 + url.setQuery(query); + #endif + fetch(url); + } + + void parseResonse(QIODevice *dev) + { + if (!dev) { + MessageBox::error(this, i18n("Failed to fetch podcasts from GPodder")); + return; + } + QJson::Parser parser; + QVariant data = parser.parse(dev); + if (data.isNull()) { + MessageBox::error(this, i18n("There was a problem parsing the response from GPodder")); + return; + } + QVariantList list=data.toList(); + foreach (const QVariant &var, list) { + QVariantMap map=var.toMap(); + addPodcast(map[QLatin1String("title")].toString(), + map[QLatin1String("url")].toUrl(), + map[QLatin1String("logo_url")].toUrl(), + map[QLatin1String("description")].toString(), + map[QLatin1String("website")].toString(), + 0); + } + } +}; + PodcastPage::PodcastPage(QWidget *p) : QWidget(p) , job(0) @@ -193,6 +240,10 @@ void PodcastPage::cancelImage() void PodcastPage::addPodcast(const QString &name, const QUrl &url, const QUrl &image, const QString &description, const QString &webPage, QTreeWidgetItem *p) { + if (name.isEmpty() || url.isEmpty()) { + return; + } + QTreeWidgetItem *podItem=p ? new QTreeWidgetItem(p, QStringList() << name) : new QTreeWidgetItem(tree, QStringList() << name); @@ -454,12 +505,15 @@ PodcastSearchDialog::PodcastSearchDialog(QWidget *parent) ITunesSearchPage *itunes=new ITunesSearchPage(this); Icon itunesIcon; itunesIcon.addFile(":itunes"); - if (itunesIcon.isNull()) { - itunesIcon=Icon("folder"); - } widget->addPage(itunes, i18n("Search iTunes"), itunesIcon, i18n("Search for podcasts on iTunes")); pages << itunes; + GPodderSearchPage *gpodder=new GPodderSearchPage(this); + Icon gpodderIcon; + gpodderIcon.addFile(":gpodder"); + widget->addPage(gpodder, i18n("Search GPodder"), gpodderIcon, i18n("Search for podcasts on GPodder.net")); + pages << gpodder; + QFile file(":podcast_directories.xml"); if (file.open(QIODevice::ReadOnly)) { QXmlStreamReader reader(&file); @@ -470,11 +524,10 @@ PodcastSearchDialog::PodcastSearchDialog(QWidget *parent) QString name=reader.attributes().value(QLatin1String("name")).toString(); QString icon=reader.attributes().value(QLatin1String("icon")).toString(); Icon icn; - if (!icon.isEmpty()) { - icn.addFile(":"+icon); - } - if (icn.isNull()) { + if (icon.isEmpty()) { icn=Icon("folder"); + } else { + icn.addFile(":"+icon); } OpmlBrowsePage *page=new OpmlBrowsePage(this, QUrl(reader.attributes().value(QLatin1String("url")).toString())); widget->addPage(page, i18n("Browse %1", name), icn, i18n("Browse %1 podcasts", name));