1
- /*! rss-parser 2.9 .0 */
1
+ /*! rss-parser 2.10 .0 */
2
2
3
3
( 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
+
4
6
var Entities = require ( "entities" ) ;
5
7
var FS = require ( 'fs' ) ;
6
8
var url = require ( 'url' ) ;
@@ -12,39 +14,59 @@ var HTTPS = require('https');
12
14
var Parser = module . exports = { } ;
13
15
14
16
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' ] ,
15
23
'title' ,
16
24
'description' ,
17
25
'author' ,
18
26
'pubDate' ,
19
27
'webMaster' ,
20
28
'managingEditor' ,
21
29
'generator' ,
22
- 'link'
23
- ] ;
24
- var PODCAST_TOP_FIELDS = [
25
- 'author' ,
26
- 'subtitle' ,
27
- 'summary' ,
28
- 'explicit'
30
+ 'link' ,
29
31
] ;
32
+
30
33
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' ] ,
31
41
'title' ,
32
42
'link' ,
33
43
'pubDate' ,
34
44
'author' ,
35
45
'content:encoded' ,
36
46
'enclosure' ,
37
47
'dc:creator' ,
38
- 'dc:date'
48
+ 'dc:date' ,
39
49
] ;
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 = ( [
41
63
'author' ,
42
64
'subtitle' ,
43
65
'summary' ,
44
66
'explicit' ,
45
67
'duration' ,
46
68
'image'
47
- ] ;
69
+ ] ) . map ( mapItunesField ) ;
48
70
49
71
50
72
var stripHtml = function ( str ) {
@@ -66,7 +88,7 @@ var getContent = function(content) {
66
88
}
67
89
}
68
90
69
- var parseAtomFeed = function ( xmlObj , callback ) {
91
+ var parseAtomFeed = function ( xmlObj , options , callback ) {
70
92
var feed = xmlObj . feed ;
71
93
var json = { feed : { entries : [ ] } } ;
72
94
if ( feed . link ) {
@@ -101,29 +123,38 @@ var parseAtomFeed = function(xmlObj, callback) {
101
123
callback ( null , json ) ;
102
124
}
103
125
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 ) ;
106
131
}
107
132
108
133
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
+ }
109
144
145
+ var parseRSS = function ( channel , items , options , callback ) {
146
+ items = items || [ ] ;
110
147
options . customFields = options . customFields || { } ;
111
148
var itemFields = ITEM_FIELDS . concat ( options . customFields . item || [ ] ) ;
112
149
var feedFields = FEED_FIELDS . concat ( options . customFields . feed || [ ] ) ;
113
150
114
151
var json = { feed : { entries : [ ] } } ;
115
- var channel = xmlObj . rss . channel [ 0 ] ;
116
- if ( channel [ 'atom:link' ] ) json . feed . feedUrl = channel [ 'atom:link' ] [ 0 ] . $ . href ;
117
152
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 ) {
123
156
var entry = { } ;
124
- itemFields . forEach ( function ( f ) {
125
- if ( item [ f ] ) entry [ f ] = item [ f ] [ 0 ] ;
126
- } )
157
+ copyFromXML ( item , entry , itemFields ) ;
127
158
if ( item . enclosure ) {
128
159
entry . enclosure = item . enclosure [ 0 ] . $ ;
129
160
}
@@ -136,14 +167,31 @@ var parseRSS2 = function(xmlObj, options, callback) {
136
167
if ( entry . guid . _ ) entry . guid = entry . guid . _ ;
137
168
}
138
169
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
+ }
139
178
json . feed . entries . push ( entry ) ;
140
179
} )
141
- if ( xmlObj . rss . $ [ 'xmlns:itunes' ] ) {
142
- decorateItunes ( json , channel ) ;
143
- }
144
180
callback ( null , json ) ;
145
181
}
146
182
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
+
147
195
/**
148
196
* Add iTunes specific fields from XML to extracted JSON
149
197
*
@@ -176,39 +224,31 @@ var decorateItunes = function decorateItunes(json, channel) {
176
224
json . feed . itunes . owner = owner ;
177
225
}
178
226
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
+ }
195
236
} ) ;
196
237
}
197
238
198
- Parser . parseString = function ( xml , settings , callback ) {
239
+ Parser . parseString = function ( xml , options , callback ) {
199
240
if ( ! callback ) {
200
- callback = settings ;
201
- settings = { } ;
241
+ callback = options ;
242
+ options = { } ;
202
243
}
203
-
204
244
XML2JS . parseString ( xml , function ( err , result ) {
205
245
if ( err ) return callback ( err ) ;
206
246
if ( result . feed ) {
207
- return parseAtomFeed ( result , callback )
247
+ return parseAtomFeed ( result , options , callback )
208
248
} 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 ) ;
210
250
} else {
211
- return parseRSS1 ( result , callback ) ;
251
+ return parseRSS1 ( result , options , callback ) ;
212
252
}
213
253
} ) ;
214
254
}
@@ -248,7 +288,7 @@ Parser.parseURL = function(feedUrl, options, callback) {
248
288
req . on ( 'error' , callback ) ;
249
289
}
250
290
251
- Parser . parseFile = function ( file , options , callback ) {
291
+ Parser . parseFile = function ( file , options , callback ) {
252
292
FS . readFile ( file , 'utf8' , function ( err , contents ) {
253
293
return Parser . parseString ( contents , options , callback ) ;
254
294
} )
0 commit comments