@@ -4,14 +4,25 @@ import 'package:dart_rss/domain/atom_feed.dart';
44import 'package:dart_rss/domain/rss1_feed.dart' ;
55import 'package:dart_rss/domain/rss_feed.dart' ;
66import 'package:xml/xml.dart' as xml;
7+ import 'package:intl/intl.dart' ;
78
89extension SafeParseDateTime on DateTime {
910 static DateTime safeParse (String str) {
11+ const dateFormatPatterns = [
12+ 'EEE, d MMM yyyy HH:mm:ss Z' ,
13+ ];
14+
1015 try {
1116 return DateTime .parse (str);
1217 } catch (_) {
13- return null ;
18+ for (final pattern in dateFormatPatterns) {
19+ try {
20+ final format = DateFormat (pattern);
21+ return format.parse (str);
22+ } catch (_) {}
23+ }
1424 }
25+ return null ;
1526 }
1627}
1728
@@ -40,56 +51,15 @@ class WebFeed {
4051 switch (rssVersion) {
4152 case RssVersion .RSS1 :
4253 final rss1Feed = Rss1Feed .parse (xmlString);
43- return WebFeed (
44- title: rss1Feed.title,
45- description: rss1Feed.description,
46- links: [rss1Feed.link],
47- items: rss1Feed.items
48- .map (
49- (item) => WebFeedItem (
50- title: item.title,
51- body: item.description ?? item.dc? .description,
52- updated: SafeParseDateTime .safeParse (item.dc? .date),
53- links: [item.link],
54- ),
55- )
56- .toList (),
57- );
54+ return WebFeed .fromRss1 (rss1Feed);
5855 break ;
5956 case RssVersion .RSS2 :
6057 final rss2Feed = RssFeed .parse (xmlString);
61- return WebFeed (
62- title: rss2Feed.title,
63- description: rss2Feed.description,
64- links: [rss2Feed.link],
65- items: rss2Feed.items
66- .map (
67- (item) => WebFeedItem (
68- title: item.title,
69- body: item.description ?? item.dc? .description,
70- updated: SafeParseDateTime .safeParse (item.dc? .date),
71- ),
72- )
73- .toList (),
74- );
58+ return WebFeed .fromRss2 (rss2Feed);
7559 break ;
7660 case RssVersion .Atom :
7761 final atomFeed = AtomFeed .parse (xmlString);
78- return WebFeed (
79- title: atomFeed.title,
80- description: atomFeed.subtitle,
81- links: atomFeed.links.map ((atomLink) => atomLink.href).toList (),
82- items: atomFeed.items
83- .map (
84- (item) => WebFeedItem (
85- title: item.title,
86- body: item.summary,
87- updated: SafeParseDateTime .safeParse (item.updated),
88- links: item.links.map ((atomLink) => atomLink.href).toList (),
89- ),
90- )
91- .toList (),
92- );
62+ return WebFeed .fromAtom (atomFeed);
9363 break ;
9464 case RssVersion .Unknown :
9565 throw Error .safeToString (
@@ -100,6 +70,62 @@ class WebFeed {
10070 }
10171 }
10272
73+ static WebFeed fromRss1 (Rss1Feed rss1feed) {
74+ return WebFeed (
75+ title: rss1feed.title ?? rss1feed.dc.title ?? '' ,
76+ description: rss1feed.description ?? rss1feed.dc? .description ?? '' ,
77+ links: [rss1feed.link],
78+ items: rss1feed.items
79+ .map (
80+ (item) => WebFeedItem (
81+ title: item.title ?? item.dc? .title ?? '' ,
82+ body: item.description ?? item.dc? .description ?? '' ,
83+ updated: SafeParseDateTime .safeParse (item.dc? .date),
84+ links: [item.link],
85+ ),
86+ )
87+ .toList (),
88+ );
89+ }
90+
91+ static WebFeed fromRss2 (RssFeed rssFeed) {
92+ return WebFeed (
93+ title: rssFeed.title ?? rssFeed.dc.title ?? '' ,
94+ description: rssFeed.description ?? rssFeed.dc.description ?? '' ,
95+ links: [rssFeed.link],
96+ items: rssFeed.items
97+ .map (
98+ (item) => WebFeedItem (
99+ title: item.title ?? item.dc.title ?? '' ,
100+ body: item.description ?? item.dc.description ?? '' ,
101+ updated: SafeParseDateTime .safeParse (item.pubDate) ??
102+ SafeParseDateTime .safeParse (item.dc.date),
103+ links: [item.link],
104+ ),
105+ )
106+ .toList (),
107+ );
108+ }
109+
110+ static WebFeed fromAtom (AtomFeed atomFeed) {
111+ return WebFeed (
112+ title: atomFeed.title,
113+ description: atomFeed.subtitle,
114+ links: atomFeed.links.map ((atomLink) => atomLink.href).toList (),
115+ items: atomFeed.items
116+ .map (
117+ (item) => WebFeedItem (
118+ title: item.title,
119+ body: item.summary ?? item.content,
120+ updated: SafeParseDateTime .safeParse (item.updated) ??
121+ SafeParseDateTime .safeParse (item.published),
122+ links: item.links.map ((atomLink) => atomLink.href).toList (),
123+ ),
124+ )
125+ .toList (),
126+ );
127+ }
128+
103129 static Future <WebFeed > fromUrl (String url) async {
104130 final response = await http.get (url);
105131 return fromXmlString (response.body);
0 commit comments