feedjira 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +8 -0
- data/.travis.yml +31 -12
- data/CHANGELOG.md +15 -1
- data/Dangerfile +1 -0
- data/Gemfile +2 -1
- data/Rakefile +6 -1
- data/feedjira.gemspec +16 -14
- data/fixtures/vcr_cassettes/fetch_failure.yml +62 -0
- data/fixtures/vcr_cassettes/parse_error.yml +222 -0
- data/fixtures/vcr_cassettes/success.yml +281 -0
- data/lib/feedjira.rb +9 -0
- data/lib/feedjira/core_ext.rb +3 -3
- data/lib/feedjira/core_ext/date.rb +2 -1
- data/lib/feedjira/core_ext/string.rb +1 -1
- data/lib/feedjira/core_ext/time.rb +19 -16
- data/lib/feedjira/date_time_utilities.rb +24 -0
- data/lib/feedjira/date_time_utilities/date_time_language_parser.rb +22 -0
- data/lib/feedjira/date_time_utilities/date_time_pattern_parser.rb +29 -0
- data/lib/feedjira/feed.rb +27 -18
- data/lib/feedjira/feed_entry_utilities.rb +15 -17
- data/lib/feedjira/feed_utilities.rb +26 -21
- data/lib/feedjira/parser/atom.rb +9 -8
- data/lib/feedjira/parser/atom_entry.rb +10 -13
- data/lib/feedjira/parser/atom_feed_burner.rb +8 -10
- data/lib/feedjira/parser/atom_feed_burner_entry.rb +11 -14
- data/lib/feedjira/parser/atom_youtube.rb +20 -0
- data/lib/feedjira/parser/atom_youtube_entry.rb +29 -0
- data/lib/feedjira/parser/google_docs_atom.rb +6 -6
- data/lib/feedjira/parser/google_docs_atom_entry.rb +11 -11
- data/lib/feedjira/parser/itunes_rss.rb +39 -22
- data/lib/feedjira/parser/itunes_rss_category.rb +38 -0
- data/lib/feedjira/parser/itunes_rss_item.rb +28 -20
- data/lib/feedjira/parser/itunes_rss_owner.rb +3 -4
- data/lib/feedjira/parser/podlove_chapter.rb +20 -0
- data/lib/feedjira/parser/rss.rb +10 -8
- data/lib/feedjira/parser/rss_entry.rb +17 -21
- data/lib/feedjira/parser/rss_feed_burner.rb +4 -6
- data/lib/feedjira/parser/rss_feed_burner_entry.rb +23 -28
- data/lib/feedjira/parser/rss_image.rb +15 -0
- data/lib/feedjira/preprocessor.rb +2 -2
- data/lib/feedjira/version.rb +1 -1
- data/spec/feedjira/date_time_utilities_spec.rb +41 -0
- data/spec/feedjira/feed_entry_utilities_spec.rb +23 -19
- data/spec/feedjira/feed_spec.rb +109 -74
- data/spec/feedjira/feed_utilities_spec.rb +65 -63
- data/spec/feedjira/parser/atom_entry_spec.rb +54 -34
- data/spec/feedjira/parser/atom_feed_burner_entry_spec.rb +27 -20
- data/spec/feedjira/parser/atom_feed_burner_spec.rb +32 -30
- data/spec/feedjira/parser/atom_spec.rb +50 -48
- data/spec/feedjira/parser/atom_youtube_entry_spec.rb +86 -0
- data/spec/feedjira/parser/atom_youtube_spec.rb +43 -0
- data/spec/feedjira/parser/google_docs_atom_entry_spec.rb +5 -4
- data/spec/feedjira/parser/google_docs_atom_spec.rb +6 -6
- data/spec/feedjira/parser/itunes_rss_item_spec.rb +33 -29
- data/spec/feedjira/parser/itunes_rss_owner_spec.rb +10 -9
- data/spec/feedjira/parser/itunes_rss_spec.rb +83 -30
- data/spec/feedjira/parser/podlove_chapter_spec.rb +37 -0
- data/spec/feedjira/parser/rss_entry_spec.rb +50 -33
- data/spec/feedjira/parser/rss_feed_burner_entry_spec.rb +55 -33
- data/spec/feedjira/parser/rss_feed_burner_spec.rb +31 -26
- data/spec/feedjira/parser/rss_spec.rb +56 -24
- data/spec/feedjira/preprocessor_spec.rb +11 -3
- data/spec/sample_feeds.rb +29 -21
- data/spec/sample_feeds/AmazonWebServicesBlog.xml +797 -797
- data/spec/sample_feeds/AtomEscapedHTMLInPreTag.xml +13 -0
- data/spec/sample_feeds/CRE.xml +5849 -0
- data/spec/sample_feeds/FeedBurnerXHTML.xml +400 -400
- data/spec/sample_feeds/ITunesWithSingleQuotedAttributes.xml +67 -0
- data/spec/sample_feeds/PaulDixExplainsNothing.xml +175 -175
- data/spec/sample_feeds/PaulDixExplainsNothingAlternate.xml +175 -175
- data/spec/sample_feeds/PaulDixExplainsNothingFirstEntryContent.xml +16 -16
- data/spec/sample_feeds/PaulDixExplainsNothingWFW.xml +174 -174
- data/spec/sample_feeds/TenderLovemaking.xml +12 -2
- data/spec/sample_feeds/TrotterCashionHome.xml +611 -611
- data/spec/sample_feeds/TypePadNews.xml +368 -368
- data/spec/sample_feeds/itunes.xml +18 -2
- data/spec/sample_feeds/pet_atom.xml +229 -229
- data/spec/sample_feeds/youtube_atom.xml +395 -0
- data/spec/spec_helper.rb +6 -0
- metadata +112 -27
@@ -6,18 +6,18 @@ module Feedjira
|
|
6
6
|
include SAXMachine
|
7
7
|
include FeedUtilities
|
8
8
|
element :title
|
9
|
-
element :subtitle, :
|
10
|
-
element :link, :
|
11
|
-
element :link, :
|
12
|
-
elements :link, :
|
13
|
-
elements :entry, :
|
9
|
+
element :subtitle, as: :description
|
10
|
+
element :link, as: :url, value: :href, with: { type: 'text/html' }
|
11
|
+
element :link, as: :feed_url, value: :href, with: { type: 'application/atom+xml' } # rubocop:disable Metrics/LineLength
|
12
|
+
elements :link, as: :links, value: :href
|
13
|
+
elements :entry, as: :entries, class: GoogleDocsAtomEntry
|
14
14
|
|
15
15
|
def url
|
16
16
|
@url ||= links.first
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.able_to_parse?(xml) #:nodoc:
|
20
|
-
%r{<id>https?://docs
|
20
|
+
%r{<id>https?://docs\.google\.com/.*\</id\>} =~ xml
|
21
21
|
end
|
22
22
|
|
23
23
|
def feed_url
|
@@ -5,21 +5,21 @@ module Feedjira
|
|
5
5
|
include FeedEntryUtilities
|
6
6
|
|
7
7
|
element :title
|
8
|
-
element :link, :
|
9
|
-
element :name, :
|
8
|
+
element :link, as: :url, value: :href, with: { type: 'text/html', rel: 'alternate' } # rubocop:disable Metrics/LineLength
|
9
|
+
element :name, as: :author
|
10
10
|
element :content
|
11
11
|
element :summary
|
12
12
|
element :published
|
13
|
-
element :id, :
|
14
|
-
element :created, :
|
15
|
-
element :issued, :
|
13
|
+
element :id, as: :entry_id
|
14
|
+
element :created, as: :published
|
15
|
+
element :issued, as: :published
|
16
16
|
element :updated
|
17
|
-
element :modified, :
|
18
|
-
elements :category, :
|
19
|
-
elements :link, :
|
20
|
-
element :"docs:md5Checksum", :
|
21
|
-
element :"docs:filename", :
|
22
|
-
element :"docs:suggestedFilename", :
|
17
|
+
element :modified, as: :updated
|
18
|
+
elements :category, as: :categories, value: :term
|
19
|
+
elements :link, as: :links, value: :href
|
20
|
+
element :"docs:md5Checksum", as: :checksum
|
21
|
+
element :"docs:filename", as: :original_filename
|
22
|
+
element :"docs:suggestedFilename", as: :suggested_filename
|
23
23
|
|
24
24
|
def url
|
25
25
|
@url ||= links.first
|
@@ -1,8 +1,10 @@
|
|
1
1
|
module Feedjira
|
2
|
-
|
3
2
|
module Parser
|
4
3
|
# iTunes is RSS 2.0 + some apple extensions
|
5
|
-
#
|
4
|
+
# Sources:
|
5
|
+
# * https://cyber.harvard.edu/rss/rss.html
|
6
|
+
# * http://lists.apple.com/archives/syndication-dev/2005/Nov/msg00002.html
|
7
|
+
# * https://help.apple.com/itc/podcasts_connect/
|
6
8
|
class ITunesRSS
|
7
9
|
include SAXMachine
|
8
10
|
include FeedUtilities
|
@@ -12,39 +14,54 @@ module Feedjira
|
|
12
14
|
# RSS 2.0 elements that need including
|
13
15
|
element :copyright
|
14
16
|
element :description
|
17
|
+
element :image, class: RSSImage
|
15
18
|
element :language
|
19
|
+
element :lastBuildDate, as: :last_built
|
20
|
+
element :link, as: :url
|
16
21
|
element :managingEditor
|
22
|
+
element :rss, as: :version, value: :version
|
17
23
|
element :title
|
18
|
-
element :
|
24
|
+
element :ttl
|
19
25
|
|
20
26
|
# If author is not present use managingEditor on the channel
|
21
|
-
element :"itunes:author", :
|
22
|
-
element :"itunes:block", :
|
23
|
-
element :"itunes:image", :
|
24
|
-
element :"itunes:explicit", :
|
25
|
-
element :"itunes:
|
27
|
+
element :"itunes:author", as: :itunes_author
|
28
|
+
element :"itunes:block", as: :itunes_block
|
29
|
+
element :"itunes:image", value: :href, as: :itunes_image
|
30
|
+
element :"itunes:explicit", as: :itunes_explicit
|
31
|
+
element :"itunes:complete", as: :itunes_complete
|
32
|
+
element :"itunes:keywords", as: :itunes_keywords
|
33
|
+
|
26
34
|
# New URL for the podcast feed
|
27
|
-
element :"itunes:new_feed_url", :
|
28
|
-
element :"itunes:subtitle", :
|
35
|
+
element :"itunes:new_feed_url", as: :itunes_new_feed_url
|
36
|
+
element :"itunes:subtitle", as: :itunes_subtitle
|
37
|
+
|
29
38
|
# If summary is not present, use the description tag
|
30
|
-
element :"itunes:summary", :
|
39
|
+
element :"itunes:summary", as: :itunes_summary
|
31
40
|
|
32
|
-
# iTunes RSS feeds can have multiple main categories
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
41
|
+
# iTunes RSS feeds can have multiple main categories and multiple
|
42
|
+
# sub-categories per category.
|
43
|
+
elements :"itunes:category", as: :_itunes_categories,
|
44
|
+
class: ITunesRSSCategory
|
45
|
+
private :_itunes_categories
|
37
46
|
|
38
|
-
|
47
|
+
def itunes_categories
|
48
|
+
_itunes_categories.flat_map do |itunes_category|
|
49
|
+
itunes_category.enum_for(:each_subcategory).to_a
|
50
|
+
end
|
51
|
+
end
|
39
52
|
|
40
|
-
|
53
|
+
def itunes_category_paths
|
54
|
+
_itunes_categories.flat_map do |itunes_category|
|
55
|
+
itunes_category.enum_for(:each_path).to_a
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
elements :"itunes:owner", as: :itunes_owners, class: ITunesRSSOwner
|
60
|
+
elements :item, as: :entries, class: ITunesRSSItem
|
41
61
|
|
42
62
|
def self.able_to_parse?(xml)
|
43
|
-
|
63
|
+
%r{xmlns:itunes\s?=\s?[\"\']http://www\.itunes\.com/dtds/podcast-1\.0\.dtd[\"\']}i =~ xml # rubocop:disable Metrics/LineLength
|
44
64
|
end
|
45
|
-
|
46
65
|
end
|
47
|
-
|
48
66
|
end
|
49
|
-
|
50
67
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Feedjira
|
2
|
+
module Parser
|
3
|
+
# iTunes extensions to the standard RSS2.0 item
|
4
|
+
# Source: https://help.apple.com/itc/podcasts_connect/#/itcb54353390
|
5
|
+
class ITunesRSSCategory
|
6
|
+
include SAXMachine
|
7
|
+
|
8
|
+
attribute :text
|
9
|
+
|
10
|
+
elements :"itunes:category", as: :itunes_categories,
|
11
|
+
class: ITunesRSSCategory
|
12
|
+
|
13
|
+
def each_subcategory
|
14
|
+
return to_enum(__method__) unless block_given?
|
15
|
+
|
16
|
+
yield text
|
17
|
+
|
18
|
+
itunes_categories.each do |itunes_category|
|
19
|
+
itunes_category.each_subcategory(&proc)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def each_path(ancestors = [])
|
24
|
+
return to_enum(__method__, ancestors) unless block_given?
|
25
|
+
|
26
|
+
category_hierarchy = ancestors + [text]
|
27
|
+
|
28
|
+
if itunes_categories.empty?
|
29
|
+
yield category_hierarchy
|
30
|
+
else
|
31
|
+
itunes_categories.each do |itunes_category|
|
32
|
+
itunes_category.each_path(category_hierarchy, &proc)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Feedjira
|
2
|
-
|
3
2
|
module Parser
|
4
3
|
# iTunes extensions to the standard RSS2.0 item
|
5
4
|
# Source: http://www.apple.com/itunes/whatson/podcasts/specs.html
|
@@ -8,29 +7,38 @@ module Feedjira
|
|
8
7
|
include FeedEntryUtilities
|
9
8
|
|
10
9
|
element :author
|
11
|
-
element :guid, :
|
10
|
+
element :guid, as: :entry_id
|
12
11
|
element :title
|
13
|
-
element :link, :
|
14
|
-
element :description, :
|
15
|
-
element :"content:encoded", :
|
16
|
-
element :pubDate, :
|
12
|
+
element :link, as: :url
|
13
|
+
element :description, as: :summary
|
14
|
+
element :"content:encoded", as: :content
|
15
|
+
element :pubDate, as: :published
|
17
16
|
|
18
17
|
# If author is not present use author tag on the item
|
19
|
-
element :"itunes:author", :
|
20
|
-
element :"itunes:block", :
|
21
|
-
element :"itunes:duration", :
|
22
|
-
element :"itunes:explicit", :
|
23
|
-
element :"itunes:keywords", :
|
24
|
-
element :"itunes:subtitle", :
|
25
|
-
element :"itunes:image", :
|
26
|
-
element :"itunes:isClosedCaptioned", :
|
27
|
-
element :"itunes:order", :
|
18
|
+
element :"itunes:author", as: :itunes_author
|
19
|
+
element :"itunes:block", as: :itunes_block
|
20
|
+
element :"itunes:duration", as: :itunes_duration
|
21
|
+
element :"itunes:explicit", as: :itunes_explicit
|
22
|
+
element :"itunes:keywords", as: :itunes_keywords
|
23
|
+
element :"itunes:subtitle", as: :itunes_subtitle
|
24
|
+
element :"itunes:image", value: :href, as: :itunes_image
|
25
|
+
element :"itunes:isClosedCaptioned", as: :itunes_closed_captioned
|
26
|
+
element :"itunes:order", as: :itunes_order
|
27
|
+
|
28
28
|
# If summary is not present, use the description tag
|
29
|
-
element :"itunes:summary", :
|
30
|
-
element :enclosure, :
|
31
|
-
element :enclosure, :
|
32
|
-
element :enclosure, :
|
29
|
+
element :"itunes:summary", as: :itunes_summary
|
30
|
+
element :enclosure, value: :length, as: :enclosure_length
|
31
|
+
element :enclosure, value: :type, as: :enclosure_type
|
32
|
+
element :enclosure, value: :url, as: :enclosure_url
|
33
|
+
elements 'psc:chapter', as: :raw_chapters, class: Feedjira::Parser::PodloveChapter # rubocop:disable Metrics/LineLength
|
34
|
+
|
35
|
+
# Podlove requires clients to re-order by start time in the
|
36
|
+
# event the publisher doesn't provide them in that
|
37
|
+
# order. SAXMachine doesn't have any sort capability afaik, so
|
38
|
+
# we have to sort chapters manually.
|
39
|
+
def chapters
|
40
|
+
raw_chapters.sort_by(&:start)
|
41
|
+
end
|
33
42
|
end
|
34
43
|
end
|
35
|
-
|
36
44
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
module Feedjira
|
2
|
-
|
3
2
|
module Parser
|
4
3
|
class ITunesRSSOwner
|
5
4
|
include SAXMachine
|
6
5
|
include FeedUtilities
|
7
|
-
|
8
|
-
element :"itunes:
|
6
|
+
|
7
|
+
element :"itunes:name", as: :name
|
8
|
+
element :"itunes:email", as: :email
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
12
11
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Feedjira
|
2
|
+
module Parser
|
3
|
+
class PodloveChapter
|
4
|
+
include SAXMachine
|
5
|
+
include FeedEntryUtilities
|
6
|
+
attribute :start, as: :start_ntp
|
7
|
+
attribute :title
|
8
|
+
attribute :href, as: :url
|
9
|
+
attribute :image
|
10
|
+
|
11
|
+
def start
|
12
|
+
return unless start_ntp
|
13
|
+
parts = start_ntp.split(':')
|
14
|
+
parts.reverse.to_enum.with_index.map do |part, index|
|
15
|
+
part.to_f * (60**index)
|
16
|
+
end.reduce(:+)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/feedjira/parser/rss.rb
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
module Feedjira
|
2
|
-
|
3
2
|
module Parser
|
4
3
|
# Parser for dealing with RSS feeds.
|
4
|
+
# Source: https://cyber.harvard.edu/rss/rss.html
|
5
5
|
class RSS
|
6
6
|
include SAXMachine
|
7
7
|
include FeedUtilities
|
8
|
+
element :description
|
9
|
+
element :image, class: RSSImage
|
10
|
+
element :language
|
11
|
+
element :lastBuildDate, as: :last_built
|
12
|
+
element :link, as: :url
|
8
13
|
element :rss, as: :version, value: :version
|
9
14
|
element :title
|
10
|
-
element :
|
11
|
-
|
12
|
-
elements :item, :
|
13
|
-
elements :"atom:link", :as => :hubs, :value => :href, :with => {:rel => "hub"}
|
15
|
+
element :ttl
|
16
|
+
elements :"atom:link", as: :hubs, value: :href, with: { rel: 'hub' }
|
17
|
+
elements :item, as: :entries, class: RSSEntry
|
14
18
|
|
15
19
|
attr_accessor :feed_url
|
16
20
|
|
17
|
-
def self.able_to_parse?(xml)
|
21
|
+
def self.able_to_parse?(xml)
|
18
22
|
(/\<rss|\<rdf/ =~ xml) && !(/feedburner/ =~ xml)
|
19
23
|
end
|
20
24
|
end
|
21
|
-
|
22
25
|
end
|
23
|
-
|
24
26
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Feedjira
|
2
|
-
|
3
2
|
module Parser
|
4
3
|
# Parser for dealing with RDF feed entries.
|
5
4
|
class RSSEntry
|
@@ -7,31 +6,28 @@ module Feedjira
|
|
7
6
|
include FeedEntryUtilities
|
8
7
|
|
9
8
|
element :title
|
10
|
-
element :link, :
|
11
|
-
|
12
|
-
element :"dc:creator", :as => :author
|
13
|
-
element :author, :as => :author
|
14
|
-
element :"content:encoded", :as => :content
|
15
|
-
element :description, :as => :summary
|
9
|
+
element :link, as: :url
|
16
10
|
|
17
|
-
element :"
|
18
|
-
element :
|
11
|
+
element :"dc:creator", as: :author
|
12
|
+
element :author, as: :author
|
13
|
+
element :"content:encoded", as: :content
|
14
|
+
element :description, as: :summary
|
19
15
|
|
20
|
-
element :
|
21
|
-
element :
|
22
|
-
element :"dc:date", :as => :published
|
23
|
-
element :"dc:Date", :as => :published
|
24
|
-
element :"dcterms:created", :as => :published
|
16
|
+
element :"media:content", as: :image, value: :url
|
17
|
+
element :enclosure, as: :image, value: :url
|
25
18
|
|
19
|
+
element :pubDate, as: :published
|
20
|
+
element :pubdate, as: :published
|
21
|
+
element :"dc:date", as: :published
|
22
|
+
element :"dc:Date", as: :published
|
23
|
+
element :"dcterms:created", as: :published
|
26
24
|
|
27
|
-
element :"dcterms:modified", :
|
28
|
-
element :issued, :
|
29
|
-
elements :category, :
|
25
|
+
element :"dcterms:modified", as: :updated
|
26
|
+
element :issued, as: :published
|
27
|
+
elements :category, as: :categories
|
30
28
|
|
31
|
-
element :guid, :
|
32
|
-
element :"dc:identifier", :
|
29
|
+
element :guid, as: :entry_id
|
30
|
+
element :"dc:identifier", as: :entry_id
|
33
31
|
end
|
34
|
-
|
35
32
|
end
|
36
|
-
|
37
33
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Feedjira
|
2
|
-
|
3
2
|
module Parser
|
4
3
|
# Parser for dealing with RSS feeds.
|
5
4
|
class RSSFeedBurner
|
@@ -7,9 +6,10 @@ module Feedjira
|
|
7
6
|
include FeedUtilities
|
8
7
|
element :title
|
9
8
|
element :description
|
10
|
-
element :link, :
|
11
|
-
|
12
|
-
elements :
|
9
|
+
element :link, as: :url
|
10
|
+
element :lastBuildDate, as: :last_built
|
11
|
+
elements :"atom10:link", as: :hubs, value: :href, with: { rel: 'hub' }
|
12
|
+
elements :item, as: :entries, class: RSSFeedBurnerEntry
|
13
13
|
|
14
14
|
attr_accessor :feed_url
|
15
15
|
|
@@ -17,7 +17,5 @@ module Feedjira
|
|
17
17
|
(/\<rss|\<rdf/ =~ xml) && (/feedburner/ =~ xml)
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
22
|
-
|
23
21
|
end
|
@@ -1,43 +1,38 @@
|
|
1
1
|
module Feedjira
|
2
|
-
|
3
2
|
module Parser
|
4
3
|
# Parser for dealing with RDF feed entries.
|
5
4
|
class RSSFeedBurnerEntry
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
element :title
|
10
|
-
|
11
|
-
element :"feedburner:origLink", :as => :url
|
12
|
-
element :link, :as => :url
|
5
|
+
include SAXMachine
|
6
|
+
include FeedEntryUtilities
|
13
7
|
|
14
|
-
|
15
|
-
element :author, :as => :author
|
16
|
-
element :"content:encoded", :as => :content
|
17
|
-
element :description, :as => :summary
|
8
|
+
element :title
|
18
9
|
|
19
|
-
|
20
|
-
|
10
|
+
element :"feedburner:origLink", as: :url
|
11
|
+
element :link, as: :url
|
21
12
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
element :"dcterms:created", :as => :published
|
13
|
+
element :"dc:creator", as: :author
|
14
|
+
element :author, as: :author
|
15
|
+
element :"content:encoded", as: :content
|
16
|
+
element :description, as: :summary
|
27
17
|
|
18
|
+
element :"media:content", as: :image, value: :url
|
19
|
+
element :enclosure, as: :image, value: :url
|
28
20
|
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
element :pubDate, as: :published
|
22
|
+
element :pubdate, as: :published
|
23
|
+
element :"dc:date", as: :published
|
24
|
+
element :"dc:Date", as: :published
|
25
|
+
element :"dcterms:created", as: :published
|
32
26
|
|
33
|
-
|
27
|
+
element :"dcterms:modified", as: :updated
|
28
|
+
element :issued, as: :published
|
29
|
+
elements :category, as: :categories
|
34
30
|
|
35
|
-
|
36
|
-
@url || @link
|
37
|
-
end
|
31
|
+
element :guid, as: :entry_id
|
38
32
|
|
33
|
+
def url
|
34
|
+
@url || @link
|
35
|
+
end
|
39
36
|
end
|
40
|
-
|
41
37
|
end
|
42
|
-
|
43
38
|
end
|