poddb_client 0.1.0 → 0.1.1
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.
- data/MIT-LICENSE.txt +21 -0
- data/lib/interactive.vim +59 -15
- data/lib/poddb_client/downloading.rb +1 -1
- data/lib/poddb_client/version.rb +1 -1
- data/lib/poddb_client.rb +53 -20
- metadata +23 -31
data/MIT-LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2010 Daniel Choi, http://danielchoi.com/software/
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/lib/interactive.vim
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
let s:client_cmd = "ruby -Ilib bin/poddb"
|
2
|
-
|
2
|
+
if !exists($PODDB_SERVER)
|
3
|
+
let g:poddb_base_url = $PODDB_SERVER
|
4
|
+
else
|
5
|
+
let g:poddb_base_url = "http://poddb.com"
|
6
|
+
endif
|
7
|
+
|
3
8
|
|
4
9
|
let s:download_and_play_cmd = s:client_cmd." --download-and-play "
|
5
10
|
|
@@ -31,7 +36,8 @@ function! s:main_window()
|
|
31
36
|
noremap <buffer> <c-j> :call <SID>show_next_item(0)<CR>
|
32
37
|
noremap <buffer> <c-k> :call <SID>show_next_item(1)<CR>
|
33
38
|
noremap <buffer> f :call <SID>favorite_this_podcast()<CR>
|
34
|
-
autocmd BufEnter <buffer> :setlocal nowrap
|
39
|
+
autocmd BufEnter <buffer> :setlocal nowrap | let s:listbufnr = bufnr('')
|
40
|
+
autocmd BufWinEnter <buffer> :only
|
35
41
|
noremap <buffer> <Leader>? :call <SID>help()<CR>
|
36
42
|
endfunction
|
37
43
|
|
@@ -42,6 +48,8 @@ function! s:item_window()
|
|
42
48
|
noremap <buffer> <c-j> :call <SID>show_next_item(0)<CR>
|
43
49
|
noremap <buffer> <c-k> :call <SID>show_next_item(1)<CR>
|
44
50
|
noremap <buffer> d :call <SID>mark_for_download()<cr>
|
51
|
+
nnoremap <buffer> o :call <SID>find_next_href_and_open()<CR>
|
52
|
+
nnoremap <buffer> O :call <SID>open_all_hrefs()<CR>
|
45
53
|
close
|
46
54
|
endfunction
|
47
55
|
|
@@ -56,11 +64,13 @@ function! s:show_item()
|
|
56
64
|
if (itemId == '')
|
57
65
|
return
|
58
66
|
endif
|
59
|
-
let command = "curl -s '".
|
67
|
+
let command = "curl -s '".g:poddb_base_url."/item/".itemId."'"
|
60
68
|
let res = system(command)
|
61
69
|
call s:focus_window(s:itembufnr)
|
70
|
+
setlocal modifiable
|
62
71
|
silent! 1,$delete
|
63
72
|
silent! put! =res
|
73
|
+
setlocal nomodifiable
|
64
74
|
normal 1G
|
65
75
|
wincmd p
|
66
76
|
endfunc
|
@@ -116,7 +126,7 @@ function! s:show_podcast_items(podcastId)
|
|
116
126
|
if (podcastId == '')
|
117
127
|
return
|
118
128
|
endif
|
119
|
-
let command = "curl -s '".
|
129
|
+
let command = "curl -s '".g:poddb_base_url."/podcast/".podcastId."/items'"
|
120
130
|
let contents = system(command)
|
121
131
|
if contents =~ 'No matches\c'
|
122
132
|
echom "No items!"
|
@@ -197,14 +207,7 @@ function! s:show_next_item(previous)
|
|
197
207
|
if s:is_podcast_list()
|
198
208
|
return
|
199
209
|
end
|
200
|
-
|
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
|
210
|
+
call s:focus_window(s:listbufnr)
|
208
211
|
if a:previous
|
209
212
|
normal k
|
210
213
|
else
|
@@ -212,9 +215,6 @@ function! s:show_next_item(previous)
|
|
212
215
|
endif
|
213
216
|
call s:show_item()
|
214
217
|
normal zz
|
215
|
-
if origbufnr == s:itembufnr
|
216
|
-
wincmd p
|
217
|
-
endif
|
218
218
|
normal 0
|
219
219
|
redraw
|
220
220
|
endfunction
|
@@ -225,9 +225,53 @@ function! s:help()
|
|
225
225
|
echo res
|
226
226
|
endfunction
|
227
227
|
|
228
|
+
" ------------------------------------------------------------------------
|
229
|
+
" open links in external browser
|
230
|
+
|
231
|
+
if !exists("g:Poddb#browser_command")
|
232
|
+
for cmd in ["gnome-open", "open"]
|
233
|
+
if executable(cmd)
|
234
|
+
let g:Poddb#browser_command = cmd
|
235
|
+
break
|
236
|
+
endif
|
237
|
+
endfor
|
238
|
+
if !exists("g:Poddb#browser_command")
|
239
|
+
echom "Can't find the to open your web browser."
|
240
|
+
endif
|
241
|
+
endif
|
242
|
+
|
243
|
+
let s:http_link_pattern = 'https\?:[^ >)\]]\+'
|
244
|
+
|
245
|
+
func! s:open_href_under_cursor()
|
246
|
+
let href = matchstr(expand("<cWORD>") , s:http_link_pattern)
|
247
|
+
let command = g:Poddb#browser_command . " '" . shellescape(href) . "' "
|
248
|
+
call system(command)
|
249
|
+
endfunc
|
250
|
+
|
251
|
+
func! s:find_next_href_and_open()
|
252
|
+
let res = search(s:http_link_pattern, 'cw')
|
253
|
+
if res != 0
|
254
|
+
call s:open_href_under_cursor()
|
255
|
+
endif
|
256
|
+
endfunc
|
257
|
+
|
258
|
+
func! s:open_all_hrefs()
|
259
|
+
let n = 0
|
260
|
+
let line = search(s:http_link_pattern, 'cw')
|
261
|
+
while line
|
262
|
+
call s:open_href_under_cursor()
|
263
|
+
let n += 1
|
264
|
+
let line = search(s:http_link_pattern, 'W')
|
265
|
+
endwhile
|
266
|
+
echom 'opened '.n.' links'
|
267
|
+
endfunc
|
268
|
+
|
269
|
+
" ------------------------------------------------------------------------
|
270
|
+
|
228
271
|
|
229
272
|
call s:main_window()
|
230
273
|
call s:item_window()
|
231
274
|
|
232
275
|
normal 3G
|
233
276
|
|
277
|
+
|
@@ -20,7 +20,7 @@ class PoddbClient
|
|
20
20
|
|
21
21
|
filename_suffix = File.extname(URI.parse(enclosure_url).path)
|
22
22
|
|
23
|
-
@filename = "%s.%s.
|
23
|
+
@filename = "%s.%s.poddb_%d_%d%s" % [podcast_fragment, title_fragment, podcast[:podcast_id], item_id, filename_suffix]
|
24
24
|
puts "Downloading #{enclosure_url} as #{@filename}"
|
25
25
|
cmd = "wget -O #{@filename} '#{enclosure_url}' && touch #{@filename}"
|
26
26
|
`#{cmd}`
|
data/lib/poddb_client/version.rb
CHANGED
data/lib/poddb_client.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'poddb_client/downloading'
|
2
|
+
require 'poddb_client/version'
|
2
3
|
require 'cgi'
|
3
4
|
require 'optparse'
|
4
5
|
require 'net/http'
|
5
6
|
|
6
7
|
class PoddbClient
|
7
8
|
|
8
|
-
# TODO:
|
9
|
-
SERVER = "http://
|
9
|
+
# TODO: set for production
|
10
|
+
SERVER = ENV['PODDB_SERVER'] || "http://poddb.com"
|
10
11
|
|
11
12
|
PODDB_DIR = "%s/.poddb" % ENV['HOME']
|
12
13
|
CACHE_DIR = "%s/.poddb/cache" % ENV['HOME']
|
@@ -23,7 +24,10 @@ class PoddbClient
|
|
23
24
|
def initialize(args)
|
24
25
|
@args = args
|
25
26
|
@options = {}
|
27
|
+
@params = ["v=#{PoddbClient::VERSION}" ]
|
26
28
|
@outfile = ITEM_LIST_OUTFILE # changed only for podcast list
|
29
|
+
@version = PoddbClient::VERSION
|
30
|
+
@query = []
|
27
31
|
parse_options
|
28
32
|
end
|
29
33
|
|
@@ -41,8 +45,11 @@ class PoddbClient
|
|
41
45
|
opts.on("-a", "--add PODCAST_URL", "Add podcast with PODCAST_URL to the poddb database") do |podcast_url|
|
42
46
|
@add_podcast = podcast_url
|
43
47
|
end
|
44
|
-
opts.on("-l", "--list", "List all podcasts in the poddb database", "(If
|
48
|
+
opts.on("-l", "--list [QUERY]", "List all podcasts in the poddb database", "(If QUERY is supplied, will return matching podcasts)") do |query|
|
45
49
|
@list_podcasts = true
|
50
|
+
if query
|
51
|
+
@query << query
|
52
|
+
end
|
46
53
|
end
|
47
54
|
opts.on("-F", "--favorite-podcasts", "Show favorite podcasts") do
|
48
55
|
if ! File.size?(FAVORITE_PODCASTS_FILE)
|
@@ -51,8 +58,14 @@ class PoddbClient
|
|
51
58
|
end
|
52
59
|
@list_favorite_podcasts = true
|
53
60
|
end
|
61
|
+
opts.on("-o", "--order ORDER", "Sort results by ORDER", "The only option right now is 'popular'. Default order is pubdate.") do |order|
|
62
|
+
@params << "o=#{order}"
|
63
|
+
end
|
64
|
+
opts.on("-d", "--days DAYS", "Limit results to items published since DAYS days ago") do |days|
|
65
|
+
@params << "d=#{days}"
|
66
|
+
end
|
54
67
|
opts.on("-t", "--type MEDIA_TYPE", "Return items of MEDIA_TYPE only (audio,video)") do |media_type|
|
55
|
-
@
|
68
|
+
@params << "t=#{media_type}"
|
56
69
|
end
|
57
70
|
opts.on("--download-and-play ITEM_ID", "Download item and play with PODDB_MEDIA_PLAYER") do |item_id|
|
58
71
|
puts "Download and play #{item_id}"
|
@@ -66,12 +79,16 @@ class PoddbClient
|
|
66
79
|
exit
|
67
80
|
end
|
68
81
|
opts.on_tail("-v", "--version", "Show version number") do
|
69
|
-
require 'poddb_client/version'
|
70
82
|
puts "poddb #{VERSION}"
|
71
83
|
exit
|
72
84
|
end
|
73
85
|
end.parse!(@args)
|
74
|
-
@query =
|
86
|
+
@query = @query.concat @args
|
87
|
+
q = CGI::escape(@query.join(' ').strip)
|
88
|
+
if q != ''
|
89
|
+
@params << "q=#{q}"
|
90
|
+
end
|
91
|
+
@params = @params.empty? ? '' : @params.join('&')
|
75
92
|
end
|
76
93
|
|
77
94
|
def run
|
@@ -91,11 +108,14 @@ class PoddbClient
|
|
91
108
|
end
|
92
109
|
|
93
110
|
def add_podcast
|
94
|
-
puts "Adding podcast
|
95
|
-
res = Net::HTTP.post_form(URI.parse("#{SERVER}/podcasts"),
|
96
|
-
|
97
|
-
|
98
|
-
|
111
|
+
puts "Adding podcast with url: #{@add_podcast}"
|
112
|
+
res = Net::HTTP.post_form(URI.parse("#{SERVER}/podcasts"), 'url' => @add_podcast).body
|
113
|
+
if res =~ /^Error/
|
114
|
+
puts res
|
115
|
+
else
|
116
|
+
podcast_id, title = res.split(/\s+/, 2)
|
117
|
+
add_to_favorite_podcasts(podcast_id)
|
118
|
+
end
|
99
119
|
end
|
100
120
|
|
101
121
|
def interactive
|
@@ -103,13 +123,12 @@ class PoddbClient
|
|
103
123
|
puts @output
|
104
124
|
exit
|
105
125
|
end
|
106
|
-
if @output =~ /^No matches/i
|
126
|
+
if @output =~ /^No matches/i || @output =~ /^Error/
|
107
127
|
puts @output
|
108
128
|
exit
|
109
129
|
end
|
110
|
-
|
111
130
|
File.open(@outfile, 'w') {|f| f.puts @output }
|
112
|
-
cmd = "vim -S #{VIMSCRIPT} #{@outfile}
|
131
|
+
cmd = "export PODDB_SERVER=#{SERVER} && vim -S #{VIMSCRIPT} #{@outfile} "
|
113
132
|
puts cmd
|
114
133
|
system(cmd)
|
115
134
|
if download_and_play?
|
@@ -123,9 +142,9 @@ class PoddbClient
|
|
123
142
|
def list_podcasts
|
124
143
|
@outfile = PODCAST_LIST_OUTFILE
|
125
144
|
@output = if @list_podcasts
|
126
|
-
`curl -s #{SERVER}/podcasts
|
145
|
+
`curl -s '#{SERVER}/podcasts?#@params'`
|
127
146
|
elsif @list_favorite_podcasts
|
128
|
-
`curl -s #{SERVER}/podcasts?podcast_ids=#{favorite_podcast_ids.join(',')}`
|
147
|
+
`curl -s '#{SERVER}/podcasts?podcast_ids=#{favorite_podcast_ids.join(',')}'`
|
129
148
|
end
|
130
149
|
if File.size?(FAVORITE_PODCASTS_FILE)
|
131
150
|
@output = @output.split("\n").map {|line|
|
@@ -140,12 +159,12 @@ class PoddbClient
|
|
140
159
|
end
|
141
160
|
|
142
161
|
def items_from_favorites
|
143
|
-
@output = `curl -s '#{SERVER}/items?podcast_ids=#{favorite_podcast_ids.join(',')}
|
162
|
+
@output = `curl -s '#{SERVER}/items?podcast_ids=#{favorite_podcast_ids.join(',')}&#@params'`
|
144
163
|
mark_already_downloaded
|
145
164
|
end
|
146
165
|
|
147
166
|
def search
|
148
|
-
@output = `curl -s '#{SERVER}/search
|
167
|
+
@output = `curl -s '#{SERVER}/search?#@params'`
|
149
168
|
mark_already_downloaded
|
150
169
|
end
|
151
170
|
|
@@ -157,14 +176,28 @@ private
|
|
157
176
|
|
158
177
|
def favorite_podcast_ids
|
159
178
|
if File.size?(FAVORITE_PODCASTS_FILE)
|
160
|
-
File.readlines(FAVORITE_PODCASTS_FILE).map(&:strip).select {|x| x
|
179
|
+
File.readlines(FAVORITE_PODCASTS_FILE).map(&:strip).select {|x| x =~ /\d+/}.map {|x| x.to_i}
|
161
180
|
else
|
162
181
|
[]
|
163
182
|
end
|
164
183
|
end
|
165
184
|
|
185
|
+
def add_to_favorite_podcasts(podcast_id)
|
186
|
+
if File.size?(FAVORITE_PODCASTS_FILE) && File.read(FAVORITE_PODCASTS_FILE).split("\n").any? {|line| line.strip == podcast_id.to_s}
|
187
|
+
return
|
188
|
+
end
|
189
|
+
if podcast_id !~ /\d/
|
190
|
+
return
|
191
|
+
end
|
192
|
+
podcast_id = podcast_id.to_i
|
193
|
+
File.open(FAVORITE_PODCASTS_FILE, 'a') {|f|
|
194
|
+
f.puts podcast_id
|
195
|
+
}
|
196
|
+
puts "Added '#{title}' [##{podcast_id}] to your favorite podcasts. Type `poddb -F` to show your favorites."
|
197
|
+
end
|
198
|
+
|
166
199
|
def mark_already_downloaded
|
167
|
-
@downloaded_item_ids = Dir['*
|
200
|
+
@downloaded_item_ids = Dir['*poddb_*'].map { |f| f[/poddb_\d+_(\d+)/,1] }.compact
|
168
201
|
@output = @output.split(/\n/).map {|line|
|
169
202
|
item_id = line[/\d+$/,0]
|
170
203
|
if @downloaded_item_ids.include?(item_id)
|
metadata
CHANGED
@@ -1,29 +1,25 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: poddb_client
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Daniel Choi
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-09-13 00:00:00 -04:00
|
14
|
-
default_executable:
|
12
|
+
date: 2011-09-15 00:00:00.000000000Z
|
15
13
|
dependencies: []
|
16
|
-
|
17
14
|
description: Podcast aggregation from the command line
|
18
|
-
email:
|
15
|
+
email:
|
19
16
|
- dhchoi@gmail.com
|
20
|
-
executables:
|
17
|
+
executables:
|
21
18
|
- poddb
|
22
19
|
extensions: []
|
23
|
-
|
24
20
|
extra_rdoc_files: []
|
25
|
-
|
26
|
-
|
21
|
+
files:
|
22
|
+
- MIT-LICENSE.txt
|
27
23
|
- NOTES
|
28
24
|
- README.markdown
|
29
25
|
- Rakefile
|
@@ -33,36 +29,32 @@ files:
|
|
33
29
|
- lib/poddb_client/downloading.rb
|
34
30
|
- lib/poddb_client/version.rb
|
35
31
|
- poddb_client.gemspec
|
36
|
-
has_rdoc: true
|
37
32
|
homepage: http://danielchoi.com/software/poddb_client.html
|
38
33
|
licenses: []
|
34
|
+
post_install_message: ! '*******************************************************************
|
39
35
|
|
40
|
-
post_install_message: |-
|
41
|
-
*******************************************************************
|
42
36
|
** Now please run poddb_client-install to install the Vim plugin **
|
43
|
-
*******************************************************************
|
44
|
-
rdoc_options: []
|
45
37
|
|
46
|
-
|
38
|
+
*******************************************************************'
|
39
|
+
rdoc_options: []
|
40
|
+
require_paths:
|
47
41
|
- lib
|
48
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
43
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
53
47
|
version: 1.8.6
|
54
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
49
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version:
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
60
54
|
requirements: []
|
61
|
-
|
62
55
|
rubyforge_project: poddb_client
|
63
|
-
rubygems_version: 1.
|
56
|
+
rubygems_version: 1.8.10
|
64
57
|
signing_key:
|
65
58
|
specification_version: 3
|
66
59
|
summary: Podcast aggregation from the command line
|
67
60
|
test_files: []
|
68
|
-
|