ruby-mpd 0.1.5 → 0.1.7

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.
@@ -0,0 +1,33 @@
1
+ class MPD
2
+ # Standard MPD error.
3
+ class Error < StandardError; end
4
+ # When something goes wrong with the connection
5
+ class ConnectionError < Error; end
6
+
7
+ # When the server returns an error. Superclass. Used for ACK_ERROR_UNKNOWN too.
8
+ class ServerError < Error; end
9
+
10
+ class NotListError < ServerError; end # ACK_ERROR_NOT_LIST <-- unused?
11
+ # ACK_ERROR_ARG - There was an error with one of the arguments.
12
+ class ServerArgumentError < ServerError; end
13
+ # MPD server password incorrect - ACK_ERROR_PASSWORD
14
+ class IncorrectPassword < ServerError; end
15
+ # ACK_ERROR_PERMISSION - not permitted to use the command.
16
+ # (Mostly, the solution is to connect via UNIX domain socket)
17
+ class PermissionError < ServerError; end
18
+
19
+ # ACK_ERROR_NO_EXIST - The requested resource was not found
20
+ class NotFound < ServerError; end
21
+ # ACK_ERROR_PLAYLIST_MAX - Playlist is at the max size
22
+ class PlaylistMaxError < ServerError; end
23
+ # ACK_ERROR_SYSTEM - One of the systems has errored.
24
+ class SystemError < ServerError; end
25
+ # ACK_ERROR_PLAYLIST_LOAD - unused?
26
+ class PlaylistLoadError < ServerError; end
27
+ # ACK_ERROR_UPDATE_ALREADY - Already updating the DB.
28
+ class AlreadyUpdating < ServerError; end
29
+ # ACK_ERROR_PLAYER_SYNC - not playing.
30
+ class NotPlaying < ServerError; end
31
+ # ACK_ERROR_EXIST - the resource already exists.
32
+ class AlreadyExists < ServerError; end
33
+ end
@@ -11,11 +11,13 @@ class MPD
11
11
  if word.is_a?(TrueClass) || word.is_a?(FalseClass)
12
12
  word ? '1' : '0' # convert bool to 1 or 0
13
13
  elsif word.is_a?(Range)
14
- if word.end == -1 #negative means to end of range
14
+ if word.end == -1 # negative means to end of range
15
15
  "#{word.begin}:"
16
16
  else
17
17
  "#{word.begin}:#{word.end + (word.exclude_end? ? 0 : 1)}"
18
18
  end
19
+ elsif word.is_a?(MPD::Song)
20
+ word.file
19
21
  else
20
22
  # escape any strings with space (wrap in double quotes)
21
23
  word = word.to_s
@@ -36,9 +38,14 @@ class MPD
36
38
  FLOAT_KEYS = [:mixrampdb, :elapsed]
37
39
  BOOL_KEYS = [:repeat, :random, :single, :consume, :outputenabled]
38
40
 
39
- # Parses key-value pairs into correct class
40
- # @todo special parsing of playlist, it's a int in :status and a string in :listplaylists
41
41
 
42
+ # Commands, where it makes sense to always explicitly return an array.
43
+ RETURN_ARRAY = [:channels, :outputs, :readmessages, :list, :listall,
44
+ :listallinfo, :find, :search, :listplaylists, :listplaylist, :playlistfind,
45
+ :playlistsearch, :plchanges, :tagtypes, :commands, :notcommands, :urlhandlers,
46
+ :decoders, :listplaylistinfo]
47
+
48
+ # Parses key-value pairs into correct class.
42
49
  def parse_key key, value
43
50
  if INT_KEYS.include? key
44
51
  value.to_i
@@ -113,11 +120,21 @@ class MPD
113
120
  end
114
121
  end
115
122
 
123
+ # Parses the response, determining per-command on what parsing logic
124
+ # to use (build_response vs build_grouped_response).
125
+ #
126
+ # @return [Array<Hash>, Array<String>, String, Integer] Parsed response.
127
+ def parse_response(command, string)
128
+ # return explicit array if needed
129
+ return RETURN_ARRAY.include?(command) ? [] : true if string.is_a?(TrueClass)
130
+ command == :listall ? build_grouped_response(string) : build_response(command, string)
131
+ end
132
+
116
133
  # Parses the response into appropriate objects (either a single object,
117
134
  # or an array of objects or an array of hashes).
118
135
  #
119
136
  # @return [Array<Hash>, Array<String>, String, Integer] Parsed response.
120
- def build_response(string)
137
+ def build_response(command, string)
121
138
  return [] if string.nil? || !string.is_a?(String)
122
139
 
123
140
  chunks = make_chunks(string)
@@ -128,15 +145,15 @@ class MPD
128
145
  result << (is_hash ? build_hash(chunk) : parse_line(chunk))
129
146
  end
130
147
 
131
- # if list has only one element, return it, else return array
132
- result = list.length == 1 ? list.first : list
148
+ # if list has only one element and not set to explicit array, return it, else return array
149
+ result = (list.length == 1 && !RETURN_ARRAY.include?(command)) ? list.first : list
133
150
  return result
134
151
  end
135
152
 
136
153
  # Parse the response into groups that have the same key (used for file lists,
137
154
  # groups together files, directories and playlists).
138
155
  # @return [Hash<Array>] A hash of key groups.
139
- def build_groups(string)
156
+ def build_grouped_response(string)
140
157
  return [] if string.nil? || !string.is_a?(String)
141
158
 
142
159
  string.split("\n").each_with_object({}) do |line, hash|
@@ -9,15 +9,12 @@ class MPD
9
9
  # plugins instead of the hard-coded simple m3u parser. They can access
10
10
  # playlists in the music directory (relative path including the suffix) or
11
11
  # remote playlists (absolute URI with a supported scheme).
