123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- #include "Main.h"
- #include "RSSParse.h"
- #include "RFCDate.h"
- #include "../xml/XMLNode.h"
- #include "Feeds.h"
- #include "Defaults.h"
- #include "ChannelSync.h"
- #include "ParseUtil.h"
- #include <strsafe.h>
- static void ReadWinampSpecificItem(const XMLNode *item, RSS::Item &newItem)
- {
- newItem.listened = PropertyIsTrue(item, L"winamp:listened");
- newItem.downloaded = PropertyIsTrue(item, L"winamp:downloaded");
- }
- static void ReadRSSItem(XMLNode *item, Channel &channel, bool doWinampSpecificTags)
- {
- RSS::MutableItem newItem;
- if (doWinampSpecificTags)
- ReadWinampSpecificItem(item, newItem);
- const wchar_t *pubdate = GetContent(item, L"pubDate");
- if (pubdate && pubdate[0])
- {
- newItem.publishDate = MakeRFCDate(pubdate);
- if (newItem.publishDate <= 0)
- {
- newItem.publishDate = _time64(0);
- newItem.generatedDate = true;
- }
- else
- newItem.generatedDate = false;
- }
- else
- {
- newItem.publishDate = _time64(0);
- newItem.generatedDate = true;
- }
- const wchar_t *itemName = GetContent(item, L"title");
- if (itemName && itemName[0])
- newItem.SetItemName(itemName);
- else
- {
- wchar_t date_str[128] = {0};
- MakeRFCDateString(newItem.publishDate, date_str, 128);
- newItem.SetItemName(date_str);
- }
- newItem.SetLink(GetContent(item, L"link"));
- newItem.SetURL(GetProperty(item, L"enclosure", L"url"));
- const wchar_t* src = GetProperty(item, L"source", L"src");
- if (!src || !src[0])
- {
- newItem.SetSourceURL(GetProperty(item, L"source", L"url"));
- }
- else
- {
- newItem.SetSourceURL(src/*GetProperty(item, L"source", L"src")*/);
- }
- newItem.SetSize(GetProperty(item, L"enclosure", L"length"));
- const wchar_t *guid = GetContent(item, L"guid");
- if (!guid || !guid[0])
- guid = GetProperty(item, L"enclosure", L"url");
- if (guid && guid[0])
- {
- newItem.SetGUID(guid);
- }
- else
- {
- wchar_t generated_guid[160] = {0};
- StringCbPrintf(generated_guid, sizeof(generated_guid), L"%s%s", channel.title, newItem.itemName);
- newItem.SetGUID(generated_guid);
- }
- const wchar_t *description = GetContent(item, L"description");
- if (!description || !description[0])
- description = GetContent(item, L"content:encoded");
- newItem.SetDescription(description);
- const wchar_t *duration = GetContent(item, L"itunes:duration");
- if (duration && duration[0])
- newItem.SetDuration(duration);
- if (newItem.itemName && newItem.itemName[0])
- {
- channel.items.push_back(newItem);
- }
- }
- void ReadWinampSpecificChannel(const XMLNode *node, Channel &newChannel)
- {
- const XMLNode *curNode = 0;
- const wchar_t *lastupdate = node->GetProperty(L"winamp:lastupdate");
- if (lastupdate && lastupdate[0])
- newChannel.lastUpdate = MakeRFCDate(lastupdate);
- const wchar_t *winamp_url = GetContent(node, L"winamp:url");
- newChannel.SetURL(winamp_url);
- // set to preference value first
- newChannel.updateTime = updateTime;
- newChannel.autoUpdate = autoUpdate;
- newChannel.autoDownload = autoDownload;
- newChannel.autoDownloadEpisodes = autoDownloadEpisodes;
- curNode = node->Get(L"winamp:update");
- if (curNode)
- {
- newChannel.useDefaultUpdate = PropertyIsTrue(curNode, L"usedefaultupdate");
- newChannel.needsRefresh = PropertyIsTrue(curNode, L"needsrefresh");
- if (!newChannel.useDefaultUpdate)
- {
- newChannel.updateTime = _wtoi64(curNode->GetProperty(L"updatetime"));
- newChannel.autoUpdate = PropertyIsTrue(curNode, L"autoupdate");
- }
- }
- curNode = node->Get(L"winamp:download");
- if (curNode)
- {
- newChannel.autoDownload = PropertyIsTrue(curNode, L"autodownload");
- if (newChannel.autoDownload)
- {
- const wchar_t *prop = curNode->GetProperty(L"autoDownloadEpisodes");
- if (prop)
- newChannel.autoDownloadEpisodes = _wtoi(prop);
- }
- }
- }
- static void ReadRSSChannel(const XMLNode *node, Channel &newChannel, bool doWinampSpecificTags)
- {
- XMLNode::NodeList::const_iterator itemItr;
- if (doWinampSpecificTags)
- ReadWinampSpecificChannel(node, newChannel);
- const wchar_t *title = GetContent(node, L"title");
- newChannel.SetTitle(title);
- const wchar_t *link = GetContent(node, L"link");
- newChannel.SetLink(link);
- const wchar_t *description = GetContent(node, L"description");
- newChannel.SetDescription(description);
- const wchar_t *ttl = GetContent(node, L"ttl");
- if (ttl)
- newChannel.ttl = _wtoi(ttl);
- const XMLNode::NodeList *items = node->GetList(L"item");
- if (items)
- {
- for (itemItr = items->begin(); itemItr != items->end(); itemItr++)
- ReadRSSItem(*itemItr, newChannel, doWinampSpecificTags);
- }
- }
- void ReadRSS(const XMLNode *rss, ChannelSync *sync, bool doWinampSpecificTags, const wchar_t *url)
- {
- XMLNode::NodeList::const_iterator itr;
- sync->BeginChannelSync();
- const XMLNode::NodeList *channelList = rss->GetList(L"channel");
- if (channelList)
- {
- for (itr = channelList->begin(); itr != channelList->end(); itr ++)
- {
- Channel newChannel;
- ReadRSSChannel(*itr, newChannel, doWinampSpecificTags);
- if (!newChannel.url || !newChannel.url[0])
- newChannel.SetURL(url);
- sync->NewChannel(newChannel);
- }
- }
- sync->EndChannelSync();
- }
|