muzak 0.0.13 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6895336a3fa06db40e63f71d227e36b11a18397
4
- data.tar.gz: 32f2ad6998993b76b783d9e97d8d91db55db1be0
3
+ metadata.gz: efea3aab55cde7f64c4385e48873e81f89ba4b0f
4
+ data.tar.gz: ff90d394bdb2937280c31615f7ca84d9e1e7651f
5
5
  SHA512:
6
- metadata.gz: bea81c7b13e504c158e9fb6d01beb3431d56b48c578b3f0c659dd059adad4c6cd87d1e3e975c58bf8be6fe1e412dad6508846cb5a98b603fa96a9948a3f0a4ed
7
- data.tar.gz: 692b0d3ba74454f6c7669156f4cf472932c930bcb29e59399149371db188eaf01442062bd7a8be31af854bbc06f2636d2694505ab46edb1e9848c6e4ed7f78cb
6
+ metadata.gz: 5e4182c5276d798c51cd282ba6b6f8d5524eee2577c3f5f3574cd7f96bdfcb18b2d3b12f8362c1adf21cf0e074491ada9944c64f56d9c1d9d245b34415d43346
7
+ data.tar.gz: 2827f75b69ecf2da6321ec3944647b0e9c64d2812d40b48bd76697dc999eb493e12c55b5b8e55149c3ec67e34565f310024873713a7d957e6d4a1b689c555452
@@ -1,19 +1,21 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "muzak"
4
+ require "socket"
4
5
 
5
6
  def fatal(msg)
6
7
  puts "Fatal: #{msg}"
7
8
  exit 1
8
9
  end
9
10
 
10
- fifo_path = File.join(Muzak::CONFIG_DIR, "muzak.fifo")
11
-
12
- fatal "Is muzakd running?" unless File.exist?(fifo_path)
13
-
14
- File.open(fifo_path, "w") do |io|
15
- # we don't actually need to do this, but let's be verbose for the user
16
- fatal "Unknown command." unless Muzak::Cmd.commands.include?(ARGV.first)
17
-
18
- io.puts ARGV.join(" ")
11
+ begin
12
+ server_host = Muzak::Config.daemon_host
13
+ server_port = Muzak::Config.daemon_port
14
+ sock = TCPSocket.new server_host, server_port
15
+ rescue
16
+ fatal "Is muzakd running?"
19
17
  end
18
+
19
+ sock.puts ARGV.join(" ")
20
+ puts sock.gets
21
+ sock.close
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "muzak"
4
+ require "socket"
4
5
 
5
6
  def fatal(msg)
6
- puts "Fatal: #{msg}"
7
+ STDERR.puts "Fatal: #{msg}"
7
8
  exit 1
8
9
  end
9
10
 
@@ -13,12 +14,17 @@ def dmenu(options)
13
14
  `printf "#{opts}" | #{dmenu}`
14
15
  end
15
16
 
16
- fifo_path = File.join(Muzak::CONFIG_DIR, "muzak.fifo")
17
-
18
- fatal "Is muzakd running?" unless File.exist?(fifo_path)
17
+ begin
18
+ server_host = Muzak::Config.daemon_host
19
+ server_port = Muzak::Config.daemon_port
20
+ sock = TCPSocket.new server_host, server_port
21
+ rescue
22
+ fatal "Is muzakd running?"
23
+ end
19
24
 
20
25
  command = dmenu Muzak::Cmd.commands
21
26
 
22
- File.open(fifo_path, "w") do |io|
23
- io.puts command unless command.empty?
24
- end
27
+ sock.puts command unless command.empty?
28
+ puts sock.gets
29
+
30
+ sock.close
data/bin/muzakd CHANGED
@@ -2,24 +2,31 @@
2
2
 
3
3
  require "muzak"
4
4
  require "shellwords"
5
+ require "socket"
6
+ require "json"
7
+ require "thread"
5
8
 
6
9
  Process.daemon unless Muzak::Config.debug || Muzak::Config.verbose
7
10
  Thread.abort_on_exception = Muzak::Config.debug
8
11
 
9
12
  muzak = Muzak::Instance.new
10
13
 
11
- fifo_path = File.join(Muzak::CONFIG_DIR, "muzak.fifo")
12
- File.delete(fifo_path) if File.exist?(fifo_path) # just in case a previous session died
13
- File.mkfifo(fifo_path)
14
+ server_port = Muzak::Config.daemon_port || 2669
15
+ server = TCPServer.new server_port
14
16
 