12
- #
13
- # Changes: rm -> destroy. listplaylistinfo -> songs. Playlist prefixes
14
- # dropped also of course. Listplaylist not used, kinda inferior to listplaylistinfo
15
12
  class Playlist
16
13
 
17
14
  attr_accessor :name
18
15
 
19
16
  def initialize(mpd, options)
20
- @name = options[:playlist]
17
+ @name = options.is_a?(Hash) ? options[:playlist] : options.to_s
21
18
  @mpd = mpd
22
19
  #@last_modified = options[:'last-modified']
23
20
  end
@@ -25,7 +22,9 @@ class MPD
25
22
  # Lists the songs in the playlist. Playlist plugins are supported.
26
23
  # @return [Array<MPD::Song>] songs in the playlist.
27
24
  def songs
28
- mpd.build_songs_list @mpd.send_command(:listplaylistinfo, @name)
25
+ @mpd.send_command(:listplaylistinfo, @name).map {|hash| Song.new(hash) }
26
+ rescue NotFound
27
+ return [] # we rescue in the case the playlist doesn't exist.
29
28
  end
30
29
 
31
30
  # Loads the playlist into the current queue. Playlist plugins are supported.
@@ -51,7 +50,7 @@ class MPD
51
50
  # and +:any+ to match against all available tags.
52
51
  # @macro returnraise
53
52
  def searchadd(type, what)
54
- send_command :searchaddpl, @name, type, what
53
+ @mpd.send_command :searchaddpl, @name, type, what
55
54
  end
56
55
 
57
56
  # Clears the playlist.
@@ -1,4 +1,5 @@
1
1
  class MPD
2
+ # This namespace contains "plugins", which get included into the main class.
2
3
  module Plugins
3
4
  # = Client to client commands
4
5
  #
@@ -30,9 +31,7 @@ class MPD
30
31
  end
31
32
 
32
33
  # Obtain a list of all channels.
33
- # @return [Array<String>]
34
- # @return [String] if only one channel exists.
35
- # @return [true] if no channels exist.
34
+ # @return [Array<String>] a list of channels
36
35
  def channels
37
36
  send_command :channels
38
37
  end
@@ -40,8 +39,6 @@ class MPD
40
39
  # Reads messages for this client. The response is an array of
41
40
  # hashes with +:channel+ and +:message+ keys or true if no messages.
42
41
  # @return [Array<Hash>] Messages recieved.
43
- # @return [Hash] if only one message recieved
44
- # @return [true] if no messages.
45
42
  def readmessages
46
43
  send_command :readmessages
47
44
  end
@@ -1,8 +1,6 @@
1
1
  class MPD
2
2
  module Plugins
3
- # Commands for controlling playback. Changes have been made to {#seek},
4
- # command maps to +seekcur+ from MPD and the original seek command is
5
- # {#seekpos} here.
3
+ # Commands for controlling playback.
6
4
  module Controls
7
5
  # Plays the next song in the playlist.
8
6
  # @macro returnraise
@@ -11,7 +9,6 @@ class MPD
11
9
  end
12
10
 
13
11
  # Resume/pause playback.
14
- # @note The use of pause without an argument is deprecated in MPD.
15
12
  # @macro returnraise
16
13
  def pause=(toggle)
17
14
  send_command :pause, toggle
@@ -46,7 +43,7 @@ class MPD
46
43
  # @since MPD 0.17
47
44
  # @param [Integer, String] time Position within the current song.
48
45
  # @param [Hash] options Either +:id+ or +:pos+ can be specified.
49
- # Returns true if successful,
46
+ # @macro returnraise
50
47
  def seek(time, options = {})
51
48
  if options[:id]
52
49
  send_command :seekid, options[:id], time
@@ -1,9 +1,6 @@
1
1
  class MPD
2
2
  module Plugins
3
3
  # Commands for interacting with the music database.
4
- #
5
- # Changes: listallinfo -> songs, searchaddpl in MPD::Playlist#searchadd.
6
- # search merges search, find, searchadd and findadd
7
4
  module Database
8
5
 
9
6
  # Counts the number of songs and their total playtime
@@ -22,7 +19,13 @@ class MPD
22
19
  send_command :list, type, arg
23
20
  end
24
21
 
25
- # listall
22
+ # List all of the files in the database, starting at path.
23
+ # If path isn't specified, the root of the database is used.
24
+ #
25
+ # @return [Hash<String>] hash with array keys :file, :directory and :playlist.
26
+ def files(path = nil)
27
+ send_command :listall, path
28
+ end
26
29
 
27
30
  # List all of the songs in the database starting at path.
28
31
  # If path isn't specified, the root of the database is used
@@ -32,7 +35,8 @@ class MPD
32
35
  build_songs_list send_command(:listallinfo, path)
33
36
  end
34
37
 
35
- # lsinfo
38
+ # lsinfo - Clients that are connected via UNIX domain socket may use this
39
+ # command to read the tags of an arbitrary local file (URI beginning with "file:///").
36
40
 
37
41
  # Searches for any song that contains +what+ in the +type+ field.
38
42
  # Searches are case insensitive by default, however you can enable
@@ -68,11 +72,45 @@ class MPD
68
72
 
69
73
  # Same as {#update}, but also rescans unmodified files.
70
74
  #
71
- # @return [Integer] Update job ID
75
+ # @return (see #update)
72
76
  def rescan(path = nil)
73
77
  send_command :rescan, path
74
78
  end
75
79
 
