listlace 0.2.1 → 0.2.2
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/Gemfile +1 -1
- data/Gemfile.lock +5 -7
- data/README.md +50 -2
- data/lib/listlace.rb +3 -1
- data/lib/listlace/commands.rb +4 -76
- data/lib/listlace/commands/info_commands.rb +46 -0
- data/lib/listlace/commands/playback_commands.rb +73 -0
- data/lib/listlace/commands/queue_commands.rb +18 -0
- data/lib/listlace/time_helpers.rb +17 -4
- data/listlace.gemspec +5 -9
- metadata +20 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73a561a8f588866994d8cbe4718ebdfecc177e0c
|
4
|
+
data.tar.gz: b6e132d833d80fa70db4bd45797a14f215a886ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71fbeea2dffa8205f5ad4ffa0320b5c53ad8e8f8cbf8d3c22f83b3a396330bd9aba86b70ccb9f224aabe66607a15bc7068ba2fa6ac85cd0d2167aa74b2d27bd1
|
7
|
+
data.tar.gz: 453a19318a387a0016cebbd839a1bdf22caa2f350ae108e06b4f25d75f9e229b3611fc3561ba3a4e502fc2dd9ac705d500f60ea1bcf3ff53ebdcaf83e97a8f9b
|
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
listlace (0.2.
|
5
|
-
bundler
|
6
|
-
pry
|
7
|
-
ruby-mpd
|
4
|
+
listlace (0.2.2)
|
5
|
+
bundler (~> 1.5)
|
6
|
+
pry (~> 0.9)
|
7
|
+
ruby-mpd (~> 0.3, >= 0.3.1)
|
8
8
|
|
9
9
|
GEM
|
10
|
-
remote:
|
10
|
+
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
12
|
coderay (1.1.0)
|
13
13
|
method_source (0.8.2)
|
@@ -15,7 +15,6 @@ GEM
|
|
15
15
|
coderay (~> 1.0)
|
16
16
|
method_source (~> 0.8)
|
17
17
|
slop (~> 3.4)
|
18
|
-
rake (0.9.2.2)
|
19
18
|
ruby-mpd (0.3.1)
|
20
19
|
slop (3.5.0)
|
21
20
|
|
@@ -24,4 +23,3 @@ PLATFORMS
|
|
24
23
|
|
25
24
|
DEPENDENCIES
|
26
25
|
listlace!
|
27
|
-
rake
|
data/README.md
CHANGED
@@ -96,14 +96,14 @@ It's basically a numeric selector, but you can pass a String containing a format
|
|
96
96
|
|
97
97
|
### Special selectors
|
98
98
|
|
99
|
-
|
99
|
+
#### all
|
100
100
|
|
101
101
|
`all` returns all the songs in your library.
|
102
102
|
|
103
103
|
♫> all
|
104
104
|
=> [3560 songs]
|
105
105
|
|
106
|
-
|
106
|
+
#### none
|
107
107
|
|
108
108
|
`none` returns an empty playlist.
|
109
109
|
|
@@ -134,6 +134,54 @@ It's basically a numeric selector, but you can pass a String containing a format
|
|
134
134
|
|
135
135
|
♫> stop
|
136
136
|
|
137
|
+
### skip
|
138
|
+
|
139
|
+
`skip` goes to the next song. If you give it a number, it will go that many songs ahead.
|
140
|
+
|
141
|
+
♫> skip
|
142
|
+
♫> skip 3
|
143
|
+
|
144
|
+
### back
|
145
|
+
|
146
|
+
`back` goes back a song. If you give it a number, it will go that many songs back.
|
147
|
+
|
148
|
+
♫> back
|
149
|
+
♫> back 3
|
150
|
+
|
151
|
+
### restart
|
152
|
+
|
153
|
+
`restart` goes back to the beginning of the current song.
|
154
|
+
|
155
|
+
♫> restart
|
156
|
+
|
157
|
+
### pause
|
158
|
+
|
159
|
+
`pause` pauses the current song.
|
160
|
+
|
161
|
+
♫> pause
|
162
|
+
|
163
|
+
### resume
|
164
|
+
|
165
|
+
`resume` resumes the current song after being paused.
|
166
|
+
|
167
|
+
♫> resume
|
168
|
+
|
169
|
+
### seek
|
170
|
+
|
171
|
+
`seek` seeks forward or backward the specified number of seconds. You can also pass a String containing a formatted time, like "1:23", to skip ahead that many minutes and seconds, or "-1:23" to skip backward.
|
172
|
+
|
173
|
+
♫> seek 10
|
174
|
+
♫> seek -10
|
175
|
+
♫> seek "1:23"
|
176
|
+
♫> seek "-0:10"
|
177
|
+
|
178
|
+
### seek_to
|
179
|
+
|
180
|
+
`seek_to` seeks to an exact position of the current playing song. You can give it a number of seconds, or a formatted string containing a time.
|
181
|
+
|
182
|
+
♫> seek_to 0
|
183
|
+
♫> seek_to "5:00"
|
184
|
+
|
137
185
|
### list
|
138
186
|
|
139
187
|
`list` with no arguments lists all the songs in your music library. If you pass it a playlist, it will list all the songs in that playlist.
|
data/lib/listlace.rb
CHANGED
data/lib/listlace/commands.rb
CHANGED
@@ -1,81 +1,9 @@
|
|
1
|
+
require "listlace/commands/info_commands"
|
2
|
+
require "listlace/commands/playback_commands"
|
3
|
+
require "listlace/commands/queue_commands"
|
4
|
+
|
1
5
|
class Listlace
|
2
6
|
module Commands
|
3
|
-
def p(*playlist)
|
4
|
-
if playlist.empty?
|
5
|
-
case mpd.status[:state]
|
6
|
-
when :play
|
7
|
-
mpd.pause = true
|
8
|
-
when :pause
|
9
|
-
mpd.pause = false
|
10
|
-
when :stop
|
11
|
-
mpd.play
|
12
|
-
end
|
13
|
-
else
|
14
|
-
mpd.clear
|
15
|
-
playlist.flatten.each do |song|
|
16
|
-
mpd.add song.file
|
17
|
-
end
|
18
|
-
mpd.play
|
19
|
-
end
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
|
23
|
-
def stop
|
24
|
-
mpd.stop
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
|
28
|
-
def q(*playlist)
|
29
|
-
if playlist.empty?
|
30
|
-
mpd.queue
|
31
|
-
else
|
32
|
-
mpd.clear
|
33
|
-
playlist.flatten.each do |song|
|
34
|
-
mpd.add song.file
|
35
|
-
end
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def list(playlist = nil)
|
41
|
-
(playlist || all).each do |song|
|
42
|
-
time = TimeHelpers.format_time(song.time)
|
43
|
-
puts "#{song.artist} - #{song.album} - #{song.title} (#{time})"
|
44
|
-
end
|
45
|
-
nil
|
46
|
-
end
|
47
|
-
|
48
|
-
def artists(playlist = nil)
|
49
|
-
(playlist || all).group_by(&:artist).each do |artist, songs|
|
50
|
-
plural = (songs.length == 1) ? "" : "s"
|
51
|
-
puts "#{artist} (#{songs.length} song#{plural})"
|
52
|
-
end
|
53
|
-
nil
|
54
|
-
end
|
55
|
-
|
56
|
-
def albums(playlist = nil)
|
57
|
-
(playlist || all).group_by(&:album).each do |album, songs|
|
58
|
-
plural = (songs.length == 1) ? "" : "s"
|
59
|
-
puts "#{songs.first.artist} - #{album} (#{songs.length} song#{plural})"
|
60
|
-
end
|
61
|
-
nil
|
62
|
-
end
|
63
|
-
|
64
|
-
def genres(playlist = nil)
|
65
|
-
(playlist || all).group_by(&:genre).each do |genre, songs|
|
66
|
-
plural = (songs.length == 1) ? "" : "s"
|
67
|
-
puts "#{genre} (#{songs.length} song#{plural})"
|
68
|
-
end
|
69
|
-
nil
|
70
|
-
end
|
71
|
-
|
72
|
-
def years(playlist = nil)
|
73
|
-
(playlist || all).group_by(&:date).each do |year, songs|
|
74
|
-
plural = (songs.length == 1) ? "" : "s"
|
75
|
-
puts "#{year} (#{songs.length} song#{plural})"
|
76
|
-
end
|
77
|
-
nil
|
78
|
-
end
|
79
7
|
end
|
80
8
|
end
|
81
9
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Listlace
|
2
|
+
module Commands
|
3
|
+
module InfoCommands
|
4
|
+
def list(playlist = nil)
|
5
|
+
(playlist || all).each do |song|
|
6
|
+
time = TimeHelpers.format_time(song.time)
|
7
|
+
puts "#{song.artist} - #{song.album} - #{song.title} (#{time})"
|
8
|
+
end
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def artists(playlist = nil)
|
13
|
+
(playlist || all).group_by(&:artist).each do |artist, songs|
|
14
|
+
plural = (songs.length == 1) ? "" : "s"
|
15
|
+
puts "#{artist} (#{songs.length} song#{plural})"
|
16
|
+
end
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def albums(playlist = nil)
|
21
|
+
(playlist || all).group_by(&:album).each do |album, songs|
|
22
|
+
plural = (songs.length == 1) ? "" : "s"
|
23
|
+
puts "#{songs.first.artist} - #{album} (#{songs.length} song#{plural})"
|
24
|
+
end
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def genres(playlist = nil)
|
29
|
+
(playlist || all).group_by(&:genre).each do |genre, songs|
|
30
|
+
plural = (songs.length == 1) ? "" : "s"
|
31
|
+
puts "#{genre} (#{songs.length} song#{plural})"
|
32
|
+
end
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def years(playlist = nil)
|
37
|
+
(playlist || all).group_by(&:date).each do |year, songs|
|
38
|
+
plural = (songs.length == 1) ? "" : "s"
|
39
|
+
puts "#{year} (#{songs.length} song#{plural})"
|
40
|
+
end
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class Listlace
|
2
|
+
module Commands
|
3
|
+
module PlaybackCommands
|
4
|
+
def p(*playlist)
|
5
|
+
if playlist.empty?
|
6
|
+
case mpd.status[:state]
|
7
|
+
when :play
|
8
|
+
mpd.pause = true
|
9
|
+
when :pause
|
10
|
+
mpd.pause = false
|
11
|
+
when :stop
|
12
|
+
mpd.play
|
13
|
+
end
|
14
|
+
else
|
15
|
+
mpd.clear
|
16
|
+
playlist.flatten.each do |song|
|
17
|
+
mpd.add song.file
|
18
|
+
end
|
19
|
+
mpd.play
|
20
|
+
end
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def stop
|
25
|
+
mpd.stop
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def skip(n = 1)
|
30
|
+
n.times { mpd.next }
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def back(n = 1)
|
35
|
+
n.times { mpd.previous }
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def restart
|
40
|
+
seek_to 0
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def pause
|
45
|
+
mpd.pause = true
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def resume
|
50
|
+
mpd.pause = false
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def seek(time)
|
55
|
+
if time.is_a? String
|
56
|
+
time = TimeHelpers.parse_time(time)
|
57
|
+
end
|
58
|
+
stat = mpd.status
|
59
|
+
mpd.seek(stat[:time].first + time, pos: stat[:song])
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def seek_to(time)
|
64
|
+
if time.is_a? String
|
65
|
+
time = TimeHelpers.parse_time(time)
|
66
|
+
end
|
67
|
+
mpd.seek(time, pos: mpd.status[:song])
|
68
|
+
nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
@@ -4,22 +4,33 @@ class Listlace
|
|
4
4
|
|
5
5
|
# Helper method to format a number of seconds as a string like "1:03:56".
|
6
6
|
def format_time(seconds, options = {})
|
7
|
-
|
7
|
+
negative = false
|
8
|
+
if seconds < 0
|
9
|
+
negative = true
|
10
|
+
seconds = -seconds
|
11
|
+
end
|
8
12
|
|
9
13
|
hours = seconds / 3600
|
10
14
|
minutes = (seconds / 60) % 60
|
11
15
|
seconds = seconds % 60
|
16
|
+
sign = negative ? "-" : ""
|
12
17
|
|
13
18
|
if hours > 0
|
14
|
-
"%d:%02d:%02d" % [hours, minutes, seconds]
|
19
|
+
"%s%d:%02d:%02d" % [sign, hours, minutes, seconds]
|
15
20
|
else
|
16
|
-
"%d:%02d" % [minutes, seconds]
|
21
|
+
"%s%d:%02d" % [sign, minutes, seconds]
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
20
25
|
# Helper method to parse a string like "1:03:56" and return the number of
|
21
26
|
# seconds that time length represents.
|
22
27
|
def parse_time(string)
|
28
|
+
negative = false
|
29
|
+
if string[0] == "-"
|
30
|
+
negative = true
|
31
|
+
string = string[1..-1]
|
32
|
+
end
|
33
|
+
|
23
34
|
parts = string.split(":", -1).map(&:to_i)
|
24
35
|
|
25
36
|
raise ArgumentError, "too many parts" if parts.length > 3
|
@@ -27,7 +38,9 @@ class Listlace
|
|
27
38
|
|
28
39
|
parts.unshift(0) until parts.length == 3
|
29
40
|
hours, minutes, seconds = parts
|
30
|
-
hours * 3600 + minutes * 60 + seconds
|
41
|
+
total_seconds = hours * 3600 + minutes * 60 + seconds
|
42
|
+
|
43
|
+
total_seconds * (negative ? -1 : 1)
|
31
44
|
end
|
32
45
|
end
|
33
46
|
end
|
data/listlace.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "listlace"
|
3
|
-
s.version = "0.2.
|
4
|
-
s.date = "2014-03-
|
3
|
+
s.version = "0.2.2"
|
4
|
+
s.date = "2014-03-25"
|
5
5
|
s.summary = "An mpd (music player daemon) client with a Ruby shell as the interface."
|
6
6
|
s.description = "Listlace is an mpd (music player daemon) client with a Ruby shell as the interface."
|
7
7
|
s.author = "Jeremy Ruten"
|
@@ -15,12 +15,8 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.files += ["bin/listlace"]
|
16
16
|
s.files += Dir["lib/**/*.rb"]
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
%w(rake).each do |gem_name|
|
23
|
-
s.add_development_dependency gem_name
|
24
|
-
end
|
18
|
+
s.add_runtime_dependency "bundler", "~> 1.5"
|
19
|
+
s.add_runtime_dependency "pry", "~> 0.9"
|
20
|
+
s.add_runtime_dependency "ruby-mpd", "~> 0.3", ">= 0.3.1"
|
25
21
|
end
|
26
22
|
|
metadata
CHANGED
@@ -1,71 +1,63 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: listlace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Ruten
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.5'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '0.9'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '0.9'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: ruby-mpd
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.3'
|
45
48
|
- - ">="
|
46
49
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
50
|
+
version: 0.3.1
|
48
51
|
type: :runtime
|
49
52
|
prerelease: false
|
50
53
|
version_requirements: !ruby/object:Gem::Requirement
|
51
54
|
requirements:
|
52
|
-
- - "
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rake
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
55
|
+
- - "~>"
|
60
56
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
57
|
+
version: '0.3'
|
66
58
|
- - ">="
|
67
59
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
60
|
+
version: 0.3.1
|
69
61
|
description: Listlace is an mpd (music player daemon) client with a Ruby shell as
|
70
62
|
the interface.
|
71
63
|
email: jeremy.ruten@gmail.com
|
@@ -81,6 +73,9 @@ files:
|
|
81
73
|
- bin/listlace
|
82
74
|
- lib/listlace.rb
|
83
75
|
- lib/listlace/commands.rb
|
76
|
+
- lib/listlace/commands/info_commands.rb
|
77
|
+
- lib/listlace/commands/playback_commands.rb
|
78
|
+
- lib/listlace/commands/queue_commands.rb
|
84
79
|
- lib/listlace/core_ext/array.rb
|
85
80
|
- lib/listlace/selectors.rb
|
86
81
|
- lib/listlace/time_helpers.rb
|