15
- File.open(fifo_path, "r+") do |fifo|
16
- loop do
17
- cmd_argv = Shellwords.split(fifo.readline) rescue next
17
+ exiting = false
18
+
19
+ loop do
20
+ begin
21
+ client = server.accept
22
+ cmd_argv = Shellwords.split(client.readline)
18
23
  next if cmd_argv.empty? || cmd_argv.any?(&:empty?)
19
- cmd = cmd_argv.shift
20
- muzak.command cmd, *cmd_argv
21
- break if cmd == "quit"
24
+ client.puts(muzak.command(*cmd_argv).to_json)
25
+ break if cmd_argv.first == "quit"
26
+ rescue Exception => e
27
+ client.puts({ error: e.to_s }.to_json)
28
+ raise e
29
+ ensure
30
+ client.close
22
31
  end
23
32
  end
24
-
25
- File.delete(fifo_path) if File.exist?(fifo_path)
@@ -5,12 +5,10 @@ module Muzak
5
5
  # Query the {Muzak::Config} for a given key.
6
6
  # @command `config-get <key>`
7
7
  # @cmdexample `muzak> config-get player`
8
- def config_get(*args)
9
- fail_arity(args, 1)
10
- key = args.shift
11
- return if key.nil?
8
+ def config_get(key)
9
+ value = Config.send Utils.resolve_method(key)
12
10
 
13
- info "#{key}: #{Config.send Utils.resolve_method(key)}"
11
+ build_response data: { key => value }
14
12
  end
15
13
  end
16
14
  end
@@ -4,29 +4,32 @@ module Muzak
4
4
  # @command `index-build`
5
5
  # @cmdexample `muzak> index-build`
6
6
  def index_build(*args)
7
- warn_arity(args, 0)
8
-
9
7
  verbose "building a new index, this may take a while"
10
8
 
11
9
  index.build!
10
+
11
+ build_response data: {
12
+ artists: index.artists.size,
13
+ albums: index.albums.size
14
+ }
12
15
  end
13
16
 
14
17
  # List all artists in the index.
15
18
  # @command `list-artists`
16
19
  # @cmdexample `muzak> list-artists`
17
- def list_artists(*args)
18
- warn_arity(args, 0)
19
-
20
- puts index.artists.join("\n")
20
+ def list_artists
21
+ build_response data: {
22
+ artists: index.artists
23
+ }
21
24
  end
22
25
 
23
26
  # List all albums in the index.
24
27
  # @command `list-albums`
25
28
  # @cmdexample `muzak> list-albums`
26
- def list_albums(*args)
27
- warn_arity(args, 0)
28
-
29
- puts index.album_names.join("\n")
29
+ def list_albums
30
+ build_response data: {
31
+ albums: index.album_names
32
+ }
30
33
  end
31
34
 
32
35
  # List all albums by the given artist in the index.
@@ -34,9 +37,12 @@ module Muzak
34
37
  # @cmdexample `muzak> albums-by-artist Your Favorite Artist`
35
38
  def albums_by_artist(*args)
36
39
  artist = args.join(" ")
37
- return if artist.nil?
38
40
 
39
- puts index.albums_by(artist).map(&:title)
41
+ albums = index.albums_by(artist).map(&:title)
42
+
43
+ build_response data: {
44
+ albums: albums
45
+ }
40
46
  end
41
47
 
42
48
  # List all songs by the given artist in the index.
@@ -44,9 +50,12 @@ module Muzak
44
50
  # @cmdexample `muzak> songs-by-artist Your Next Favorite Artist`
45
51
  def songs_by_artist(*args)
46
52
  artist = args.join(" ")
47
- return if artist.nil?
48
53
 
49
- puts index.songs_by(artist).map(&:title)
54
+ songs = index.songs_by(artist).map(&:title)
55
+
56
+ build_response data: {
57
+ songs: songs
58
+ }
50
59
  end
51
60
  end
52
61
  end
@@ -5,7 +5,10 @@ module Muzak
5
5
  # @cmdexample `muzak> help`
6
6
  def help(*args)
7
7
  commands = Muzak::Cmd.commands.join(", ")
8
- info "available commands: #{commands}"
8
+
9
+ build_response data: {
10
+ commands: commands
11
+ }
9
12
  end
10
13
 
11
14
  # List all available plugins.
@@ -14,8 +17,9 @@ module Muzak
14
17
  # @note This list will differ from loaded plugins, if not all available
15
18
  # plugins are configured.