80
+ # unofficial
81
+
82
+ # List all of the directories in the database, starting at path.
83
+ # If path isn't specified, the root of the database is used.
84
+ #
85
+ # @return [Array<String>] Array of directory names
86
+ def directories(path = nil)
87
+ response = send_command(:listall, path)
88
+ return response[:directory]
89
+ end
90
+
91
+ # Lists all of the albums in the database.
92
+ # The optional argument is for specifying an artist to list
93
+ # the albums for
94
+ #
95
+ # @return [Array<String>] An array of album names.
96
+ def albums(artist = nil)
97
+ list :album, artist
98
+ end
99
+
100
+ # Lists all of the artists in the database.
101
+ #
102
+ # @return [Array<String>] An array of artist names.
103
+ def artists
104
+ list :artist
105
+ end
106
+
107
+ # List all of the songs by an artist.
108
+ #
109
+ # @return [Array<MPD::Song>]
110
+ def songs_by_artist(artist)
111
+ search :artist, artist
112
+ end
113
+
76
114
  end
77
115
  end
78
116
  end
@@ -14,8 +14,11 @@ class MPD
14
14
  # Get the currently playing song
15
15
  #
16
16
  # @return [MPD::Song]
17
+ # @return [nil] if there is no song playing
17
18
  def current_song
18
- Song.new send_command :currentsong
19
+ hash = send_command :currentsong
20
+ # if there is no current song (we get true, then return nil)
21
+ hash.is_a?(TrueClass) ? nil : Song.new(hash)
19
22
  end
20
23
 
21
24
  # Waits until there is a noteworthy change in one or more of MPD's subsystems.
@@ -41,9 +44,9 @@ class MPD
41
44
  #
42
45
  # @since MPD 0.14
43
46
  # @param [Symbol] masks A list of subsystems we want to be notified on.
44
- def idle(*masks)
45
- send_command(:idle, *masks)
46
- end
47
+ #def idle(*masks)
48
+ # send_command(:idle, *masks)
49
+ #end
47
50
 
48
51
  # MPD status: volume, time, modes...
49
52
  # * *volume*: 0-100
@@ -1,8 +1,6 @@
1
1
  class MPD
2
2
  module Plugins
3
3
  # Commands related to setting various aspects and modes of playback.
4
- #
5
- # Changes: setvol -> volume.
6
4
  module PlaybackOptions
7
5
 
8
6
  # Enable/disable consume mode.
@@ -26,6 +24,7 @@ class MPD
26
24
  # volume so use negative values, I prefer -17dB. In the absence of mixramp
27
25
  # tags crossfading will be used. See http://sourceforge.net/projects/mixramp
28
26
  # @param [Float] decibels Maximum volume level in decibels.
27
+ # @macro returnraise
29
28
  def mixrampdb=(decibels)
30
29
  send_command :mixrampdb, decibels
31
30
  end
@@ -33,6 +32,7 @@ class MPD
33
32
  # Additional time subtracted from the overlap calculated by mixrampdb.
34
33
  # A value of "nan" or Float::NAN disables MixRamp overlapping and falls
35
34
  # back to crossfading.
35
+ # @macro returnraise
36
36
  def mixrampdelay=(seconds)
37
37
  send_command :mixrampdelay, seconds
38
38
  end
@@ -51,7 +51,7 @@ class MPD
51
51
 
52
52
  # Sets the volume level. (Maps to MPD's +setvol+)
53
53
  # @param [Integer] vol Volume level between 0 and 100.
54
- # @macro returnraise
54
+ # @return [Integer] The new volume level.
55
55
  def volume=(vol)
56
56
  send_command :setvol, vol
57
57
  end
@@ -1,13 +1,11 @@
1
1
  class MPD
2
2
  module Plugins
3
3
  # These commands manipulate stored playlists.
4
- #
5
- # Changes: listplaylists -> playlists.
6
4
  module Playlists
7
5
 
8
6
  # List all of the playlists in the database
9
7
  #
10
- # @return [Array<Hash>] Array of playlists
8
+ # @return [Array<MPD::Playlist>] Array of playlists
11
9
  def playlists
12
10
  send_command(:listplaylists).map {|opt| MPD::Playlist.new(self, opt)}
13
11
  end
@@ -2,17 +2,14 @@ class MPD
2
2
  module Plugins
3
3
  # These commands manipulate the current playlist, what's playing now.
4
4
  # For a distinction between this and other playlists, this is called
5
- # queue.
6
- # Changes: playlistinfo -> queue, plchanges -> queue_changes,
7
- # playlistid -> song_with_id, playlistfind -> queue_find,
8
- # playlistsearch -> queue_search, prio -> song_priority.
5
+ # queue.
9
6
  module Queue
10
7
 
11
8
  # List the current playlist/queue.
12
9
  # An Integer or Range can be used to limit the information returned
13
10
  # to a specific subset.
14
11
  #
15
- # @return [MPD::Song, Array<MPD::Song>] Array of songs in the queue
12
+ # @return [Array<MPD::Song>] Array of songs in the queue
16
13
  # or a single song.
17
14
  def queue(limit=nil)
18
15
  build_songs_list send_command(:playlistinfo, limit)
@@ -27,6 +24,7 @@ class MPD
27
24
 
28
25
  # Adds a song to the queue (*non-recursive*) and returns the song id.
29
26
  # Optionally, one can specify the position on which to add the song (since MPD 0.14).
27
+ # @return [Integer] id of the song that was added.
30
28
  def addid(path, pos=nil)
31
29
  send_command :addid, pos
32
30
  end
@@ -1,8 +1,6 @@
1
1
  class MPD
2
2
  module Plugins
3
3
  # Informational commands regarding MPD's internals and config.
4
- #
5
- # Changes: tagtypes was mapped to tags and gets fetched only once.
6
4
  module Reflection
7
5
  # Returns the config of MPD (currently only music_directory).
8
6
  # Only works if connected trough an UNIX domain socket.
@@ -36,7 +34,9 @@ class MPD
36
34
  send_command :decoders
37
35
  end
38
36
 
