mplug163 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +37 -11
- data/lib/mplug163/menu.rb +18 -18
- data/lib/mplug163/ui.rb +28 -27
- data/lib/mplug163/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74c850695c2de63dc5ac9391709ead803c5014b4
|
4
|
+
data.tar.gz: c70748299cddc82dada1423a2f1d6a276ea91780
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 192868550cb7aa2e5022ce9b77c00158597fa2988298157dcc79f368d2c24fe9ee6f10770dc253cd738d9384181372bba2fecec81d58dac61127132bd7f7ac01
|
7
|
+
data.tar.gz: dd8d3cc2a8af14adc75783a23b73a7565f18e662b8e93f549d5a92abd22212fe72f9566bab9ec0cf0d387ee2ec8a952095c15eda67242cfa92d90ad03d3d7582
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,22 +1,48 @@
|
|
1
1
|
# Mplug163
|
2
2
|
|
3
|
-
|
3
|
+
Mplug163, built with Ruby 2.1, is a command line music player that wirelessly plugs in Netease music(http://music.163.com).
|
4
4
|
|
5
|
-
##
|
5
|
+
## Installation
|
6
6
|
|
7
|
-
|
8
|
-
brew install mpg123
|
9
|
-
```
|
7
|
+
My MacBook Pro is running Mavericks(10.9), Mplug163 runs smoothly with Ruby 2.1.
|
10
8
|
|
11
|
-
|
9
|
+
You're lucky if you use Mac OS X. Just follow:
|
12
10
|
|
13
|
-
```ruby
|
14
|
-
gem install mplug163
|
15
11
|
```
|
12
|
+
$ brew install mpg123
|
13
|
+
$ gem install mplug163
|
14
|
+
```
|
15
|
+
|
16
|
+
After finishing the installation, open your terminal and input `mplug163`. Music's coming!
|
17
|
+
|
18
|
+
Sorry, I do not test Mplug163 in Linux. If you try it in Linux and catch some problem, please issue me. Thanks!
|
19
|
+
|
20
|
+
## Shortcuts
|
21
|
+
|
22
|
+
| Key | Explanation | 中文释义 |
|
23
|
+
| :---|:---------------------|:--------------|
|
24
|
+
| j | Down | 向下 |
|
25
|
+
| k | Up | 向上 |
|
26
|
+
| h | Back | 后退 |
|
27
|
+
| l | Forward | 前进 |
|
28
|
+
| [ | Prev Song | 上一首歌曲 |
|
29
|
+
| ] | Next Song | 上一首歌曲 |
|
30
|
+
| ' ' | Play / Pause | 播放 / 暂停 |
|
31
|
+
| u | Prev Page | 上一页列表 |
|
32
|
+
| d | Next Page | 下一页列表 |
|
33
|
+
| f | Search | 搜索 |
|
34
|
+
| m | Main Menu | 主菜单 |
|
35
|
+
| p | Present Playlist | 当前播放列表 |
|
36
|
+
| a | Add | 添加歌曲到打碟 |
|
37
|
+
| z | DJ List | 打碟列表 |
|
38
|
+
| s | Star Song | 收藏歌曲 |
|
39
|
+
| c | Collection | 收藏歌曲列表 |
|
40
|
+
| r | Remove Present Entry | 删除当前曲目 |
|
41
|
+
| q | Quit | 退出 |
|
16
42
|
|
17
|
-
##
|
43
|
+
## Attention
|
18
44
|
|
19
|
-
|
45
|
+
Mplug163 will make a new directory `~/.mplug163` and touch a file to store user's data for the first time.
|
20
46
|
|
21
47
|
## Big Thanks
|
22
48
|
|
@@ -32,7 +58,7 @@ MIT License.
|
|
32
58
|
|
33
59
|
## Contributing
|
34
60
|
|
35
|
-
1. Fork it ( https://github.com/
|
61
|
+
1. Fork it ( https://github.com/rippleyui/mplug163/fork )
|
36
62
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
37
63
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
38
64
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/mplug163/menu.rb
CHANGED
@@ -2,24 +2,24 @@ require 'curses'
|
|
2
2
|
require 'json'
|
3
3
|
|
4
4
|
SHORTCUT = [
|
5
|
-
['j', 'Down
|
6
|
-
['k', 'Up
|
7
|
-
['h', 'Back
|
8
|
-
['l', 'Forward
|
9
|
-
['
|
10
|
-
['
|
11
|
-
['
|
12
|
-
['
|
13
|
-
['
|
14
|
-
['
|
15
|
-
['m', 'Menu
|
16
|
-
['p', 'Present
|
17
|
-
['a', 'Add
|
18
|
-
['z', 'DJ list
|
19
|
-
['s', 'Star
|
20
|
-
['c', 'Collection', '
|
21
|
-
['r', 'Remove
|
22
|
-
['q', 'Quit
|
5
|
+
['j', 'Down ', '向下'],
|
6
|
+
['k', 'Up ', '向上'],
|
7
|
+
['h', 'Back ', '后退'],
|
8
|
+
['l', 'Forward ', '前进'],
|
9
|
+
['[', 'Prev song ', '上一首歌曲'],
|
10
|
+
[']', 'Next song ', '下一首歌曲'],
|
11
|
+
[' ', 'Play / Pause', '播放 / 暂停'],
|
12
|
+
['u', 'Prev page ', '上一页列表'],
|
13
|
+
['d', 'Next page ', '下一页列表'],
|
14
|
+
['f', 'Search ', '搜索'],
|
15
|
+
['m', 'Menu ', '主菜单'],
|
16
|
+
['p', 'Present ', '当前播放列表'],
|
17
|
+
['a', 'Add ', '添加歌曲到打碟'],
|
18
|
+
['z', 'DJ list ', '打碟列表'],
|
19
|
+
['s', 'Star ', '收藏歌曲'],
|
20
|
+
['c', 'Collection ', '收藏歌曲列表'],
|
21
|
+
['r', 'Remove ', '删除当前曲目'],
|
22
|
+
['q', 'Quit ', '退出']
|
23
23
|
]
|
24
24
|
|
25
25
|
class Menu
|
data/lib/mplug163/ui.rb
CHANGED
@@ -34,13 +34,13 @@ class Ui
|
|
34
34
|
SCREEN_TOP = 0
|
35
35
|
SCREEN_LEFT = 0
|
36
36
|
|
37
|
-
PLAYER_X =
|
37
|
+
PLAYER_X = 8
|
38
38
|
PLAYER_TITLE_Y = 4
|
39
39
|
PLAYER_STATUS_Y = 5
|
40
40
|
PLAYER_CONTENT_Y = 7
|
41
41
|
PLAYER_INFO_Y = 19
|
42
42
|
|
43
|
-
PLAYER_NOTE_X = PLAYER_X -
|
43
|
+
PLAYER_NOTE_X = PLAYER_X - 2
|
44
44
|
PLAYER_POINTER_X = PLAYER_X - 3
|
45
45
|
|
46
46
|
def initialize
|
@@ -61,12 +61,13 @@ class Ui
|
|
61
61
|
|
62
62
|
def build_playinfo(song_name, artist, album_name, pause=false)
|
63
63
|
if pause
|
64
|
-
putstr(@screen, PLAYER_STATUS_Y, PLAYER_NOTE_X, '
|
64
|
+
putstr(@screen, PLAYER_STATUS_Y, PLAYER_NOTE_X, '■', Curses.color_pair(3))
|
65
65
|
else
|
66
|
-
putstr(@screen, PLAYER_STATUS_Y, PLAYER_NOTE_X, '
|
66
|
+
putstr(@screen, PLAYER_STATUS_Y, PLAYER_NOTE_X, '▶', Curses.color_pair(3))
|
67
67
|
end
|
68
68
|
|
69
|
-
|
69
|
+
info = "#{song_name} - #{artist}"
|
70
|
+
song_info = pretty_format(info, 0, 50)
|
70
71
|
putstr(@screen, PLAYER_STATUS_Y, PLAYER_X, song_info, Curses.color_pair(4))
|
71
72
|
@screen.refresh
|
72
73
|
end
|
@@ -82,31 +83,31 @@ class Ui
|
|
82
83
|
putstr(@screen, PLAYER_TITLE_Y, PLAYER_X, title, Curses.color_pair(1))
|
83
84
|
|
84
85
|
if datalist.size == 0
|
85
|
-
putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, '
|
86
|
+
putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, '没有内容 Orz')
|
86
87
|
else
|
87
88
|
case datatype
|
88
89
|
when 'main'
|
89
90
|
(offset...[datalist.length, offset+step].min).each do |i|
|
90
91
|
if i == index
|
91
|
-
line_info = "
|
92
|
+
line_info = "♩ #{i}. #{datalist[i]}"
|
92
93
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
|
93
94
|
else
|
94
|
-
line_info = "#{i}
|
95
|
+
line_info = "#{i}. #{datalist[i]}"
|
95
96
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
99
|
-
putstr(@screen, PLAYER_INFO_Y, PLAYER_X, '
|
100
|
+
putstr(@screen, PLAYER_INFO_Y, PLAYER_X, 'Crafted with ❤ by Ripple Yui', Curses.color_pair(3))
|
100
101
|
|
101
102
|
when 'songs'
|
102
103
|
(offset...[datalist.length, offset+step].min).each do |i|
|
103
104
|
if i == index
|
104
|
-
info = "
|
105
|
-
line_info = pretty_format(info, 0,
|
105
|
+
info = "♩ #{i}. #{datalist[i]['song_name']} - #{datalist[i]['artist']} - #{datalist[i]['album_name']}"
|
106
|
+
line_info = pretty_format(info, 0, 52)
|
106
107
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
|
107
108
|
else
|
108
|
-
info = "#{i}
|
109
|
-
line_info = pretty_format(info, 0,
|
109
|
+
info = "#{i}. #{datalist[i]['song_name']} - #{datalist[i]['artist']} - #{datalist[i]['album_name']}"
|
110
|
+
line_info = pretty_format(info, 0, 50)
|
110
111
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
|
111
112
|
end
|
112
113
|
end
|
@@ -114,10 +115,10 @@ class Ui
|
|
114
115
|
when 'artists'
|
115
116
|
(offset...[datalist.length, offset+step].min).each do |i|
|
116
117
|
if i == index
|
117
|
-
line_info = "
|
118
|
+
line_info = "♩ #{i}. #{datalist[i]['artists_name']} - #{datalist[i]['artist']} #{datalist[i]['alias']}"
|
118
119
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
|
119
120
|
else
|
120
|
-
line_info = "#{i}
|
121
|
+
line_info = "#{i}. #{datalist[i]['artists_name']} - #{datalist[i]['artist']} #{datalist[i]['alias']}"
|
121
122
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
|
122
123
|
end
|
123
124
|
end
|
@@ -125,10 +126,10 @@ class Ui
|
|
125
126
|
when 'albums'
|
126
127
|
(offset...[datalist.length, offset+step].min).each do |i|
|
127
128
|
if i == index
|
128
|
-
line_info = "
|
129
|
+
line_info = "♩ #{i}. #{datalist[i]['albums_name']} - #{datalist[i]['artists_name']}"
|
129
130
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
|
130
131
|
else
|
131
|
-
line_info = "#{i}
|
132
|
+
line_info = "#{i}. #{datalist[i]['albums_name']} - #{datalist[i]['artists_name']}"
|
132
133
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
|
133
134
|
end
|
134
135
|
end
|
@@ -136,10 +137,10 @@ class Ui
|
|
136
137
|
when 'playlists'
|
137
138
|
(offset...[datalist.length, offset+step].min).each do |i|
|
138
139
|
if i == index
|
139
|
-
line_info = "
|
140
|
+
line_info = "♩ #{i}. #{datalist[i]['playlists_name']} - #{datalist[i]['creator_name']}"
|
140
141
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
|
141
142
|
else
|
142
|
-
line_info = "#{i}
|
143
|
+
line_info = "#{i}. #{datalist[i]['playlists_name']} - #{datalist[i]['creator_name']}"
|
143
144
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
|
144
145
|
end
|
145
146
|
end
|
@@ -147,17 +148,17 @@ class Ui
|
|
147
148
|
when 'djchannels'
|
148
149
|
(offset...[datalist.length, offset+step].min).each do |i|
|
149
150
|
if i == index
|
150
|
-
line_info = "
|
151
|
+
line_info = "♩ #{i}. #{datalist[i][0]['song_name']}"
|
151
152
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
|
152
153
|
else
|
153
|
-
line_info = "#{i}
|
154
|
+
line_info = "#{i}. #{datalist[i][0]['song_name']}"
|
154
155
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
|
155
156
|
end
|
156
157
|
end
|
157
158
|
|
158
159
|
when 'help'
|
159
160
|
(offset...[datalist.length, offset+step].min).each do |i|
|
160
|
-
line_info = "#{i}
|
161
|
+
line_info = "#{i}. #{datalist[i][0]} #{datalist[i][1]} #{datalist[i][2]}"
|
161
162
|
putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
|
162
163
|
end
|
163
164
|
end
|
@@ -227,18 +228,18 @@ class Ui
|
|
227
228
|
|
228
229
|
def build_search_menu
|
229
230
|
clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
|
230
|
-
putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, '
|
231
|
+
putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, '选择搜索类型:', Curses.color_pair(1))
|
231
232
|
putstr(@screen, PLAYER_CONTENT_Y + 1, PLAYER_X, '[1] 歌曲')
|
232
233
|
putstr(@screen, PLAYER_CONTENT_Y + 2, PLAYER_X, '[2] 艺术家')
|
233
234
|
putstr(@screen, PLAYER_CONTENT_Y + 3, PLAYER_X, '[3] 专辑')
|
234
235
|
putstr(@screen, PLAYER_CONTENT_Y + 4, PLAYER_X, '[4] 网易精选集')
|
235
|
-
putstr(@screen, PLAYER_CONTENT_Y + 6, PLAYER_X, '
|
236
|
+
putstr(@screen, PLAYER_CONTENT_Y + 6, PLAYER_X, '请键入对应数字:', Curses.color_pair(2))
|
236
237
|
@screen.refresh
|
237
238
|
x = @screen.getch
|
238
239
|
end
|
239
240
|
|
240
241
|
def build_login
|
241
|
-
params = get_param('
|
242
|
+
params = get_param('请输入登录信息:(e.g. foobar@163.com foobar)')
|
242
243
|
account = params.split(' ')
|
243
244
|
return build_login if account.size != 2
|
244
245
|
|
@@ -253,10 +254,10 @@ class Ui
|
|
253
254
|
|
254
255
|
def build_login_error
|
255
256
|
clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
|
256
|
-
putstr(@screen, PLAYER_CONTENT_Y + 1, PLAYER_X, 'oh
|
257
|
+
putstr(@screen, PLAYER_CONTENT_Y + 1, PLAYER_X, 'oh,信息好像不对……', Curses.color_pair(2))
|
257
258
|
putstr(@screen, PLAYER_CONTENT_Y + 2, PLAYER_X, '[1] 再试一次')
|
258
259
|
putstr(@screen, PLAYER_CONTENT_Y + 3, PLAYER_X, '[2] 稍后再试')
|
259
|
-
putstr(@screen, PLAYER_CONTENT_Y + 5, PLAYER_X, '
|
260
|
+
putstr(@screen, PLAYER_CONTENT_Y + 5, PLAYER_X, '请键入对应数字:', Curses.color_pair(2))
|
260
261
|
@screen.refresh
|
261
262
|
x = @screen.getch
|
262
263
|
end
|
data/lib/mplug163/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mplug163
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ripple Yui
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|