epodder 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ecd79269c9453422ef0c084f210dc069f65c290b
4
+ data.tar.gz: 3fecdad4ad7a39555589713bb6798f26c6906bc2
5
+ SHA512:
6
+ metadata.gz: bb4d61a4fbb044c995646026948546d678cf3c92806d69d2c9871b9cfd60750b500b0e7c58f6b8b17cd2a81cce8be6832929396293a73a21d60130e6076c1ad5
7
+ data.tar.gz: 94c55e0cff2e673c57a2ea998dfa32e7974453287314dccae05f418d753a32ed1a719f6894a08a0b5fde79db85b958aacaef288b515031f85878f3ab775d8816
data/bin/epodder CHANGED
@@ -1,6 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
- require "bundler/setup"
3
+ require 'bundler/setup'
4
+ require 'require_all'
5
+ require 'cmdparse'
6
+ require 'yell'
7
+
4
8
  require_relative '../lib/epodder'
5
9
 
6
10
  Epodder.run
data/lib/arguments.rb CHANGED
@@ -48,8 +48,6 @@ module Epodder
48
48
  def method_missing(name, value=nil, *args)
49
49
  if @args.has_key? name
50
50
  @args[name]
51
- else
52
- nil
53
51
  end
54
52
  end
55
53
 
@@ -1,6 +1,6 @@
1
1
  #TODO clean up nil!!
2
2
  module Epodder
3
- class Configurator
3
+ class Configurator < Eclass
4
4
  @@default_path = "~/.epodder/"
5
5
  @@db_path = "epodder.db"
6
6
  @@yaml_path = "epodder.yaml"
@@ -62,6 +62,7 @@ module Epodder
62
62
  false
63
63
  end
64
64
 
65
+
65
66
  def start_logging
66
67
  logger = Yell.new :name => 'log' do |l|
67
68
  if @args.log_file.nil?
@@ -1,6 +1,6 @@
1
1
  require 'data_mapper'
2
2
  module Epodder
3
- class Episode
3
+ class Episode < Eclass
4
4
  include DataMapper::Resource
5
5
 
6
6
  property :id, Serial
@@ -1,5 +1,5 @@
1
1
  module Epodder
2
- class Podcast
2
+ class Podcast < Eclass
3
3
  include DataMapper::Resource
4
4
  property :id, Serial
5
5
  property :title, String, :length=> 500
data/lib/epodder.rb CHANGED
@@ -1,33 +1,26 @@
1
1
  module Epodder
2
- require "rubygems"
3
- require "bundler/setup"
4
- require 'require_all'
5
- require 'data_mapper'
6
- require 'cmdparse'
7
- require 'yell'
2
+ require_all File.dirname(File.dirname(__FILE__)) << '/lib'
8
3
 
9
- require_all File.dirname(File.dirname(__FILE__)) << '/lib'
4
+ @@verbose = false
10
5
 
11
- @@verbose = false
6
+ def verbose?
7
+ @@verbose
8
+ end
12
9
 
13
- def verbose?
14
- @@verbose
15
- end
10
+ def verbose= state
11
+ @@verbose = state
12
+ end
16
13
 
17
- def verbose= state
18
- @@verbose = state
19
- end
14
+ def self.do_verb verb, args
15
+ c = Epodder.const_get(verb.to_s.capitalize)
16
+ verb_object = c.send :new
17
+ verb_object.send verb, args
18
+ end
20
19
 
21
- def self.do_verb verb, args
22
- c = Epodder.const_get(verb.to_s.capitalize)
23
- verb_object = c.send :new
24
- verb_object.send verb, args
25
- end
26
-
27
- def self.run
28
- args = Arguments.new
29
- Configurator.new(args)
30
- do_verb args.action, args.arguments
31
- end
20
+ def self.run
21
+ args = Arguments.new
22
+ Configurator.new(args)
23
+ do_verb args.action, args.arguments
24
+ end
32
25
 
33
26
  end
data/lib/verb/catchup.rb CHANGED
@@ -4,16 +4,12 @@ module Epodder
4
4
  if args.empty?
5
5
  podcasts = Podcast.all
6
6
  else
7
- podcasts = args.map {|id| Podcast.get(id)}
7
+ podcasts = args.map {|id| Podcast.get(id.to_i)}
8
8
  end
9
- catchup_podcasts podcasts
10
- end
11
-
12
- def catchup_podcasts podcasts
13
- podcasts.each do |podcast|
9
+ podcasts.each do |podcast|
14
10
  Episode.all(:downloaded => false, :podcast => podcast).update(:downloaded => true)
15
11
  end
16
- end
12
+ end
17
13
  end
18
14
 
19
15
  end
data/lib/verb/clean.rb CHANGED
@@ -8,7 +8,7 @@ module Epodder
8
8
  if args.empty?
9
9
  podcasts = Podcast.all
10
10
  else
11
- podcasts = args.map{|podcast| Podcast.get(podcast)}
11
+ podcasts = args.map{|podcast| Podcast.get(podcast.to_i)}
12
12
  end
13
13
  podcasts.each do |podcast|
14
14
  count = 0
@@ -17,15 +17,13 @@ module Epodder
17
17
  known_episodes = known_episodes.map{|episode| episode.url.to_s}
18
18
  feed_episodes = feed_episodes.map{|episode|@episode = episode; episode.enclosure.url}
19
19
  episodes = (known_episodes - feed_episodes)
20
- puts "know episodes was #{known_episodes.length - feed_episodes.length} longer than feed episodes"
20
+ episodes_length = episodes.length
21
21
  episodes.map{|episode| Episode.all(:url => episode)}.each do |episode|
22
- count += 1
23
- win = episode.destroy
24
- if !win
22
+ if !episode.destroy
25
23
  episode.errors.each {|error| puts error}
26
24
  end
27
25
  end
28
- puts "#{podcast.title} -- cleaned #{count} episodes"
26
+ puts "#{podcast.title} -- cleaned #{episodes_length} episodes"
29
27
  end
30
28
  end
31
29
 
data/lib/verb/download.rb CHANGED
@@ -9,11 +9,12 @@ module Epodder
9
9
  end
10
10
 
11
11
  def download args
12
- look_for_episodes lookup_args(args)
12
+ each_argument(args) do |podcast|
13
+ look_for_episodes podcast
14
+ end
13
15
  end
14
16
 
15
- def look_for_episodes podcasts
16
- podcasts.each do |podcast|
17
+ def look_for_episodes podcast
17
18
  episodes = Episode.all(:downloaded => false, :podcast => podcast)
18
19
  episodes.select{|ep| !ep.nil?}.each do |episode|
19
20
  puts episode.podcast.title
@@ -22,14 +23,13 @@ module Epodder
22
23
  puts "Downloading #{title} - #{episode.title || episode.id}"
23
24
  download_episode episode
24
25
  end
25
- end
26
26
  end
27
27
 
28
28
  def download_episode episode
29
29
  begin
30
30
  @mechanize.get(episode.url).save_as("download/#{episode.podcast.title.strip}/#{episode.url.to_s.match('((?!\/).)*$')}")
31
31
  episode.mark_as_downloaded
32
- rescue Exception => e
32
+ rescue StandardError => e
33
33
  puts e
34
34
  end
35
35
  end
data/lib/verb/remove.rb CHANGED
@@ -6,6 +6,12 @@ module Epodder
6
6
  end
7
7
 
8
8
  def remove args
9
+ each_argument(args) do |podcast|
10
+ input = ask("Remove #{podcast.id} : #{podcast.title}? Type \"YES\" to remove")
11
+ if input == "YES"
12
+ podcast.destroy
13
+ end
14
+ end
9
15
  args.map{|id| Podcast.get(id)}.each do |podcast|
10
16
  input = ask("Remove #{podcast.id} : #{podcast.title}? Type \"YES\" to remove")
11
17
  if input == "YES"
data/lib/verb/update.rb CHANGED
@@ -11,53 +11,52 @@ module Epodder
11
11
  end
12
12
 
13
13
  def update args
14
- check_for_new_episodes lookup_args(args)
14
+ each_argument(args) do |podcast|
15
+ check_for_new_episodes podcast
16
+ end
15
17
  end
16
18
 
17
- def check_for_new_episodes podcasts
18
- podcasts.each do |podcast|
19
- @podcast = podcast
20
- @podcast_urls = @podcast.episodes.map {|episode| episode.url}
19
+ def check_for_new_episodes podcast
21
20
  max_pub = get_max_pubdate podcast
22
21
  open_podcast podcast, max_pub
23
- end
24
22
  end
25
23
 
26
24
  def get_max_pubdate podcast
27
- Episode.max(:pub_date, :conditions => { :podcast => podcast}) || Time.at(0).to_date
25
+ Episode.max(:pub_date, :conditions => { :podcast => podcast }) || Time.at(0).to_date
28
26
  end
29
27
 
30
28
  def open_podcast podcast, max_pub
31
29
  begin
32
30
  @mechanize.get(podcast.uri) do |feed|
33
31
  @log.info "Maximum pubdate for #{podcast.title} - #{podcast.id} is #{max_pub}"
34
- parse_feed feed, max_pub
32
+ parse_feed feed, podcast, max_pub
35
33
  end
36
- rescue Exception => e
37
- puts e
34
+ rescue StandardError => e
35
+ puts "#{podcast.title} - #{e}"
38
36
  end
39
37
  end
40
38
 
41
- def parse_feed feed, max_pub
39
+ def parse_feed feed, database_podcast, max_pub
42
40
  podcast = FeedMe.parse feed.body
43
41
  podcast.emulate_atom!
44
- @count = 0
45
- podcast.items.each do |item|
46
- add_eligable_episodes item, max_pub
47
- end
48
- puts "#{@podcast.title} has #{@count} new episodes" if @count > 0
42
+ pending_episodes = podcast.items.select {|item| is_valid? item, max_pub}
43
+ pending_episodes.each {|pending_episode| add_eligible_episode database_podcast, pending_episode }
44
+ length = pending_episodes.length
45
+ puts "#{database_podcast.title} has #{length} new episodes" if length > 0
46
+ end
47
+
48
+ def is_valid? item, max_pub
49
+ item.enclosure && item.pubdate.to_date > max_pub.to_date
49
50
  end