39
- # Get a list of available song metadata.
37
+ # Get a list of available song metadata fields. This gets only
38
+ # mapped once per-connect (it gets remapped if you connect and
39
+ # disconnect).
40
40
  # @return [Array] An array of tags.
41
41
  def tags
42
42
  @tags ||= send_command(:tagtypes).map {|tag| tag.downcase }
data/lib/ruby-mpd/song.rb CHANGED
@@ -1,11 +1,15 @@
1
1
  class MPD; end
2
2
 
3
- # This class is a glorified Hash used to represent a song.
3
+ # Object representation of a song.
4
4
  #
5
5
  # If the field doesn't exist or isn't set, nil will be returned
6
6
  class MPD::Song
7
+ # length in seconds
8
+ attr_accessor :time
9
+
7
10
  def initialize(options)
8
- @data = {}
11
+ @data = {} #allowed fields are @types + :file
12
+ @time = options.delete(:time).first #HAXX for array return
9
13
  @data.merge! options
10
14
  end
11
15
 
@@ -14,10 +18,12 @@ class MPD::Song
14
18
  self.file == another.file
15
19
  end
16
20
 
21
+ # @return [String] A formatted representation of the song length ("1:02")
17
22
  def length
18
- return "#{(@data.time / 60)}:#{"%02d" % (@data.time % 60)}"
23
+ return "#{(@time / 60)}:#{"%02d" % (@time % 60)}"
19
24
  end
20
25
 
26
+ # Pass any unknown calls over to the data hash.
21
27
  def method_missing(m, *a)
22
28
  key = m #.to_s
23
29
  if key =~ /=$/
data/ruby-mpd.gemspec CHANGED
@@ -3,7 +3,7 @@
3
3
  Gem::Specification.new do |s|
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.name = 'ruby-mpd'
6
- s.version = '0.1.5'
6
+ s.version = '0.1.7'
7
7
  s.homepage = 'https://github.com/archSeer/ruby-mpd'
8
8
  s.authors = ["Blaž Hrastnik"]
9
9
  s.email = ['speed.the.bboy@gmail.com']
@@ -1,35 +1,24 @@
1
1
  #
2
- # Unit tests for librmpd
2
+ # Unit tests for ruby-mpd
3
3
  #
4
- # This uses the included mpdserver.rb test server
5
4
 
6
- require '../lib/librmpd'
7
- require '../lib/mpdserver'
5
+ require '../lib/ruby-mpd'
8
6
  require 'test/unit'
9
7
 
10
8
  class MPDTester < Test::Unit::TestCase
11
9
 
12
10
  def setup
13
11
  begin
14
- @port = 93932
15
- @server = MPDTestServer.new @port
16
- @server.start
17
- rescue Errno::EADDRINUSE
18
- @port = 94942
19
- @server = MPDTestServer.new @port
20
- @server.start
21
- end
22
- @mpd = MPD.new 'localhost', @port
12
+ @mpd = MPD.new 'localhost', 94942
23
13
  end
24
14
 
25
15
  def teardown
26
16
  @mpd.disconnect
27
- @server.stop
28
17
  end
29
18
 
30
19
  def test_connect
31
20
  ret = @mpd.connect
32
- assert_match /OK MPD [0-9.]*\n/, ret
21
+ assert ret
33
22
  end
34
23
 
35
24
  def test_connected?
@@ -73,10 +62,10 @@ class MPDTester < Test::Unit::TestCase
73
62
  assert_equal 'Are You Shpongled?', pls[0].album
74
63
  assert_equal 'Shpongle Falls', pls[0].title
75
64
 
76
- assert_raise(MPD::MPDError) {@mpd.add('Does/Not/Exist')}
65
+ assert_raise(MPD::ServerError) {@mpd.add('Does/Not/Exist')}
77
66
 
78
67
  @mpd.disconnect
79
- assert_raise(MPD::MPDError) {@mpd.add('Shpongle')}
68
+ assert_raise(MPD::ServerError) {@mpd.add('Shpongle')}
80
69
  end
81
70
 
82
71
  def test_clear
@@ -94,7 +83,7 @@ class MPDTester < Test::Unit::TestCase
94
83
  assert_equal 0, pls.size
95
84
 
96
85
  @mpd.disconnect
97
- assert_raise(MPD::MPDError) {@mpd.clear}
86
+ assert_raise(MPD::ServerError) {@mpd.clear}
98
87
  end
99
88
 
100
89
  def test_clearerror
@@ -104,7 +93,7 @@ class MPDTester < Test::Unit::TestCase
104
93
  assert @mpd.clearerror
105
94
 
106
95
  @mpd.disconnect
107
- assert_raise(MPD::MPDError) {@mpd.clearerror}
96
+ assert_raise(MPD::ServerError) {@mpd.clearerror}
108
97
  end
109
98
 
110
99
  def test_crossfade
@@ -116,8 +105,8 @@ class MPDTester < Test::Unit::TestCase
116
105
  assert_equal '40', @mpd.status['xfade']
117
106
 
118
107
  @mpd.disconnect
119
- assert_raise(MPD::MPDError) {@mpd.crossfade = 20}
120
- assert_raise(MPD::MPDError) {@mpd.crossfade}
108
+ assert_raise(MPD::ServerError) {@mpd.crossfade = 20}
109
+ assert_raise(MPD::ServerError) {@mpd.crossfade}
121
110
  end
122
111
 
123
112
  def test_current_song
@@ -155,7 +144,7 @@ class MPDTester < Test::Unit::TestCase
155
144
  assert_equal '1', s.track
156
145
 
157
146
  @mpd.disconnect
158
- assert_raise(MPD::MPDError) {@mpd.current_song}
147
+ assert_raise(MPD::ServerError) {@mpd.current_song}
159
148
  end
160
149
 