16
19
  def list_plugins
17
- plugins = Plugin.plugin_names.join(", ")
18
- puts "available plugins: #{plugins}"
20
+ build_response data: {
21
+ plugins: Plugin.plugin_names
22
+ }
19
23
  end
20
24
 
21
25
  # Terminates the muzak instance (**not** just the client).
@@ -24,6 +28,8 @@ module Muzak
24
28
  def quit
25
29
  verbose "muzak is quitting..."
26
30
  player.deactivate!
31
+
32
+ build_response
27
33
  end
28
34
  end
29
35
  end
@@ -11,6 +11,8 @@ module Muzak
11
11
  end
12
12
 
13
13
  player.activate!
14
+
15
+ build_response
14
16
  end
15
17
 
16
18
  # Deactivate the configured player.
@@ -22,6 +24,8 @@ module Muzak
22
24
 
23
25
  # do cleanup even if the player isn't running, just in case
24
26
  player.deactivate!
27
+
28
+ build_response
25
29
  end
26
30
 
27
31
  # Tell the player to begin playback.
@@ -29,6 +33,8 @@ module Muzak
29
33
  # @cmdexample `muzak> play`
30
34
  def play
31
35
  player.play
36
+
37
+ build_response
32
38
  end
33
39
 
34
40
  # Tell the player to pause.
@@ -36,6 +42,8 @@ module Muzak
36
42
  # @cmdexample `muzak> pause`
37
43
  def pause
38
44
  player.pause
45
+
46
+ build_response
39
47
  end
40
48
 
41
49
  # Tell the player to toggle its playback state.
@@ -47,6 +55,8 @@ module Muzak
47
55
  else
48
56
  player.play
49
57
  end
58
+
59
+ build_response
50
60
  end
51
61
 
52
62
  # Tell the player to load the next song.
@@ -54,6 +64,8 @@ module Muzak
54
64
  # @cmdexample `muzak> next`
55
65
  def next
56
66
  player.next_song
67
+
68
+ build_response
57
69
  end
58
70
 
59
71
  # Tell the player to load the previous song.
@@ -61,6 +73,8 @@ module Muzak
61
73
  # @cmdexample `muzak> previous`
62
74
  def previous
63
75
  player.previous_song
76
+
77
+ build_response
64
78
  end
65
79
 
66
80
  # Tell the player to enqueue all songs by the given artist.
@@ -68,13 +82,15 @@ module Muzak
68
82
  # @cmdexample `muzak> enqueue-artist Your Favorite Artist`
69
83
  def enqueue_artist(*args)
70
84
  artist = args.join(" ")
71
- return if artist.nil?
72
-
73
85
  albums = index.albums_by(artist)
74
- return if albums.empty?
75
86
 
76
- albums.each do |album|
77
- player.enqueue_album album
87
+ unless albums.empty?
88
+ albums.each do |album|
89
+ player.enqueue_album album
90
+ end
91
+ build_response
92
+ else
93
+ build_response error: "no albums by: '#{artist}'"
78
94
  end
79
95
  end
80
96
 
@@ -83,30 +99,39 @@ module Muzak
83
99
  # @cmdexample `muzak> enqueue-album Your Favorite Album`
84
100
  def enqueue_album(*args)
85
101
  album_name = args.join(" ")
86
- return if album_name.nil?
87
102
 
88
103
  album = index.albums[album_name]
89
- return if album.nil?
90
104
 
91
- player.enqueue_album album
105
+ if album
106
+ player.enqueue_album album
107
+ build_response
108
+ else
109
+ build_response error: "no such album: '#{album_name}'"
110
+ end
92
111
  end
93
112
 
94
113
  # Tell the player to load the given number of random songs.
95
114
  # @command `jukebox [count]`
96
115
  # @cmdexample `muzak> jukebox 150`
97
- def jukebox(*args)
98
- count = args.shift || Config.jukebox_size
99
-
116
+ def jukebox(count = Config.jukebox_size)
100
117
  songs = index.jukebox(count.to_i)
101
118
 
102
- songs.each { |s| player.enqueue_song s }
119
+ Thread.new do
120
+ songs.each { |s| player.enqueue_song s }
121
+ end
122
+
123
+ build_response data: {
124
+ jukebox: songs.map(&:full_title)
125
+ }
103
126
  end
104
127
 
105
128
  # Tell the player to list its internal queue.
106
129
  # @command `list-queue`
107
130
  # @cmdexample `muzak> list-queue`
108
131
  def list_queue
