cmus 2.0.4
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/bin/cmus-remote.rb +123 -0
- data/cmus.gemspec +16 -0
- data/lib/cmus.rb +12 -0
- data/lib/cmus/controller.rb +58 -0
- data/lib/cmus/controller/player.rb +55 -0
- data/lib/cmus/controller/status.rb +72 -0
- data/lib/cmus/controller/toggle.rb +33 -0
- data/lib/cmus/version.rb +15 -0
- metadata +53 -0
data/bin/cmus-remote.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'cmus'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
options = {}
|
6
|
+
|
7
|
+
OptionParser.new do |o|
|
8
|
+
o.on '--server SOCKET', 'connect using SOCKET instead of ~/.cmus/socket' do |value|
|
9
|
+
options[:server] = value
|
10
|
+
end
|
11
|
+
|
12
|
+
o.on '--version', 'display version information and exit' do
|
13
|
+
puts "cmus-remote.rb for #{Cmus.version}"
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
o.on '-p', '--play', 'start playing' do
|
18
|
+
options[:player] = :play
|
19
|
+
end
|
20
|
+
|
21
|
+
o.on '-u', '--pause', 'toggle pause' do
|
22
|
+
options[:player] = :pause
|
23
|
+
end
|
24
|
+
|
25
|
+
o.on '-s', '--stop', 'stop playing' do
|
26
|
+
options[:player] = :stop
|
27
|
+
end
|
28
|
+
|
29
|
+
o.on '-n', '--next', 'skip forward in playlist' do
|
30
|
+
options[:player] = :next
|
31
|
+
end
|
32
|
+
|
33
|
+
o.on '-r', '--prev', 'skip backward in playlist' do
|
34
|
+
options[:player] = :prev
|
35
|
+
end
|
36
|
+
|
37
|
+
o.on '-v', '--volume VOL', 'changes volume' do |value|
|
38
|
+
options[:player] = :volume
|
39
|
+
options[:value] = value
|
40
|
+
end
|
41
|
+
|
42
|
+
o.on '-k', '--seek SEEK', 'seek' do |value|
|
43
|
+
options[:player] = :seek
|
44
|
+
options[:value] = value
|
45
|
+
end
|
46
|
+
|
47
|
+
o.on '-R', '--repeat', 'toggle repeat' do
|
48
|
+
options[:toggle] = :repeat
|
49
|
+
end
|
50
|
+
|
51
|
+
o.on '-S', '--shuffle', 'toggle shuffle' do
|
52
|
+
options[:toggle] = :shuffle
|
53
|
+
end
|
54
|
+
|
55
|
+
o.on '-Q', 'get player status information' do
|
56
|
+
options[:status] = true
|
57
|
+
end
|
58
|
+
|
59
|
+
o.on '-l', '--library', 'modify library instead of playlist' do
|
60
|
+
options[:library] = true
|
61
|
+
end
|
62
|
+
|
63
|
+
o.on '-P', '--playlist', 'modify playlist (default)' do
|
64
|
+
options[:playlist] = true
|
65
|
+
end
|
66
|
+
|
67
|
+
o.on '-q', '--queue', 'modify play queue instead of playlist' do
|
68
|
+
options[:queue] = true
|
69
|
+
end
|
70
|
+
|
71
|
+
o.on '-c', '--clear', 'clear playlist, library (-l) or play queue (-q)' do
|
72
|
+
options[:clear] = true
|
73
|
+
end
|
74
|
+
|
75
|
+
o.on '-C', '--raw', 'treat arguments (instead of stdin) as raw commands' do
|
76
|
+
options[:raw]
|
77
|
+
end
|
78
|
+
end.parse!
|
79
|
+
|
80
|
+
controller = options[:server] ? Cmus::Controller.new(options[:server]) : Cmus::Controller.new
|
81
|
+
|
82
|
+
if options[:clear]
|
83
|
+
controller.clear(options[:queue] ? :queue : options[:library] ? :library : :playlist)
|
84
|
+
end
|
85
|
+
|
86
|
+
if options[:player]
|
87
|
+
controller.player.__send__ *[options[:player], options[:value]].compact
|
88
|
+
end
|
89
|
+
|
90
|
+
if options[:toggle]
|
91
|
+
controller.toggle.__send__ options[:toggle]
|
92
|
+
end
|
93
|
+
|
94
|
+
if options[:status]
|
95
|
+
controller.status.tap {|status|
|
96
|
+
puts "status #{status.to_sym}"
|
97
|
+
puts "file #{status.path}" if status.path
|
98
|
+
puts "duration #{status.duration}" if status.duration
|
99
|
+
puts "position #{status.position}" if status.position
|
100
|
+
|
101
|
+
status.tags.marshal_dump.each {|name, value|
|
102
|
+
puts "tag #{name} #{value}"
|
103
|
+
}
|
104
|
+
|
105
|
+
status.settings.marshal_dump.each {|name, value|
|
106
|
+
puts "set #{name} #{value}"
|
107
|
+
}
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
if options[:raw]
|
112
|
+
ARGV.each {|command|
|
113
|
+
controller.puts command
|
114
|
+
}
|
115
|
+
|
116
|
+
while line = controller.readline
|
117
|
+
puts line
|
118
|
+
end
|
119
|
+
else
|
120
|
+
ARGV.each {|path|
|
121
|
+
controller.add(options[:queue] ? :queue : options[:library] ? :library : :playlist, path)
|
122
|
+
}
|
123
|
+
end
|
data/cmus.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Kernel.load 'lib/cmus/version.rb'
|
2
|
+
|
3
|
+
Gem::Specification.new {|s|
|
4
|
+
s.name = 'cmus'
|
5
|
+
s.version = Cmus.version
|
6
|
+
s.author = 'meh.'
|
7
|
+
s.email = 'meh@paranoici.org'
|
8
|
+
s.homepage = 'http://github.com/meh/LOLastfm'
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.summary = 'cmus remote controller library.'
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
s.require_paths = ['lib']
|
16
|
+
}
|
data/lib/cmus.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
require 'cmus/controller'
|
12
|
+
require 'cmus/version'
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
require 'socket'
|
12
|
+
|
13
|
+
require 'cmus/controller/toggle'
|
14
|
+
require 'cmus/controller/player'
|
15
|
+
require 'cmus/controller/status'
|
16
|
+
|
17
|
+
module Cmus
|
18
|
+
|
19
|
+
class Controller
|
20
|
+
attr_reader :path
|
21
|
+
|
22
|
+
def initialize (path = '~/.cmus/socket')
|
23
|
+
@path = File.expand_path(path)
|
24
|
+
@socket = UNIXSocket.new(@path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def respond_to_missing? (id)
|
28
|
+
@socket.respond_to? id
|
29
|
+
end
|
30
|
+
|
31
|
+
def method_missing (id, *args, &block)
|
32
|
+
@socket.__send__ id, *args, &block
|
33
|
+
end
|
34
|
+
|
35
|
+
def clear (context = :playlist)
|
36
|
+
puts "clear -#{context.to_s[0]}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def add (context = :playlist, *paths)
|
40
|
+
paths.flatten.compact.uniq.each {|path|
|
41
|
+
puts "clear -#{context.to_s[0]} #{path}"
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def toggle
|
46
|
+
Toggle.new(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
def player
|
50
|
+
Player.new(self)
|
51
|
+
end
|
52
|
+
|
53
|
+
def status
|
54
|
+
Status.new(self)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
module Cmus; class Controller
|
12
|
+
|
13
|
+
class Player
|
14
|
+
attr_reader :controller
|
15
|
+
|
16
|
+
def initialize (controller)
|
17
|
+
@controller = controller
|
18
|
+
end
|
19
|
+
|
20
|
+
def play (file = nil)
|
21
|
+
if file
|
22
|
+
controller.puts "player-play #{File.real_path(File.expand_path(file))}"
|
23
|
+
else
|
24
|
+
controller.puts 'player-play'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def pause
|
29
|
+
return if controller.status == :paused
|
30
|
+
|
31
|
+
controller.puts 'player-pause'
|
32
|
+
end
|
33
|
+
|
34
|
+
def stop
|
35
|
+
controller.puts 'player-stop'
|
36
|
+
end
|
37
|
+
|
38
|
+
def next
|
39
|
+
controller.puts 'player-next'
|
40
|
+
end
|
41
|
+
|
42
|
+
def prev
|
43
|
+
controller.puts 'player-prev'
|
44
|
+
end
|
45
|
+
|
46
|
+
def volume (volume)
|
47
|
+
controller.puts "vol #{volume}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def seek (second)
|
51
|
+
controller.puts "seek #{second}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end; end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
require 'ostruct'
|
12
|
+
|
13
|
+
module Cmus; class Controller
|
14
|
+
|
15
|
+
class Status
|
16
|
+
attr_reader :controller, :path, :duration, :position, :tags, :settings
|
17
|
+
|
18
|
+
def initialize (controller)
|
19
|
+
@controller = controller
|
20
|
+
|
21
|
+
@tags = OpenStruct.new
|
22
|
+
@settings = OpenStruct.new
|
23
|
+
|
24
|
+
controller.puts 'status'
|
25
|
+
|
26
|
+
buffer = controller.read(1)
|
27
|
+
|
28
|
+
while tmp = (controller.read_nonblock(2048) rescue nil)
|
29
|
+
buffer << tmp
|
30
|
+
end
|
31
|
+
|
32
|
+
buffer.each_line {|line|
|
33
|
+
type, data = line.chomp.split ' ', 2
|
34
|
+
|
35
|
+
next unless type
|
36
|
+
|
37
|
+
case type.to_sym
|
38
|
+
when :status
|
39
|
+
@status = data.to_sym
|
40
|
+
|
41
|
+
when :file
|
42
|
+
@path = data
|
43
|
+
|
44
|
+
when :duration
|
45
|
+
@duration = data.to_i
|
46
|
+
|
47
|
+
when :position
|
48
|
+
@position = data.to_i
|
49
|
+
|
50
|
+
when :tag
|
51
|
+
name, data = data.split ' ', 2
|
52
|
+
|
53
|
+
@tags.send "#{name}=", data
|
54
|
+
|
55
|
+
when :set
|
56
|
+
name, data = data.split ' ', 2
|
57
|
+
|
58
|
+
@settings.send "#{name}=", data
|
59
|
+
end
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def == (other)
|
64
|
+
super || to_sym == other
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_sym
|
68
|
+
@status
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end; end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
module Cmus; class Controller
|
12
|
+
|
13
|
+
class Toggle
|
14
|
+
attr_reader :controller
|
15
|
+
|
16
|
+
def initialize (controller)
|
17
|
+
@controller = controller
|
18
|
+
end
|
19
|
+
|
20
|
+
def repeat
|
21
|
+
controller.puts 'toggle repeat'
|
22
|
+
end
|
23
|
+
|
24
|
+
def shuffle
|
25
|
+
controller.puts 'toggle shuffle'
|
26
|
+
end
|
27
|
+
|
28
|
+
def pause
|
29
|
+
controller.puts 'player-pause'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end; end
|
data/lib/cmus/version.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#--
|
2
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
3
|
+
# Version 2, December 2004
|
4
|
+
#
|
5
|
+
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
6
|
+
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
7
|
+
#
|
8
|
+
# 0. You just DO WHAT THE FUCK YOU WANT TO.
|
9
|
+
#++
|
10
|
+
|
11
|
+
module Cmus
|
12
|
+
def self.version
|
13
|
+
'2.0.4'
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cmus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.4
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- meh.
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-17 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email: meh@paranoici.org
|
16
|
+
executables:
|
17
|
+
- cmus-remote.rb
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/cmus-remote.rb
|
22
|
+
- cmus.gemspec
|
23
|
+
- lib/cmus.rb
|
24
|
+
- lib/cmus/controller.rb
|
25
|
+
- lib/cmus/controller/player.rb
|
26
|
+
- lib/cmus/controller/status.rb
|
27
|
+
- lib/cmus/controller/toggle.rb
|
28
|
+
- lib/cmus/version.rb
|
29
|
+
homepage: http://github.com/meh/LOLastfm
|
30
|
+
licenses: []
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 1.8.24
|
50
|
+
signing_key:
|
51
|
+
specification_version: 3
|
52
|
+
summary: cmus remote controller library.
|
53
|
+
test_files: []
|