161
150
  def test_delete
@@ -171,10 +160,10 @@ class MPDTester < Test::Unit::TestCase
171
160
  assert_not_equal 'No On Ever Dreams', song.title
172
161
  end
173
162
 
174
- assert_raise(MPD::MPDError) {@mpd.delete(999)}
163
+ assert_raise(MPD::ServerError) {@mpd.delete(999)}
175
164
 
176
165
  @mpd.disconnect
177
- assert_raise(MPD::MPDError) {@mpd.delete(3)}
166
+ assert_raise(MPD::ServerError) {@mpd.delete(3)}
178
167
  end
179
168
 
180
169
  def test_deleteid
@@ -190,10 +179,10 @@ class MPDTester < Test::Unit::TestCase
190
179
  assert_not_equal 'No One Ever Dreams', song.title
191
180
  end
192
181
 
193
- assert_raise(MPD::MPDError) {@mpd.deleteid(999)}
182
+ assert_raise(MPD::ServerError) {@mpd.deleteid(999)}
194
183
 
195
184
  @mpd.disconnect
196
- assert_raise(MPD::MPDError) {@mpd.deleteid(11)}
185
+ assert_raise(MPD::ServerError) {@mpd.deleteid(11)}
197
186
  end
198
187
 
199
188
  def test_find
@@ -230,10 +219,10 @@ class MPDTester < Test::Unit::TestCase
230
219
  d = @mpd.find 'artist', 'no artist'
231
220
  assert_equal 0, d.size
232
221
 
233
- assert_raise(MPD::MPDError) {@mpd.find('error', 'no-such')}
222
+ assert_raise(MPD::ServerError) {@mpd.find('error', 'no-such')}
234
223
 
235
224
  @mpd.disconnect
236
- assert_raise(MPD::MPDError) {@mpd.find('album', 'Are You Shpongled')}
225
+ assert_raise(MPD::ServerError) {@mpd.find('album', 'Are You Shpongled')}
237
226
  end
238
227
 
239
228
  def test_kill
@@ -243,7 +232,7 @@ class MPDTester < Test::Unit::TestCase
243
232
 
244
233
  assert !@mpd.connected?
245
234
 
246
- assert_raise(MPD::MPDError) {@mpd.kill}
235
+ assert_raise(MPD::ServerError) {@mpd.kill}
247
236
  end
248
237
 
249
238
  def test_albums
@@ -264,7 +253,7 @@ class MPDTester < Test::Unit::TestCase
264
253
  assert_equal 'Nothing Lasts... But Nothing Is Lost', sh[1]
265
254
 
266
255
  @mpd.disconnect
267
- assert_raise(MPD::MPDError) {@mpd.albums}
256
+ assert_raise(MPD::ServerError) {@mpd.albums}
268
257
  end
269
258
 
270
259
  def test_artists
@@ -278,7 +267,7 @@ class MPDTester < Test::Unit::TestCase
278
267
  assert_equal 'Shpongle', artists[2]
279
268
 
280
269
  @mpd.disconnect
281
- assert_raise(MPD::MPDError) {@mpd.artists}
270
+ assert_raise(MPD::ServerError) {@mpd.artists}
282
271
  end
283
272
 
284
273
  def test_list
@@ -305,11 +294,11 @@ class MPDTester < Test::Unit::TestCase
305
294
  assert_equal 'Are You Shpongled?', arg[0]
306
295
  assert_equal 'Nothing Lasts... But Nothing Is Lost', arg[1]
307
296
 
308
- assert_raise(MPD::MPDError) {@mpd.list('fail')}
309
- assert_raise(MPD::MPDError) {@mpd.list('fail', 'Shpongle')}
297
+ assert_raise(MPD::ServerError) {@mpd.list('fail')}
298
+ assert_raise(MPD::ServerError) {@mpd.list('fail', 'Shpongle')}
310
299
 
311
300
  @mpd.disconnect
312
- assert_raise(MPD::MPDError) {@mpd.artists}
301
+ assert_raise(MPD::ServerError) {@mpd.artists}
313
302
  end
314
303
 
315
304
  def test_directories
@@ -333,10 +322,10 @@ class MPDTester < Test::Unit::TestCase
333
322
  assert_equal 'Shpongle/Are_You_Shpongled', shpongle[1]
334
323
  assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost', shpongle[2]
335
324
 
336
- assert_raise(MPD::MPDError) {@mpd.directories('no-dirs')}
325
+ assert_raise(MPD::ServerError) {@mpd.directories('no-dirs')}
337
326
 
338
327
  @mpd.disconnect
339
- assert_raise(MPD::MPDError) {@mpd.directories}
328
+ assert_raise(MPD::ServerError) {@mpd.directories}
340
329
  end
341
330
 
342
331
  def test_files
@@ -364,10 +353,10 @@ class MPDTester < Test::Unit::TestCase
364
353
  assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost/01.Botanical_Dimensions.ogg', sh[7]
365
354
  assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost/20.Falling_Awake.ogg', sh[26]
366
355
 
367
- assert_raise(MPD::MPDError) {@mpd.files('no-files')}
356
+ assert_raise(MPD::ServerError) {@mpd.files('no-files')}
368
357
 
369
358
  @mpd.disconnect
370
- assert_raise(MPD::MPDError) {@mpd.files}
359
+ assert_raise(MPD::ServerError) {@mpd.files}
371
360
  end
372
361
 
373
362
  def test_playlists
@@ -381,7 +370,7 @@ class MPDTester < Test::Unit::TestCase
381
370
  assert_equal 'Astral_Projection_-_Dancing_Galaxy', pls[1]
382
371
 
383
372
  @mpd.disconnect
384
- assert_raise(MPD::MPDError) {@mpd.playlists}
373
+ assert_raise(MPD::ServerError) {@mpd.playlists}
385
374
  end
