poddb_client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/NOTES ADDED
@@ -0,0 +1,10 @@
1
+
2
+ ------------------------------------------------------------------------
3
+ Fri Sep 9 11:44:46 EDT 2011
4
+
5
+ TODO
6
+
7
+ - gemspec
8
+ - OptionParser
9
+
10
+
@@ -0,0 +1,6 @@
1
+ # poddb
2
+
3
+ Poddb is a podcast aggregator, fetcher, and discovery tool for Unix systems.
4
+
5
+
6
+
@@ -0,0 +1,70 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
7
+
8
+ desc "release and build and push new website"
9
+ task :push => [:release, :web]
10
+
11
+ desc "Bumps version number up one and git commits"
12
+ task :bump do
13
+ basefile = "lib/poddb_client/version.rb"
14
+ file = File.read(basefile)
15
+ oldver = file[/VERSION = '(\d.\d.\d)'/, 1]
16
+ newver_i = oldver.gsub(".", '').to_i + 1
17
+ newver = ("%.3d" % newver_i).split(//).join('.')
18
+ puts oldver
19
+ puts newver
20
+ puts "Bumping version: #{oldver} => #{newver}"
21
+ newfile = file.gsub("VERSION = '#{oldver}'", "VERSION = '#{newver}'")
22
+ File.open(basefile, 'w') {|f| f.write newfile}
23
+ `git commit -am 'Bump'`
24
+ end
25
+
26
+ desc "build and push website"
27
+ task :web => :build_webpage do
28
+ puts "Building and pushing website"
29
+ Dir.chdir "../project-webpages" do
30
+ `scp out/poddb_client.html zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
31
+ `rsync -avz out/images-poddb_client zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
32
+ `rsync -avz out/stylesheets zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
33
+ `rsync -avz out/lightbox2 zoe2@instantwatcher.com:~/danielchoi.com/public/software/`
34
+ end
35
+ #`open http://danielchoi.com/software/poddb_client.html`
36
+ end
37
+
38
+ desc "build webpage"
39
+ task :build_webpage do
40
+ `cp README.markdown ../project-webpages/src/poddb_client.README.markdown`
41
+ `cp coverage.markdown ../project-webpages/src/poddb_client.coverage.markdown`
42
+ Dir.chdir "../project-webpages" do
43
+ puts `ruby gen.rb poddb_client #{ViTunes::VERSION}`
44
+ `open out/poddb_client.html`
45
+ end
46
+ end
47
+
48
+
49
+ desc "git push and rake release bumped version"
50
+ task :bumped do
51
+ puts `git push && rake release`
52
+ Rake::Task["web"].execute
53
+ end
54
+
55
+ desc "Run tests"
56
+ task :test do
57
+ $:.unshift File.expand_path("test")
58
+ require 'test_helper'
59
+ Dir.chdir("test") do
60
+ Dir['*_test.rb'].each do |x|
61
+ puts "requiring #{x}"
62
+ require x
63
+ end
64
+ end
65
+
66
+ MiniTest::Unit.autorun
67
+ end
68
+
69
+ task :default => :test
70
+
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require 'poddb_client'
3
+
4
+ PoddbClient.new(ARGV).run
5
+
@@ -0,0 +1,233 @@
1
+ let s:client_cmd = "ruby -Ilib bin/poddb"
2
+ let s:base_url = "http://localhost:3000"
3
+
4
+ let s:download_and_play_cmd = s:client_cmd." --download-and-play "
5
+
6
+ let s:poddb_cache_dir = $HOME."/.poddb/cache"
7
+ call system("mkdir -p ".s:poddb_cache_dir)
8
+ let s:favorite_podcasts_list = $HOME."/.poddb/favorites"
9
+
10
+ let s:download_list = []
11
+
12
+ autocmd VimLeave * :call <SID>write_download_list()<CR>
13
+
14
+ function! PoddbStatusLine()
15
+ return "%<%f\ | Press ".g:mapleader."? for help. "."%r%=%-14.(%l,%c%V%)\ %P"
16
+ endfunction
17
+
18
+ " main_window() is a list of items, shown from search and by show_podcast_items()
19
+ function! s:main_window()
20
+ let s:listbufnr = bufnr('')
21
+ setlocal cursorline
22
+ setlocal nowrap
23
+ setlocal textwidth=0
24
+ setlocal nomodifiable
25
+ setlocal statusline=%!PoddbStatusLine()
26
+ noremap <buffer> <cr> :call <SID>show_item()<cr>
27
+ noremap <buffer> l :call <SID>show_item()<cr>
28
+ noremap <buffer> d :call <SID>mark_for_download()<cr>
29
+ noremap <buffer> D :call <SID>download_and_play()<cr>
30
+ noremap <buffer> p :call <SID>show_podcast_items('')<cr>
31
+ noremap <buffer> <c-j> :call <SID>show_next_item(0)<CR>
32
+ noremap <buffer> <c-k> :call <SID>show_next_item(1)<CR>
33
+ noremap <buffer> f :call <SID>favorite_this_podcast()<CR>
34
+ autocmd BufEnter <buffer> :setlocal nowrap
35
+ noremap <buffer> <Leader>? :call <SID>help()<CR>
36
+ endfunction
37
+
38
+ function! s:item_window()
39
+ rightbelow split poddb-item-window
40
+ let s:itembufnr = bufnr('%')
41
+ setlocal buftype=nofile
42
+ noremap <buffer> <c-j> :call <SID>show_next_item(0)<CR>
43
+ noremap <buffer> <c-k> :call <SID>show_next_item(1)<CR>
44
+ noremap <buffer> d :call <SID>mark_for_download()<cr>
45
+ close
46
+ endfunction
47
+
48
+ function! s:show_item()
49
+ if s:is_podcast_list()
50
+ let podcastId = matchstr( matchstr(getline(line('.')), '\d\+\s*$'), '\d\+' )
51
+ call s:show_podcast_items(podcastId)
52
+ return
53
+ else
54
+ let itemId = matchstr(getline(line('.')), '\d\+$')
55
+ endif
56
+ if (itemId == '')
57
+ return
58
+ endif
59
+ let command = "curl -s '".s:base_url."/item/".itemId."'"
60
+ let res = system(command)
61
+ call s:focus_window(s:itembufnr)
62
+ silent! 1,$delete
63
+ silent! put! =res
64
+ normal 1G
65
+ wincmd p
66
+ endfunc
67
+
68
+ function! s:mark_for_download() range
69
+ if s:is_podcast_list()
70
+ return
71
+ end
72
+ call s:focus_window(s:listbufnr)
73
+ let itemId = matchstr( matchstr(getline(line('.')), '\d\+\s*$'), '\d\+' )
74
+ if itemId == ''
75
+ return
76
+ endif
77
+ setlocal modifiable
78
+ let lnum = a:firstline
79
+ while lnum <= a:lastline
80
+ let line = getline(lnum)
81
+ if (match(line, "^*") != -1)
82
+ let newline = substitute(line, '^*', ' ', '')
83
+ call filter(s:download_list, 'v:val == itemId')
84
+ else
85
+ let newline = substitute(line, '^.', '*', '')
86
+ call add(s:download_list, itemId)
87
+ endif
88
+ call setline(lnum, newline)
89
+ let lnum += 1
90
+ endwhile
91
+ setlocal nomodifiable
92
+ write
93
+ redraw
94
+ endfunc
95
+
96
+ function! s:write_download_list()
97
+ let outfile = s:poddb_cache_dir . "/download_list"
98
+ echo s:download_list
99
+ " sleep 1
100
+ call writefile(s:download_list, outfile)
101
+ endfunc
102
+
103
+ function! s:show_podcast_items(podcastId)
104
+ " Let user use p key from podcastlist and itemlist
105
+ " If p is pressed in podcastlist, podcastId will be blank, and we'll reuse
106
+ " s:show_item() to extract podcastId and call this method again.
107
+ if s:is_podcast_list() && a:podcastId == ''
108
+ call s:show_item()
109
+ return
110
+ end
111
+ if a:podcastId != ''
112
+ let podcastId = a:podcastId
113
+ else
114
+ let podcastId = matchstr( matchstr(getline(line('.')), '\d\+ |\s*\d\+$'), '\d\+' )
115
+ end
116
+ if (podcastId == '')
117
+ return
118
+ endif
119
+ let command = "curl -s '".s:base_url."/podcast/".podcastId."/items'"
120
+ let contents = system(command)
121
+ if contents =~ 'No matches\c'
122
+ echom "No items!"
123
+ return
124
+ endif
125
+ call s:focus_window(s:itembufnr)
126
+ close!
127
+ let outfile = s:poddb_cache_dir . "/podcast-" . podcastId . "-itemlist"
128
+ call writefile(split(contents, "\n"), outfile)
129
+ exec "e+3 ".outfile
130
+ call s:main_window()
131
+ endfunc
132
+
133
+ function! s:is_podcast_list()
134
+ let top_line = getline(1)
135
+ return top_line =~ "xml_url"
136
+ endfunct
137
+
138
+ function! s:favorite_this_podcast()
139
+ let is_podcast_list = s:is_podcast_list()
140
+ if is_podcast_list
141
+ let podcastId = matchstr( matchstr(getline(line('.')), '\d\+\s*$'), '\d\+' )
142
+ else
143
+ let podcastId = matchstr( matchstr(getline(line('.')), '\d\+ |\s*\d\+$'), '\d\+' )
144
+ endif
145
+ if (podcastId == '')
146
+ return
147
+ endif
148
+ if !is_podcast_list
149
+ call system("grep '^".podcastId."$' ".s:favorite_podcasts_list." || echo ".podcastId." >> ".s:favorite_podcasts_list)
150
+ echom "Added this podcast to favorites"
151
+ return
152
+ end
153
+ let line = getline('.')
154
+ if (match(line, "^@") != -1)
155
+ let newline = substitute(line, '^@', ' ', '')
156
+ let tmp = tempname()
157
+ " alter favorites file
158
+ call system("grep -v '^".podcastId."$' ".s:favorite_podcasts_list." | uniq > ".tmp." && mv ".tmp." ".s:favorite_podcasts_list)
159
+ else
160
+ let newline = substitute(line, '^ ', '@', '')
161
+ " append to favorites file
162
+ call system("echo ".podcastId." >> ".s:favorite_podcasts_list)
163
+ endif
164
+ setlocal modifiable
165
+ call setline(line('.'), newline)
166
+ setlocal nomodifiable
167
+ write!
168
+ normal 0
169
+ endfunc
170
+
171
+ function! s:download_and_play()
172
+ let itemId = matchstr( matchstr(getline(line('.')), '\d\+\s*$'), '\d\+' )
173
+ let outfile = s:poddb_cache_dir . "/download_and_play"
174
+ call system("echo ".itemId." > ".outfile)
175
+ call writefile(itemId, outfile)
176
+ qa!
177
+ endfunc
178
+
179
+ function! s:focus_window(target_bufnr)
180
+ if bufwinnr(a:target_bufnr) == winnr()
181
+ return
182
+ end
183
+ let winnr = bufwinnr(a:target_bufnr)
184
+ if winnr == -1
185
+ if a:target_bufnr == s:listbufnr
186
+ leftabove split
187
+ else
188
+ rightbelow split
189
+ endif
190
+ exec "buffer" . a:target_bufnr
191
+ else
192
+ exec winnr . "wincmd w"
193
+ endif
194
+ endfunction
195
+
196
+ function! s:show_next_item(previous)
197
+ if s:is_podcast_list()
198
+ return
199
+ end
200
+ let origbufnr = bufnr('%')
201
+ let fullscreen = (bufwinnr(s:listbufnr) == -1) " we're in full screen message mode
202
+ if fullscreen
203
+ split
204
+ exec 'b'. s:listbufnr
205
+ else
206
+ call s:focus_window(s:listbufnr)
207
+ end
208
+ if a:previous
209
+ normal k
210
+ else
211
+ normal j
212
+ endif
213
+ call s:show_item()
214
+ normal zz
215
+ if origbufnr == s:itembufnr
216
+ wincmd p
217
+ endif
218
+ normal 0
219
+ redraw
220
+ endfunction
221
+
222
+ function! s:help()
223
+ " This just displays the README
224
+ let res = system(s:client_cmd." --key-mappings")
225
+ echo res
226
+ endfunction
227
+
228
+
229
+ call s:main_window()
230
+ call s:item_window()
231
+
232
+ normal 3G
233
+
@@ -0,0 +1,179 @@
1
+ require 'poddb_client/downloading'
2
+ require 'cgi'
3
+ require 'optparse'
4
+ require 'net/http'
5
+
6
+ class PoddbClient
7
+
8
+ # TODO: change to poddb.com
9
+ SERVER = "http://localhost:3000"
10
+
11
+ PODDB_DIR = "%s/.poddb" % ENV['HOME']
12
+ CACHE_DIR = "%s/.poddb/cache" % ENV['HOME']
13
+ `mkdir -p #{CACHE_DIR}`
14
+
15
+ VIMSCRIPT = "lib/interactive.vim"
16
+ ITEM_LIST_OUTFILE = "#{CACHE_DIR}/main.itemlist"
17
+ PODCAST_LIST_OUTFILE = "#{CACHE_DIR}/main.podcastlist"
18
+ FAVORITE_PODCASTS_FILE = "#{PODDB_DIR}/favorites"
19
+ DOWNLOAD_AND_PLAY_FILE = "#{CACHE_DIR}/download_and_play"
20
+
21
+ include PoddbClient::Downloading
22
+
23
+ def initialize(args)
24
+ @args = args
25
+ @options = {}
26
+ @outfile = ITEM_LIST_OUTFILE # changed only for podcast list
27
+ parse_options
28
+ end
29
+
30
+ def parse_options
31
+ OptionParser.new do |opts|
32
+ opts.banner = "Usage: poddb [options] [query]"
33
+ opts.separator ""
34
+ opts.on("-f", "--from-favorites", "Show all recent items from favorite podcasts") do
35
+ if ! File.size?(FAVORITE_PODCASTS_FILE)
36
+ puts "No podcasts found in #{FAVORITE_PODCASTS_FILE}"
37
+ exit
38
+ end
39
+ @items_from_favorites = true
40
+ end
41
+ opts.on("-a", "--add PODCAST_URL", "Add podcast with PODCAST_URL to the poddb database") do |podcast_url|
42
+ @add_podcast = podcast_url
43
+ end
44
+ opts.on("-l", "--list", "List all podcasts in the poddb database", "(If query is supplied, will return matching podcasts)") do
45
+ @list_podcasts = true
46
+ end
47
+ opts.on("-F", "--favorite-podcasts", "Show favorite podcasts") do
48
+ if ! File.size?(FAVORITE_PODCASTS_FILE)
49
+ puts "No podcasts found in #{FAVORITE_PODCASTS_FILE}"
50
+ exit
51
+ end
52
+ @list_favorite_podcasts = true
53
+ end
54
+ opts.on("-t", "--type MEDIA_TYPE", "Return items of MEDIA_TYPE only (audio,video)") do |media_type|
55
+ @media_type_param = "&media_type=#{media_type}"
56
+ end
57
+ opts.on("--download-and-play ITEM_ID", "Download item and play with PODDB_MEDIA_PLAYER") do |item_id|
58
+ puts "Download and play #{item_id}"
59
+ end
60
+ opts.on("--key-mappings", "Show key mappings for Vim navigation interface") do
61
+ puts "KEYMAPPINGS"
62
+ exit
63
+ end
64
+ opts.on_tail("-h", "--help", "Show this message") do
65
+ puts opts
66
+ exit
67
+ end
68
+ opts.on_tail("-v", "--version", "Show version number") do
69
+ require 'poddb_client/version'
70
+ puts "poddb #{VERSION}"
71
+ exit
72
+ end
73
+ end.parse!(@args)
74
+ @query = CGI::escape(@args.join(' ').strip)
75
+ end
76
+
77
+ def run
78
+ cleanup
79
+ if @add_podcast
80
+ add_podcast
81
+ elsif @list_podcasts || @list_favorite_podcasts
82
+ list_podcasts
83
+ interactive
84
+ elsif @items_from_favorites
85
+ items_from_favorites
86
+ interactive
87
+ else
88
+ search
89
+ interactive
90
+ end
91
+ end
92
+
93
+ def add_podcast
94
+ puts "Adding podcast..."
95
+ res = Net::HTTP.post_form(URI.parse("#{SERVER}/podcasts"),
96
+ 'url' => @add_podcast)
97
+ # TODO improve response
98
+ puts res.body
99
+ end
100
+
101
+ def interactive
102
+ if !STDOUT.tty?
103
+ puts @output
104
+ exit
105
+ end
106
+ if @output =~ /^No matches/i
107
+ puts @output
108
+ exit
109
+ end
110
+
111
+ File.open(@outfile, 'w') {|f| f.puts @output }
112
+ cmd = "vim -S #{VIMSCRIPT} #{@outfile} #{@poddb_env}"
113
+ puts cmd
114
+ system(cmd)
115
+ if download_and_play?
116
+ download_and_play
117
+ else
118
+ download_marked_items
119
+ end
120
+ cleanup
121
+ end
122
+
123
+ def list_podcasts
124
+ @outfile = PODCAST_LIST_OUTFILE
125
+ @output = if @list_podcasts
126
+ `curl -s #{SERVER}/podcasts?q=#{@query}`
127
+ elsif @list_favorite_podcasts
128
+ `curl -s #{SERVER}/podcasts?podcast_ids=#{favorite_podcast_ids.join(',')}`
129
+ end
130
+ if File.size?(FAVORITE_PODCASTS_FILE)
131
+ @output = @output.split("\n").map {|line|
132
+ # podcast_ids here are strings
133
+ if (podcast_id = line[/\d+$/,0]) && favorite_podcast_ids.include?(podcast_id)
134
+ line.sub(/^ /, "@")
135
+ else
136
+ line
137
+ end
138
+ }.join("\n")
139
+ end
140
+ end
141
+
142
+ def items_from_favorites
143
+ @output = `curl -s '#{SERVER}/items?podcast_ids=#{favorite_podcast_ids.join(',')}#{@media_type_param}'`
144
+ mark_already_downloaded
145
+ end
146
+
147
+ def search
148
+ @output = `curl -s '#{SERVER}/search?q=#{@query}#{@media_type_param}'`
149
+ mark_already_downloaded
150
+ end
151
+
152
+ def cleanup
153
+ `rm -rf #{CACHE_DIR}/*`
154
+ end
155
+
156
+ private
157
+
158
+ def favorite_podcast_ids
159
+ if File.size?(FAVORITE_PODCASTS_FILE)
160
+ File.readlines(FAVORITE_PODCASTS_FILE).map(&:strip).select {|x| x != ''}
161
+ else
162
+ []
163
+ end
164
+ end
165
+
166
+ def mark_already_downloaded
167
+ @downloaded_item_ids = Dir['*poddb*'].map { |f| f[/poddb(\d+)/,1] }.compact
168
+ @output = @output.split(/\n/).map {|line|
169
+ item_id = line[/\d+$/,0]
170
+ if @downloaded_item_ids.include?(item_id)
171
+ line.sub(/^ /, 'D')
172
+ else
173
+ line
174
+ end
175
+ }.join("\n")
176
+ end
177
+
178
+
179
+ end
@@ -0,0 +1,55 @@
1
+ require 'yaml'
2
+ require 'uri'
3
+
4
+ class PoddbClient
5
+ module Downloading
6
+
7
+
8
+ def titleize(s, maxlength=20)
9
+ s.gsub(/\W+/, '-')[0,maxlength].sub(/-$/, '')
10
+ end
11
+
12
+ def download(item_id)
13
+ response = `curl -s #{SERVER}/item/#{item_id}/download`
14
+ data = YAML::load(response)
15
+ item = data[:item]
16
+ podcast = data[:podcast]
17
+ enclosure_url = item[:enclosure_url]
18
+ title_fragment = titleize item[:title], 50
19
+ podcast_fragment = titleize podcast[:title], 40
20
+
21
+ filename_suffix = File.extname(URI.parse(enclosure_url).path)
22
+
23
+ @filename = "%s.%s.poddb%s%s" % [podcast_fragment, title_fragment, item_id.to_s, filename_suffix]
24
+ puts "Downloading #{enclosure_url} as #{@filename}"
25
+ cmd = "wget -O #{@filename} '#{enclosure_url}' && touch #{@filename}"
26
+ `#{cmd}`
27
+ end
28
+
29
+ def download_marked_items
30
+ download_list_file = "#{CACHE_DIR}/download_list"
31
+ return unless File.size?(download_list_file)
32
+ item_ids = File.readlines(download_list_file).
33
+ map {|line| line[/(\d+)\s*$/, 1]}.
34
+ compact.map {|x| x.to_i}
35
+ item_ids.each do |item_id|
36
+ download item_id
37
+ end
38
+ end
39
+
40
+
41
+ def download_and_play?
42
+ File.size? DOWNLOAD_AND_PLAY_FILE
43
+ end
44
+
45
+ def download_and_play
46
+ item_id = File.read(DOWNLOAD_AND_PLAY_FILE).strip
47
+ abort("No item id found") if item_id !~ /\d/
48
+ download item_id
49
+ media_player_cmd = ENV['PODDB_MEDIA_PLAYER'] || 'mplayer'
50
+ exec("#{media_player_cmd} #@filename")
51
+ end
52
+ end
53
+ end
54
+
55
+
@@ -0,0 +1,3 @@
1
+ class PoddbClient
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "poddb_client/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "poddb_client"
7
+ s.version = PoddbClient::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.required_ruby_version = '>= 1.8.6'
10
+
11
+ s.authors = ["Daniel Choi"]
12
+ s.email = ["dhchoi@gmail.com"]
13
+ s.homepage = "http://danielchoi.com/software/poddb_client.html"
14
+ s.summary = %q{Podcast aggregation from the command line}
15
+ s.description = %q{Podcast aggregation from the command line}
16
+
17
+ s.rubyforge_project = "poddb_client"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+
24
+ message = "** Now please run poddb_client-install to install the Vim plugin **"
25
+ divider = "*" * message.length
26
+ s.post_install_message = [divider, message, divider].join("\n")
27
+ end
28
+
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: poddb_client
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Daniel Choi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-09-13 00:00:00 -04:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: Podcast aggregation from the command line
18
+ email:
19
+ - dhchoi@gmail.com
20
+ executables:
21
+ - poddb
22
+ extensions: []
23
+
24
+ extra_rdoc_files: []
25
+
26
+ files:
27
+ - NOTES
28
+ - README.markdown
29
+ - Rakefile
30
+ - bin/poddb
31
+ - lib/interactive.vim
32
+ - lib/poddb_client.rb
33
+ - lib/poddb_client/downloading.rb
34
+ - lib/poddb_client/version.rb
35
+ - poddb_client.gemspec
36
+ has_rdoc: true
37
+ homepage: http://danielchoi.com/software/poddb_client.html
38
+ licenses: []
39
+
40
+ post_install_message: |-
41
+ *******************************************************************
42
+ ** Now please run poddb_client-install to install the Vim plugin **
43
+ *******************************************************************
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.8.6
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ requirements: []
61
+
62
+ rubyforge_project: poddb_client
63
+ rubygems_version: 1.6.1
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: Podcast aggregation from the command line
67
+ test_files: []
68
+