50
51
 
51
- def add_eligable_episodes item, max_pub
52
- if item.enclosure && item.pubdate.to_date > max_pub.to_date
52
+ def add_eligible_episode podcast, item
53
53
  begin
54
- @count += 1
55
54
  ep = Episode.first_or_create(
56
55
  :title => item.title,
57
56
  :url => item.enclosure.url,
58
57
  :pub_date => item.pubdate.to_date,
59
58
  :downloaded => false,
60
- :podcast => @podcast
59
+ :podcast => podcast
61
60
  )
62
61
  ep.errors.each do |error|
63
62
  @log.error error
@@ -65,8 +64,8 @@ module Epodder
65
64
 
66
65
  rescue Exception => e
67
66
  @log.error e
67
+ raise e
68
68
  end
69
- end
70
69
  end
71
70
 
72
71
  end
data/lib/verb/verb.rb CHANGED
@@ -1,24 +1,37 @@
1
1
  module Epodder
2
- class Verb < Eclass
3
- def verb_struct
4
- super
5
- Struct.new(:name,:description,:block)
6
- end
2
+ class Verb < Eclass
3
+ def verb_struct
4
+ super
5
+ Struct.new(:name,:description,:block)
6
+ end
7
7
 
8
- def add_command (cmd, args)
9
- command = CmdParse::Command.new(@verb.name,false,false)
10
- command.short_desc = @verb.description
11
- command.set_execution_block(&@verb.block)
12
- cmd.add_command(command)
13
- end
8
+ def add_command (cmd, args)
9
+ command = CmdParse::Command.new(@verb.name,false,false)
10
+ command.short_desc = @verb.description
11
+ command.set_execution_block(&@verb.block)
12
+ cmd.add_command(command)
13
+ end
14
14
 
15
- def lookup_args args
16
- if args.empty?
17
- podcasts = Podcast.all
18
- else
19
- podcasts = args.map {|id| Podcast.get(id)}
20
- end
21
- end
15
+ def lookup_args args
16
+ if args.empty?
17
+ podcasts = Podcast.all
18
+ else
19
+ podcasts = args.map {|id| Podcast.get(id.to_i)}
20
+ end
21
+ end
22
22
 
23
- end
23
+ def each_argument args, &block
24
+ podcasts = nil
25
+ if args.empty?
26
+ podcasts = Podcast.all
27
+ else
28
+ podcasts = args.map {|id| Podcast.get(id.to_i)}
29
+ end
30
+ podcasts.each do |podcast|
31
+ yield podcast
32
+ end
33
+ end
34
+
35
+
36
+ end
24
37
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: epodder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 0.0.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Eric Bergstrom
@@ -14,145 +13,225 @@ dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: nokogiri
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: feedme
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: mechanize
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: cmdparse
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: data_mapper
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: dm-sqlite-adapter
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: yell
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: highline
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :runtime
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: require_all
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - '>='
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :runtime
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: bundler
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: excellent
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: flog
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: flay
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rubocop
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '>='
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: rspec
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - '>='
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - '>='
156
235
  - !ruby/object:Gem::Version
157
236
  version: '0'
158
237
  description:
@@ -163,7 +242,6 @@ extensions: []
163
242
  extra_rdoc_files: []
164
243
  files:
165
244
  - lib/arguments.rb
166
- - lib/configuration/configuration.rb
167
245
  - lib/configuration/configurator.rb
168
246
  - lib/database/episode.rb
169
247
  - lib/database/podcast.rb
@@ -181,26 +259,25 @@ files:
181
259
  - bin/epodder
182
260
  homepage: http://github.com/scribe/epodder
183
261
  licenses: []
262
+ metadata: {}
184
263
  post_install_message:
185
264
  rdoc_options: []
186
265
  require_paths:
187
266
  - lib
188
267
  required_ruby_version: !ruby/object:Gem::Requirement
189
- none: false
190
268
  requirements:
191
- - - ! '>='
269
+ - - '>='
192
270
  - !ruby/object:Gem::Version
193
271
  version: '0'
194
272
  required_rubygems_version: !ruby/object:Gem::Requirement
195
- none: false
196
273
  requirements:
197
- - - ! '>='
274
+ - - '>='
198
275
  - !ruby/object:Gem::Version
199
276
  version: '0'
200
277
  requirements: []
201
278
  rubyforge_project:
202
- rubygems_version: 1.8.25
279
+ rubygems_version: 2.0.3
203
280
  signing_key:
204
- specification_version: 3
281
+ specification_version: 4
205
282
  summary: Ruby re-do of hpodder
206
283
  test_files: []
@@ -1,4 +0,0 @@
1
- module Epodder
2
- module Configuration
3
- end
4
- end