386
375
 
387
376
  def test_songs
@@ -413,10 +402,10 @@ class MPDTester < Test::Unit::TestCase
413
402
  assert_equal 'Botanical Dimensions', sh[7].title
414
403
  assert_equal 'Falling Awake', sh[26].title
415
404
 
416
- assert_raise(MPD::MPDError) {@mpd.songs('no-songs')}
405
+ assert_raise(MPD::ServerError) {@mpd.songs('no-songs')}
417
406
 
418
407
  @mpd.disconnect
419
- assert_raise(MPD::MPDError) {@mpd.songs}
408
+ assert_raise(MPD::ServerError) {@mpd.songs}
420
409
  end
421
410
 
422
411
  def test_songs_by_artist
@@ -439,7 +428,7 @@ class MPDTester < Test::Unit::TestCase
439
428
  assert_equal 0, songs.size
440
429
 
441
430
  @mpd.disconnect
442
- assert_raise(MPD::MPDError) {@mpd.songs_by_artist('Shpongle')}
431
+ assert_raise(MPD::ServerError) {@mpd.songs_by_artist('Shpongle')}
443
432
  end
444
433
 
445
434
  def test_load
@@ -465,10 +454,10 @@ class MPDTester < Test::Unit::TestCase
465
454
  assert_equal 'Liquid Sun', pls[6].title
466
455
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[7].title
467
456
 
468
- assert_raise(MPD::MPDError) {@mpd.load('No-PLS')}
457
+ assert_raise(MPD::ServerError) {@mpd.load('No-PLS')}
469
458
 
470
459
  @mpd.disconnect
471
- assert_raise(MPD::MPDError) {@mpd.load('Astral_Projection_-_Dancing_Galaxy')}
460
+ assert_raise(MPD::ServerError) {@mpd.load('Astral_Projection_-_Dancing_Galaxy')}
472
461
  end
473
462
 
474
463
  def test_move
@@ -495,10 +484,10 @@ class MPDTester < Test::Unit::TestCase
495
484
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[6].title
496
485
  assert_equal 'Soundform', pls[7].title
497
486
 
498
- assert_raise(MPD::MPDError) {@mpd.move(999,1)}
487
+ assert_raise(MPD::ServerError) {@mpd.move(999,1)}
499
488
 
500
489
  @mpd.disconnect
501
- assert_raise(MPD::MPDError) {@mpd.move(3,1)}
490
+ assert_raise(MPD::ServerError) {@mpd.move(3,1)}
502
491
  end
503
492
 
504
493
  def test_moveid
@@ -525,10 +514,10 @@ class MPDTester < Test::Unit::TestCase
525
514
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[6].title
526
515
  assert_equal 'Soundform', pls[7].title
527
516
 
528
- assert_raise(MPD::MPDError) {@mpd.moveid(999,1)}
517
+ assert_raise(MPD::ServerError) {@mpd.moveid(999,1)}
529
518
 
530
519
  @mpd.disconnect
531
- assert_raise(MPD::MPDError) {@mpd.moveid(10,1)}
520
+ assert_raise(MPD::ServerError) {@mpd.moveid(10,1)}
532
521
 
533
522
  end
534
523
 
@@ -546,7 +535,7 @@ class MPDTester < Test::Unit::TestCase
546
535
  assert_equal pos + 1, @mpd.status['song'].to_i
547
536
 
548
537
  @mpd.disconnect
549
- assert_raise(MPD::MPDError) {@mpd.next}
538
+ assert_raise(MPD::ServerError) {@mpd.next}
550
539
  end
551
540
 
552
541
  def test_pause
@@ -573,19 +562,19 @@ class MPDTester < Test::Unit::TestCase
573
562
  assert !@mpd.paused?
574
563
 
575
564
  @mpd.disconnect
576
- assert_raise(MPD::MPDError) {@mpd.pause = true}
577
- assert_raise(MPD::MPDError) {@mpd.paused?}
565
+ assert_raise(MPD::ServerError) {@mpd.pause = true}
566
+ assert_raise(MPD::ServerError) {@mpd.paused?}
578
567
  end
579
568
 
580
569
  def test_password
581
570
  @mpd.connect
582
571
 
583
- assert_raise(MPD::MPDError) {@mpd.password('wrong')}
572
+ assert_raise(MPD::ServerError) {@mpd.password('wrong')}
584
573
 
585
574
  assert @mpd.password('test')
586
575
 
587
576
  @mpd.disconnect
588
- assert_raise(MPD::MPDError) {@mpd.password('test')}
577
+ assert_raise(MPD::ServerError) {@mpd.password('test')}
589
578
  end
590
579
 
591
580
  def test_ping
@@ -594,7 +583,7 @@ class MPDTester < Test::Unit::TestCase
594
583
  assert @mpd.ping
595
584
 
596
585
  @mpd.disconnect
597
- assert_raise(MPD::MPDError) {@mpd.ping}
586
+ assert_raise(MPD::ServerError) {@mpd.ping}
598
587
  end
599
588
 
600
589
  def test_play
@@ -624,8 +613,8 @@ class MPDTester < Test::Unit::TestCase
624
613
  assert_equal 'Flying Into A Star', song.title
625
614
 
626
615
  @mpd.disconnect
627
- assert_raise(MPD::MPDError) {@mpd.play}
628
- assert_raise(MPD::MPDError) {@mpd.playing?}
616
+ assert_raise(MPD::ServerError) {@mpd.play}
617
+ assert_raise(MPD::ServerError) {@mpd.playing?}
629
618
  end
630
619
 
631
620
  def test_playid
@@ -655,8 +644,8 @@ class MPDTester < Test::Unit::TestCase
655
644
  assert_equal 'Flying Into A Star', song.title
