feedzirra-podcast 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'feedzirra-podcast/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "feedzirra-podcast"
8
+ spec.version = FeedzirraPodcast::VERSION
9
+ spec.authors = ["Chris Kalafarski"]
10
+ spec.email = ["chris@farski.com"]
11
+ spec.description = %q{Strict RSS 2 podcast parsing with Feedzirra}
12
+ spec.summary = %q{Feedzirra parser classes strictly for handling podcasts strictly}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+
24
+ spec.add_dependency("feedzirra")
25
+ spec.add_dependency("periodic", "~> 1.2.2")
26
+ end
@@ -0,0 +1,11 @@
1
+ module FeedzirraPodcast
2
+ module Parser
3
+ class ItunesOwner
4
+ include SAXMachine
5
+ include Feedzirra::FeedUtilities
6
+
7
+ element :"itunes:email", as: :email
8
+ element :"itunes:name", as: :name
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,68 @@
1
+ require 'feedzirra-podcast/parser/podcast_item'
2
+
3
+ module FeedzirraPodcast
4
+ module Parser
5
+ class Podcast < FeedzirraPodcast::Parser::RSS2
6
+
7
+ elements :item, as: :items, class: PodcastItem
8
+
9
+ # iTunes
10
+
11
+ element :"itunes:author", as: :itunes_author
12
+ element :"itunes:owner", as: :itunes_owner, class: ItunesOwner
13
+ element :"itunes:explicit", as: :itunes_explicit_string
14
+ element :"itunes:subtitle", as: :itunes_subtitle
15
+ element :"itunes:summary", as: :itunes_summary
16
+ elements :"itunes:category", as: :itunes_categories, value: :text
17
+ element :"itunes:image", as: :itunes_image, value: :href
18
+ element :"itunes:keywords", as: :itunes_keywords_string
19
+
20
+ element :"itunes:block", as: :itunes_block_string
21
+ element :"itunes:complete", as: :itunes_complete_string
22
+ element :"itunes:new-feed-url", as: :itunes_new_feed_url
23
+
24
+ # Syndication RSS
25
+
26
+ # element :"sy:updatePeriod"
27
+ # element :"sy:updateFrequency"
28
+ # element :"sy:updateBase"
29
+
30
+ # Misc
31
+
32
+ element :issn
33
+
34
+ def itunes_explicit
35
+ case itunes_explicit_string
36
+ when "yes"
37
+ true
38
+ when "clean"
39
+ :clean
40
+ else
41
+ false
42
+ end
43
+ end
44
+
45
+ def itunes_keywords
46
+ itunes_keywords_string.split(',').map(&:strip) if itunes_keywords_string.present?
47
+ end
48
+
49
+ def itunes_block
50
+ case itunes_block_string
51
+ when "yes"
52
+ true
53
+ else
54
+ false
55
+ end
56
+ end
57
+
58
+ def itunes_complete
59
+ case itunes_complete_string
60
+ when "yes"
61
+ true
62
+ else
63
+ false
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,80 @@
1
+ require 'feedzirra-podcast/parser/itunes_owner'
2
+
3
+ module FeedzirraPodcast
4
+ module Parser
5
+ class PodcastItem < FeedzirraPodcast::Parser::RSS2Item
6
+
7
+ # iTunes
8
+
9
+ element :"itunes:author", as: :itunes_author
10
+ element :"itunes:subtitle", as: :itunes_subtitle
11
+ element :"itunes:summary", as: :itunes_summary
12
+ element :"itunes:explicit", as: :itunes_explicit_string
13
+ element :"itunes:duration", as: :itunes_duration_string
14
+ element :"itunes:keywords", as: :itunes_keywords_string
15
+ element :"itunes:image", as: :itunes_image, value: :href
16
+
17
+ element :"itunes:block", as: :itunes_block_string
18
+ element :"itunes:isClosedCaptioned", as: :itunes_is_closed_captioned_string
19
+ element :"itunes:order", as: :itunes_order_string
20
+
21
+ # DC
22
+
23
+ element :"dc:creator", as: :dc_creator
24
+ element :"dc:created", as: :dc_created_string
25
+
26
+ # Content
27
+
28
+ element :"content:encoded", as: :content_encoded
29
+
30
+ def itunes_explicit
31
+ case itunes_explicit_string
32
+ when "yes"
33
+ true
34
+ when "clean"
35
+ :clean
36
+ else
37
+ false
38
+ end
39
+ end
40
+
41
+ def itunes_duration
42
+ Periodic.parse(itunes_duration_string) if itunes_duration_string.present?
43
+ # rescue
44
+ # nil
45
+ end
46
+
47
+ def itunes_keywords
48
+ itunes_keywords_string.split(',').map(&:strip) if itunes_keywords_string.present?
49
+ end
50
+
51
+ def itunes_block
52
+ case itunes_block_string
53
+ when "yes"
54
+ true
55
+ else
56
+ false
57
+ end
58
+ end
59
+
60
+ def itunes_is_closed_captioned
61
+ case itunes_is_closed_captioned_string
62
+ when "yes"
63
+ true
64
+ else
65
+ false
66
+ end
67
+ end
68
+
69
+ def itunes_order
70
+ itunes_order_string.to_f if itunes_order_string.present?
71
+ end
72
+
73
+ def dc_created
74
+ Time.parse(dc_created_string).utc if dc_created_string.present?
75
+ rescue ArgumentError
76
+ nil
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,57 @@
1
+ require 'feedzirra-podcast/parser/rss2_channel_image'
2
+
3
+ module FeedzirraPodcast
4
+ module Parser
5
+ class RSS2
6
+ include SAXMachine
7
+ include Feedzirra::FeedUtilities
8
+
9
+ # RSS 2.0 required
10
+
11
+ element :link
12
+ element :title
13
+ element :description
14
+
15
+ # RSS 2.0 optional
16
+
17
+ element :language
18
+ element :copyright
19
+ element :managingEditor
20
+ element :webMaster
21
+ element :pubDate, as: :pub_date_string
22
+ element :lastBuildDate, as: :last_build_date_string
23
+ elements :category, as: :categories
24
+ element :image, class: FeedzirraPodcast::Parser::RSS2ChannelImage
25
+ element :docs
26
+
27
+ element :generator
28
+ element :rating
29
+ element :ttl
30
+ # skipDays
31
+ # skipHours
32
+
33
+ # cloud
34
+ # textinput
35
+
36
+ # elements :item, as: :items, class: RSS2Item
37
+
38
+ attr_accessor :feed_url
39
+
40
+ def self.able_to_parse?(xml) #:nodoc:
41
+ (/\<rss|\<rdf/ =~ xml)
42
+ end
43
+
44
+ def pubDate
45
+ Time.parse(pub_date_string).utc if pub_date_string.present?
46
+ rescue ArgumentError
47
+ nil
48
+ end
49
+
50
+ def lastBuildDate
51
+ Time.parse(last_build_date_string).utc if last_build_date_string.present?
52
+ rescue ArgumentError
53
+ nil
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,15 @@
1
+ module FeedzirraPodcast
2
+ module Parser
3
+ class RSS2ChannelImage
4
+ include SAXMachine
5
+ include Feedzirra::FeedUtilities
6
+
7
+ element :url
8
+ element :title
9
+ element :link
10
+ element :width
11
+ element :height
12
+ element :description
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,42 @@
1
+ module FeedzirraPodcast
2
+ module Parser
3
+ class RSS2Item
4
+ include SAXMachine
5
+ include Feedzirra::FeedEntryUtilities
6
+
7
+ # RSS 2.0 required
8
+
9
+ element :title
10
+ element :description
11
+
12
+ # RSS 2.0 optional
13
+
14
+ element :link
15
+ element :author
16
+ element :pubDate, as: :pub_date_string
17
+ element :source, as: :source_title
18
+ element :source, as: :source_url, value: :url
19
+ elements :category, as: :categories
20
+ element :guid # isPermalink might be a thing
21
+ element :enclosure, as: :enclosure_url, value: :url
22
+ element :enclosure, as: :enclosure_length, value: :length
23
+ element :enclosure, as: :enclosure_type, value: :type
24
+
25
+ element :comments
26
+
27
+ def pubDate
28
+ Time.parse(pub_date_string).utc if pub_date_string.present?
29
+ rescue ArgumentError
30
+ nil
31
+ end
32
+
33
+ def source
34
+ Struct.new(:title, :url).new(source_title, source_url)
35
+ end
36
+
37
+ def enclosure
38
+ Struct.new(:url, :length, :type).new(enclosure_url, enclosure_length.try(:to_f), enclosure_type)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module FeedzirraPodcast
2
+ VERSION = '0.0.9'
3
+ end
@@ -0,0 +1,11 @@
1
+ require 'periodic'
2
+ require 'feedzirra'
3
+
4
+ require 'feedzirra-podcast/parser/rss2'
5
+ require 'feedzirra-podcast/parser/rss2_channel_image'
6
+ require 'feedzirra-podcast/parser/rss2_item'
7
+
8
+ require 'feedzirra-podcast/parser/podcast'
9
+ require 'feedzirra-podcast/parser/podcast_item'
10
+
11
+ require 'feedzirra-podcast/parser/itunes_owner'
@@ -0,0 +1,14 @@
1
+ require 'minitest/spec'
2
+ require 'minitest/autorun'
3
+ require 'feedzirra-podcast'
4
+
5
+ class PodcastChannelTest < MiniTest::Unit::TestCase
6
+ def setup
7
+ text = File.open('etc/feeds/99percentinvisible.xml', 'r').read
8
+ @feed = FeedzirraPodcast::Parser::Podcast.parse(text)
9
+ end
10
+
11
+ def test_itunes_author
12
+ assert_equal 'Roman Mars', @feed.itunes_author
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ require 'minitest/spec'
2
+ require 'minitest/autorun'
3
+ require 'feedzirra-podcast'
4
+
5
+ class PodcastItemTest < MiniTest::Unit::TestCase
6
+ def setup
7
+ text = File.open('etc/feeds/99percentinvisible.xml', 'r').read
8
+ @feed = FeedzirraPodcast::Parser::Podcast.parse(text)
9
+ @item = @feed.items.first
10
+ end
11
+
12
+ def test_itunes_author
13
+ assert_equal 'Roman Mars', @item.itunes_author
14
+ end
15
+
16
+ def test_duration
17
+ assert_equal '31:04', @item.itunes_duration_string
18
+ assert_equal 1864, @item.itunes_duration
19
+ end
20
+
21
+ def test_explicit
22
+ assert_equal 'no', @item.itunes_explicit_string
23
+ assert_equal false, @item.itunes_explicit
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ require 'minitest/spec'
2
+ require 'minitest/autorun'
3
+ require 'feedzirra-podcast'
4
+
5
+ class RSSChannelTest < MiniTest::Unit::TestCase
6
+ def setup
7
+ text = File.open('etc/feeds/99percentinvisible.xml', 'r').read
8
+ @feed = FeedzirraPodcast::Parser::Podcast.parse(text)
9
+ end
10
+
11
+ def test_title
12
+ assert_equal '99% Invisible', @feed.title
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require 'minitest/spec'
2
+ require 'minitest/autorun'
3
+ require 'feedzirra-podcast'
4
+
5
+ class RSSItemTest < MiniTest::Unit::TestCase
6
+ def setup
7
+ text = File.open('etc/feeds/99percentinvisible.xml', 'r').read
8
+ @feed = FeedzirraPodcast::Parser::Podcast.parse(text)
9
+ @item = @feed.items.first
10
+ end
11
+
12
+ def test_title
13
+ assert_equal '84- Ode to Ladislav Sutnar plus Trading Places with Planet Money', @item.title
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: feedzirra-podcast
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ platform: ruby
6
+ authors:
7
+ - Chris Kalafarski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: feedzirra
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: periodic
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.2
69
+ description: Strict RSS 2 podcast parsing with Feedzirra
70
+ email:
71
+ - chris@farski.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - etc/feeds/99percentinvisible.xml
82
+ - feedzirra-podcast.gemspec
83
+ - lib/feedzirra-podcast.rb
84
+ - lib/feedzirra-podcast/parser/itunes_owner.rb
85
+ - lib/feedzirra-podcast/parser/podcast.rb
86
+ - lib/feedzirra-podcast/parser/podcast_item.rb
87
+ - lib/feedzirra-podcast/parser/rss2.rb
88
+ - lib/feedzirra-podcast/parser/rss2_channel_image.rb
89
+ - lib/feedzirra-podcast/parser/rss2_item.rb
90
+ - lib/feedzirra-podcast/version.rb
91
+ - test/podcast_channel_test.rb
92
+ - test/podcast_item_test.rb
93
+ - test/rss_channel_test.rb
94
+ - test/rss_item_test.rb
95
+ homepage: ''
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.0.3
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Feedzirra parser classes strictly for handling podcasts strictly
119
+ test_files:
120
+ - test/podcast_channel_test.rb
121
+ - test/podcast_item_test.rb
122
+ - test/rss_channel_test.rb
123
+ - test/rss_item_test.rb