109
- puts player.list_queue.map(&:title)
132
+ build_response data: {
133
+ queue: player.list_queue.map(&:title)
134
+ }
110
135
  end
111
136
 
112
137
  # Tell the player to shuffle its internal queue.
@@ -114,6 +139,8 @@ module Muzak
114
139
  # @cmdexample `muzak> shuffle-queue`
115
140
  def shuffle_queue
116
141
  player.shuffle_queue
142
+
143
+ build_response
117
144
  end
118
145
 
119
146
  # Tell the player to clear its internal queue.
@@ -122,15 +149,21 @@ module Muzak
122
149
  # @note This does not (usually) stop the current song.
123
150
  def clear_queue
124
151
  player.clear_queue
152
+
153
+ build_response
125
154
  end
126
155
 
127
156
  # Retrieve the currently playing song from the player and print it.
128
157
  # @command `now-playing`
129
158
  # @cmdexample `muzak> now-playing`
130
159
  def now_playing
131
- return unless player.playing?
132
-
133
- info player.now_playing.full_title
160
+ if player.playing?
161
+ build_response data: {
162
+ playing: player.now_playing.full_title
163
+ }
164
+ else
165
+ build_response error: "no currently playing song"
166
+ end
134
167
  end
135
168
  end
136
169
  end
@@ -3,100 +3,97 @@ module Muzak
3
3
  # List all currently available playlists.
4
4
  # @command `list-playlists`
5
5
  # @cmdexample `muzak> list-playlists`
6
- def list_playlists(*args)
7
- Playlist.playlist_names.each do |playlist|
8
- info playlist
9
- end
6
+ def list_playlists
7
+ build_response data: {
8
+ playlists: Playlist.playlist_names
9
+ }
10
10
  end
11
11
 
12
12
  # Delete the given playlist.
13
13
  # @command `playlist-delete <playlist>`
14
14
  # @cmdexample `muzak> playlist-delete favorites`
15
- def playlist_delete(*args)
16
- fail_arity(args, 1)
17
- pname = args.shift
18
-
15
+ def playlist_delete(pname)
19
16
  debug "deleting playist '#{pname}'"
20
17
 
21
18
  Playlist.delete!(pname)
22
19
  playlists[pname] = nil
20
+
21
+ build_response
23
22
  end
24
23
 
25
24
  # Add the given playlist to the player's queue.
26
25
  # @command `enqueue-playlist <playlist>`
27
26
  # @cmdexample `muzak> enqueue-playlist favorites`
28
- def enqueue_playlist(*args)
29
- fail_arity(args, 1)
30
- pname = args.shift
31
-
27
+ def enqueue_playlist(pname)
32
28
  player.enqueue_playlist(playlists[pname])
33
29
  event :playlist_enqueued, playlists[pname]
30
+
31
+ build_response
34
32
  end
35
33
 
36
34
  # Add the given album to the given playlist.
37
35
  # @command `playlist-add-album <playlist> <album name>`
38
36
  # @cmdexample `muzak> playlist-add-album favorites Your Favorite Album`
39
- def playlist_add_album(*args)
40
- pname = args.shift
41
- return if pname.nil?
42
-
37
+ def playlist_add_album(pname, *args)
43
38
  album_name = args.join(" ")
44
- return if album_name.nil?
45
-
46
39
  album = index.albums[album_name]
47
- return if album.nil?
48
40
 
49
- playlists[pname].add(album.songs)
41
+ if album
42
+ playlists[pname].add(album.songs)
43
+ build_response
44
+ else
45
+ build_response error: "no such album: '#{album_name}'"
46
+ end
50
47
  end
51
48
 
52
49
  # Add the given artist to the given playlist.
53
50
  # @command `playlist-add-artist <playlist> <artist name>`
54
51
  # @cmdexample `muzak> playlist-add-artist dad-rock The Rolling Stones`
55
- def playlist_add_artist(*args)
56
- pname = args.shift
57
- return if pname.nil?
58
-
52
+ def playlist_add_artist(pname, *args)
59
53
  artist = args.join(" ")
60
- return if artist.nil?
54
+ songs = index.songs_by(artist)
61
55
 
62
- playlists[pname].add(index.songs_by(artist))
56
+ unless songs.empty?
57
+ playlists[pname].add(songs)
58
+ build_response
59
+ else
60
+ build_response error: "no songs by artist: '#{artist}'"
61
+ end
63
62
  end
64
63
 
65
64
  # Add the currently playing song to the given playlist.
