douban.fm 0.4.0 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +1 -0
- data/README.md +1 -0
- data/bin/douban.fm +14 -0
- data/index.html +3 -3
- data/lib/douban.fm/douban_fm.rb +34 -4
- data/lib/douban.fm/version.rb +1 -1
- metadata +19 -15
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjAxNmM3NzU1ODc3N2ZjMzc4NDJjMTdmM2Q4Y2VmY2I4NmY3NTJjNg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NzIzM2NiY2IyNjUxOWEyZjRlNGZkNTczMDJhZTllZTRhNTQzZDMzZg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OGI2MGUxZjFkMWVhODA2NTIwODJjYTdiMjQ3Y2I3MzRkNTBhN2Y5NGRkZGJm
|
10
|
+
MWY1OTZjMDA5NjVlMjc3MDI1NjY1N2U2YzY0MmY3MTFlN2FkZDEwYWFjZjAy
|
11
|
+
OGY3ZTBiNmE1N2RmZmUwYTNiMDBlMDExOTM0Y2IyYTY4YzRmMDg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YTAzMmY5Yzk0MWUyOWM2NjlkZmQ5OWZmOGIzYjYwZGY4OTg1MTg2OGUyZDdk
|
14
|
+
M2UwOWM2MDQ1OWI3ODkyOWI2OWUzOWFlMjVkMjZhNGQ5OTIyNzVmMTMzYzRi
|
15
|
+
MGFjNDBhOWIzYTk5YmZiYzNmNjRjODJkNGM4ZGQxMmNmZjg1MmE=
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -36,6 +36,7 @@ Usage: douban.fm [OPTIONS]
|
|
36
36
|
if not provided, 64kbps will be used as default
|
37
37
|
for non-pro user this option simply does not work
|
38
38
|
-l, --list list all available channels
|
39
|
+
-f, --favor [count] list favorites songs
|
39
40
|
-i, --interaction [port] start an http server for interaction
|
40
41
|
if omit port, 3000 will be used by default
|
41
42
|
GET /channels to get all available channels
|
data/bin/douban.fm
CHANGED
@@ -56,6 +56,11 @@ class DoubanFMCLI
|
|
56
56
|
options.list = true
|
57
57
|
end
|
58
58
|
|
59
|
+
opts.on('-f', '--favor [count]', 'list favorites songs') do |count|
|
60
|
+
options.favor = true
|
61
|
+
options.liked = count.to_i
|
62
|
+
end
|
63
|
+
|
59
64
|
opts.on('-i', '--interaction [port]',
|
60
65
|
'start an http server for interaction',
|
61
66
|
'if omit port, 3000 will be used by default',
|
@@ -135,6 +140,15 @@ class DoubanFMCLI
|
|
135
140
|
logger.log("login as user [#{options.email}]")
|
136
141
|
end
|
137
142
|
|
143
|
+
if options.favor
|
144
|
+
@douban_fm.fetch_liked_songs(options.liked)
|
145
|
+
@douban_fm.liked_songs['songs'].each_with_index do |song, index|
|
146
|
+
puts "#{index}#{' '*(4 - index.to_s.length)}#{song['title']} - #{song['artist']}"
|
147
|
+
end
|
148
|
+
|
149
|
+
exit
|
150
|
+
end
|
151
|
+
|
138
152
|
@douban_fm.select_channel(options.channel)
|
139
153
|
|
140
154
|
logger.log("select channel #{options.channel}")
|
data/index.html
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
<meta name="author" content="@honnix,@jihao">
|
9
9
|
|
10
10
|
<!-- CSS -->
|
11
|
-
<link href="http://twitter.github.
|
11
|
+
<link href="http://twitter.github.io/bootstrap/assets/css/bootstrap.css" rel="stylesheet">
|
12
12
|
<style type="text/css">
|
13
13
|
|
14
14
|
/* Sticky footer styles
|
@@ -66,7 +66,7 @@
|
|
66
66
|
padding: 2px 2px;
|
67
67
|
}
|
68
68
|
</style>
|
69
|
-
<link href="http://twitter.github.
|
69
|
+
<link href="http://twitter.github.io/bootstrap/assets/css/bootstrap-responsive.css" rel="stylesheet">
|
70
70
|
|
71
71
|
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
|
72
72
|
<!--[if lt IE 9]>
|
@@ -121,7 +121,7 @@
|
|
121
121
|
================================================== -->
|
122
122
|
<!-- Placed at the end of the document so the pages load faster -->
|
123
123
|
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
|
124
|
-
<script src="http://twitter.github.
|
124
|
+
<script src="http://twitter.github.io/bootstrap/assets/js/bootstrap-button.js"></script>
|
125
125
|
<script type="text/javascript">
|
126
126
|
$(function(){
|
127
127
|
$('a#now').button('loading');
|
data/lib/douban.fm/douban_fm.rb
CHANGED
@@ -10,7 +10,7 @@ module DoubanFM
|
|
10
10
|
|
11
11
|
RANDOM_CHANNEL_ID = -1
|
12
12
|
|
13
|
-
attr_reader :waiting, :channels, :current_channel, :kbps
|
13
|
+
attr_reader :waiting, :channels, :current_channel, :kbps, :liked_songs
|
14
14
|
|
15
15
|
def initialize(logger = DummyLogger.new, email = '', password = '')
|
16
16
|
@logger = logger
|
@@ -23,7 +23,7 @@ module DoubanFM
|
|
23
23
|
|
24
24
|
def login
|
25
25
|
uri = URI('http://www.douban.com/j/app/login')
|
26
|
-
res =
|
26
|
+
res = get_http_client().post_form(uri,
|
27
27
|
'email' => @email,
|
28
28
|
'password' => @password,
|
29
29
|
'app_name' => 'radio_desktop_mac',
|
@@ -38,7 +38,7 @@ module DoubanFM
|
|
38
38
|
today = Date.new
|
39
39
|
if today != @last_fetching_channels_date
|
40
40
|
uri = URI('http://www.douban.com/j/app/radio/channels')
|
41
|
-
res =
|
41
|
+
res = get_http_client().get(uri)
|
42
42
|
@channels = JSON.parse(res)
|
43
43
|
|
44
44
|
@last_fetching_channels_date = today
|
@@ -49,6 +49,27 @@ module DoubanFM
|
|
49
49
|
@logger.log("raw channel list #{channels}")
|
50
50
|
end
|
51
51
|
|
52
|
+
def fetch_liked_songs(count)
|
53
|
+
uri = URI('http://www.douban.com/j/app/radio/liked_songs')
|
54
|
+
params = {
|
55
|
+
:app_name => 'radio_desktop_mac',
|
56
|
+
:version => '100',
|
57
|
+
:user_id => @user_info['user_id'],
|
58
|
+
:expire => @user_info['expire'],
|
59
|
+
:token => @user_info['token'],
|
60
|
+
:count => count,
|
61
|
+
:exclude => ''
|
62
|
+
}
|
63
|
+
uri.query = URI.encode_www_form(params)
|
64
|
+
res = get_http_client().get_response(uri)
|
65
|
+
@liked_songs = JSON.parse(res.body)
|
66
|
+
@logger.log("liked songs #{@liked_songs}")
|
67
|
+
|
68
|
+
unless @liked_songs['err'].nil?
|
69
|
+
raise @liked_songs
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
52
73
|
def select_channel(channel_num)
|
53
74
|
@current_channel = channel_num
|
54
75
|
end
|
@@ -81,7 +102,7 @@ module DoubanFM
|
|
81
102
|
}
|
82
103
|
@logger.log(params)
|
83
104
|
uri.query = URI.encode_www_form(params)
|
84
|
-
res =
|
105
|
+
res = get_http_client().get_response(uri)
|
85
106
|
|
86
107
|
@current_playlist = JSON.parse(res.body)
|
87
108
|
|
@@ -230,6 +251,15 @@ module DoubanFM
|
|
230
251
|
end
|
231
252
|
|
232
253
|
private
|
254
|
+
def get_http_client
|
255
|
+
proxy = ENV['HTTP_PROXY'] || ENV['HTTPS_PROXY']
|
256
|
+
unless proxy.nil?
|
257
|
+
m = proxy.match(/(http(s)?:\/\/)?(?<proxy_addr>.*):(?<proxy_port>[0-9]*)/)
|
258
|
+
Net::HTTP::Proxy(m['proxy_addr'], m['proxy_port'])
|
259
|
+
else
|
260
|
+
Net::HTTP
|
261
|
+
end
|
262
|
+
end
|
233
263
|
|
234
264
|
def add_current_playlist_to_mpd(mpd)
|
235
265
|
@logger.log("add more songs to mpd")
|
data/lib/douban.fm/version.rb
CHANGED
metadata
CHANGED
@@ -1,38 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: douban.fm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- honnix
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-08-31 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: ruby-mpd
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- - =
|
17
|
+
- - '='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 0.1.5
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.5
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: highline
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- - =
|
31
|
+
- - '='
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: 1.6.15
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.6.15
|
36
41
|
description: douban.fm
|
37
42
|
email:
|
38
43
|
- hxliang1982@gmail.com
|
@@ -55,27 +60,26 @@ files:
|
|
55
60
|
- lib/douban.fm/version.rb
|
56
61
|
homepage: https://github.com/honnix/douban.fm
|
57
62
|
licenses: []
|
63
|
+
metadata: {}
|
58
64
|
post_install_message:
|
59
65
|
rdoc_options: []
|
60
66
|
require_paths:
|
61
67
|
- lib
|
62
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
69
|
requirements:
|
65
70
|
- - ! '>='
|
66
71
|
- !ruby/object:Gem::Version
|
67
72
|
version: '0'
|
68
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
74
|
requirements:
|
71
75
|
- - ! '>='
|
72
76
|
- !ruby/object:Gem::Version
|
73
77
|
version: '0'
|
74
78
|
requirements: []
|
75
79
|
rubyforge_project:
|
76
|
-
rubygems_version:
|
80
|
+
rubygems_version: 2.0.3
|
77
81
|
signing_key:
|
78
|
-
specification_version:
|
82
|
+
specification_version: 4
|
79
83
|
summary: douban.fm
|
80
84
|
test_files: []
|
81
85
|
has_rdoc:
|