Skip to content

Commit 2fc65bd

Browse files
committed
v2.10.0
1 parent b609519 commit 2fc65bd

File tree

3 files changed

+99
-59
lines changed

3 files changed

+99
-59
lines changed

dist/rss-parser.js

+91-51
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
/*! rss-parser 2.9.0 */
1+
/*! rss-parser 2.10.0 */
22

33
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.RSSParser = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
4+
'use strict';
5+
46
var Entities = require("entities");
57
var FS = require('fs');
68
var url = require('url');
@@ -12,39 +14,59 @@ var HTTPS = require('https');
1214
var Parser = module.exports = {};
1315

1416
var FEED_FIELDS = [
17+
['author', 'creator'],
18+
['dc:publisher', 'publisher'],
19+
['dc:creator', 'creator'],
20+
['dc:source', 'source'],
21+
['dc:title', 'title'],
22+
['dc:type', 'type'],
1523
'title',
1624
'description',
1725
'author',
1826
'pubDate',
1927
'webMaster',
2028
'managingEditor',
2129
'generator',
22-
'link'
23-
];
24-
var PODCAST_TOP_FIELDS = [
25-
'author',
26-
'subtitle',
27-
'summary',
28-
'explicit'
30+
'link',
2931
];
32+
3033
var ITEM_FIELDS = [
34+
['author', 'creator'],
35+
['dc:creator', 'creator'],
36+
['dc:date', 'date'],
37+
['dc:language', 'language'],
38+
['dc:rights', 'rights'],
39+
['dc:source', 'source'],
40+
['dc:title', 'title'],
3141
'title',
3242
'link',
3343
'pubDate',
3444
'author',
3545
'content:encoded',
3646
'enclosure',
3747
'dc:creator',
38-
'dc:date'
48+
'dc:date',
3949
];
40-
var PODCAST_ITEM_FIELDS = [
50+
51+
var mapItunesField = function(f) {
52+
return ['itunes:' + f, f];
53+
}
54+
55+
var PODCAST_FEED_FIELDS = ([
56+
'author',
57+
'subtitle',
58+
'summary',
59+
'explicit'
60+
]).map(mapItunesField);
61+
62+
var PODCAST_ITEM_FIELDS = ([
4163
'author',
4264
'subtitle',
4365
'summary',
4466
'explicit',
4567
'duration',
4668
'image'
47-
];
69+
]).map(mapItunesField);
4870

4971

5072
var stripHtml = function(str) {
@@ -66,7 +88,7 @@ var getContent = function(content) {
6688
}
6789
}
6890

