dhun 0.5.6 → 0.6.0
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/CONTRIBUTORS +1 -0
- data/FIX.md +4 -3
- data/README.md +106 -54
- data/Rakefile +12 -0
- data/TODO.md +0 -9
- data/bin/dhun +2 -1
- data/dhun.gemspec +7 -5
- data/lib/dhun.rb +2 -3
- data/lib/dhun/client.rb +25 -0
- data/lib/dhun/dhun_server.rb +56 -23
- data/lib/dhun/handler.rb +69 -90
- data/lib/dhun/player.rb +90 -65
- data/lib/dhun/query.rb +63 -42
- data/lib/dhun/result.rb +8 -8
- data/lib/dhun/runner.rb +204 -86
- data/lib/dhun/server.rb +6 -48
- metadata +34 -5
- data/lib/dhun/command.rb +0 -15
- data/lib/dhun/controller.rb +0 -160
- data/lib/dhun/dhun_client.rb +0 -30
data/lib/dhun/server.rb
CHANGED
@@ -1,50 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'rubygems'
|
2
2
|
require 'daemons'
|
3
|
-
module Dhun
|
4
|
-
class Server
|
5
|
-
|
6
|
-
attr_reader :logger
|
7
3
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
def start
|
16
|
-
if @options[:daemonize]
|
17
|
-
logger.log "Starting Dhun"
|
18
|
-
exit if fork
|
19
|
-
Process.setsid
|
20
|
-
log_file = @options[:log] || @options[:default_log]
|
21
|
-
exec("#{ENV['_']} start -l #{log_file} #{@options[:debug] ? "-D" : ""}")
|
22
|
-
end
|
23
|
-
logger.file = @options[:log] if @options[:log]
|
24
|
-
logger.log "Starting Dhun"
|
25
|
-
at_exit { remove_socket_file }
|
26
|
-
EventMachine::run {
|
27
|
-
EventMachine::start_server @socket, DhunServer
|
28
|
-
}
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.stop
|
32
|
-
Logger.instance.log "Stopping Dhun"
|
33
|
-
EventMachine.stop if EventMachine.reactor_running?
|
34
|
-
exit
|
35
|
-
end
|
36
|
-
|
37
|
-
protected
|
38
|
-
# Register signals:
|
39
|
-
# * calls +stop+ to shutdown gracefully.
|
40
|
-
def setup_signals
|
41
|
-
trap('QUIT') { Server.stop }
|
42
|
-
trap('INT') { Server.stop }
|
43
|
-
trap('TERM') { Server.stop }
|
44
|
-
end
|
45
|
-
|
46
|
-
def remove_socket_file
|
47
|
-
File.delete(@socket) if File.exist?(@socket)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
4
|
+
dhun_server = File.dirname(__FILE__)+"/dhun_server.rb"
|
5
|
+
Daemons.run(dhun_server,
|
6
|
+
:dir_mode => :normal,
|
7
|
+
:dir => '/tmp/'
|
8
|
+
)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dhun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Deepak Jois
|
@@ -9,9 +9,29 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-12 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: riot
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.10.11
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rr
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.10.5
|
34
|
+
version:
|
15
35
|
- !ruby/object:Gem::Dependency
|
16
36
|
name: eventmachine
|
17
37
|
type: :runtime
|
@@ -42,6 +62,16 @@ dependencies:
|
|
42
62
|
- !ruby/object:Gem::Version
|
43
63
|
version: 1.0.10
|
44
64
|
version:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: thor
|
67
|
+
type: :runtime
|
68
|
+
version_requirement:
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 0.12.0
|
74
|
+
version:
|
45
75
|
description:
|
46
76
|
email: deepak.jois@gmail.com
|
47
77
|
executables:
|
@@ -51,6 +81,7 @@ extensions:
|
|
51
81
|
extra_rdoc_files: []
|
52
82
|
|
53
83
|
files:
|
84
|
+
- CONTRIBUTORS
|
54
85
|
- FIX.md
|
55
86
|
- LICENSE.txt
|
56
87
|
- README.md
|
@@ -65,9 +96,7 @@ files:
|
|
65
96
|
- ext/player.c
|
66
97
|
- ext/query.c
|
67
98
|
- lib/dhun.rb
|
68
|
-
- lib/dhun/
|
69
|
-
- lib/dhun/controller.rb
|
70
|
-
- lib/dhun/dhun_client.rb
|
99
|
+
- lib/dhun/client.rb
|
71
100
|
- lib/dhun/dhun_server.rb
|
72
101
|
- lib/dhun/handler.rb
|
73
102
|
- lib/dhun/logger.rb
|
data/lib/dhun/command.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Dhun
|
3
|
-
class Command
|
4
|
-
attr_reader :commands, :arguments
|
5
|
-
|
6
|
-
def initialize(command,arguments)
|
7
|
-
@command = command
|
8
|
-
@arguments = arguments
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_json
|
12
|
-
{ "command" => @command, "arguments" => @arguments }.to_json
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/lib/dhun/controller.rb
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Dhun
|
3
|
-
class Controller
|
4
|
-
|
5
|
-
attr_accessor :options,:logger
|
6
|
-
|
7
|
-
def initialize(options)
|
8
|
-
@options = options
|
9
|
-
@logger = Logger.instance
|
10
|
-
end
|
11
|
-
|
12
|
-
def start
|
13
|
-
server = Server.new(@options)
|
14
|
-
if DhunClient.is_dhun_server_running?(@options[:socket])
|
15
|
-
puts "Dhun is already running"
|
16
|
-
else
|
17
|
-
server.start
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def stop
|
22
|
-
send_command("stop")
|
23
|
-
end
|
24
|
-
|
25
|
-
def query(*args)
|
26
|
-
abort_if_empty_args(args)
|
27
|
-
q = Query.new(args)
|
28
|
-
if q.is_valid?
|
29
|
-
files = q.execute_spotlight_query
|
30
|
-
puts(files.empty? ? "No Results Found" : "#{files.size} Results\n" + files.join("\n"))
|
31
|
-
else
|
32
|
-
puts "Invalid Query Syntax. Run dhun -h to see right syntax"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def play(*args)
|
37
|
-
abort_if_empty_args(args)
|
38
|
-
resp = get_json_response("play", args)
|
39
|
-
return unless resp
|
40
|
-
# Process response
|
41
|
-
case resp.success?
|
42
|
-
when true
|
43
|
-
puts resp[:message]
|
44
|
-
# Print list of files
|
45
|
-
print_list resp[:files]
|
46
|
-
else
|
47
|
-
puts resp[:message]
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def enqueue(*args)
|
52
|
-
abort_if_empty_args(args)
|
53
|
-
resp = get_json_response("enqueue",args)
|
54
|
-
return unless resp
|
55
|
-
# Process response
|
56
|
-
case resp.success?
|
57
|
-
when true
|
58
|
-
puts resp[:message]
|
59
|
-
# Print list of files
|
60
|
-
print_list resp[:files]
|
61
|
-
else
|
62
|
-
puts resp[:message]
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def status
|
67
|
-
resp = get_json_response("status")
|
68
|
-
return unless resp
|
69
|
-
puts resp[:message]
|
70
|
-
if resp.success?
|
71
|
-
now_playing = resp[:now_playing]
|
72
|
-
queue = resp[:queue]
|
73
|
-
puts "Now playing #{now_playing}" if now_playing
|
74
|
-
if queue.empty?
|
75
|
-
puts "Queue is empty"
|
76
|
-
else
|
77
|
-
print_list(queue)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def history
|
83
|
-
resp = get_json_response("history")
|
84
|
-
return unless resp
|
85
|
-
puts resp[:message]
|
86
|
-
print_list(resp[:history]) unless resp[:history].empty?
|
87
|
-
end
|
88
|
-
|
89
|
-
def next(skip_length=1)
|
90
|
-
begin
|
91
|
-
skip_length = Integer(skip_length)
|
92
|
-
rescue ArgumentError => ex # Not a valid integer
|
93
|
-
abort ex.message
|
94
|
-
end
|
95
|
-
resp = get_json_response("next",[skip_length])
|
96
|
-
puts resp[:message] if resp
|
97
|
-
end
|
98
|
-
|
99
|
-
def prev(skip_length=1)
|
100
|
-
begin
|
101
|
-
skip_length = Integer(skip_length)
|
102
|
-
rescue ArgumentError => ex # Not a valid integer
|
103
|
-
abort ex.message
|
104
|
-
end
|
105
|
-
resp = get_json_response("prev",[skip_length])
|
106
|
-
puts resp[:message] if resp
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
def pause
|
111
|
-
resp = get_json_response("pause")
|
112
|
-
puts resp[:message] if resp
|
113
|
-
end
|
114
|
-
|
115
|
-
def resume
|
116
|
-
resp = get_json_response("resume")
|
117
|
-
puts resp[:message] if resp
|
118
|
-
end
|
119
|
-
|
120
|
-
def shuffle
|
121
|
-
resp = get_json_response("shuffle")
|
122
|
-
return unless resp
|
123
|
-
# Process response
|
124
|
-
case resp.success?
|
125
|
-
when true
|
126
|
-
puts resp[:message]
|
127
|
-
# Print list of files
|
128
|
-
print_list resp[:queue]
|
129
|
-
else
|
130
|
-
puts resp[:message]
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
protected
|
135
|
-
def send_command(command,arguments=[])
|
136
|
-
cmd = { "command" => command, "arguments" => arguments }.to_json
|
137
|
-
client = DhunClient.new(@options)
|
138
|
-
resp = client.send(cmd)
|
139
|
-
end
|
140
|
-
|
141
|
-
def get_json_response(command,args=[])
|
142
|
-
begin
|
143
|
-
resp = send_command(command,args)
|
144
|
-
return Result.from_json_str(resp)
|
145
|
-
rescue
|
146
|
-
puts "Invalid Response From Server"
|
147
|
-
logger.debug $!
|
148
|
-
return nil
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def abort_if_empty_args(args)
|
153
|
-
abort "You must pass in atleast one argument" if args.empty?
|
154
|
-
end
|
155
|
-
|
156
|
-
def print_list(list)
|
157
|
-
list.each { |item| puts item }
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
data/lib/dhun/dhun_client.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'socket'
|
2
|
-
require 'json'
|
3
|
-
module Dhun
|
4
|
-
class DhunClient
|
5
|
-
def initialize(options)
|
6
|
-
@options = options
|
7
|
-
@socket = options[:socket]
|
8
|
-
unless DhunClient.is_dhun_server_running?(@socket)
|
9
|
-
raise "Dhun server is not running"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def send(message)
|
14
|
-
u = UNIXSocket.new(@socket)
|
15
|
-
u.puts message
|
16
|
-
resp = u.read
|
17
|
-
u.close
|
18
|
-
return resp
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.is_dhun_server_running?(socket)
|
22
|
-
begin
|
23
|
-
u = UNIXSocket.new(socket)
|
24
|
-
return true
|
25
|
-
rescue StandardError => ex
|
26
|
-
return false
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|