656
645
 
657
646
  @mpd.disconnect
658
- assert_raise(MPD::MPDError) {@mpd.playid}
659
- assert_raise(MPD::MPDError) {@mpd.playing?}
647
+ assert_raise(MPD::ServerError) {@mpd.playid}
648
+ assert_raise(MPD::ServerError) {@mpd.playing?}
660
649
 
661
650
  end
662
651
 
@@ -674,7 +663,7 @@ class MPDTester < Test::Unit::TestCase
674
663
  assert_equal 9, ver
675
664
 
676
665
  @mpd.disconnect
677
- assert_raise(MPD::MPDError) {@mpd.playlist_version}
666
+ assert_raise(MPD::ServerError) {@mpd.playlist_version}
678
667
  end
679
668
 
680
669
  def test_playlist
@@ -700,7 +689,7 @@ class MPDTester < Test::Unit::TestCase
700
689
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[7].title
701
690
 
702
691
  @mpd.disconnect
703
- assert_raise(MPD::MPDError) {@mpd.playlist}
692
+ assert_raise(MPD::ServerError) {@mpd.playlist}
704
693
  end
705
694
 
706
695
  def test_song_at_pos
@@ -717,10 +706,10 @@ class MPDTester < Test::Unit::TestCase
717
706
  assert_equal 'Liquid Sun', @mpd.song_at_pos(6).title
718
707
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', @mpd.song_at_pos(7).title
719
708
 
720
- assert_raise(MPD::MPDError) {@mpd.song_at_pos(999)}
709
+ assert_raise(MPD::ServerError) {@mpd.song_at_pos(999)}
721
710
 
722
711
  @mpd.disconnect
723
- assert_raise(MPD::MPDError) {@mpd.song_at_pos(0)}
712
+ assert_raise(MPD::ServerError) {@mpd.song_at_pos(0)}
724
713
  end
725
714
 
726
715
  def test_song_with_id
@@ -737,10 +726,10 @@ class MPDTester < Test::Unit::TestCase
737
726
  assert_equal 'Liquid Sun', @mpd.song_with_id(13).title
738
727
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', @mpd.song_with_id(14).title
739
728
 
740
- assert_raise(MPD::MPDError) {@mpd.song_with_id(999)}
729
+ assert_raise(MPD::ServerError) {@mpd.song_with_id(999)}
741
730
 
742
731
  @mpd.disconnect
743
- assert_raise(MPD::MPDError) {@mpd.song_with_id(10)}
732
+ assert_raise(MPD::ServerError) {@mpd.song_with_id(10)}
744
733
  end
745
734
 
746
735
  def test_playlist_changes
@@ -770,7 +759,7 @@ class MPDTester < Test::Unit::TestCase
770
759
  assert_equal 8, changes.size
771
760
 
772
761
  @mpd.disconnect
773
- assert_raise(MPD::MPDError) {@mpd.playlist_changes(9)}
762
+ assert_raise(MPD::ServerError) {@mpd.playlist_changes(9)}
774
763
  end
775
764
 
776
765
  def test_previous
@@ -791,7 +780,7 @@ class MPDTester < Test::Unit::TestCase
791
780
  assert_equal pos - 1, @mpd.status['song'].to_i
792
781
 
793
782
  @mpd.disconnect
794
- assert_raise(MPD::MPDError) {@mpd.previous}
783
+ assert_raise(MPD::ServerError) {@mpd.previous}
795
784
  end
796
785
 
797
786
  def test_random
@@ -804,8 +793,8 @@ class MPDTester < Test::Unit::TestCase
804
793
  assert !@mpd.random?
805
794
 
806
795
  @mpd.disconnect
807
- assert_raise(MPD::MPDError) {@mpd.random = false}
808
- assert_raise(MPD::MPDError) {@mpd.random?}
796
+ assert_raise(MPD::ServerError) {@mpd.random = false}
797
+ assert_raise(MPD::ServerError) {@mpd.random?}
809
798
  end
810
799
 
811
800
  def test_repeat
@@ -818,8 +807,8 @@ class MPDTester < Test::Unit::TestCase
818
807
  assert !@mpd.repeat?
819
808
 
820
809
  @mpd.disconnect
821
- assert_raise(MPD::MPDError) {@mpd.repeat = false}
822
- assert_raise(MPD::MPDError) {@mpd.repeat?}
810
+ assert_raise(MPD::ServerError) {@mpd.repeat = false}
811
+ assert_raise(MPD::ServerError) {@mpd.repeat?}
823
812
  end
824
813
 
825
814
  def test_rm
@@ -833,10 +822,10 @@ class MPDTester < Test::Unit::TestCase
833
822
 
834
823
  assert_equal 'Shpongle_-_Are_You_Shpongled', pls[0]
835
824
 
836
- assert_raise(MPD::MPDError) {@mpd.rm('Not-Exist')}
825
+ assert_raise(MPD::ServerError) {@mpd.rm('Not-Exist')}
837
826
 
838
827
  @mpd.disconnect
839
- assert_raise(MPD::MPDError) {@mpd.rm('Astral_Projection_-_Dancing_Galaxy')}
828
+ assert_raise(MPD::ServerError) {@mpd.rm('Astral_Projection_-_Dancing_Galaxy')}
840
829
  end
841
830
 
842
831
  def test_save
@@ -872,7 +861,7 @@ class MPDTester < Test::Unit::TestCase
872
861
  assert_equal '... and the Day Turned to Night', pls[14].title
873
862
 
874
863
  @mpd.disconnect
875
- assert_raise(MPD::MPDError) {@mpd.save('test')}
864
+ assert_raise(MPD::ServerError) {@mpd.save('test')}
876
865
  end
877
866
 
878
867
  def test_search
