dhun 0.6.0 → 0.7.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/README.md CHANGED
@@ -29,7 +29,7 @@ the `gem` command to compile the native extensions.
29
29
  this runs the Dhun server as a daemon by default. to not run it as a daemon:
30
30
 
31
31
  $ dhun start_server --foreground
32
- or
32
+ or
33
33
  $ dhun start_server -f
34
34
 
35
35
  See `dhun help start_server for more information`
@@ -44,8 +44,7 @@ You can also query the Spotlight database before playing the files, with the
44
44
 
45
45
  $ dhun query deadmau5
46
46
 
47
- Querying: deadmau5 | 6 Results
48
- 0 : /Volumes/Storage/Music/Grand.Theft.Auto.IV-Radio.Station.Rips-AiTB/Electro-Choc/03 One + One - No Pressure (Deadmau5 Remix).mp3
47
+ Querying: deadmau5 | 5 Results
49
48
  1 : /Volumes/Storage/Music/Grand.Theft.Auto.IV-Radio.Station.Rips-AiTB/Electro-Choc/09 Chris Lake vs. Deadmau5 - I Thought Inside Out (Original Mix).mp3
50
49
  2 : /Volumes/Storage/Music/Deadmau5 - It Sounds Like (MP3, 320bps) [2009]/01 Alone With You.mp3