66
65
  # @see Muzak::Player::StubPlayer#now_playing
67
66
  # @command `playlist-add-current <playlist>`
68
67
  # @cmdexample `muzak> playlist-add-current favorites`
69
- def playlist_add_current(*args)
70
- return unless player.running?
71
-
72
- pname = args.shift
73
- return if pname.nil?
74
-
75
- playlists[pname].add player.now_playing
68
+ def playlist_add_current(pname)
69
+ if player.running?
70
+ playlists[pname].add player.now_playing
71
+ build_response
72
+ else
73
+ build_response error: "the player is not running"
74
+ end
76
75
  end
77
76
 
78
77
  # Deletes the currently playing song from the given playlist.
79
78
  # @see Muzak::Player::StubPlayer#now_playing
80
79
  # @command `playlist-del-current <playlist>`
81
80
  # @cmdexample `muzak> playlist-del-current favorites`
82
- def playlist_del_current(*args)
83
- return unless player.running?
84
-
85
- pname = args.shift
86
- return if pname.nil?
87
-
88
- playlists[pname].delete player.now_playing
81
+ def playlist_del_current(pname)
82
+ if player.running?
83
+ playlists[pname].delete player.now_playing
84
+ build_response
85
+ else
86
+ build_response error: "the player is not running"
87
+ end
89
88
  end
90
89
 
91
90
  # Shuffle the given playlist.
92
91
  # @see Muzak::Playlist#shuffle!
93
92
  # @command `playlist-shuffle <playlist>`
94
93
  # @cmdexample `muzak> playlist-shuffle dad-rock`
95
- def playlist_shuffle(*args)
96
- pname = args.shift
97
- return if pname.nil?
98
-
94
+ def playlist_shuffle(pname)
99
95
  playlists[pname].shuffle!
96
+ build_response
100
97
  end
101
98
  end
102
99
  end
@@ -1,6 +1,6 @@
1
1
  module Muzak
2
2
  # Muzak's current version
3
- VERSION = "0.0.13".freeze
3
+ VERSION = "0.1.0".freeze
4
4
 
5
5
  # The root directory for all user configuration, data, etc
6
6
  CONFIG_DIR = File.expand_path("~/.config/muzak").freeze
@@ -18,10 +18,11 @@ module Muzak
18
18
 
19
19
  # @param tree [String] the root to begin indexing from
20
20
  # @param deep [Boolean] whether to build a "deep" index
21
+ # @param sync [Boolean] whether or not to save to {Muzak::INDEX_FILE}
21
22
  # @note if the index ({Muzak::INDEX_FILE}) already exists and is not
22
23
  # outdated, no building is performed.
23
24
  # @see #build!
24
- def initialize(tree, deep: false)
25
+ def initialize(tree, deep: false, sync: true)
25
26
  @tree = tree
26
27
  @deep = deep
27
28
 
@@ -31,17 +32,23 @@ module Muzak
31
32
  return unless outdated?
32
33
  end
33
34
 
34
- build!
35
+ build!(sync)
36
+ end
37
+
38
+ # Synchronize the in-memory index hash with {Muzak::INDEX_FILE}.
39
+ def sync!
40
+ File.open(INDEX_FILE, "w") { |io| io.write Marshal::dump @hash }
35
41
  end
36
42
 
37
43
  # (Re)builds and saves the index ({Muzak::INDEX_FILE}) to disk.
44
+ # @param sync [Boolean] whether or not to save to {Muzak::INDEX_FILE}
38
45
  # @note This method can be expensive.
39
- def build!
46
+ def build!(sync: true)
40
47
  @hash = build_index_hash!
41
48
 
42
49
  debug "indexed #{albums.length} albums by #{artists.length} artists"
43
50
 
44
- File.open(INDEX_FILE, "w") { |io| io.write Marshal::dump @hash }
51
+ sync! if sync
45
52
  end
46
53
 
47
54
  # @return [Boolean] whether or not the current index is deep
@@ -11,12 +11,17 @@ module Muzak
11
11
  # instance.command "enqueue-playlist", "favorites"
12
12
  # instance.command "pause"
13
13
  def command(cmd, *args)
14
- send Utils.resolve_command(cmd), *args
15
- end
16
-
17
- def method_missing(meth, *args)
18
- warn "unknown command: #{Utils.resolve_method(meth)}"
19
- help
14
+ if Cmd.commands.include?(cmd)
15
+ meth = method(Utils.resolve_command(cmd))
16
+ if meth.arity == args.size || meth.arity <= -1
17
+ meth.call *args
18
+ else
19
+ build_response error: "got #{args.size} args, needed #{meth.arity}"
20
+ end
21
+ else
22
+ warn "unknown command: '#{cmd}'"
23
+ build_response error: "unknown command '#{cmd}'"
24
+ end
20
25
  end
21
26
 
22
27
  # @return [Index] the instance's music index
@@ -115,22 +115,16 @@ module Muzak
115
115
  output pretty(:blue, "verbose"), args
116
116
  end
117
117
 
118
- # Outputs a boxed warning message unless the arity of the given arguments
119
- # equals the expected arity.
120
- # @param args [Array<String>] the arguments
121
- # @param arity [Integer] the expected arity
122
- # @return [void]
123
- def warn_arity(args, arity)
124
- warn "expected #{arity} arguments, got #{args.length}" unless args.length == arity
125
- end
126
-
127
- # Outputs a boxed failure message unless the arity of the given arguments
128
- # equals the expected arity.
129
- # @param args [Array<String>] the arguments
130
- # @param arity [Integer] the expected arity
131
- # @return [void]
132
- def fail_arity(args, arity)
133
- error "needed #{arity} arguments, got #{args.length}" unless args.length == arity
118
+ # Returns a response hash containing the given data and error.
119
+ # @param error [String] the error string, if needed
120
+ # @param data [String, Hash] the data, if needed
121
+ def build_response(error: nil, data: nil)
122
+ { response: {
123
+ error: error,
124
+ data: data,
125
+ method: caller_locations.first.label
126
+ }
127
+ }
134
128
  end
135
129
  end
136
130
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: muzak
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Woodruff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-27 00:00:00.000000000 Z
11
+ date: 2016-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: taglib-ruby
@@ -27,7 +27,6 @@ dependencies:
27
27
  description: A library for controlling playlists and media players.
28
28
  email: william@tuffbizz.com
29
29
  executables:
30
- - muzak
31
30
  - muzakd
32
31
  - muzak-cmd
33
32
  - muzak-dmenu
@@ -37,7 +36,6 @@ files:
37
36
  - ".yardopts"
38
37
  - LICENSE
39
38
  - README.md
40
- - bin/muzak
41
39
  - bin/muzak-cmd
42
40
  - bin/muzak-dmenu
43
41
  - bin/muzakd
data/bin/muzak DELETED
@@ -1,46 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "muzak"
4
- require "readline"
5
- require "shellwords"
6
-
7
- Thread.abort_on_exception = Muzak::Config.debug
8
-
9
- muzak = Muzak::Instance.new
10
-
11
- COMMANDS = Muzak::Cmd.commands
12
-
13
- CONFIG_REGEX = /^config-(get)|(set)|(del)/
14
- ARTIST_REGEX = Regexp.union COMMANDS.select{ |c| c =~ /artist/ }.map { |c| /^#{c}/ }
15
- ALBUM_REGEX = Regexp.union COMMANDS.select{ |c| c =~ /album/ }.map { |c| /^#{c}/ }
16
- PLAYLIST_REGEX = /^playlist-delete/
17
-
18
- comp = proc do |s|
19
- case Readline.line_buffer
20
- when CONFIG_REGEX
21
- muzak.config.keys.grep(Regexp.new(Regexp.escape(s)))
22
- when ARTIST_REGEX
23
- ss = Readline.line_buffer.split(" ")
24
- muzak.index.artists.grep(Regexp.new(Regexp.escape(ss[1..-1].join(" "))))
25
- when ALBUM_REGEX
26
- muzak.index.album_names.grep(Regexp.new(Regexp.escape(s)))
27
- when PLAYLIST_REGEX
28
- Muzak::Playlist.playlist_names.grep(Regexp.new(Regexp.escape(s)))
29
- else
30
- COMMANDS.grep(Regexp.new(Regexp.escape(s)))
31
- end
32
- end
33
-
34
- Readline.completion_append_character = " "
35
- Readline.completion_proc = comp
36
-
37
- # ignore interrupts
38
- trap("INT", "SIG_IGN")
39
-
40
- while line = Readline.readline("muzak> ", true)
41
- cmd_argv = Shellwords.split(line) rescue next
42
- next if cmd_argv.empty? || cmd_argv.any?(&:empty?)
43
- cmd = cmd_argv.shift
44
- muzak.command cmd, *cmd_argv
45
- break if cmd == "quit"
46
- end