@@ -908,10 +897,10 @@ class MPDTester < Test::Unit::TestCase
908
897
  z = @mpd.search 'title', 'no-title'
909
898
  assert_equal 0, z.size
910
899
 
911
- assert_raise(MPD::MPDError) {@mpd.search('error', 'nosuch')}
900
+ assert_raise(MPD::ServerError) {@mpd.search('error', 'nosuch')}
912
901
 
913
902
  @mpd.disconnect
914
- assert_raise(MPD::MPDError) {@mpd.search('artist','searching')}
903
+ assert_raise(MPD::ServerError) {@mpd.search('artist','searching')}
915
904
  end
916
905
 
917
906
  def test_seek
@@ -940,7 +929,7 @@ class MPDTester < Test::Unit::TestCase
940
929
  assert_equal '200:585', status['time']
941
930
 
942
931
  @mpd.disconnect
943
- assert_raise(MPD::MPDError) {@mpd.seek(1, 100)}
932
+ assert_raise(MPD::ServerError) {@mpd.seek(1, 100)}
944
933
  end
945
934
 
946
935
  def test_seekid
@@ -969,7 +958,7 @@ class MPDTester < Test::Unit::TestCase
969
958
  assert_equal '200:585', status['time']
970
959
 
971
960
  @mpd.disconnect
972
- assert_raise(MPD::MPDError) {@mpd.seekid(1, 100)}
961
+ assert_raise(MPD::ServerError) {@mpd.seekid(1, 100)}
973
962
  end
974
963
 
975
964
  def test_volume
@@ -984,8 +973,8 @@ class MPDTester < Test::Unit::TestCase
984
973
  assert_equal vol, @mpd.volume
985
974
 
986
975
  @mpd.disconnect
987
- assert_raise(MPD::MPDError) {@mpd.volume = 10}
988
- assert_raise(MPD::MPDError) {@mpd.volume}
976
+ assert_raise(MPD::ServerError) {@mpd.volume = 10}
977
+ assert_raise(MPD::ServerError) {@mpd.volume}
989
978
  end
990
979
 
991
980
  def test_shuffle
@@ -1001,7 +990,7 @@ class MPDTester < Test::Unit::TestCase
1001
990
  assert_not_equal 'Dancing Galaxy', pls[0].title
1002
991
 
1003
992
  @mpd.disconnect
1004
- assert_raise(MPD::MPDError) {@mpd.shuffle}
993
+ assert_raise(MPD::ServerError) {@mpd.shuffle}
1005
994
  end
1006
995
 
1007
996
  def test_stats
@@ -1015,7 +1004,7 @@ class MPDTester < Test::Unit::TestCase
1015
1004
  assert_equal '500', stats['uptime']
1016
1005
 
1017
1006
  @mpd.disconnect
1018
- assert_raise(MPD::MPDError) {@mpd.stats}
1007
+ assert_raise(MPD::ServerError) {@mpd.stats}
1019
1008
  end
1020
1009
 
1021
1010
  def test_status
@@ -1028,7 +1017,7 @@ class MPDTester < Test::Unit::TestCase
1028
1017
  assert_equal '0', status['random']
1029
1018
 
1030
1019
  @mpd.disconnect
1031
- assert_raise(MPD::MPDError) {@mpd.status}
1020
+ assert_raise(MPD::ServerError) {@mpd.status}
1032
1021
  end
1033
1022
 
1034
1023
  def test_stop
@@ -1046,8 +1035,8 @@ class MPDTester < Test::Unit::TestCase
1046
1035
  assert !@mpd.playing?
1047
1036
 
1048
1037
  @mpd.disconnect
1049
- assert_raise(MPD::MPDError) {@mpd.stop}
1050
- assert_raise(MPD::MPDError) {@mpd.stopped?}
1038
+ assert_raise(MPD::ServerError) {@mpd.stop}
1039
+ assert_raise(MPD::ServerError) {@mpd.stopped?}
1051
1040
  end
1052
1041
 
1053
1042
  def test_swap
@@ -1081,10 +1070,10 @@ class MPDTester < Test::Unit::TestCase
1081
1070
  assert_equal 'Liquid Sun', pls[6].title
1082
1071
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[1].title
1083
1072
 
1084
- assert_raise(MPD::MPDError) {@mpd.swap(999,1)}
1073
+ assert_raise(MPD::ServerError) {@mpd.swap(999,1)}
1085
1074
 
1086
1075
  @mpd.disconnect
1087
- assert_raise(MPD::MPDError) {@mpd.swap(2, 5)}
1076
+ assert_raise(MPD::ServerError) {@mpd.swap(2, 5)}
1088
1077
  end
1089
1078
 
1090
1079
  def test_swapid
@@ -1118,10 +1107,10 @@ class MPDTester < Test::Unit::TestCase
1118
1107
  assert_equal 'Liquid Sun', pls[6].title
1119
1108
  assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[1].title
1120
1109
 
1121
- assert_raise(MPD::MPDError) {@mpd.swapid(999,8)}
1110
+ assert_raise(MPD::ServerError) {@mpd.swapid(999,8)}
1122
1111
 
1123
1112
  @mpd.disconnect
1124
- assert_raise(MPD::MPDError) {@mpd.swapid(9, 12)}
1113
+ assert_raise(MPD::ServerError) {@mpd.swapid(9, 12)}
1125
1114
  end
1126
1115
 
1127
1116
  def test_update
@@ -1140,6 +1129,6 @@ class MPDTester < Test::Unit::TestCase
1140
1129
  assert_nil status['updating_db']
1141
1130
 
1142
1131
  @mpd.disconnect
1143
- assert_raise(MPD::MPDError) {@mpd.update}
1132
+ assert_raise(MPD::ServerError) {@mpd.update}
1144
1133
  end
1145
1134
  end