ruby-mpd 0.1.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/.gitignore +22 -0
- data/AUTHORS +1 -0
- data/COPYING +340 -0
- data/DOC.rdoc +78 -0
- data/README.rdoc +174 -0
- data/data/database.yaml +347 -0
- data/examples/rmpc.rb +67 -0
- data/examples/tailmpc.rb +115 -0
- data/lib/mpdserver.rb +1206 -0
- data/lib/ruby-mpd.rb +310 -0
- data/lib/ruby-mpd/parser.rb +151 -0
- data/lib/ruby-mpd/playlist.rb +77 -0
- data/lib/ruby-mpd/plugins/channels.rb +58 -0
- data/lib/ruby-mpd/plugins/controls.rb +72 -0
- data/lib/ruby-mpd/plugins/database.rb +79 -0
- data/lib/ruby-mpd/plugins/information.rb +146 -0
- data/lib/ruby-mpd/plugins/outputs.rb +26 -0
- data/lib/ruby-mpd/plugins/playback_options.rb +88 -0
- data/lib/ruby-mpd/plugins/playlists.rb +17 -0
- data/lib/ruby-mpd/plugins/queue.rb +125 -0
- data/lib/ruby-mpd/plugins/reflection.rb +46 -0
- data/lib/ruby-mpd/plugins/stickers.rb +52 -0
- data/lib/ruby-mpd/song.rb +31 -0
- data/ruby-mpd.gemspec +17 -0
- data/tests/libtests.rb +1145 -0
- data/tests/servertests.rb +3405 -0
- metadata +73 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
class MPD
|
2
|
+
module Plugins
|
3
|
+
# Commands related to setting various aspects and modes of playback.
|
4
|
+
#
|
5
|
+
# Changes: setvol -> volume.
|
6
|
+
module PlaybackOptions
|
7
|
+
|
8
|
+
# Enable/disable consume mode.
|
9
|
+
# @since MPD 0.16
|
10
|
+
# When consume is activated, each song played is removed from playlist
|
11
|
+
# after playing.
|
12
|
+
# @macro returnraise
|
13
|
+
def consume=(toggle)
|
14
|
+
send_command :consume, toggle
|
15
|
+
end
|
16
|
+
|
17
|
+
# Set the crossfade between songs in seconds.
|
18
|
+
# @macro returnraise
|
19
|
+
def crossfade=(seconds)
|
20
|
+
send_command :crossfade, seconds
|
21
|
+
end
|
22
|
+
|
23
|
+
# Sets the threshold at which songs will be overlapped. Like crossfading
|
24
|
+
# but doesn't fade the track volume, just overlaps. The songs need to have
|
25
|
+
# MixRamp tags added by an external tool. 0dB is the normalized maximum
|
26
|
+
# volume so use negative values, I prefer -17dB. In the absence of mixramp
|
27
|
+
# tags crossfading will be used. See http://sourceforge.net/projects/mixramp
|
28
|
+
# @param [Float] decibels Maximum volume level in decibels.
|
29
|
+
def mixrampdb=(decibels)
|
30
|
+
send_command :mixrampdb, decibels
|
31
|
+
end
|
32
|
+
|
33
|
+
# Additional time subtracted from the overlap calculated by mixrampdb.
|
34
|
+
# A value of "nan" or Float::NAN disables MixRamp overlapping and falls
|
35
|
+
# back to crossfading.
|
36
|
+
def mixrampdelay=(seconds)
|
37
|
+
send_command :mixrampdelay, seconds
|
38
|
+
end
|
39
|
+
|
40
|
+
# Enable/disable random playback.
|
41
|
+
# @macro returnraise
|
42
|
+
def random=(toggle)
|
43
|
+
send_command :random, toggle
|
44
|
+
end
|
45
|
+
|
46
|
+
# Enable/disable repeat mode.
|
47
|
+
# @macro returnraise
|
48
|
+
def repeat=(toggle)
|
49
|
+
send_command :repeat, toggle
|
50
|
+
end
|
51
|
+
|
52
|
+
# Sets the volume level. (Maps to MPD's +setvol+)
|
53
|
+
# @param [Integer] vol Volume level between 0 and 100.
|
54
|
+
# @macro returnraise
|
55
|
+
def volume=(vol)
|
56
|
+
send_command :setvol, vol
|
57
|
+
end
|
58
|
+
|
59
|
+
# Enable/disable single mode.
|
60
|
+
# @since MPD 0.15
|
61
|
+
# When single is activated, playback is stopped after current song,
|
62
|
+
# or song is repeated if the 'repeat' mode is enabled.
|
63
|
+
# @macro returnraise
|
64
|
+
def single=(toggle)
|
65
|
+
send_command :single, toggle
|
66
|
+
end
|
67
|
+
|
68
|
+
# Sets the replay gain mode. One of :off, :track, :album, :auto.
|
69
|
+
# @since MPD 0.16
|
70
|
+
# Changing the mode during playback may take several seconds, because
|
71
|
+
# the new settings does not affect the buffered data.
|
72
|
+
#
|
73
|
+
# This command triggers the options idle event.
|
74
|
+
# @macro returnraise
|
75
|
+
def replay_gain_mode=(mode)
|
76
|
+
send_command :replay_gain_mode, mode
|
77
|
+
end
|
78
|
+
|
79
|
+
# Prints replay gain options. Currently, only the variable
|
80
|
+
# +:replay_gain_mode+ is returned.
|
81
|
+
# @since MPD 0.16
|
82
|
+
def replay_gain_status
|
83
|
+
send_command :replay_gain_status
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class MPD
|
2
|
+
module Plugins
|
3
|
+
# These commands manipulate stored playlists.
|
4
|
+
#
|
5
|
+
# Changes: listplaylists -> playlists.
|
6
|
+
module Playlists
|
7
|
+
|
8
|
+
# List all of the playlists in the database
|
9
|
+
#
|
10
|
+
# @return [Array<Hash>] Array of playlists
|
11
|
+
def playlists
|
12
|
+
send_command(:listplaylists).map {|opt| MPD::Playlist.new(self, opt)}
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
class MPD
|
2
|
+
module Plugins
|
3
|
+
# These commands manipulate the current playlist, what's playing now.
|
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.
|
8
|
+
module Queue
|
9
|
+
|
10
|
+
# List the current playlist/queue.
|
11
|
+
# An Integer or Range can be used to limit the information returned
|
12
|
+
# to a specific subset.
|
13
|
+
#
|
14
|
+
# @return [MPD::Song, Array<MPD::Song>] Array of songs in the queue
|
15
|
+
# or a single song.
|
16
|
+
def queue(limit=nil)
|
17
|
+
build_songs_list send_command(:playlistinfo, limit)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add the file _path_ to the queue. If path is a directory,
|
21
|
+
# it will be added *recursively*.
|
22
|
+
# @macro returnraise
|
23
|
+
def add(path)
|
24
|
+
send_command :add, path
|
25
|
+
end
|
26
|
+
|
27
|
+
# Adds a song to the queue (*non-recursive*) and returns the song id.
|
28
|
+
# Optionally, one can specify the position on which to add the song (since MPD 0.14).
|
29
|
+
def addid(path, pos=nil)
|
30
|
+
send_command :addid, pos
|
31
|
+
end
|
32
|
+
|
33
|
+
# Clears the current queue.
|
34
|
+
# @macro returnraise
|
35
|
+
def clear
|
36
|
+
send_command :clear
|
37
|
+
end
|
38
|
+
|
39
|
+
# Deletes the song from the queue.
|
40
|
+
#
|
41
|
+
# Since MPD 0.15 a range can also be passed. Songs with positions within range will be deleted.
|
42
|
+
# @param [Integer, Range] pos Song with position in the queue will be deleted,
|
43
|
+
# if range is passed, songs with positions within range will be deleted.
|
44
|
+
# @macro returnraise
|
45
|
+
def delete(pos)
|
46
|
+
send_command :delete, pos
|
47
|
+
end
|
48
|
+
|
49
|
+
# Delete the song with the +songid+ from the queue.
|
50
|
+
# @macro returnraise
|
51
|
+
def deleteid(songid)
|
52
|
+
send_command :deleteid, songid
|
53
|
+
end
|
54
|
+
|
55
|
+
# Move the song at +from+ to +to+ in the queue.
|
56
|
+
# * Since 0.14, +to+ can be a negative number, which is the offset
|
57
|
+
# of the song from the currently playing (or to-be-played) song.
|
58
|
+
# So -1 would mean the song would be moved to be the next song in the queue.
|
59
|
+
# Moving a song to -queue.length will move it to the song _before_ the current
|
60
|
+
# song on the queue; so this will work for repeating playlists, too.
|
61
|
+
# * Since 0.15, +from+ can be a range of songs to move.
|
62
|
+
# @macro returnraise
|
63
|
+
def move(from, to)
|
64
|
+
send_command :move, from, to
|
65
|
+
end
|
66
|
+
|
67
|
+
# Move the song with the +songid+ to +to+ in the queue.
|
68
|
+
# @macro returnraise
|
69
|
+
def moveid(songid, to)
|
70
|
+
send_command :moveid, songid, to
|
71
|
+
end
|
72
|
+
|
73
|
+
# playlistfind
|
74
|
+
|
75
|
+
# Returns the song with the +songid+ in the playlist,
|
76
|
+
# @return [MPD::Song]
|
77
|
+
def song_with_id(songid)
|
78
|
+
Song.new send_command(:playlistid, songid)
|
79
|
+
end
|
80
|
+
|
81
|
+
# playlistsearch
|
82
|
+
|
83
|
+
# List the changes since the specified version in the queue.
|
84
|
+
# @return [Array<MPD::Song>]
|
85
|
+
def queue_changes(version)
|
86
|
+
build_songs_list send_command(:plchanges, version)
|
87
|
+
end
|
88
|
+
|
89
|
+
# plchangesposid
|
90
|
+
|
91
|
+
# prio
|
92
|
+
|
93
|
+
# prioid
|
94
|
+
|
95
|
+
# Shuffles the queue.
|
96
|
+
# Optionally, a Range can be used to shuffle a specific subset.
|
97
|
+
# @macro returnraise
|
98
|
+
def shuffle(range)
|
99
|
+
send_command :shuffle, range
|
100
|
+
end
|
101
|
+
|
102
|
+
# Swaps the song at position +posA+ with the song
|
103
|
+
# as position +posB+ in the queue.
|
104
|
+
# @macro returnraise
|
105
|
+
def swap(posA, posB)
|
106
|
+
send_command :swap, posA, posB
|
107
|
+
end
|
108
|
+
|
109
|
+
# Swaps the positions of the song with the id +songidA+
|
110
|
+
# with the song with the id +songidB+ in the queue.
|
111
|
+
# @macro returnraise
|
112
|
+
def swapid(songidA, songidB)
|
113
|
+
send_command :swapid, songidA, songidB
|
114
|
+
end
|
115
|
+
|
116
|
+
# Saves the current playlist/queue to +playlist+.m3u in the
|
117
|
+
# playlist directory.
|
118
|
+
# @macro returnraise
|
119
|
+
def save(playlist)
|
120
|
+
send_command :save, playlist
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class MPD
|
2
|
+
module Plugins
|
3
|
+
# Informational commands regarding MPD's internals and config.
|
4
|
+
#
|
5
|
+
# Changes: tagtypes was mapped to tags and gets fetched only once.
|
6
|
+
module Reflection
|
7
|
+
# Returns the config of MPD (currently only music_directory).
|
8
|
+
# Only works if connected trough an UNIX domain socket.
|
9
|
+
# @return [Hash] Configuration of MPD
|
10
|
+
def config
|
11
|
+
send_command :config
|
12
|
+
end
|
13
|
+
|
14
|
+
# Shows which commands the current user has access to.
|
15
|
+
# @return [Array<Symbol>] Array of command names.
|
16
|
+
def commands
|
17
|
+
send_command :commands
|
18
|
+
end
|
19
|
+
|
20
|
+
# Shows which commands the current user does not have access to.
|
21
|
+
# @return [Array<Symbol>] Array of command names.
|
22
|
+
def notcommands
|
23
|
+
send_command :notcommands
|
24
|
+
end
|
25
|
+
|
26
|
+
# Gets a list of available URL handlers.
|
27
|
+
# @return [Array<String>] Array of URL's MPD can handle.
|
28
|
+
def url_handlers
|
29
|
+
send_command :urlhandlers
|
30
|
+
end
|
31
|
+
|
32
|
+
# Get a list of decoder plugins, with by their supported suffixes
|
33
|
+
# and MIME types.
|
34
|
+
# @return [Array<Hash>] An array of hashes, one per decoder.
|
35
|
+
def decoders
|
36
|
+
send_command :decoders
|
37
|
+
end
|
38
|
+
|
39
|
+
# Get a list of available song metadata.
|
40
|
+
# @return [Array] An array of tags.
|
41
|
+
def tags
|
42
|
+
@tags ||= send_command(:tagtypes).map {|tag| tag.downcase }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class MPD
|
2
|
+
module Plugins
|
3
|
+
# "Stickers" are pieces of information attached to existing MPD objects
|
4
|
+
# (e.g. song files, directories, albums). Clients can create arbitrary
|
5
|
+
# name/value pairs. MPD itself does not assume any special meaning in them.
|
6
|
+
#
|
7
|
+
# The goal is to allow clients to share additional (possibly dynamic) information
|
8
|
+
# about songs, which is neither stored on the client (not available to other clients),
|
9
|
+
# nor stored in the song files (MPD has no write access).
|
10
|
+
#
|
11
|
+
# Client developers should create a standard for common sticker names, to ensure
|
12
|
+
# interoperability.
|
13
|
+
#
|
14
|
+
# Objects which may have stickers are addressed by their object type ("song" for song objects)
|
15
|
+
# and their URI (the path within the database for songs).
|
16
|
+
module Stickers
|
17
|
+
|
18
|
+
# seems that type is always :song, supposedly directory and
|
19
|
+
# playlist too "(e.g. song files, directories, albums)"
|
20
|
+
|
21
|
+
# Reads a sticker value for the specified object.
|
22
|
+
def get_sticker(type, uri, name)
|
23
|
+
send_command :sticker, :get, type, uri, name
|
24
|
+
end
|
25
|
+
|
26
|
+
# Adds a sticker value to the specified object. If a sticker
|
27
|
+
# item with that name already exists, it is replaced.
|
28
|
+
def set_sticker(type, uri, name, value)
|
29
|
+
send_command :sticker, :set, type, uri, name
|
30
|
+
end
|
31
|
+
|
32
|
+
# Deletes a sticker value from the specified object. If you do
|
33
|
+
# not specify a sticker name, all sticker values are deleted.
|
34
|
+
def delete_sticker(type, uri, name = nil)
|
35
|
+
send_command :sticker, :delete, type, uri, name
|
36
|
+
end
|
37
|
+
|
38
|
+
# Lists the stickers for the specified object.
|
39
|
+
def list_stickers(type, uri)
|
40
|
+
send_command :sticker, :list, type, uri
|
41
|
+
end
|
42
|
+
|
43
|
+
# Searches the sticker database for stickers with the specified name,
|
44
|
+
# below the specified directory (URI). For each matching song, it prints
|
45
|
+
# the URI and that one sticker's value.
|
46
|
+
def find_sticker(type, uri, name)
|
47
|
+
send_command :sticker, :find, type, uri, name
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class MPD; end
|
2
|
+
|
3
|
+
# This class is a glorified Hash used to represent a song.
|
4
|
+
#
|
5
|
+
# If the field doesn't exist or isn't set, nil will be returned
|
6
|
+
class MPD::Song
|
7
|
+
def initialize(options)
|
8
|
+
@data = {}
|
9
|
+
@data.merge! options
|
10
|
+
end
|
11
|
+
|
12
|
+
# Two songs are the same when they are the same file.
|
13
|
+
def ==(another)
|
14
|
+
self.file == another.file
|
15
|
+
end
|
16
|
+
|
17
|
+
def length
|
18
|
+
return "#{(@data.time / 60)}:#{"%02d" % (@data.time % 60)}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing(m, *a)
|
22
|
+
key = m #.to_s
|
23
|
+
if key =~ /=$/
|
24
|
+
@data[$`] = a[0]
|
25
|
+
elsif a.empty?
|
26
|
+
@data[key]
|
27
|
+
else
|
28
|
+
raise NoMethodError, "#{m}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/ruby-mpd.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.name = 'ruby-mpd'
|
6
|
+
s.version = '0.1.4'
|
7
|
+
s.homepage = 'https://github.com/archSeer/ruby-mpd'
|
8
|
+
s.authors = ["Blaž Hrastnik"]
|
9
|
+
s.email = ['speed.the.bboy@gmail.com']
|
10
|
+
s.summary = "Modern client library for MPD"
|
11
|
+
s.description = "A powerful, modern and feature complete library for the Music Player Daemon."
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split("\n")
|
14
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
end
|
data/tests/libtests.rb
ADDED
@@ -0,0 +1,1145 @@
|
|
1
|
+
#
|
2
|
+
# Unit tests for librmpd
|
3
|
+
#
|
4
|
+
# This uses the included mpdserver.rb test server
|
5
|
+
|
6
|
+
require '../lib/librmpd'
|
7
|
+
require '../lib/mpdserver'
|
8
|
+
require 'test/unit'
|
9
|
+
|
10
|
+
class MPDTester < Test::Unit::TestCase
|
11
|
+
|
12
|
+
def setup
|
13
|
+
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
|
23
|
+
end
|
24
|
+
|
25
|
+
def teardown
|
26
|
+
@mpd.disconnect
|
27
|
+
@server.stop
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_connect
|
31
|
+
ret = @mpd.connect
|
32
|
+
assert_match /OK MPD [0-9.]*\n/, ret
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_connected?
|
36
|
+
# test a good connection
|
37
|
+
@mpd.connect
|
38
|
+
assert @mpd.connected?
|
39
|
+
|
40
|
+
# Test a disconnect
|
41
|
+
@server.stop
|
42
|
+
assert !@mpd.connected?
|
43
|
+
|
44
|
+
# test a bad connection
|
45
|
+
bad = MPD.new 'no-connection', 6600
|
46
|
+
assert !bad.connected?
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_disconnect
|
50
|
+
# test a good connection
|
51
|
+
@mpd.connect
|
52
|
+
assert @mpd.connected?
|
53
|
+
@mpd.disconnect
|
54
|
+
assert !@mpd.connected?
|
55
|
+
@mpd.disconnect
|
56
|
+
assert !@mpd.connected?
|
57
|
+
|
58
|
+
# test a bad connection
|
59
|
+
bad = MPD.new 'no-connection'
|
60
|
+
bad.disconnect
|
61
|
+
assert !bad.connected?
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_add
|
65
|
+
@mpd.connect
|
66
|
+
assert @mpd.connected?
|
67
|
+
|
68
|
+
assert @mpd.add('Shpongle/Are_You_Shpongled/1.Shpongle_Falls.ogg')
|
69
|
+
|
70
|
+
pls = @mpd.playlist
|
71
|
+
assert_equal 1, pls.size
|
72
|
+
assert_equal 'Shpongle', pls[0].artist
|
73
|
+
assert_equal 'Are You Shpongled?', pls[0].album
|
74
|
+
assert_equal 'Shpongle Falls', pls[0].title
|
75
|
+
|
76
|
+
assert_raise(MPD::MPDError) {@mpd.add('Does/Not/Exist')}
|
77
|
+
|
78
|
+
@mpd.disconnect
|
79
|
+
assert_raise(MPD::MPDError) {@mpd.add('Shpongle')}
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_clear
|
83
|
+
@mpd.connect
|
84
|
+
assert @mpd.connected?
|
85
|
+
|
86
|
+
assert @mpd.add('Shpongle')
|
87
|
+
|
88
|
+
pls = @mpd.playlist
|
89
|
+
assert_equal 27, pls.size
|
90
|
+
|
91
|
+
assert @mpd.clear
|
92
|
+
|
93
|
+
pls = @mpd.playlist
|
94
|
+
assert_equal 0, pls.size
|
95
|
+
|
96
|
+
@mpd.disconnect
|
97
|
+
assert_raise(MPD::MPDError) {@mpd.clear}
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_clearerror
|
101
|
+
@mpd.connect
|
102
|
+
assert @mpd.connected?
|
103
|
+
|
104
|
+
assert @mpd.clearerror
|
105
|
+
|
106
|
+
@mpd.disconnect
|
107
|
+
assert_raise(MPD::MPDError) {@mpd.clearerror}
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_crossfade
|
111
|
+
@mpd.connect
|
112
|
+
|
113
|
+
@mpd.crossfade = 40
|
114
|
+
|
115
|
+
assert_equal 40, @mpd.crossfade
|
116
|
+
assert_equal '40', @mpd.status['xfade']
|
117
|
+
|
118
|
+
@mpd.disconnect
|
119
|
+
assert_raise(MPD::MPDError) {@mpd.crossfade = 20}
|
120
|
+
assert_raise(MPD::MPDError) {@mpd.crossfade}
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_current_song
|
124
|
+
@mpd.connect
|
125
|
+
|
126
|
+
s = @mpd.current_song
|
127
|
+
assert_nil s
|
128
|
+
|
129
|
+
assert @mpd.add('Shpongle/Are_You_Shpongled/1.Shpongle_Falls.ogg')
|
130
|
+
|
131
|
+
assert @mpd.play
|
132
|
+
|
133
|
+
sleep 2
|
134
|
+
|
135
|
+
assert @mpd.playing?
|
136
|
+
|
137
|
+
s = @mpd.current_song
|
138
|
+
|
139
|
+
assert_equal 'Shpongle', s.artist
|
140
|
+
assert_equal 'Are You Shpongled?', s.album
|
141
|
+
assert_equal 'Shpongle Falls', s.title
|
142
|
+
assert_equal '1', s.track
|
143
|
+
|
144
|
+
@mpd.stop
|
145
|
+
|
146
|
+
sleep 2
|
147
|
+
|
148
|
+
assert !@mpd.playing?
|
149
|
+
|
150
|
+
s = @mpd.current_song
|
151
|
+
|
152
|
+
assert_equal 'Shpongle', s.artist
|
153
|
+
assert_equal 'Are You Shpongled?', s.album
|
154
|
+
assert_equal 'Shpongle Falls', s.title
|
155
|
+
assert_equal '1', s.track
|
156
|
+
|
157
|
+
@mpd.disconnect
|
158
|
+
assert_raise(MPD::MPDError) {@mpd.current_song}
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_delete
|
162
|
+
@mpd.connect
|
163
|
+
|
164
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
165
|
+
|
166
|
+
assert @mpd.delete(3)
|
167
|
+
|
168
|
+
pls = @mpd.playlist
|
169
|
+
assert_equal 7, pls.size
|
170
|
+
pls.each do |song|
|
171
|
+
assert_not_equal 'No On Ever Dreams', song.title
|
172
|
+
end
|
173
|
+
|
174
|
+
assert_raise(MPD::MPDError) {@mpd.delete(999)}
|
175
|
+
|
176
|
+
@mpd.disconnect
|
177
|
+
assert_raise(MPD::MPDError) {@mpd.delete(3)}
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_deleteid
|
181
|
+
@mpd.connect
|
182
|
+
|
183
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
184
|
+
|
185
|
+
assert @mpd.deleteid(10)
|
186
|
+
|
187
|
+
pls = @mpd.playlist
|
188
|
+
assert_equal 7, pls.size
|
189
|
+
pls.each do |song|
|
190
|
+
assert_not_equal 'No One Ever Dreams', song.title
|
191
|
+
end
|
192
|
+
|
193
|
+
assert_raise(MPD::MPDError) {@mpd.deleteid(999)}
|
194
|
+
|
195
|
+
@mpd.disconnect
|
196
|
+
assert_raise(MPD::MPDError) {@mpd.deleteid(11)}
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_find
|
200
|
+
@mpd.connect
|
201
|
+
|
202
|
+
a = @mpd.find 'album', 'Are You Shpongled?'
|
203
|
+
assert_equal 7, a.size
|
204
|
+
assert_equal 'Shpongle Falls', a[0].title
|
205
|
+
assert_equal 'Monster Hit', a[1].title
|
206
|
+
assert_equal 'Vapour Rumours', a[2].title
|
207
|
+
assert_equal 'Shpongle Spores', a[3].title
|
208
|
+
assert_equal 'Behind Closed Eyelids', a[4].title
|
209
|
+
assert_equal 'Divine Moments of Truth', a[5].title
|
210
|
+
assert_equal '... and the Day Turned to Night', a[6].title
|
211
|
+
|
212
|
+
b = @mpd.find 'artist', 'Carbon Based Lifeforms'
|
213
|
+
assert_equal 11, b.size
|
214
|
+
assert_equal 'Central Plains', b[0].title
|
215
|
+
assert_equal 'Tensor', b[1].title
|
216
|
+
assert_equal 'MOS 6581 (Album Version)', b[2].title
|
217
|
+
assert_equal 'Silent Running', b[3].title
|
218
|
+
assert_equal 'Neurotransmitter', b[4].title
|
219
|
+
assert_equal 'Hydroponic Garden', b[5].title
|
220
|
+
assert_equal 'Exosphere', b[6].title
|
221
|
+
assert_equal 'Comsat', b[7].title
|
222
|
+
assert_equal 'Epicentre (First Movement)', b[8].title
|
223
|
+
assert_equal 'Artificial Island', b[9].title
|
224
|
+
assert_equal 'Refraction 1.33', b[10].title
|
225
|
+
|
226
|
+
c = @mpd.find 'title', 'Silent Running'
|
227
|
+
assert_equal 1, c.size
|
228
|
+
assert_equal 'Silent Running', c[0].title
|
229
|
+
|
230
|
+
d = @mpd.find 'artist', 'no artist'
|
231
|
+
assert_equal 0, d.size
|
232
|
+
|
233
|
+
assert_raise(MPD::MPDError) {@mpd.find('error', 'no-such')}
|
234
|
+
|
235
|
+
@mpd.disconnect
|
236
|
+
assert_raise(MPD::MPDError) {@mpd.find('album', 'Are You Shpongled')}
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_kill
|
240
|
+
@mpd.connect
|
241
|
+
|
242
|
+
assert @mpd.kill
|
243
|
+
|
244
|
+
assert !@mpd.connected?
|
245
|
+
|
246
|
+
assert_raise(MPD::MPDError) {@mpd.kill}
|
247
|
+
end
|
248
|
+
|
249
|
+
def test_albums
|
250
|
+
@mpd.connect
|
251
|
+
|
252
|
+
albums = @mpd.albums
|
253
|
+
|
254
|
+
assert_equal 4, albums.size
|
255
|
+
assert_equal 'Are You Shpongled?', albums[0]
|
256
|
+
assert_equal 'Dancing Galaxy', albums[1]
|
257
|
+
assert_equal 'Hydroponic Garden', albums[2]
|
258
|
+
assert_equal 'Nothing Lasts... But Nothing Is Lost', albums[3]
|
259
|
+
|
260
|
+
sh = @mpd.albums 'Shpongle'
|
261
|
+
|
262
|
+
assert_equal 2, sh.size
|
263
|
+
assert_equal 'Are You Shpongled?', sh[0]
|
264
|
+
assert_equal 'Nothing Lasts... But Nothing Is Lost', sh[1]
|
265
|
+
|
266
|
+
@mpd.disconnect
|
267
|
+
assert_raise(MPD::MPDError) {@mpd.albums}
|
268
|
+
end
|
269
|
+
|
270
|
+
def test_artists
|
271
|
+
@mpd.connect
|
272
|
+
|
273
|
+
artists = @mpd.artists
|
274
|
+
|
275
|
+
assert_equal 3, artists.size
|
276
|
+
assert_equal 'Astral Projection', artists[0]
|
277
|
+
assert_equal 'Carbon Based Lifeforms', artists[1]
|
278
|
+
assert_equal 'Shpongle', artists[2]
|
279
|
+
|
280
|
+
@mpd.disconnect
|
281
|
+
assert_raise(MPD::MPDError) {@mpd.artists}
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_list
|
285
|
+
@mpd.connect
|
286
|
+
|
287
|
+
albums = @mpd.list 'album'
|
288
|
+
|
289
|
+
assert_equal 4, albums.size
|
290
|
+
assert_equal 'Are You Shpongled?', albums[0]
|
291
|
+
assert_equal 'Dancing Galaxy', albums[1]
|
292
|
+
assert_equal 'Hydroponic Garden', albums[2]
|
293
|
+
assert_equal 'Nothing Lasts... But Nothing Is Lost', albums[3]
|
294
|
+
|
295
|
+
artists = @mpd.list 'artist'
|
296
|
+
|
297
|
+
assert_equal 3, artists.size
|
298
|
+
assert_equal 'Astral Projection', artists[0]
|
299
|
+
assert_equal 'Carbon Based Lifeforms', artists[1]
|
300
|
+
assert_equal 'Shpongle', artists[2]
|
301
|
+
|
302
|
+
arg = @mpd.list 'album', 'Shpongle'
|
303
|
+
|
304
|
+
assert_equal 2, arg.size
|
305
|
+
assert_equal 'Are You Shpongled?', arg[0]
|
306
|
+
assert_equal 'Nothing Lasts... But Nothing Is Lost', arg[1]
|
307
|
+
|
308
|
+
assert_raise(MPD::MPDError) {@mpd.list('fail')}
|
309
|
+
assert_raise(MPD::MPDError) {@mpd.list('fail', 'Shpongle')}
|
310
|
+
|
311
|
+
@mpd.disconnect
|
312
|
+
assert_raise(MPD::MPDError) {@mpd.artists}
|
313
|
+
end
|
314
|
+
|
315
|
+
def test_directories
|
316
|
+
@mpd.connect
|
317
|
+
|
318
|
+
dirs = @mpd.directories
|
319
|
+
|
320
|
+
assert_equal 7, dirs.size
|
321
|
+
assert_equal 'Astral_Projection', dirs[0]
|
322
|
+
assert_equal 'Astral_Projection/Dancing_Galaxy', dirs[1]
|
323
|
+
assert_equal 'Carbon_Based_Lifeforms', dirs[2]
|
324
|
+
assert_equal 'Carbon_Based_Lifeforms/Hydroponic_Garden', dirs[3]
|
325
|
+
assert_equal 'Shpongle', dirs[4]
|
326
|
+
assert_equal 'Shpongle/Are_You_Shpongled', dirs[5]
|
327
|
+
assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost', dirs[6]
|
328
|
+
|
329
|
+
shpongle = @mpd.directories 'Shpongle'
|
330
|
+
|
331
|
+
assert_equal 3, shpongle.size
|
332
|
+
assert_equal 'Shpongle', shpongle[0]
|
333
|
+
assert_equal 'Shpongle/Are_You_Shpongled', shpongle[1]
|
334
|
+
assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost', shpongle[2]
|
335
|
+
|
336
|
+
assert_raise(MPD::MPDError) {@mpd.directories('no-dirs')}
|
337
|
+
|
338
|
+
@mpd.disconnect
|
339
|
+
assert_raise(MPD::MPDError) {@mpd.directories}
|
340
|
+
end
|
341
|
+
|
342
|
+
def test_files
|
343
|
+
@mpd.connect
|
344
|
+
|
345
|
+
files = @mpd.files
|
346
|
+
|
347
|
+
assert_equal 46, files.size
|
348
|
+
|
349
|
+
assert_equal 'Astral_Projection/Dancing_Galaxy/1.Dancing_Galaxy.ogg', files[0]
|
350
|
+
assert_equal 'Astral_Projection/Dancing_Galaxy/8.Ambient_Galaxy_(Disco_Valley_Mix).ogg', files[7]
|
351
|
+
assert_equal 'Carbon_Based_Lifeforms/Hydroponic_Garden/01.Central_Plains.ogg', files[8]
|
352
|
+
assert_equal 'Carbon_Based_Lifeforms/Hydroponic_Garden/11.Refraction_1.33.ogg', files[18]
|
353
|
+
assert_equal 'Shpongle/Are_You_Shpongled/1.Shpongle_Falls.ogg', files[19]
|
354
|
+
assert_equal 'Shpongle/Are_You_Shpongled/7...._and_the_Day_Turned_to_Night.ogg', files[25]
|
355
|
+
assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost/01.Botanical_Dimensions.ogg', files[26]
|
356
|
+
assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost/20.Falling_Awake.ogg', files[45]
|
357
|
+
|
358
|
+
sh = @mpd.files 'Shpongle'
|
359
|
+
|
360
|
+
assert_equal 27, sh.size
|
361
|
+
|
362
|
+
assert_equal 'Shpongle/Are_You_Shpongled/1.Shpongle_Falls.ogg', sh[0]
|
363
|
+
assert_equal 'Shpongle/Are_You_Shpongled/7...._and_the_Day_Turned_to_Night.ogg', sh[6]
|
364
|
+
assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost/01.Botanical_Dimensions.ogg', sh[7]
|
365
|
+
assert_equal 'Shpongle/Nothing_Lasts..._But_Nothing_Is_Lost/20.Falling_Awake.ogg', sh[26]
|
366
|
+
|
367
|
+
assert_raise(MPD::MPDError) {@mpd.files('no-files')}
|
368
|
+
|
369
|
+
@mpd.disconnect
|
370
|
+
assert_raise(MPD::MPDError) {@mpd.files}
|
371
|
+
end
|
372
|
+
|
373
|
+
def test_playlists
|
374
|
+
@mpd.connect
|
375
|
+
|
376
|
+
pls = @mpd.playlists
|
377
|
+
|
378
|
+
assert_equal 2, pls.size
|
379
|
+
|
380
|
+
assert_equal 'Shpongle_-_Are_You_Shpongled', pls[0]
|
381
|
+
assert_equal 'Astral_Projection_-_Dancing_Galaxy', pls[1]
|
382
|
+
|
383
|
+
@mpd.disconnect
|
384
|
+
assert_raise(MPD::MPDError) {@mpd.playlists}
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_songs
|
388
|
+
@mpd.connect
|
389
|
+
|
390
|
+
songs = @mpd.songs
|
391
|
+
|
392
|
+
assert_equal 46, songs.size
|
393
|
+
|
394
|
+
assert_equal 'Dancing Galaxy', songs[0].title
|
395
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', songs[7].title
|
396
|
+
assert_equal 'Central Plains', songs[8].title
|
397
|
+
assert_equal 'Refraction 1.33', songs[18].title
|
398
|
+
assert_equal 'Shpongle Falls', songs[19].title
|
399
|
+
assert_equal '... and the Day Turned to Night', songs[25].title
|
400
|
+
assert_equal 'Botanical Dimensions', songs[26].title
|
401
|
+
assert_equal 'Falling Awake', songs[45].title
|
402
|
+
|
403
|
+
sh = @mpd.songs 'Shpongle'
|
404
|
+
|
405
|
+
assert_equal 27, sh.size
|
406
|
+
|
407
|
+
sh.each do |s|
|
408
|
+
assert_equal 'Shpongle', s.artist
|
409
|
+
end
|
410
|
+
|
411
|
+
assert_equal 'Shpongle Falls', sh[0].title
|
412
|
+
assert_equal '... and the Day Turned to Night', sh[6].title
|
413
|
+
assert_equal 'Botanical Dimensions', sh[7].title
|
414
|
+
assert_equal 'Falling Awake', sh[26].title
|
415
|
+
|
416
|
+
assert_raise(MPD::MPDError) {@mpd.songs('no-songs')}
|
417
|
+
|
418
|
+
@mpd.disconnect
|
419
|
+
assert_raise(MPD::MPDError) {@mpd.songs}
|
420
|
+
end
|
421
|
+
|
422
|
+
def test_songs_by_artist
|
423
|
+
@mpd.connect
|
424
|
+
|
425
|
+
songs = @mpd.songs_by_artist 'Shpongle'
|
426
|
+
|
427
|
+
assert_equal 27, songs.size
|
428
|
+
|
429
|
+
songs.each do |s|
|
430
|
+
assert_equal 'Shpongle', s.artist
|
431
|
+
end
|
432
|
+
|
433
|
+
assert_equal 'Shpongle Falls', songs[0].title
|
434
|
+
assert_equal '... and the Day Turned to Night', songs[6].title
|
435
|
+
assert_equal 'Botanical Dimensions', songs[7].title
|
436
|
+
assert_equal 'Falling Awake', songs[26].title
|
437
|
+
|
438
|
+
songs = @mpd.songs_by_artist 'no-songs'
|
439
|
+
assert_equal 0, songs.size
|
440
|
+
|
441
|
+
@mpd.disconnect
|
442
|
+
assert_raise(MPD::MPDError) {@mpd.songs_by_artist('Shpongle')}
|
443
|
+
end
|
444
|
+
|
445
|
+
def test_load
|
446
|
+
@mpd.connect
|
447
|
+
|
448
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
449
|
+
|
450
|
+
pls = @mpd.playlist
|
451
|
+
|
452
|
+
assert_equal 8, pls.size
|
453
|
+
|
454
|
+
pls.each do |song|
|
455
|
+
assert_equal 'Astral Projection', song.artist
|
456
|
+
assert_equal 'Dancing Galaxy', song.album
|
457
|
+
end
|
458
|
+
|
459
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
460
|
+
assert_equal 'Soundform', pls[1].title
|
461
|
+
assert_equal 'Flying Into A Star', pls[2].title
|
462
|
+
assert_equal 'No One Ever Dreams', pls[3].title
|
463
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[4].title
|
464
|
+
assert_equal 'Life On Mars', pls[5].title
|
465
|
+
assert_equal 'Liquid Sun', pls[6].title
|
466
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[7].title
|
467
|
+
|
468
|
+
assert_raise(MPD::MPDError) {@mpd.load('No-PLS')}
|
469
|
+
|
470
|
+
@mpd.disconnect
|
471
|
+
assert_raise(MPD::MPDError) {@mpd.load('Astral_Projection_-_Dancing_Galaxy')}
|
472
|
+
end
|
473
|
+
|
474
|
+
def test_move
|
475
|
+
@mpd.connect
|
476
|
+
|
477
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
478
|
+
|
479
|
+
assert @mpd.move( 3, 1 )
|
480
|
+
|
481
|
+
pls = @mpd.playlist
|
482
|
+
|
483
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
484
|
+
assert_equal 'No One Ever Dreams', pls[1].title
|
485
|
+
assert_equal 'Soundform', pls[2].title
|
486
|
+
assert_equal 'Flying Into A Star', pls[3].title
|
487
|
+
|
488
|
+
assert @mpd.move( 2, 7 )
|
489
|
+
|
490
|
+
pls = @mpd.playlist
|
491
|
+
|
492
|
+
assert_equal 'No One Ever Dreams', pls[1].title
|
493
|
+
assert_equal 'Flying Into A Star', pls[2].title
|
494
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[3].title
|
495
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[6].title
|
496
|
+
assert_equal 'Soundform', pls[7].title
|
497
|
+
|
498
|
+
assert_raise(MPD::MPDError) {@mpd.move(999,1)}
|
499
|
+
|
500
|
+
@mpd.disconnect
|
501
|
+
assert_raise(MPD::MPDError) {@mpd.move(3,1)}
|
502
|
+
end
|
503
|
+
|
504
|
+
def test_moveid
|
505
|
+
@mpd.connect
|
506
|
+
|
507
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
508
|
+
|
509
|
+
assert @mpd.moveid( 10, 1 )
|
510
|
+
|
511
|
+
pls = @mpd.playlist
|
512
|
+
|
513
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
514
|
+
assert_equal 'No One Ever Dreams', pls[1].title
|
515
|
+
assert_equal 'Soundform', pls[2].title
|
516
|
+
assert_equal 'Flying Into A Star', pls[3].title
|
517
|
+
|
518
|
+
assert @mpd.moveid( 8, 7 )
|
519
|
+
|
520
|
+
pls = @mpd.playlist
|
521
|
+
|
522
|
+
assert_equal 'No One Ever Dreams', pls[1].title
|
523
|
+
assert_equal 'Flying Into A Star', pls[2].title
|
524
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[3].title
|
525
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[6].title
|
526
|
+
assert_equal 'Soundform', pls[7].title
|
527
|
+
|
528
|
+
assert_raise(MPD::MPDError) {@mpd.moveid(999,1)}
|
529
|
+
|
530
|
+
@mpd.disconnect
|
531
|
+
assert_raise(MPD::MPDError) {@mpd.moveid(10,1)}
|
532
|
+
|
533
|
+
end
|
534
|
+
|
535
|
+
def test_next
|
536
|
+
@mpd.connect
|
537
|
+
|
538
|
+
@mpd.load 'Astral_Projection_-_Dancing_Galaxy'
|
539
|
+
|
540
|
+
@mpd.play 3
|
541
|
+
|
542
|
+
pos = @mpd.status['song'].to_i
|
543
|
+
|
544
|
+
assert @mpd.next
|
545
|
+
|
546
|
+
assert_equal pos + 1, @mpd.status['song'].to_i
|
547
|
+
|
548
|
+
@mpd.disconnect
|
549
|
+
assert_raise(MPD::MPDError) {@mpd.next}
|
550
|
+
end
|
551
|
+
|
552
|
+
def test_pause
|
553
|
+
@mpd.connect
|
554
|
+
assert @mpd.connected?
|
555
|
+
|
556
|
+
@mpd.load 'Astral_Projection_-_Dancing_Galaxy'
|
557
|
+
|
558
|
+
assert @mpd.play
|
559
|
+
assert @mpd.playing?
|
560
|
+
|
561
|
+
@mpd.pause = true
|
562
|
+
assert @mpd.paused?
|
563
|
+
|
564
|
+
@mpd.pause = false
|
565
|
+
assert !@mpd.paused?
|
566
|
+
|
567
|
+
assert @mpd.stop
|
568
|
+
assert @mpd.stopped?
|
569
|
+
|
570
|
+
@mpd.pause = true
|
571
|
+
assert @mpd.stopped?
|
572
|
+
|
573
|
+
assert !@mpd.paused?
|
574
|
+
|
575
|
+
@mpd.disconnect
|
576
|
+
assert_raise(MPD::MPDError) {@mpd.pause = true}
|
577
|
+
assert_raise(MPD::MPDError) {@mpd.paused?}
|
578
|
+
end
|
579
|
+
|
580
|
+
def test_password
|
581
|
+
@mpd.connect
|
582
|
+
|
583
|
+
assert_raise(MPD::MPDError) {@mpd.password('wrong')}
|
584
|
+
|
585
|
+
assert @mpd.password('test')
|
586
|
+
|
587
|
+
@mpd.disconnect
|
588
|
+
assert_raise(MPD::MPDError) {@mpd.password('test')}
|
589
|
+
end
|
590
|
+
|
591
|
+
def test_ping
|
592
|
+
@mpd.connect
|
593
|
+
|
594
|
+
assert @mpd.ping
|
595
|
+
|
596
|
+
@mpd.disconnect
|
597
|
+
assert_raise(MPD::MPDError) {@mpd.ping}
|
598
|
+
end
|
599
|
+
|
600
|
+
def test_play
|
601
|
+
@mpd.connect
|
602
|
+
assert @mpd.connected?
|
603
|
+
|
604
|
+
@mpd.load 'Astral_Projection_-_Dancing_Galaxy'
|
605
|
+
|
606
|
+
assert @mpd.play
|
607
|
+
|
608
|
+
sleep 2
|
609
|
+
|
610
|
+
assert @mpd.playing?
|
611
|
+
|
612
|
+
song = @mpd.current_song
|
613
|
+
|
614
|
+
assert_equal 'Dancing Galaxy', song.title
|
615
|
+
|
616
|
+
assert @mpd.play(2)
|
617
|
+
|
618
|
+
sleep 2
|
619
|
+
|
620
|
+
assert @mpd.playing?
|
621
|
+
|
622
|
+
song = @mpd.current_song
|
623
|
+
|
624
|
+
assert_equal 'Flying Into A Star', song.title
|
625
|
+
|
626
|
+
@mpd.disconnect
|
627
|
+
assert_raise(MPD::MPDError) {@mpd.play}
|
628
|
+
assert_raise(MPD::MPDError) {@mpd.playing?}
|
629
|
+
end
|
630
|
+
|
631
|
+
def test_playid
|
632
|
+
@mpd.connect
|
633
|
+
assert @mpd.connected?
|
634
|
+
|
635
|
+
@mpd.load 'Astral_Projection_-_Dancing_Galaxy'
|
636
|
+
|
637
|
+
assert @mpd.playid
|
638
|
+
|
639
|
+
sleep 2
|
640
|
+
|
641
|
+
assert @mpd.playing?
|
642
|
+
|
643
|
+
song = @mpd.current_song
|
644
|
+
|
645
|
+
assert_equal 'Dancing Galaxy', song.title
|
646
|
+
|
647
|
+
assert @mpd.playid(9)
|
648
|
+
|
649
|
+
sleep 2
|
650
|
+
|
651
|
+
assert @mpd.playing?
|
652
|
+
|
653
|
+
song = @mpd.current_song
|
654
|
+
|
655
|
+
assert_equal 'Flying Into A Star', song.title
|
656
|
+
|
657
|
+
@mpd.disconnect
|
658
|
+
assert_raise(MPD::MPDError) {@mpd.playid}
|
659
|
+
assert_raise(MPD::MPDError) {@mpd.playing?}
|
660
|
+
|
661
|
+
end
|
662
|
+
|
663
|
+
def test_playlist_version
|
664
|
+
@mpd.connect
|
665
|
+
|
666
|
+
ver = @mpd.playlist_version
|
667
|
+
|
668
|
+
assert_equal 1, ver
|
669
|
+
|
670
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
671
|
+
|
672
|
+
ver = @mpd.playlist_version
|
673
|
+
|
674
|
+
assert_equal 9, ver
|
675
|
+
|
676
|
+
@mpd.disconnect
|
677
|
+
assert_raise(MPD::MPDError) {@mpd.playlist_version}
|
678
|
+
end
|
679
|
+
|
680
|
+
def test_playlist
|
681
|
+
@mpd.connect
|
682
|
+
|
683
|
+
pls = @mpd.playlist
|
684
|
+
|
685
|
+
assert_equal 0, pls.size
|
686
|
+
|
687
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
688
|
+
|
689
|
+
pls = @mpd.playlist
|
690
|
+
|
691
|
+
assert_equal 8, pls.size
|
692
|
+
|
693
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
694
|
+
assert_equal 'Soundform', pls[1].title
|
695
|
+
assert_equal 'Flying Into A Star', pls[2].title
|
696
|
+
assert_equal 'No One Ever Dreams', pls[3].title
|
697
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[4].title
|
698
|
+
assert_equal 'Life On Mars', pls[5].title
|
699
|
+
assert_equal 'Liquid Sun', pls[6].title
|
700
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[7].title
|
701
|
+
|
702
|
+
@mpd.disconnect
|
703
|
+
assert_raise(MPD::MPDError) {@mpd.playlist}
|
704
|
+
end
|
705
|
+
|
706
|
+
def test_song_at_pos
|
707
|
+
@mpd.connect
|
708
|
+
|
709
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
710
|
+
|
711
|
+
assert_equal 'Dancing Galaxy', @mpd.song_at_pos(0).title
|
712
|
+
assert_equal 'Soundform', @mpd.song_at_pos(1).title
|
713
|
+
assert_equal 'Flying Into A Star', @mpd.song_at_pos(2).title
|
714
|
+
assert_equal 'No One Ever Dreams', @mpd.song_at_pos(3).title
|
715
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', @mpd.song_at_pos(4).title
|
716
|
+
assert_equal 'Life On Mars', @mpd.song_at_pos(5).title
|
717
|
+
assert_equal 'Liquid Sun', @mpd.song_at_pos(6).title
|
718
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', @mpd.song_at_pos(7).title
|
719
|
+
|
720
|
+
assert_raise(MPD::MPDError) {@mpd.song_at_pos(999)}
|
721
|
+
|
722
|
+
@mpd.disconnect
|
723
|
+
assert_raise(MPD::MPDError) {@mpd.song_at_pos(0)}
|
724
|
+
end
|
725
|
+
|
726
|
+
def test_song_with_id
|
727
|
+
@mpd.connect
|
728
|
+
|
729
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
730
|
+
|
731
|
+
assert_equal 'Dancing Galaxy', @mpd.song_with_id(7).title
|
732
|
+
assert_equal 'Soundform', @mpd.song_with_id(8).title
|
733
|
+
assert_equal 'Flying Into A Star', @mpd.song_with_id(9).title
|
734
|
+
assert_equal 'No One Ever Dreams', @mpd.song_with_id(10).title
|
735
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', @mpd.song_with_id(11).title
|
736
|
+
assert_equal 'Life On Mars', @mpd.song_with_id(12).title
|
737
|
+
assert_equal 'Liquid Sun', @mpd.song_with_id(13).title
|
738
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', @mpd.song_with_id(14).title
|
739
|
+
|
740
|
+
assert_raise(MPD::MPDError) {@mpd.song_with_id(999)}
|
741
|
+
|
742
|
+
@mpd.disconnect
|
743
|
+
assert_raise(MPD::MPDError) {@mpd.song_with_id(10)}
|
744
|
+
end
|
745
|
+
|
746
|
+
def test_playlist_changes
|
747
|
+
@mpd.connect
|
748
|
+
|
749
|
+
assert @mpd.add('Astral_Projection')
|
750
|
+
|
751
|
+
changes = @mpd.playlist_changes 8
|
752
|
+
|
753
|
+
assert_equal 1, changes.size
|
754
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', changes[0].title
|
755
|
+
|
756
|
+
changes = @mpd.playlist_changes 1
|
757
|
+
|
758
|
+
assert_equal 8, changes.size
|
759
|
+
assert_equal 'Dancing Galaxy', changes[0].title
|
760
|
+
assert_equal 'Soundform', changes[1].title
|
761
|
+
assert_equal 'Flying Into A Star', changes[2].title
|
762
|
+
assert_equal 'No One Ever Dreams', changes[3].title
|
763
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', changes[4].title
|
764
|
+
assert_equal 'Life On Mars', changes[5].title
|
765
|
+
assert_equal 'Liquid Sun', changes[6].title
|
766
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', changes[7].title
|
767
|
+
|
768
|
+
changes = @mpd.playlist_changes 999
|
769
|
+
|
770
|
+
assert_equal 8, changes.size
|
771
|
+
|
772
|
+
@mpd.disconnect
|
773
|
+
assert_raise(MPD::MPDError) {@mpd.playlist_changes(9)}
|
774
|
+
end
|
775
|
+
|
776
|
+
def test_previous
|
777
|
+
@mpd.connect
|
778
|
+
|
779
|
+
@mpd.load 'Astral_Projection_-_Dancing_Galaxy'
|
780
|
+
|
781
|
+
@mpd.play 3
|
782
|
+
|
783
|
+
sleep 2
|
784
|
+
|
785
|
+
assert @mpd.playing?
|
786
|
+
|
787
|
+
pos = @mpd.status['song'].to_i
|
788
|
+
|
789
|
+
assert @mpd.previous
|
790
|
+
|
791
|
+
assert_equal pos - 1, @mpd.status['song'].to_i
|
792
|
+
|
793
|
+
@mpd.disconnect
|
794
|
+
assert_raise(MPD::MPDError) {@mpd.previous}
|
795
|
+
end
|
796
|
+
|
797
|
+
def test_random
|
798
|
+
@mpd.connect
|
799
|
+
|
800
|
+
@mpd.random = true
|
801
|
+
assert @mpd.random?
|
802
|
+
|
803
|
+
@mpd.random = false
|
804
|
+
assert !@mpd.random?
|
805
|
+
|
806
|
+
@mpd.disconnect
|
807
|
+
assert_raise(MPD::MPDError) {@mpd.random = false}
|
808
|
+
assert_raise(MPD::MPDError) {@mpd.random?}
|
809
|
+
end
|
810
|
+
|
811
|
+
def test_repeat
|
812
|
+
@mpd.connect
|
813
|
+
|
814
|
+
@mpd.repeat = true
|
815
|
+
assert @mpd.repeat?
|
816
|
+
|
817
|
+
@mpd.repeat = false
|
818
|
+
assert !@mpd.repeat?
|
819
|
+
|
820
|
+
@mpd.disconnect
|
821
|
+
assert_raise(MPD::MPDError) {@mpd.repeat = false}
|
822
|
+
assert_raise(MPD::MPDError) {@mpd.repeat?}
|
823
|
+
end
|
824
|
+
|
825
|
+
def test_rm
|
826
|
+
@mpd.connect
|
827
|
+
|
828
|
+
assert @mpd.rm('Astral_Projection_-_Dancing_Galaxy')
|
829
|
+
|
830
|
+
pls = @mpd.playlists
|
831
|
+
|
832
|
+
assert 1, pls.size
|
833
|
+
|
834
|
+
assert_equal 'Shpongle_-_Are_You_Shpongled', pls[0]
|
835
|
+
|
836
|
+
assert_raise(MPD::MPDError) {@mpd.rm('Not-Exist')}
|
837
|
+
|
838
|
+
@mpd.disconnect
|
839
|
+
assert_raise(MPD::MPDError) {@mpd.rm('Astral_Projection_-_Dancing_Galaxy')}
|
840
|
+
end
|
841
|
+
|
842
|
+
def test_save
|
843
|
+
@mpd.connect
|
844
|
+
|
845
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
846
|
+
assert @mpd.load('Shpongle_-_Are_You_Shpongled')
|
847
|
+
|
848
|
+
assert @mpd.save('UnitTests')
|
849
|
+
|
850
|
+
assert @mpd.clear
|
851
|
+
|
852
|
+
assert @mpd.load('UnitTests')
|
853
|
+
|
854
|
+
pls = @mpd.playlist
|
855
|
+
|
856
|
+
assert_equal 15, pls.size
|
857
|
+
|
858
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
859
|
+
assert_equal 'Soundform', pls[1].title
|
860
|
+
assert_equal 'Flying Into A Star', pls[2].title
|
861
|
+
assert_equal 'No One Ever Dreams', pls[3].title
|
862
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[4].title
|
863
|
+
assert_equal 'Life On Mars', pls[5].title
|
864
|
+
assert_equal 'Liquid Sun', pls[6].title
|
865
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[7].title
|
866
|
+
assert_equal 'Shpongle Falls', pls[8].title
|
867
|
+
assert_equal 'Monster Hit', pls[9].title
|
868
|
+
assert_equal 'Vapour Rumours', pls[10].title
|
869
|
+
assert_equal 'Shpongle Spores', pls[11].title
|
870
|
+
assert_equal 'Behind Closed Eyelids', pls[12].title
|
871
|
+
assert_equal 'Divine Moments of Truth', pls[13].title
|
872
|
+
assert_equal '... and the Day Turned to Night', pls[14].title
|
873
|
+
|
874
|
+
@mpd.disconnect
|
875
|
+
assert_raise(MPD::MPDError) {@mpd.save('test')}
|
876
|
+
end
|
877
|
+
|
878
|
+
def test_search
|
879
|
+
@mpd.connect
|
880
|
+
|
881
|
+
a = @mpd.search 'album', 'ydroponic gar'
|
882
|
+
|
883
|
+
assert_equal 11, a.size
|
884
|
+
a.each do |song|
|
885
|
+
assert_equal 'Carbon Based Lifeforms', song.artist
|
886
|
+
assert_equal 'Hydroponic Garden', song.album
|
887
|
+
end
|
888
|
+
|
889
|
+
b = @mpd.search 'artist', 'hpon'
|
890
|
+
|
891
|
+
assert_equal 27, b.size
|
892
|
+
b.each do |song|
|
893
|
+
assert_equal 'Shpongle', song.artist
|
894
|
+
end
|
895
|
+
|
896
|
+
c = @mpd.search 'title', 'falls'
|
897
|
+
assert_equal 1, c.size
|
898
|
+
assert_equal 'Shpongle', c[0].artist
|
899
|
+
assert_equal 'Shpongle Falls', c[0].title
|
900
|
+
assert_equal 'Are You Shpongled?', c[0].album
|
901
|
+
|
902
|
+
d = @mpd.search 'filename', 'disco_valley'
|
903
|
+
assert_equal 1, d.size
|
904
|
+
assert_equal 'Astral Projection', d[0].artist
|
905
|
+
assert_equal 'Dancing Galaxy', d[0].album
|
906
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', d[0].title
|
907
|
+
|
908
|
+
z = @mpd.search 'title', 'no-title'
|
909
|
+
assert_equal 0, z.size
|
910
|
+
|
911
|
+
assert_raise(MPD::MPDError) {@mpd.search('error', 'nosuch')}
|
912
|
+
|
913
|
+
@mpd.disconnect
|
914
|
+
assert_raise(MPD::MPDError) {@mpd.search('artist','searching')}
|
915
|
+
end
|
916
|
+
|
917
|
+
def test_seek
|
918
|
+
@mpd.connect
|
919
|
+
|
920
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
921
|
+
|
922
|
+
assert @mpd.play
|
923
|
+
|
924
|
+
sleep 2
|
925
|
+
|
926
|
+
assert @mpd.pause = true
|
927
|
+
|
928
|
+
sleep 2
|
929
|
+
|
930
|
+
assert @mpd.seek(2, 200)
|
931
|
+
|
932
|
+
sleep 2
|
933
|
+
|
934
|
+
song = @mpd.current_song
|
935
|
+
|
936
|
+
assert_equal 'Flying Into A Star', song.title
|
937
|
+
|
938
|
+
status = @mpd.status
|
939
|
+
|
940
|
+
assert_equal '200:585', status['time']
|
941
|
+
|
942
|
+
@mpd.disconnect
|
943
|
+
assert_raise(MPD::MPDError) {@mpd.seek(1, 100)}
|
944
|
+
end
|
945
|
+
|
946
|
+
def test_seekid
|
947
|
+
@mpd.connect
|
948
|
+
|
949
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
950
|
+
|
951
|
+
assert @mpd.play
|
952
|
+
|
953
|
+
sleep 2
|
954
|
+
|
955
|
+
assert @mpd.pause = true
|
956
|
+
|
957
|
+
sleep 2
|
958
|
+
|
959
|
+
assert @mpd.seekid(9, 200)
|
960
|
+
|
961
|
+
sleep 2
|
962
|
+
|
963
|
+
song = @mpd.current_song
|
964
|
+
|
965
|
+
assert_equal 'Flying Into A Star', song.title
|
966
|
+
|
967
|
+
status = @mpd.status
|
968
|
+
|
969
|
+
assert_equal '200:585', status['time']
|
970
|
+
|
971
|
+
@mpd.disconnect
|
972
|
+
assert_raise(MPD::MPDError) {@mpd.seekid(1, 100)}
|
973
|
+
end
|
974
|
+
|
975
|
+
def test_volume
|
976
|
+
@mpd.connect
|
977
|
+
|
978
|
+
vol = @mpd.volume
|
979
|
+
|
980
|
+
@mpd.volume = 30
|
981
|
+
assert_equal 30, @mpd.volume
|
982
|
+
|
983
|
+
@mpd.volume = vol
|
984
|
+
assert_equal vol, @mpd.volume
|
985
|
+
|
986
|
+
@mpd.disconnect
|
987
|
+
assert_raise(MPD::MPDError) {@mpd.volume = 10}
|
988
|
+
assert_raise(MPD::MPDError) {@mpd.volume}
|
989
|
+
end
|
990
|
+
|
991
|
+
def test_shuffle
|
992
|
+
@mpd.connect
|
993
|
+
|
994
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
995
|
+
|
996
|
+
assert @mpd.shuffle
|
997
|
+
|
998
|
+
pls = @mpd.playlist
|
999
|
+
|
1000
|
+
assert_equal 8, pls.size
|
1001
|
+
assert_not_equal 'Dancing Galaxy', pls[0].title
|
1002
|
+
|
1003
|
+
@mpd.disconnect
|
1004
|
+
assert_raise(MPD::MPDError) {@mpd.shuffle}
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
def test_stats
|
1008
|
+
@mpd.connect
|
1009
|
+
|
1010
|
+
stats = @mpd.stats
|
1011
|
+
|
1012
|
+
assert_equal '3', stats['artists']
|
1013
|
+
assert_equal '4', stats['albums']
|
1014
|
+
assert_equal '46', stats['songs']
|
1015
|
+
assert_equal '500', stats['uptime']
|
1016
|
+
|
1017
|
+
@mpd.disconnect
|
1018
|
+
assert_raise(MPD::MPDError) {@mpd.stats}
|
1019
|
+
end
|
1020
|
+
|
1021
|
+
def test_status
|
1022
|
+
@mpd.connect
|
1023
|
+
|
1024
|
+
status = @mpd.status
|
1025
|
+
|
1026
|
+
assert_equal 'stop', status['state']
|
1027
|
+
assert_equal '0', status['repeat']
|
1028
|
+
assert_equal '0', status['random']
|
1029
|
+
|
1030
|
+
@mpd.disconnect
|
1031
|
+
assert_raise(MPD::MPDError) {@mpd.status}
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
def test_stop
|
1035
|
+
@mpd.connect
|
1036
|
+
assert @mpd.connected?
|
1037
|
+
|
1038
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
1039
|
+
|
1040
|
+
assert @mpd.play
|
1041
|
+
assert @mpd.playing?
|
1042
|
+
|
1043
|
+
assert @mpd.stop
|
1044
|
+
assert @mpd.stopped?
|
1045
|
+
|
1046
|
+
assert !@mpd.playing?
|
1047
|
+
|
1048
|
+
@mpd.disconnect
|
1049
|
+
assert_raise(MPD::MPDError) {@mpd.stop}
|
1050
|
+
assert_raise(MPD::MPDError) {@mpd.stopped?}
|
1051
|
+
end
|
1052
|
+
|
1053
|
+
def test_swap
|
1054
|
+
@mpd.connect
|
1055
|
+
|
1056
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
1057
|
+
|
1058
|
+
assert @mpd.swap(2,5)
|
1059
|
+
|
1060
|
+
pls = @mpd.playlist
|
1061
|
+
|
1062
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
1063
|
+
assert_equal 'Soundform', pls[1].title
|
1064
|
+
assert_equal 'Flying Into A Star', pls[5].title
|
1065
|
+
assert_equal 'No One Ever Dreams', pls[3].title
|
1066
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[4].title
|
1067
|
+
assert_equal 'Life On Mars', pls[2].title
|
1068
|
+
assert_equal 'Liquid Sun', pls[6].title
|
1069
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[7].title
|
1070
|
+
|
1071
|
+
assert @mpd.swap(7,1)
|
1072
|
+
|
1073
|
+
pls = @mpd.playlist
|
1074
|
+
|
1075
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
1076
|
+
assert_equal 'Soundform', pls[7].title
|
1077
|
+
assert_equal 'Flying Into A Star', pls[5].title
|
1078
|
+
assert_equal 'No One Ever Dreams', pls[3].title
|
1079
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[4].title
|
1080
|
+
assert_equal 'Life On Mars', pls[2].title
|
1081
|
+
assert_equal 'Liquid Sun', pls[6].title
|
1082
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[1].title
|
1083
|
+
|
1084
|
+
assert_raise(MPD::MPDError) {@mpd.swap(999,1)}
|
1085
|
+
|
1086
|
+
@mpd.disconnect
|
1087
|
+
assert_raise(MPD::MPDError) {@mpd.swap(2, 5)}
|
1088
|
+
end
|
1089
|
+
|
1090
|
+
def test_swapid
|
1091
|
+
@mpd.connect
|
1092
|
+
|
1093
|
+
assert @mpd.load('Astral_Projection_-_Dancing_Galaxy')
|
1094
|
+
|
1095
|
+
assert @mpd.swapid(9,12)
|
1096
|
+
|
1097
|
+
pls = @mpd.playlist
|
1098
|
+
|
1099
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
1100
|
+
assert_equal 'Soundform', pls[1].title
|
1101
|
+
assert_equal 'Flying Into A Star', pls[5].title
|
1102
|
+
assert_equal 'No One Ever Dreams', pls[3].title
|
1103
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[4].title
|
1104
|
+
assert_equal 'Life On Mars', pls[2].title
|
1105
|
+
assert_equal 'Liquid Sun', pls[6].title
|
1106
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[7].title
|
1107
|
+
|
1108
|
+
assert @mpd.swapid(14,8)
|
1109
|
+
|
1110
|
+
pls = @mpd.playlist
|
1111
|
+
|
1112
|
+
assert_equal 'Dancing Galaxy', pls[0].title
|
1113
|
+
assert_equal 'Soundform', pls[7].title
|
1114
|
+
assert_equal 'Flying Into A Star', pls[5].title
|
1115
|
+
assert_equal 'No One Ever Dreams', pls[3].title
|
1116
|
+
assert_equal 'Cosmic Ascension (ft. DJ Jorg)', pls[4].title
|
1117
|
+
assert_equal 'Life On Mars', pls[2].title
|
1118
|
+
assert_equal 'Liquid Sun', pls[6].title
|
1119
|
+
assert_equal 'Ambient Galaxy (Disco Valley Mix)', pls[1].title
|
1120
|
+
|
1121
|
+
assert_raise(MPD::MPDError) {@mpd.swapid(999,8)}
|
1122
|
+
|
1123
|
+
@mpd.disconnect
|
1124
|
+
assert_raise(MPD::MPDError) {@mpd.swapid(9, 12)}
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def test_update
|
1128
|
+
@mpd.connect
|
1129
|
+
|
1130
|
+
ret = @mpd.update
|
1131
|
+
|
1132
|
+
assert_equal 1, ret
|
1133
|
+
|
1134
|
+
status = @mpd.status
|
1135
|
+
|
1136
|
+
assert_equal '1', status['updating_db']
|
1137
|
+
|
1138
|
+
status = @mpd.status
|
1139
|
+
|
1140
|
+
assert_nil status['updating_db']
|
1141
|
+
|
1142
|
+
@mpd.disconnect
|
1143
|
+
assert_raise(MPD::MPDError) {@mpd.update}
|
1144
|
+
end
|
1145
|
+
end
|