51
50
  3 : /Volumes/Storage/Music/Deadmau5 - It Sounds Like (MP3, 320bps) [2009]/02 Arguru (EDX's 5un5hine Remix).mp3
@@ -60,9 +59,9 @@ you can query based on certain filters such as artist,albums, title, genre and f
60
59
 
61
60
  Querying: [nil] | artist:Paul van Dyk title:in genre:trance file:Paul
62
61
  3 Results
63
- 0 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/08 - Paul van Dyk - Talk In Grey.mp3
64
- 1 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/09 - Paul van Dyk - In Circles.mp3
65
- 2 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/10 - Paul van Dyk - In Between.mp3
62
+ 1 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/08 - Paul van Dyk - Talk In Grey.mp3
63
+ 2 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/09 - Paul van Dyk - In Circles.mp3
64
+ 3 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/10 - Paul van Dyk - In Between.mp3
66
65
 
67
66
 
68
67
  YOu can mix filters with regular queries as well.
@@ -71,14 +70,13 @@ YOu can mix filters with regular queries as well.
71
70
 
72
71
  Querying: paul | title:haunted
73
72
  1 Results
74
- 0 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/01 - Paul van Dyk - Haunted.mp3
73
+ 1 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/01 - Paul van Dyk - Haunted.mp3
75
74
 
76
75
  You can also pass in multiple regular expressions too. they just need to be seperated by commas (,)
77
76
 
78
77
  $ dhun query paul,trance
79
78
 
80
- Querying: paul,trance | 7 Results
81
- 0 : /Volumes/Storage/Music/Paul_Van_Dyk-Volume-3CD-2009-TSP/101-paul_van_dyk-volume__the_productions.mp3
79
+ Querying: paul,trance | 6 Results
82
80
  1 : /Volumes/Storage/Music/Paul_Van_Dyk-Volume-3CD-2009-TSP/201-paul_van_dyk-volume__the_remixes_part_1.mp3
83
81
  2 : /Volumes/Storage/Music/Paul_Van_Dyk-Volume-3CD-2009-TSP/301-paul_van_dyk-volume__the_remixes_part_2.mp3
84
82
  3 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/04 - Paul van Dyk - Complicated (Feat. Ashley Tomberlin).mp3
@@ -93,7 +91,7 @@ Now lets put it all together and go crazy.
93
91
 
94
92
  Querying: paul van,dyk | title:haunted genre:trance
95
93
  1 Results
96
- 0 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/01 - Paul van Dyk - Haunted.mp3
94
+ 1 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/01 - Paul van Dyk - Haunted.mp3
97
95
 
98
96
 
99
97
  ### Playing Files
@@ -106,8 +104,7 @@ this can also be done by
106
104
 
107
105
  $ dhun enqueue paul,trance
108
106
 
109
- Querying: paul,trance | 7 Results
110
- 0 : /Volumes/Storage/Music/Paul_Van_Dyk-Volume-3CD-2009-TSP/101-paul_van_dyk-volume__the_productions.mp3
107
+ Querying: paul,trance | 6 Results
111
108
  1 : /Volumes/Storage/Music/Paul_Van_Dyk-Volume-3CD-2009-TSP/201-paul_van_dyk-volume__the_remixes_part_1.mp3
112
109
  2 : /Volumes/Storage/Music/Paul_Van_Dyk-Volume-3CD-2009-TSP/301-paul_van_dyk-volume__the_remixes_part_2.mp3
113
110
  3 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/04 - Paul van Dyk - Complicated (Feat. Ashley Tomberlin).mp3
@@ -122,12 +119,12 @@ If you leave the prompt blank and enter, it will queue ALL the resulting songs.
122
119
 
123
120
  Enter index to queue 4 5
124
121
  selected:
125
- 0 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/01 - Paul van Dyk - Haunted.mp3
126
- 1 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/02 - Paul van Dyk - White Lies (Feat. Jessica Sutta).mp3
122
+ 1 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/01 - Paul van Dyk - Haunted.mp3
123
+ 2 : /Volumes/Storage/Music/Paul van Dyk - In Between (2007)/02 - Paul van Dyk - White Lies (Feat. Jessica Sutta).mp3
127
124
  2 files queued
128
125
 
129
126
 
130
- Once queued, the songs will begin playing. you can continue to enqueue more songs via enqueue and play.
127
+ Once queued, the songs will begin playing. You can continue to enqueue more songs using `enqueue` command.
131
128
 
132
129
  ### Controlling Playback
133
130
 
@@ -185,8 +182,8 @@ Status
185
182
  Currently Playing:
186
183
  /Volumes/Storage/Music/Hydeout Productions (Second Collection)/02 Sky is Falling (feat. C.L. Smooth).mp3
187
184
  Queue:
188
- 0 : /Volumes/Storage/Music/Hydeout Productions (Second Collection)/04 Imaginary Folklore.mp3
189
- 1 : /Volumes/Storage/Music/Hydeout Productions (Second Collection)/05 Hikari(feat. Substantial).mp3
185
+ 1 : /Volumes/Storage/Music/Hydeout Productions (Second Collection)/04 Imaginary Folklore.mp3
186
+ 2 : /Volumes/Storage/Music/Hydeout Productions (Second Collection)/05 Hikari(feat. Substantial).mp3
190
187
 
191
188
  History
192
189
 
@@ -195,6 +192,17 @@ History
195
192
  History:
196
193
  0 : /Volumes/Storage/Music/Hydeout Productions (Second Collection)/04 Imaginary Folklore.mp3
197
194
 
195
+ Saving Playlist
196
+
197
+ $ dhun save_playlist /tmp/playlist.pls
198
+ created /tmp/playlist
199
+
200
+ Loading Playlist
201
+
202
+ $ dhun load_playlist /tmp/playlist.pls
203
+ 14 files queued
204
+ loaded playlist
205
+
198
206
 
199
207
  ### Stopping Dhun
200
208
 
data/dhun.gemspec CHANGED
@@ -1,8 +1,8 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'dhun'
3
- s.version = '0.6.0'
3
+ s.version = '0.7.0'
4
4
  s.summary = "Minimalist music player for OS X"
5
- s.date = '2010-01-12'
5
+ s.date = '2010-01-24'
6
6
  s.email = 'deepak.jois@gmail.com'
7
7
  s.homepage = 'http://github.com/deepakjois/dhun'
8
8
  s.has_rdoc = false
data/lib/dhun.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Dhun
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0'
3
3
 
4
4
  autoload :Runner, 'dhun/runner'
5
5
  autoload :Server, 'dhun/server'
data/lib/dhun/handler.rb CHANGED
@@ -2,10 +2,10 @@ require 'json'
2
2
  module Dhun
3
3
  # Handling commands sent by Dhun client
4
4
  class Handler
5
- attr_reader :player
5
+ attr_accessor :player
6
6
 
7
- def initialize
8
- @player = Dhun::Player.instance
7
+ def initialize(player = Dhun::Player.instance)
8
+ @player = player
9
9
  end
10
10
 
11
11
  def play
data/lib/dhun/player.rb CHANGED
@@ -4,11 +4,10 @@ module Dhun
4
4
  class Player
5
5
  include Singleton
6
6
 
7
- attr_accessor :queue,:history,:status,:current,:logger
7
+ attr_accessor :queue,:history,:status,:current
8
8
 
9
9
  def initialize
10
10
  @queue,@history = [],[]
11
- @logger = Logger.instance
12
11
  @status = :stopped
13
12
  end
14
13
 
@@ -41,7 +40,6 @@ module Dhun
41
40
  if @status == :playing
42
41
  @status = :paused
43
42
  DhunExt.pause
44
- @logger.debug "pause"
45
43
  return true
46
44
  end
47
45
  return false
@@ -53,7 +51,6 @@ module Dhun
53
51
  if @status == :paused
54
52
  @status = :playing
55
53
  DhunExt.resume
56
- @logger.debug "resume"
57
54
  return true
58
55
  end
59
56
  return false
@@ -67,7 +64,6 @@ module Dhun
67
64
  DhunExt.stop
68
65
  # Wait for @player_thread to exit cleanly
69
66
  @player_thread.join unless @player_thread.nil?
70
- @logger.debug "Stopped"
71
67
  return true
72
68
  end
73
69
  return false
@@ -77,7 +73,6 @@ module Dhun
77
73
  # returns next_track or false if invalid
78
74
  def next(skip_length = 1)
79
75
  unless skip_length > @queue.size
80
- @logger.debug "next invoked"
81
76
  stop
82
77
  @queue.shift(skip_length - 1) #skip_length returns starting with first on queue.
83
78
  next_track = @queue.first
@@ -97,7 +92,6 @@ module Dhun
97
92
  stop ; skip_length += 1
98
93
  end
99
94
  unless skip_length > @history.size
100
- @logger.debug "previous invoked"
101
95
  tracks = @history.shift skip_length
102
96
  tracks.each { |track| @queue.unshift track }
103
97
  previous = @queue.first
@@ -116,7 +110,6 @@ module Dhun
116
110
  while q == @queue
117
111
  @queue.size.downto(1) { |n| @queue.push @queue.delete_at(rand(n)) }
118
112
  end
119
- @logger.debug @queue
120
113
  return true
121
114
  end
122
115
 
@@ -127,7 +120,6 @@ module Dhun
127
120
  Thread.new do
128
121
  while @status == :playing and !@queue.empty?
129
122
  @current = @queue.shift
130
- @logger.log "Playing #{@current}"
131
123
  DhunExt.play_file @current
132
124
  @history.unshift @current
133
125
  end
data/lib/dhun/runner.rb CHANGED
@@ -11,6 +11,7 @@ module Dhun
11
11
  task.formatted_usage(self).gsub("dhun:runner:","dhun ")
12
12
  end
13
13
 
14
+
14
15
  desc "start_server","Starts the Dhun Server."
15
16
  method_option :socket, :type => :string, :default => "/tmp/dhun.sock", :aliases => '-s'
16
17
  method_option :log, :type => :string, :default => "/tmp/dhun.log", :aliases => '-l'
@@ -45,7 +46,7 @@ module Dhun
45
46
  search = search.nil? ? nil : search.split(',')
46
47
  query = Dhun::Query.new(search,options)
47
48
  if query.is_valid?
48
-
49
+
49
50
  #make the prompt pretty. i think.
50
51
  opts = options.collect {|field,value| "#{field}:#{value}" }.join(" ")
51
52
  term = search.nil? ? '[nil]' : search.join(",")
@@ -86,29 +87,16 @@ module Dhun
86
87
  method_option :file, :type => :string, :aliases => '-f'
87
88
  method_option :title, :type => :string, :aliases => '-t'
88
89
  def enqueue(search=nil)
89
-
90
+
90
91
  # invoke query command and return us all the files found.
91
92
  files = invoke :query, [search], options
92
93
  if files and !files.empty?
93
- #prompt for index of song to play and return it in pretty format. cough.
94
- if files.size == 1 # Dont prompt if result size is 1
95
- indexes = [0]
96
- else
97
- answer = ask "Enter index to queue (ENTER to select all): ",:yellow
98
-
99
- indexes ||=
100
- case
101
- when answer.include?(',') then answer.split(',')
102
- when answer.include?(' ') then answer.split(' ')
103
- when answer.size >= 1 then answer.to_a
104
- else
105
- 0..(files.size - 1)
106
- end
107
- end
108
- selected = indexes.map { |index| files[index.to_i] }
109
- say "selected:",:green
94
+ indexes = files.size == 1 ? [1] : enqueue_prompt(files.size)
95
+
96
+ selected = indexes.map { |index| files[index.to_i-1] }
97
+ say "selected:",:magenta
110
98
  say_list selected
111
-
99
+
112
100
  return_response(:enqueue,nil,selected)
113
101
  end
114
102
  end
@@ -117,7 +105,7 @@ module Dhun
117
105
  def next(count=1)
118
106
  return_response(:next,[],count.to_i)
119
107
  end
120
-
108
+
121
109
  desc "prev COUNT", "Skips to previous song by COUNT"
122
110
  def prev(count=1)
123
111
  return_response(:prev,[],count.to_i)
@@ -125,8 +113,8 @@ module Dhun
125
113
 
126
114
  desc "status", "Shows the status"
127
115
  def status
128
- return unless server_running?
129
116
  response = return_response(:status,[:current,:queue])
117
+ return false unless response
130
118
  say "Currently Playing:",:magenta
131
119
  say response[:current],:white
132
120
  say "Queue:",:cyan
@@ -136,86 +124,131 @@ module Dhun
136
124
  desc "history", "Shows the previously played songs"
137
125
  def history
138
126
  response = return_response(:history,[:history])
139
- if response[:history]
140
- say "History:",:cyan
141
- say_list response[:history]
142
- end
127
+ return false unless response
128
+ say "History:",:cyan
129
+ say_list response[:history]
143
130
  end
144
-
131
+
145
132
  desc "shuffle", "Shuffles the queue"
146
133
  def shuffle
147
134
  response = return_response(:shuffle,[:queue])
148
- if response[:queue]
149
- say "Queue:",:cyan
150
- say_list response[:queue]
151
- end
135
+ return false unless response
136
+ say "Queue:",:cyan
137
+ say_list response[:queue]
152
138
  end
153
139
 
154
140
  desc "pause", "Pauses playing"
155
141
  def pause
156
142
  return_response(:pause,[])
157
143
  end
158
-
144
+
159
145
  desc "resume", "Resumes playing"
160
146
  def resume
161
147
  return_response(:resume,[])
162
148
  end
163
-
149
+
164
150
  desc "stop", "Stops playing"
165
151
  def stop
166
152
  return_response(:stop,[])
167
153
  end
168
154
 
155
+ desc "save_playlist PATH", "saves the playlist"
156
+ def save_playlist(path=nil)
157
+ unless path
158
+ say "Please include a path for the playlist", :red
159
+ return false
160
+ end
161
+ create_file path, playlist_save
162
+ end
163
+
164
+ desc "load_playlist PATH", "loads the playlist"
165
+ def load_playlist(path=nil)
166
+ unless File.exists?(path) or path.nil?
167
+ say "invalid path! please include a valid path.", :red
168
+ return false
169
+ end
170
+ return_response(:enqueue,nil,playlist_load(path))
171
+ say "loaded playlist", :cyan
172
+ end
169
173
 
170
- private
174
+ no_tasks do
171
175
 
172
- # sends command to dhun client
173
- def send_command(command,arguments=[])
174
- cmd = { "command" => command.to_s, "arguments" => arguments }.to_json
175
- send_message(cmd,"/tmp/dhun.sock")
176
- end
176
+ # Writes the queue to the playlist.
177
+ # This will be overloaded by other playlist modules
178
+ def playlist_save
179
+ return_response(:status,[:queue])[:queue].collect { |song| song }.join("\n")
180
+ end
181
+
182
+ # Loads the playlist to the queue.
183
+ # This will be overloaded by other playlist modules.
184
+ def playlist_load(path)
185
+ File.read(path).split("\n")
186
+ end
187
+
188
+ # send out the command to server and see what it has to say.
189
+ def return_response(action,keys,argument=[])
190
+ response = get_response(action,argument)
191
+ if response
192
+ color = response.success? ? :green : :red
193
+ say response[:message], color
194
+ if keys
195
+ return keys.inject({}) {|base,key| base[key.to_sym] = response[key.to_sym] ; base}
196
+ end
197
+ end
198
+ end
177
199
 
178
- # send command to the server and retrieve response.
179
- def get_response(command,arguments=[])
180
- if server_running?
200
+ # send command to the server and retrieve response.
201
+ def get_response(command,arguments=[])
202
+ if server_running?
181
203
  resp = send_command(command,arguments)
182
204
  return Dhun::Result.from_json_str(resp)
205
+ end
183
206
  end
184
- end
185
-
186
- # prints out list with each index value
187
- # in pretty format! (contrasting colors)
188
- def say_list(list)
189
- list.each_with_index do |item,index|
190
- color = index.even? ? :white : :cyan
191
- say("#{index} : #{item}",color)
207
+
208
+ # sends command to dhun client
209
+ def send_command(command,arguments=[])
210
+ cmd = { "command" => command.to_s, "arguments" => arguments }.to_json
211
+ send_message(cmd,"/tmp/dhun.sock")
192
212
  end
193
- end
194
213
 
195
- # check to see if Dhun Server is running.
196
- # asks to start Dhun server if not
197
- # takes argument :silent to quiet its output.
198
- # need to make the socket choices more flexible
199
- def server_running?(socket = "/tmp/dhun.sock",verbose = :verbose)
200
- socket ||= "/tmp/dhun.sock"
201
- if is_server?(socket)
202
- return true
203
- else
204
- say("Please start Dhun server first with : dhun start_server", :red) unless verbose == :silent
205
- return false
214
+ # check to see if Dhun Server is running.
215
+ # asks to start Dhun server if not
216
+ # takes argument :silent to quiet its output.
217
+ # need to make the socket choices more flexible
218
+ def server_running?(socket = "/tmp/dhun.sock",verbose = :verbose)
219
+ socket ||= "/tmp/dhun.sock"
220
+ if is_server?(socket)
221
+ return true
222
+ else
223
+ say("Please start Dhun server first with : dhun start_server", :red) unless verbose == :silent
224
+ return false
225
+ end
206
226
  end
207
- end
208
-
209
- #send out the command to server and see what it has to say.
210
- def return_response(action,keys,argument=[])
211
- response = get_response(action,argument)
212
- if response
213
- color = response.success? ? :red : :cyan
214
- say response[:message], color
215
- if keys
216
- return keys.inject({}) {|base,key| base[key.to_sym] = response[key.to_sym] ; base}
227
+
228
+ #prompt for enqueue
229
+ def enqueue_prompt(size)
230
+ answer = ask "Enter index to queue (ENTER to select all): ",:yellow
231
+ case
232
+ when answer.include?(',')
233
+ return answer.split(',')
234
+ when answer.include?(' ')
235
+ return answer.split(' ')
236
+ when answer.size >= 1
237
+ return answer.to_a
238
+ else
239
+ return 0..(size - 1)
240
+ end
241
+ end
242
+
243
+ # prints out list with each index value
244
+ # in pretty format! (contrasting colors)
245
+ def say_list(list)
246
+ list.each_with_index do |item,index|
247
+ color = index.even? ? :white : :cyan
248
+ say("#{index+1} : #{item}",color)
217
249
  end
218
250
  end
251
+
219
252
  end
220
253
 
221
254
  end
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.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Deepak Jois
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-12 00:00:00 -08:00
12
+ date: 2010-01-24 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency