epodder 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/arguments.rb +23 -23
- data/lib/configuration/configurator.rb +19 -19
- data/lib/database/episode.rb +8 -8
- data/lib/database/podcast.rb +2 -2
- data/lib/epodder.rb +3 -3
- data/lib/verb/add.rb +9 -9
- data/lib/verb/catchup.rb +3 -3
- data/lib/verb/clean.rb +16 -16
- data/lib/verb/download.rb +5 -5
- data/lib/verb/fetch.rb +2 -2
- data/lib/verb/list.rb +2 -2
- data/lib/verb/remove.rb +4 -4
- data/lib/verb/update.rb +58 -58
- data/lib/verb/verb.rb +8 -12
- metadata +49 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3e6c2fa3630be50d6529e958889d1033e7bbefe
|
4
|
+
data.tar.gz: b08d84f6d0b89c8983b92f554350de0f7bf46c81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9327a39d1905c3fae8d7a96bb81af8691b9783dba48cb9c165dec2ab1c8b57669a499225ec42892c6a580b435254cc534550cff3e6cff5db9d4cd467b343cc4d
|
7
|
+
data.tar.gz: 28f535afc6306d253cd5888cb72d4d28c2d7b2a7628014869f29e01270b9a3e7f19e50bad9f35eac271c8be63292d633032c064cd6f624608009a5962d1dc103
|
data/lib/arguments.rb
CHANGED
@@ -2,38 +2,38 @@ module Epodder
|
|
2
2
|
class Arguments
|
3
3
|
attr_accessor :args
|
4
4
|
|
5
|
-
def initialize
|
6
|
-
@args =
|
5
|
+
def initialize
|
6
|
+
@args = {}
|
7
7
|
@args[:arguments] = []
|
8
|
-
verb = Struct.new(:name
|
8
|
+
verb = Struct.new(:name, :desc, :block)
|
9
9
|
@verbs = [
|
10
|
-
verb.new('add','Add a new podcast.', Proc.new {|args| @args[:action] = :add; @args[:arguments] = args}),
|
11
|
-
verb.new('catchup','Mark older episodes as downloaded.', Proc.new {|args| @args[:action] = :catchup; @args[:arguments] = args}),
|
12
|
-
verb.new('remove','Remove a feed by supplying an id.', Proc.new {|args| @args[:action] = :remove; @args[:arguments] = args}),
|
13
|
-
verb.new('lscasts','List podcasts.', Proc.new {|args| @args[:action] = :list_podcast; @args[:arguments] = args}),
|
14
|
-
verb.new('lseps','List episodes of a podcast by id.', Proc.new {|args| @args[:action] = :list_episodes; @args[:arguments] = args}),
|
15
|
-
verb.new('fetch','Update then download podcasts', Proc.new {|args| @args[:action] = :fetch; @args[:arguments] = args}),
|
16
|
-
verb.new('download','Download podcasts specified by a list of id or all podcasts', Proc.new {|args| @args[:action] = :download; @args[:arguments] = args}),
|
17
|
-
verb.new('update','Update podcasts specified by a list of id or all podcasts', Proc.new {|args| @args[:action] = :update; @args[:arguments] = args}),
|
18
|
-
verb.new(
|
10
|
+
verb.new('add', 'Add a new podcast.', Proc.new { |args| @args[:action] = :add; @args[:arguments] = args }),
|
11
|
+
verb.new('catchup', 'Mark older episodes as downloaded.', Proc.new { |args| @args[:action] = :catchup; @args[:arguments] = args }),
|
12
|
+
verb.new('remove', 'Remove a feed by supplying an id.', Proc.new { |args| @args[:action] = :remove; @args[:arguments] = args }),
|
13
|
+
verb.new('lscasts', 'List podcasts.', Proc.new { |args| @args[:action] = :list_podcast; @args[:arguments] = args }),
|
14
|
+
verb.new('lseps', 'List episodes of a podcast by id.', Proc.new { |args| @args[:action] = :list_episodes; @args[:arguments] = args }),
|
15
|
+
verb.new('fetch', 'Update then download podcasts', Proc.new { |args| @args[:action] = :fetch; @args[:arguments] = args }),
|
16
|
+
verb.new('download', 'Download podcasts specified by a list of id or all podcasts', Proc.new { |args| @args[:action] = :download; @args[:arguments] = args }),
|
17
|
+
verb.new('update', 'Update podcasts specified by a list of id or all podcasts', Proc.new { |args| @args[:action] = :update; @args[:arguments] = args }),
|
18
|
+
verb.new('clean', 'Remove old content from the database', Proc.new { |args| @args[:action] = :clean; @args[:arguments] = args })
|
19
19
|
]
|
20
20
|
get_args
|
21
21
|
end
|
22
22
|
|
23
23
|
def get_args
|
24
|
-
@args[:path] =
|
25
|
-
cmd = CmdParse::CommandParser.new(
|
26
|
-
cmd.program_name =
|
24
|
+
@args[:path] = '~/.epodder'
|
25
|
+
cmd = CmdParse::CommandParser.new(true, true)
|
26
|
+
cmd.program_name = 'ePodder'
|
27
27
|
cmd.program_version = [0, 0, 8]
|
28
28
|
cmd.options = CmdParse::OptionParserWrapper.new do |opt|
|
29
|
-
opt.separator
|
30
|
-
opt.on(
|
31
|
-
opt.on(
|
32
|
-
opt.on(
|
29
|
+
opt.separator 'Global options:'
|
30
|
+
opt.on('-v', '--verbose', 'Be verbose when outputting info') { |t| @args[:verbose] = true }
|
31
|
+
opt.on('-c', '--conf-dir [PATH]', 'Set the configuration directory') { |path| @args[:path] = path }
|
32
|
+
opt.on('-l', '--log-path [PATH]', 'Set logging to the specified file') { |path| @args[:log_file] = path }
|
33
33
|
end
|
34
34
|
|
35
|
-
cmd.add_command(
|
36
|
-
cmd.add_command(
|
35
|
+
cmd.add_command(CmdParse::HelpCommand.new)
|
36
|
+
cmd.add_command(CmdParse::VersionCommand.new)
|
37
37
|
|
38
38
|
@verbs.each do |verb|
|
39
39
|
command = CmdParse::Command.new(verb.name, false, false)
|
@@ -45,8 +45,8 @@ module Epodder
|
|
45
45
|
cmd.parse
|
46
46
|
end
|
47
47
|
|
48
|
-
def method_missing(name, value=nil, *args)
|
49
|
-
if @args.
|
48
|
+
def method_missing(name, value = nil, *args)
|
49
|
+
if @args.key? name
|
50
50
|
@args[name]
|
51
51
|
end
|
52
52
|
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
#TODO clean up nil!!
|
1
|
+
# TODO clean up nil!!
|
2
2
|
module Epodder
|
3
3
|
class Configurator < Eclass
|
4
|
-
@@default_path =
|
5
|
-
@@db_path =
|
6
|
-
@@yaml_path =
|
4
|
+
@@default_path = '~/.epodder/'
|
5
|
+
@@db_path = 'epodder.db'
|
6
|
+
@@yaml_path = 'epodder.yaml'
|
7
7
|
@@default = {
|
8
|
-
:
|
9
|
-
:
|
8
|
+
path_to_db: 'epodder.db',
|
9
|
+
path_to_download: '~/podcasts'
|
10
10
|
}
|
11
11
|
|
12
|
-
def initialize
|
12
|
+
def initialize(args)
|
13
13
|
@args = args
|
14
14
|
load_working_dir! @args.path
|
15
15
|
load_config!
|
@@ -20,17 +20,17 @@ module Epodder
|
|
20
20
|
|
21
21
|
|
22
22
|
def load_config!
|
23
|
-
#Check to see if we have a config file or if we need to create it
|
23
|
+
# Check to see if we have a config file or if we need to create it
|
24
24
|
if !File.exists? @@yaml_path
|
25
25
|
begin
|
26
|
-
File.open(@@yaml_path,
|
26
|
+
File.open(@@yaml_path, 'w') do |io|
|
27
27
|
YAML.dump(@@default, io)
|
28
28
|
end
|
29
29
|
rescue SystemCallError, NameError => error
|
30
30
|
puts "Could not load #{@@yaml_path}: #{error}"
|
31
31
|
exit
|
32
32
|
end
|
33
|
-
end
|
33
|
+
end
|
34
34
|
@conf = YAML.load_file(@@yaml_path)
|
35
35
|
end
|
36
36
|
|
@@ -38,17 +38,17 @@ module Epodder
|
|
38
38
|
|
39
39
|
def load_download_dir!
|
40
40
|
Dir.mkdir File.expand_path(@conf[:path_to_download]) unless Dir.exists?(File.expand_path(@conf[:path_to_download]))
|
41
|
-
File.symlink(File.expand_path(@conf[:path_to_download]),
|
41
|
+
File.symlink(File.expand_path(@conf[:path_to_download]), 'download') unless File.exists? 'download'
|
42
42
|
end
|
43
43
|
|
44
44
|
def load_database!
|
45
|
-
#Datamapper magic goes here
|
45
|
+
# Datamapper magic goes here
|
46
46
|
DataMapper.setup(:default, "sqlite://#{Dir.pwd}/#{@conf[:path_to_db]}")
|
47
47
|
DataMapper.finalize
|
48
48
|
DataMapper.auto_upgrade!
|
49
49
|
end
|
50
50
|
|
51
|
-
def load_working_dir!
|
51
|
+
def load_working_dir!(path)
|
52
52
|
@path = File.expand_path(path || @@default_path)
|
53
53
|
Dir.mkdir @path unless Dir.exists? @path
|
54
54
|
Dir.chdir @path unless file_error
|
@@ -64,22 +64,22 @@ module Epodder
|
|
64
64
|
|
65
65
|
|
66
66
|
def start_logging
|
67
|
-
logger = Yell.new :
|
67
|
+
logger = Yell.new name: 'log' do |l|
|
68
68
|
if @args.log_file.nil?
|
69
69
|
if @args.verbose
|
70
|
-
l.adapter :stdout,
|
70
|
+
l.adapter :stdout, 'epodder.log', level: Yell.level(:info)
|
71
71
|
else
|
72
|
-
l.adapter :stdout,
|
72
|
+
l.adapter :stdout, 'epodder.log', level: Yell.level(:error)
|
73
73
|
end
|
74
74
|
else
|
75
75
|
if @args.verbose
|
76
|
-
l.adapter :datefile,
|
76
|
+
l.adapter :datefile, 'epodder.log', level: Yell.level(:info)
|
77
77
|
else
|
78
|
-
l.adapter :datefile,
|
78
|
+
l.adapter :datefile, 'epodder.log', level: Yell.level(:error)
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
82
|
-
logger.info
|
82
|
+
logger.info 'Loaded Logger'
|
83
83
|
end
|
84
84
|
|
85
85
|
end
|
data/lib/database/episode.rb
CHANGED
@@ -4,29 +4,29 @@ module Epodder
|
|
4
4
|
include DataMapper::Resource
|
5
5
|
|
6
6
|
property :id, Serial
|
7
|
-
property :title, String, :
|
7
|
+
property :title, String, length: 500
|
8
8
|
property :url, URI
|
9
9
|
property :downloaded, Boolean
|
10
10
|
property :pub_date, DateTime
|
11
11
|
|
12
12
|
belongs_to :podcast
|
13
13
|
|
14
|
-
def self.lookup
|
14
|
+
def self.lookup(episode)
|
15
15
|
if episode.enclosure
|
16
16
|
@episode = Episode.first_or_create(
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
17
|
+
title: episode.title,
|
18
|
+
url: episode.enclosure.url,
|
19
|
+
pub_date: episode.pubdate,
|
20
|
+
downloaded: false
|
21
21
|
)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def mark_as_downloaded
|
26
26
|
self.downloaded = true
|
27
|
-
success =
|
27
|
+
success = save
|
28
28
|
if !success
|
29
|
-
|
29
|
+
errors.each do |e|
|
30
30
|
puts e
|
31
31
|
end
|
32
32
|
end
|
data/lib/database/podcast.rb
CHANGED
@@ -2,9 +2,9 @@ module Epodder
|
|
2
2
|
class Podcast < Eclass
|
3
3
|
include DataMapper::Resource
|
4
4
|
property :id, Serial
|
5
|
-
property :title, String, :
|
5
|
+
property :title, String, length: 500
|
6
6
|
property :uri, URI
|
7
|
-
has n, :episodes, :
|
7
|
+
has n, :episodes, constraint: :destroy
|
8
8
|
|
9
9
|
end
|
10
10
|
end
|
data/lib/epodder.rb
CHANGED
@@ -7,11 +7,11 @@ module Epodder
|
|
7
7
|
@@verbose
|
8
8
|
end
|
9
9
|
|
10
|
-
def verbose=
|
10
|
+
def verbose=(state)
|
11
11
|
@@verbose = state
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.do_verb
|
14
|
+
def self.do_verb(verb, args)
|
15
15
|
c = Epodder.const_get(verb.to_s.capitalize)
|
16
16
|
verb_object = c.send :new
|
17
17
|
verb_object.send verb, args
|
@@ -19,7 +19,7 @@ module Epodder
|
|
19
19
|
|
20
20
|
def self.run
|
21
21
|
args = Arguments.new
|
22
|
-
Configurator.new(args)
|
22
|
+
Configurator.new(args)
|
23
23
|
do_verb args.action, args.arguments
|
24
24
|
end
|
25
25
|
|
data/lib/verb/add.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
module Epodder
|
2
2
|
class Add < Verb
|
3
3
|
def initialize
|
4
|
-
@mechanize = Mechanize.new
|
5
4
|
end
|
6
5
|
|
7
|
-
def add
|
6
|
+
def add(args)
|
8
7
|
args.each do |url|
|
9
8
|
lookup_podcast url
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
13
|
-
def lookup_podcast
|
14
|
-
|
12
|
+
def lookup_podcast(url)
|
13
|
+
feed = Feedzirra::Feed.fetch_and_parse(url)
|
14
|
+
unless feed.is_a?(Fixnum)
|
15
15
|
save_podcast feed, url
|
16
|
+
else
|
17
|
+
puts "Error #{url} returned #{feed}"
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
|
-
def save_podcast
|
20
|
-
cast = FeedMe.parse feed.body
|
21
|
-
cast.emulate_atom!
|
21
|
+
def save_podcast(feed, url)
|
22
22
|
podcast = Podcast.first_or_create(
|
23
|
-
:
|
24
|
-
:
|
23
|
+
title: feed.title,
|
24
|
+
uri: url
|
25
25
|
)
|
26
26
|
podcast.save
|
27
27
|
|
data/lib/verb/catchup.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Epodder
|
2
2
|
class Catchup < Verb
|
3
|
-
def catchup
|
3
|
+
def catchup(args)
|
4
4
|
if args.empty?
|
5
5
|
podcasts = Podcast.all
|
6
6
|
else
|
7
|
-
podcasts = args.map {|id| Podcast.get(id.to_i)}
|
7
|
+
podcasts = args.map { |id| Podcast.get(id.to_i) }
|
8
8
|
end
|
9
9
|
podcasts.each do |podcast|
|
10
|
-
Episode.all(:
|
10
|
+
Episode.all(downloaded: false, podcast: podcast).update(downloaded: true)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
data/lib/verb/clean.rb
CHANGED
@@ -1,46 +1,46 @@
|
|
1
1
|
module Epodder
|
2
2
|
class Clean < Verb
|
3
3
|
def initialize
|
4
|
-
@mechanize = @mechanize = Mechanize.new
|
5
4
|
end
|
6
5
|
|
7
|
-
def clean
|
6
|
+
def clean(args)
|
8
7
|
if args.empty?
|
9
8
|
podcasts = Podcast.all
|
10
9
|
else
|
11
|
-
podcasts = args.map{|podcast| Podcast.get(podcast.to_i)}
|
10
|
+
podcasts = args.map { |podcast| Podcast.get(podcast.to_i) }
|
12
11
|
end
|
13
12
|
podcasts.each do |podcast|
|
14
|
-
known_episodes = Episode.all(:
|
13
|
+
known_episodes = Episode.all(downloaded: true, podcast: podcast)
|
15
14
|
feed_episodes = open_podcast podcast, DateTime.now
|
16
|
-
known_episodes = known_episodes.map{|episode| episode.url.to_s}
|
17
|
-
feed_episodes = feed_episodes.map{|episode
|
15
|
+
known_episodes = known_episodes.map { |episode| episode.url.to_s }
|
16
|
+
feed_episodes = feed_episodes.map {|episode| @episode = episode; episode.enclosure_url }
|
18
17
|
episodes = (known_episodes - feed_episodes)
|
19
18
|
episodes_length = episodes.length
|
20
|
-
episodes.map{|episode| Episode.all(:
|
19
|
+
episodes.map { |episode| Episode.all(url: episode) }.each do |episode|
|
21
20
|
if !episode.destroy
|
22
|
-
episode.errors.each {|error| puts error}
|
21
|
+
episode.errors.each { |error| puts error }
|
23
22
|
end
|
24
23
|
end
|
25
24
|
puts "#{podcast.title} -- cleaned #{episodes_length} episodes"
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
29
|
-
def open_podcast
|
28
|
+
def open_podcast(podcast, max_pub)
|
30
29
|
begin
|
31
|
-
|
30
|
+
feed = Feedzirra::Feed.fetch_and_parse(podcast.uri.to_s)
|
31
|
+
unless feed.is_a? Fixnum
|
32
32
|
return parse_feed feed, max_pub
|
33
|
+
else
|
34
|
+
raise "Error #{podcast.title} returned #{feed}"
|
33
35
|
end
|
34
|
-
rescue
|
36
|
+
rescue StandardError => e
|
35
37
|
puts e
|
38
|
+
[]
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
39
|
-
def parse_feed
|
40
|
-
|
41
|
-
podcast.emulate_atom!
|
42
|
-
temp = podcast.items.select {|item| !item.enclosure.nil?}
|
43
|
-
temp.select {|item| !item.enclosure.empty?}
|
42
|
+
def parse_feed(feed, max_pub)
|
43
|
+
feed.entries.select { |item| item.respond_to? :enclosure_url}
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
data/lib/verb/download.rb
CHANGED
@@ -2,15 +2,15 @@ require 'downspout'
|
|
2
2
|
module Epodder
|
3
3
|
class Download < Verb
|
4
4
|
|
5
|
-
def download
|
5
|
+
def download(args)
|
6
6
|
each_argument(args) do |podcast|
|
7
7
|
look_for_episodes podcast
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
def look_for_episodes
|
12
|
-
episodes = Episode.all(:
|
13
|
-
episodes.select{|ep| !ep.nil?}.each do |episode|
|
11
|
+
def look_for_episodes(podcast)
|
12
|
+
episodes = Episode.all(downloaded: false, podcast: podcast)
|
13
|
+
episodes.select { |ep| !ep.nil? }.each do |episode|
|
14
14
|
puts episode.podcast.title
|
15
15
|
title = (episode.podcast.title).strip
|
16
16
|
Dir.mkdir "download/#{title}" unless Dir.exists? "download/#{title}"
|
@@ -19,7 +19,7 @@ module Epodder
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def download_episode
|
22
|
+
def download_episode(episode)
|
23
23
|
begin
|
24
24
|
Downspout::Config.max_redirects = 100
|
25
25
|
Downspout::Config.enable_curb! if Downspout::Config.curb_available?
|
data/lib/verb/fetch.rb
CHANGED
data/lib/verb/list.rb
CHANGED
data/lib/verb/remove.rb
CHANGED
@@ -5,16 +5,16 @@ module Epodder
|
|
5
5
|
|
6
6
|
end
|
7
7
|
|
8
|
-
def remove
|
8
|
+
def remove(args)
|
9
9
|
each_argument(args) do |podcast|
|
10
10
|
input = ask("Remove #{podcast.id} : #{podcast.title}? Type \"YES\" to remove")
|
11
|
-
if input ==
|
11
|
+
if input == 'YES'
|
12
12
|
podcast.destroy
|
13
13
|
end
|
14
14
|
end
|
15
|
-
args.map{|id| Podcast.get(id)}.each do |podcast|
|
15
|
+
args.map { |id| Podcast.get(id) }.each do |podcast|
|
16
16
|
input = ask("Remove #{podcast.id} : #{podcast.title}? Type \"YES\" to remove")
|
17
|
-
if input ==
|
17
|
+
if input == 'YES'
|
18
18
|
podcast.destroy
|
19
19
|
end
|
20
20
|
end
|
data/lib/verb/update.rb
CHANGED
@@ -1,72 +1,72 @@
|
|
1
1
|
require 'date'
|
2
|
-
require '
|
3
|
-
require 'mechanize'
|
4
|
-
#require 'progress'
|
2
|
+
require 'feedzirra'
|
5
3
|
module Epodder
|
6
|
-
|
4
|
+
class Update < Verb
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
end
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
def update(args)
|
11
|
+
each_argument(args) do |podcast|
|
12
|
+
check_for_new_episodes podcast
|
13
|
+
end
|
14
|
+
end
|
18
15
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
def check_for_new_episodes(podcast)
|
17
|
+
max_pub = get_max_pubdate podcast
|
18
|
+
open_podcast podcast, max_pub
|
19
|
+
end
|
23
20
|
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
def get_max_pubdate(podcast)
|
22
|
+
Episode.max(:pub_date, conditions: { podcast: podcast }) || Time.at(0).to_date
|
23
|
+
end
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
def open_podcast(podcast, max_pub)
|
26
|
+
begin
|
27
|
+
@log.info "Maximum pubdate for #{podcast.title} - #{podcast.id} is #{max_pub}"
|
28
|
+
parse_feed podcast.uri, podcast, max_pub
|
29
|
+
rescue StandardError => e
|
30
|
+
puts "#{podcast.title} - #{e}"
|
31
|
+
end
|
33
32
|
end
|
34
|
-
rescue StandardError => e
|
35
|
-
puts "#{podcast.title} - #{e}"
|
36
|
-
end
|
37
|
-
end
|
38
33
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
34
|
+
def parse_feed(feed, database_podcast, max_pub)
|
35
|
+
podcast = Feedzirra::Feed.fetch_and_parse(feed.to_s)
|
36
|
+
unless podcast.is_a? Fixnum
|
37
|
+
pending_episodes = podcast.entries.select {|item| is_valid? item, max_pub}
|
38
|
+
else
|
39
|
+
raise "HTTP Error #{podcast}"
|
40
|
+
end
|
41
|
+
pending_episodes.each {|episode| add_eligible_episode database_podcast, episode }
|
42
|
+
length = pending_episodes.length
|
43
|
+
puts "#{database_podcast.title} has #{length} new episodes" if length > 0
|
44
|
+
end
|
51
45
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
46
|
+
def is_valid?(item, max_pub)
|
47
|
+
enclosure = item.respond_to? :enclosure_url
|
48
|
+
published = item.published.to_date
|
49
|
+
enclosure && (published > max_pub.to_date)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_eligible_episode(podcast, item)
|
53
|
+
begin
|
54
|
+
ep = Episode.first_or_create(
|
55
|
+
title: item.title,
|
56
|
+
url: item.enclosure_url,
|
57
|
+
pub_date: item.published.to_date,
|
58
|
+
downloaded: false,
|
59
|
+
podcast: podcast
|
60
|
+
)
|
61
|
+
ep.errors.each do |error|
|
62
|
+
@log.error error
|
63
|
+
end
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
rescue StandardError => e
|
66
|
+
@log.error e
|
67
|
+
raise e
|
68
|
+
end
|
68
69
|
end
|
69
|
-
end
|
70
70
|
|
71
|
-
|
71
|
+
end
|
72
72
|
end
|
data/lib/verb/verb.rb
CHANGED
@@ -2,31 +2,27 @@ module Epodder
|
|
2
2
|
class Verb < Eclass
|
3
3
|
def verb_struct
|
4
4
|
super
|
5
|
-
Struct.new(:name
|
5
|
+
Struct.new(:name, :description, :block)
|
6
6
|
end
|
7
7
|
|
8
|
-
def add_command
|
9
|
-
command = CmdParse::Command.new(@verb.name,false,false)
|
8
|
+
def add_command(cmd, args)
|
9
|
+
command = CmdParse::Command.new(@verb.name, false, false)
|
10
10
|
command.short_desc = @verb.description
|
11
11
|
command.set_execution_block(&@verb.block)
|
12
12
|
cmd.add_command(command)
|
13
13
|
end
|
14
14
|
|
15
|
-
def lookup_args
|
15
|
+
def lookup_args(args)
|
16
16
|
if args.empty?
|
17
17
|
podcasts = Podcast.all
|
18
18
|
else
|
19
|
-
podcasts = args.map {|id| Podcast.get(id.to_i)}
|
19
|
+
podcasts = args.map { |id| Podcast.get(id.to_i) }
|
20
20
|
end
|
21
|
+
podcasts
|
21
22
|
end
|
22
23
|
|
23
|
-
def each_argument
|
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
|
24
|
+
def each_argument(args, &block)
|
25
|
+
podcasts = lookup_args(args) || nil
|
30
26
|
podcasts.each do |podcast|
|
31
27
|
yield podcast
|
32
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epodder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Bergstrom
|
@@ -11,283 +11,255 @@ cert_chain: []
|
|
11
11
|
date: 2013-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: feedme
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - '>='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
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: mechanize
|
14
|
+
name: bundler
|
43
15
|
requirement: !ruby/object:Gem::Requirement
|
44
16
|
requirements:
|
45
|
-
- -
|
17
|
+
- - ">="
|
46
18
|
- !ruby/object:Gem::Version
|
47
19
|
version: '0'
|
48
20
|
type: :runtime
|
49
21
|
prerelease: false
|
50
22
|
version_requirements: !ruby/object:Gem::Requirement
|
51
23
|
requirements:
|
52
|
-
- -
|
24
|
+
- - ">="
|
53
25
|
- !ruby/object:Gem::Version
|
54
26
|
version: '0'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: cmdparse
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
58
30
|
requirements:
|
59
|
-
- -
|
31
|
+
- - ">="
|
60
32
|
- !ruby/object:Gem::Version
|
61
33
|
version: '0'
|
62
34
|
type: :runtime
|
63
35
|
prerelease: false
|
64
36
|
version_requirements: !ruby/object:Gem::Requirement
|
65
37
|
requirements:
|
66
|
-
- -
|
38
|
+
- - ">="
|
67
39
|
- !ruby/object:Gem::Version
|
68
40
|
version: '0'
|
69
41
|
- !ruby/object:Gem::Dependency
|
70
42
|
name: data_mapper
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
72
44
|
requirements:
|
73
|
-
- -
|
45
|
+
- - ">="
|
74
46
|
- !ruby/object:Gem::Version
|
75
47
|
version: '0'
|
76
48
|
type: :runtime
|
77
49
|
prerelease: false
|
78
50
|
version_requirements: !ruby/object:Gem::Requirement
|
79
51
|
requirements:
|
80
|
-
- -
|
52
|
+
- - ">="
|
81
53
|
- !ruby/object:Gem::Version
|
82
54
|
version: '0'
|
83
55
|
- !ruby/object:Gem::Dependency
|
84
56
|
name: dm-sqlite-adapter
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
86
58
|
requirements:
|
87
|
-
- -
|
59
|
+
- - ">="
|
88
60
|
- !ruby/object:Gem::Version
|
89
61
|
version: '0'
|
90
62
|
type: :runtime
|
91
63
|
prerelease: false
|
92
64
|
version_requirements: !ruby/object:Gem::Requirement
|
93
65
|
requirements:
|
94
|
-
- -
|
66
|
+
- - ">="
|
95
67
|
- !ruby/object:Gem::Version
|
96
68
|
version: '0'
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
70
|
name: yell
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
100
72
|
requirements:
|
101
|
-
- -
|
73
|
+
- - ">="
|
102
74
|
- !ruby/object:Gem::Version
|
103
75
|
version: '0'
|
104
76
|
type: :runtime
|
105
77
|
prerelease: false
|
106
78
|
version_requirements: !ruby/object:Gem::Requirement
|
107
79
|
requirements:
|
108
|
-
- -
|
80
|
+
- - ">="
|
109
81
|
- !ruby/object:Gem::Version
|
110
82
|
version: '0'
|
111
83
|
- !ruby/object:Gem::Dependency
|
112
84
|
name: highline
|
113
85
|
requirement: !ruby/object:Gem::Requirement
|
114
86
|
requirements:
|
115
|
-
- -
|
87
|
+
- - ">="
|
116
88
|
- !ruby/object:Gem::Version
|
117
89
|
version: '0'
|
118
90
|
type: :runtime
|
119
91
|
prerelease: false
|
120
92
|
version_requirements: !ruby/object:Gem::Requirement
|
121
93
|
requirements:
|
122
|
-
- -
|
94
|
+
- - ">="
|
123
95
|
- !ruby/object:Gem::Version
|
124
96
|
version: '0'
|
125
97
|
- !ruby/object:Gem::Dependency
|
126
98
|
name: require_all
|
127
99
|
requirement: !ruby/object:Gem::Requirement
|
128
100
|
requirements:
|
129
|
-
- -
|
101
|
+
- - ">="
|
130
102
|
- !ruby/object:Gem::Version
|
131
103
|
version: '0'
|
132
104
|
type: :runtime
|
133
105
|
prerelease: false
|
134
106
|
version_requirements: !ruby/object:Gem::Requirement
|
135
107
|
requirements:
|
136
|
-
- -
|
108
|
+
- - ">="
|
137
109
|
- !ruby/object:Gem::Version
|
138
110
|
version: '0'
|
139
111
|
- !ruby/object:Gem::Dependency
|
140
112
|
name: curb
|
141
113
|
requirement: !ruby/object:Gem::Requirement
|
142
114
|
requirements:
|
143
|
-
- -
|
115
|
+
- - ">="
|
144
116
|
- !ruby/object:Gem::Version
|
145
117
|
version: '0'
|
146
118
|
type: :runtime
|
147
119
|
prerelease: false
|
148
120
|
version_requirements: !ruby/object:Gem::Requirement
|
149
121
|
requirements:
|
150
|
-
- -
|
122
|
+
- - ">="
|
151
123
|
- !ruby/object:Gem::Version
|
152
124
|
version: '0'
|
153
125
|
- !ruby/object:Gem::Dependency
|
154
126
|
name: downspout
|
155
127
|
requirement: !ruby/object:Gem::Requirement
|
156
128
|
requirements:
|
157
|
-
- -
|
129
|
+
- - ">="
|
158
130
|
- !ruby/object:Gem::Version
|
159
131
|
version: '0'
|
160
132
|
type: :runtime
|
161
133
|
prerelease: false
|
162
134
|
version_requirements: !ruby/object:Gem::Requirement
|
163
135
|
requirements:
|
164
|
-
- -
|
136
|
+
- - ">="
|
165
137
|
- !ruby/object:Gem::Version
|
166
138
|
version: '0'
|
167
139
|
- !ruby/object:Gem::Dependency
|
168
140
|
name: home_run
|
169
141
|
requirement: !ruby/object:Gem::Requirement
|
170
142
|
requirements:
|
171
|
-
- -
|
143
|
+
- - ">="
|
172
144
|
- !ruby/object:Gem::Version
|
173
145
|
version: '0'
|
174
146
|
type: :runtime
|
175
147
|
prerelease: false
|
176
148
|
version_requirements: !ruby/object:Gem::Requirement
|
177
149
|
requirements:
|
178
|
-
- -
|
150
|
+
- - ">="
|
179
151
|
- !ruby/object:Gem::Version
|
180
152
|
version: '0'
|
181
153
|
- !ruby/object:Gem::Dependency
|
182
154
|
name: feedzirra
|
183
155
|
requirement: !ruby/object:Gem::Requirement
|
184
156
|
requirements:
|
185
|
-
- -
|
157
|
+
- - ">="
|
186
158
|
- !ruby/object:Gem::Version
|
187
159
|
version: '0'
|
188
160
|
type: :runtime
|
189
161
|
prerelease: false
|
190
162
|
version_requirements: !ruby/object:Gem::Requirement
|
191
163
|
requirements:
|
192
|
-
- -
|
164
|
+
- - ">="
|
193
165
|
- !ruby/object:Gem::Version
|
194
166
|
version: '0'
|
195
167
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
168
|
+
name: simplecov
|
197
169
|
requirement: !ruby/object:Gem::Requirement
|
198
170
|
requirements:
|
199
|
-
- -
|
171
|
+
- - ">="
|
200
172
|
- !ruby/object:Gem::Version
|
201
173
|
version: '0'
|
202
174
|
type: :development
|
203
175
|
prerelease: false
|
204
176
|
version_requirements: !ruby/object:Gem::Requirement
|
205
177
|
requirements:
|
206
|
-
- -
|
178
|
+
- - ">="
|
207
179
|
- !ruby/object:Gem::Version
|
208
180
|
version: '0'
|
209
181
|
- !ruby/object:Gem::Dependency
|
210
|
-
name:
|
182
|
+
name: excellent
|
211
183
|
requirement: !ruby/object:Gem::Requirement
|
212
184
|
requirements:
|
213
|
-
- -
|
185
|
+
- - ">="
|
214
186
|
- !ruby/object:Gem::Version
|
215
187
|
version: '0'
|
216
188
|
type: :development
|
217
189
|
prerelease: false
|
218
190
|
version_requirements: !ruby/object:Gem::Requirement
|
219
191
|
requirements:
|
220
|
-
- -
|
192
|
+
- - ">="
|
221
193
|
- !ruby/object:Gem::Version
|
222
194
|
version: '0'
|
223
195
|
- !ruby/object:Gem::Dependency
|
224
|
-
name:
|
196
|
+
name: flog
|
225
197
|
requirement: !ruby/object:Gem::Requirement
|
226
198
|
requirements:
|
227
|
-
- -
|
199
|
+
- - ">="
|
228
200
|
- !ruby/object:Gem::Version
|
229
201
|
version: '0'
|
230
202
|
type: :development
|
231
203
|
prerelease: false
|
232
204
|
version_requirements: !ruby/object:Gem::Requirement
|
233
205
|
requirements:
|
234
|
-
- -
|
206
|
+
- - ">="
|
235
207
|
- !ruby/object:Gem::Version
|
236
208
|
version: '0'
|
237
209
|
- !ruby/object:Gem::Dependency
|
238
|
-
name:
|
210
|
+
name: flay
|
239
211
|
requirement: !ruby/object:Gem::Requirement
|
240
212
|
requirements:
|
241
|
-
- -
|
213
|
+
- - ">="
|
242
214
|
- !ruby/object:Gem::Version
|
243
215
|
version: '0'
|
244
216
|
type: :development
|
245
217
|
prerelease: false
|
246
218
|
version_requirements: !ruby/object:Gem::Requirement
|
247
219
|
requirements:
|
248
|
-
- -
|
220
|
+
- - ">="
|
249
221
|
- !ruby/object:Gem::Version
|
250
222
|
version: '0'
|
251
223
|
- !ruby/object:Gem::Dependency
|
252
|
-
name:
|
224
|
+
name: rubocop
|
253
225
|
requirement: !ruby/object:Gem::Requirement
|
254
226
|
requirements:
|
255
|
-
- -
|
227
|
+
- - ">="
|
256
228
|
- !ruby/object:Gem::Version
|
257
229
|
version: '0'
|
258
230
|
type: :development
|
259
231
|
prerelease: false
|
260
232
|
version_requirements: !ruby/object:Gem::Requirement
|
261
233
|
requirements:
|
262
|
-
- -
|
234
|
+
- - ">="
|
263
235
|
- !ruby/object:Gem::Version
|
264
236
|
version: '0'
|
265
237
|
- !ruby/object:Gem::Dependency
|
266
|
-
name:
|
238
|
+
name: rspec
|
267
239
|
requirement: !ruby/object:Gem::Requirement
|
268
240
|
requirements:
|
269
|
-
- -
|
241
|
+
- - ">="
|
270
242
|
- !ruby/object:Gem::Version
|
271
243
|
version: '0'
|
272
244
|
type: :development
|
273
245
|
prerelease: false
|
274
246
|
version_requirements: !ruby/object:Gem::Requirement
|
275
247
|
requirements:
|
276
|
-
- -
|
248
|
+
- - ">="
|
277
249
|
- !ruby/object:Gem::Version
|
278
250
|
version: '0'
|
279
251
|
- !ruby/object:Gem::Dependency
|
280
|
-
name:
|
252
|
+
name: pry
|
281
253
|
requirement: !ruby/object:Gem::Requirement
|
282
254
|
requirements:
|
283
|
-
- -
|
255
|
+
- - ">="
|
284
256
|
- !ruby/object:Gem::Version
|
285
257
|
version: '0'
|
286
258
|
type: :development
|
287
259
|
prerelease: false
|
288
260
|
version_requirements: !ruby/object:Gem::Requirement
|
289
261
|
requirements:
|
290
|
-
- -
|
262
|
+
- - ">="
|
291
263
|
- !ruby/object:Gem::Version
|
292
264
|
version: '0'
|
293
265
|
description:
|
@@ -297,6 +269,7 @@ executables:
|
|
297
269
|
extensions: []
|
298
270
|
extra_rdoc_files: []
|
299
271
|
files:
|
272
|
+
- bin/epodder
|
300
273
|
- lib/arguments.rb
|
301
274
|
- lib/configuration/configurator.rb
|
302
275
|
- lib/database/episode.rb
|
@@ -312,7 +285,6 @@ files:
|
|
312
285
|
- lib/verb/remove.rb
|
313
286
|
- lib/verb/update.rb
|
314
287
|
- lib/verb/verb.rb
|
315
|
-
- bin/epodder
|
316
288
|
homepage: http://github.com/scribe/epodder
|
317
289
|
licenses: []
|
318
290
|
metadata: {}
|
@@ -322,17 +294,17 @@ require_paths:
|
|
322
294
|
- lib
|
323
295
|
required_ruby_version: !ruby/object:Gem::Requirement
|
324
296
|
requirements:
|
325
|
-
- -
|
297
|
+
- - ">="
|
326
298
|
- !ruby/object:Gem::Version
|
327
299
|
version: '0'
|
328
300
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
329
301
|
requirements:
|
330
|
-
- -
|
302
|
+
- - ">="
|
331
303
|
- !ruby/object:Gem::Version
|
332
304
|
version: '0'
|
333
305
|
requirements: []
|
334
306
|
rubyforge_project:
|
335
|
-
rubygems_version: 2.0
|
307
|
+
rubygems_version: 2.2.0
|
336
308
|
signing_key:
|
337
309
|
specification_version: 4
|
338
310
|
summary: Ruby re-do of hpodder
|