69-
var parseAtomFeed = function(xmlObj, callback) {
91+
var parseAtomFeed = function(xmlObj, options, callback) {
7092
var feed = xmlObj.feed;
7193
var json = {feed: {entries: []}};
7294
if (feed.link) {
@@ -101,29 +123,38 @@ var parseAtomFeed = function(xmlObj, callback) {
101123
callback(null, json);
102124
}
103125

104-
var parseRSS1 = function(xmlObj, callback) {
105-
callback("RSS 1.0 parsing not yet implemented.")
126+
var parseRSS1 = function(xmlObj, options, callback) {
127+
xmlObj = xmlObj['rdf:RDF'];
128+
var channel = xmlObj.channel[0];
129+
var items = xmlObj.item;
130+
return parseRSS(channel, items, options, callback);
106131
}
107132

108133
var parseRSS2 = function(xmlObj, options, callback) {
134+
var channel = xmlObj.rss.channel[0];
135+
var items = channel.item;
136+
return parseRSS(channel, items, options, function(err, data) {
137+
if (err) return callback(err);
138+
if (xmlObj.rss.$['xmlns:itunes']) {
139+
decorateItunes(data, channel);
140+
}
141+
callback(null, data);
142+
});
143+
}
109144

145+
var parseRSS = function(channel, items, options, callback) {
146+
items = items || [];
110147
options.customFields = options.customFields || {};
111148
var itemFields = ITEM_FIELDS.concat(options.customFields.item || []);
112149
var feedFields = FEED_FIELDS.concat(options.customFields.feed || []);
113150

114151
var json = {feed: {entries: []}};
115-
var channel = xmlObj.rss.channel[0];
116-
if (channel['atom:link']) json.feed.feedUrl = channel['atom:link'][0].$.href;
117152

118-
feedFields.forEach(function(f) {
119-
if (channel[f]) json.feed[f] = channel[f][0];
120-
})
121-
var items = channel.item;
122-
(items || []).forEach(function(item) {
153+
if (channel['atom:link']) json.feed.feedUrl = channel['atom:link'][0].$.href;
154+
copyFromXML(channel, json.feed, feedFields);
155+
items.forEach(function(item) {
123156
var entry = {};
124-
itemFields.forEach(function(f) {
125-
if (item[f]) entry[f] = item[f][0];
126-
})
157+
copyFromXML(item, entry, itemFields);
127158
if (item.enclosure) {
128159
entry.enclosure = item.enclosure[0].$;
129160
}
@@ -136,14 +167,31 @@ var parseRSS2 = function(xmlObj, options, callback) {
136167
if (entry.guid._) entry.guid = entry.guid._;
137168
}
138169
if (item.category) entry.categories = item.category;
170+
var date = entry.pubDate || entry.date;
171+
if (date) {
172+
try {
173+
entry.isoDate = new Date(date.trim()).toISOString();
174+
} catch (e) {
175+
// Ignore bad date format
176+
}
177+
}
139178
json.feed.entries.push(entry);
140179
})
141-
if (xmlObj.rss.$['xmlns:itunes']) {
142-
decorateItunes(json, channel);
143-
}
144180
callback(null, json);
145181
}
146182

183+
var copyFromXML = function(xml, dest, fields) {
184+
fields.forEach(function(f) {
185+
var from = f;
186+
var to = f;
187+
if (Array.isArray(f)) {
188+
from = f[0];
189+
to = f[1];
190+
}
191+
if (xml[from] !== undefined) dest[to] = xml[from][0];
192+
})
193+
}
194+
147195
/**
148196
* Add iTunes specific fields from XML to extracted JSON
149197
*
@@ -176,39 +224,31 @@ var decorateItunes = function decorateItunes(json, channel) {
176224
json.feed.itunes.owner = owner;
177225
}
178226

179-
PODCAST_TOP_FIELDS.forEach(function(f) {
180-
if (channel['itunes:' + f]) json.feed.itunes[f] = channel['itunes:' + f][0];
181-
});
182-
(items).forEach(function(item, index) {
183-
entry = json.feed.entries[index];
184-
PODCAST_ITEM_FIELDS.forEach(function(f) {
185-
entry.itunes = entry.itunes || {};
186-
if (item['itunes:' + f]) {
187-
if (f == 'image' && item['itunes:' + f][0].$ && item['itunes:' + f][0].$.href) {
188-
entry.itunes[f] = item['itunes:' + f][0].$.href;
189-
} else {
190-
entry.itunes[f] = item['itunes:' + f][0];
191-
}
192-
}
193-
});
194-
json.feed.entries[index] = entry;
227+
copyFromXML(channel, json.feed.itunes, PODCAST_FEED_FIELDS);
228+
items.forEach(function(item, index) {
229+
var entry = json.feed.entries[index];
230+
entry.itunes = {};
231+
copyFromXML(item, entry.itunes, PODCAST_ITEM_FIELDS);
232+
var image = item['itunes:image'];
233+
if (image && image[0] && image[0].$ && image[0].$.href) {
234+
entry.itunes.image = image[0].$.href;
235+
}
195236
});
196237
}
197238

198-
Parser.parseString = function(xml, settings, callback) {
239+
Parser.parseString = function(xml, options, callback) {
199240
if (!callback) {
200-
callback = settings;
201-
settings = {};
241+
callback = options;
242+
options = {};
202243
}
203-
204244
XML2JS.parseString(xml, function(err, result) {
205245
if (err) return callback(err);
206246
if (result.feed) {
207-
return parseAtomFeed(result, callback)
247+
return parseAtomFeed(result, options, callback)
208248
} else if (result.rss && result.rss.$.version && result.rss.$.version.indexOf('2') === 0) {
209-
return parseRSS2(result, settings, callback);
249+
return parseRSS2(result, options, callback);
210250
} else {
211-
return parseRSS1(result, callback);
251+
return parseRSS1(result, options, callback);
212252
}
213253
});
214254
}
@@ -248,7 +288,7 @@ Parser.parseURL = function(feedUrl, options, callback) {
248288
req.on('error', callback);
249289
}
250290

251-
Parser.parseFile = function(file,options,callback) {
291+
Parser.parseFile = function(file, options, callback) {
252292
FS.readFile(file, 'utf8', function(err, contents) {
253293
return Parser.parseString(contents, options, callback);
254294
})

0 commit comments

Comments
 (0)