o-mpd_client 0.2.0.1
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 +7 -0
- data/.gitignore +17 -0
- data/.hound.yml +2 -0
- data/.rubocop.yml +30 -0
- data/.travis.yml +10 -0
- data/CHANGELOG.md +44 -0
- data/Gemfile +16 -0
- data/LICENSE +22 -0
- data/MPD_COMMANDS.md +653 -0
- data/README.md +148 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/examples/Gemfile +5 -0
- data/examples/albumart.rb +18 -0
- data/examples/client.rb +17 -0
- data/examples/idle.rb +27 -0
- data/examples/range.rb +22 -0
- data/examples/rangeid.rb +26 -0
- data/examples/search_and_replace_playlist.rb +44 -0
- data/examples/stickers.rb +53 -0
- data/lib/mpd_client/version.rb +7 -0
- data/lib/mpd_client.rb +549 -0
- data/mpd_client.gemspec +25 -0
- data/spec/mpd_client/mpd_client_spec.rb +17 -0
- data/spec/spec_helper.rb +8 -0
- metadata +85 -0
data/README.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# MPD::Client
|
|
2
|
+
|
|
3
|
+
[](https://travis-ci.org/mamantoha/mpd_client)
|
|
4
|
+
[](https://badge.fury.io/rb/mpd_client)
|
|
5
|
+
|
|
6
|
+
Yet another Music Player Daemon (MPD) client library written entirely in Ruby.
|
|
7
|
+
`mpd_client` is a Ruby port of the [python-mpd](https://github.com/Mic92/python-mpd2) library.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Add this line to your application `Gemfile`:
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
gem 'mpd_client'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
And then execute:
|
|
18
|
+
|
|
19
|
+
```console
|
|
20
|
+
bundle
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Or install it yourself as:
|
|
24
|
+
|
|
25
|
+
```console
|
|
26
|
+
gem install mpd_client
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
All functionality is contained in the `MPD::Client` class. Creating an instance of this class is as simple as:
|
|
32
|
+
|
|
33
|
+
```ruby
|
|
34
|
+
require 'mpd_client'
|
|
35
|
+
|
|
36
|
+
client = MPD::Client.new
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Once you have an instance of the `MPD::Client` class, start by connecting to the server:
|
|
40
|
+
|
|
41
|
+
```ruby
|
|
42
|
+
client.connect('localhost', 6600)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
or Unix domain socket
|
|
46
|
+
|
|
47
|
+
```ruby
|
|
48
|
+
client.connect('/var/run/mpd/socket')
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The client library can be used as follows:
|
|
52
|
+
|
|
53
|
+
```ruby
|
|
54
|
+
puts client.mpd_version # print the mpd version
|
|
55
|
+
puts client.search('title', 'ruby') # print the result of the command 'search title ruby'
|
|
56
|
+
client.close # send the close command
|
|
57
|
+
client.disconect # disconnect from the server
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Command lists are also supported using `command_list_ok_begin` and `command_list_end`:
|
|
61
|
+
|
|
62
|
+
```ruby
|
|
63
|
+
client.command_list_ok_begin # start a command list
|
|
64
|
+
client.update # insert the update command into the list
|
|
65
|
+
client.status # insert the status command into the list
|
|
66
|
+
client.command_list_end # result will be a Array with the results
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Binary responses
|
|
70
|
+
|
|
71
|
+
Some commands can return binary data.
|
|
72
|
+
|
|
73
|
+
```ruby
|
|
74
|
+
require 'mpd_client'
|
|
75
|
+
|
|
76
|
+
client = MPD::Client.new
|
|
77
|
+
client.connect('localhost', 6600)
|
|
78
|
+
|
|
79
|
+
if (current_song = client.currentsong)
|
|
80
|
+
data, io = client.readpicture(current_song['file'])
|
|
81
|
+
io # StringIO
|
|
82
|
+
data # => {"size"=>"322860", "type"=>"image/jpeg", "binary"=>"3372"}
|
|
83
|
+
File.write('cover.jpg', io.string)
|
|
84
|
+
end
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The above will locate album art for the current song and save image to `cover.jpg` file.
|
|
88
|
+
|
|
89
|
+
### Ranges
|
|
90
|
+
|
|
91
|
+
Some commands(e.g. `move`, `delete`, `load`, `shuffle`, `playlistinfo`) support integer ranges(`[START:END]`) as argument. This is done in `mpd_client` by using two element array:
|
|
92
|
+
|
|
93
|
+
```ruby
|
|
94
|
+
# move the first three songs after the fifth number in the playlist
|
|
95
|
+
client.move([0, 3], 5)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Second element can be omitted. MPD will assumes the biggest possible number then:
|
|
99
|
+
|
|
100
|
+
```ruby
|
|
101
|
+
# delete all songs from the current playlist, except for the firts ten
|
|
102
|
+
client.delete([10,])
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Logging
|
|
106
|
+
|
|
107
|
+
Default logger for all MPD::Client instances:
|
|
108
|
+
|
|
109
|
+
```ruby
|
|
110
|
+
require 'logger'
|
|
111
|
+
require 'mpd_client'
|
|
112
|
+
|
|
113
|
+
MPD::Client.log = Logger.new($stderr)
|
|
114
|
+
|
|
115
|
+
client = MPD::Client.new
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Sets the logger used by this instance of MPD::Client:
|
|
119
|
+
|
|
120
|
+
```ruby
|
|
121
|
+
require 'logger'
|
|
122
|
+
require 'mpd_client'
|
|
123
|
+
|
|
124
|
+
client = MPD::Client.new
|
|
125
|
+
client.log = Logger.new($stderr)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
For more information about logging configuration, see [Logger](https://ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger.html)
|
|
129
|
+
|
|
130
|
+
## Development
|
|
131
|
+
|
|
132
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
133
|
+
|
|
134
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
|
135
|
+
|
|
136
|
+
## Contributing
|
|
137
|
+
|
|
138
|
+
1. Fork it
|
|
139
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
140
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
|
141
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
142
|
+
5. Create new Pull Request
|
|
143
|
+
|
|
144
|
+
## License and Author
|
|
145
|
+
|
|
146
|
+
Copyright (c) 2012-2022 by Anton Maminov
|
|
147
|
+
|
|
148
|
+
This library is distributed under the MIT license. Please see the LICENSE file.
|
data/bin/console
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require 'bundler/setup'
|
|
5
|
+
require 'mpd_client'
|
|
6
|
+
|
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
|
9
|
+
|
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
11
|
+
# require "pry"
|
|
12
|
+
# Pry.start
|
|
13
|
+
|
|
14
|
+
require 'irb'
|
|
15
|
+
IRB.start
|
data/bin/setup
ADDED
data/examples/Gemfile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler.setup :default
|
|
5
|
+
|
|
6
|
+
require 'logger'
|
|
7
|
+
require 'mpd_client'
|
|
8
|
+
|
|
9
|
+
# MPD::Client.log = Logger.new($stderr)
|
|
10
|
+
|
|
11
|
+
client = MPD::Client.new
|
|
12
|
+
client.connect('localhost', 6600)
|
|
13
|
+
|
|
14
|
+
if (current_song = client.currentsong)
|
|
15
|
+
data, io = client.readpicture(current_song['file'])
|
|
16
|
+
puts data
|
|
17
|
+
File.write('cover.jpg', io.string)
|
|
18
|
+
end
|
data/examples/client.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler.setup :default
|
|
5
|
+
|
|
6
|
+
require 'logger'
|
|
7
|
+
require 'mpd_client'
|
|
8
|
+
|
|
9
|
+
MPD::Client.log = Logger.new($stderr)
|
|
10
|
+
|
|
11
|
+
client = MPD::Client.new
|
|
12
|
+
client.connect('localhost', 6600)
|
|
13
|
+
|
|
14
|
+
puts client.stats
|
|
15
|
+
puts client.status
|
|
16
|
+
puts client.currentsong
|
|
17
|
+
puts client.playlistinfo
|
data/examples/idle.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler.setup :default
|
|
5
|
+
|
|
6
|
+
require 'logger'
|
|
7
|
+
require 'mpd_client'
|
|
8
|
+
|
|
9
|
+
client = MPD::Client.new
|
|
10
|
+
|
|
11
|
+
client = MPD::Client.new
|
|
12
|
+
client.log = Logger.new($stderr)
|
|
13
|
+
|
|
14
|
+
client.connect('localhost', 6600)
|
|
15
|
+
|
|
16
|
+
# Lists all changed systems:
|
|
17
|
+
# database, update, stored_playlist, playlist, player, mixer, output, options, sticker, subscription, message
|
|
18
|
+
#
|
|
19
|
+
subsystems = %w[player playlist]
|
|
20
|
+
|
|
21
|
+
loop do
|
|
22
|
+
resp = client.idle(*subsystems)
|
|
23
|
+
puts resp
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
client.close
|
|
27
|
+
client.disconnect
|
data/examples/range.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler.setup :default
|
|
5
|
+
|
|
6
|
+
require 'pp'
|
|
7
|
+
require 'logger'
|
|
8
|
+
require 'mpd_client'
|
|
9
|
+
|
|
10
|
+
MPD::Client.log = Logger.new($stderr)
|
|
11
|
+
|
|
12
|
+
client = MPD::Client.new
|
|
13
|
+
client.connect('localhost', 6600)
|
|
14
|
+
|
|
15
|
+
# delete all songs from the current playlist, except for the firts ten
|
|
16
|
+
client.delete([10])
|
|
17
|
+
|
|
18
|
+
# move the first three songs after the fifth number in the playlist
|
|
19
|
+
client.move([0, 3], 5)
|
|
20
|
+
|
|
21
|
+
# print songs form 5 to 10
|
|
22
|
+
client.playlistinfo([5, 10]).each { |s| puts "#{s['artist']} - #{s['title']}" }
|
data/examples/rangeid.rb
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler.setup :default
|
|
5
|
+
|
|
6
|
+
require 'pp'
|
|
7
|
+
require 'logger'
|
|
8
|
+
require 'mpd_client'
|
|
9
|
+
|
|
10
|
+
MPD::Client.log = Logger.new($stderr)
|
|
11
|
+
|
|
12
|
+
client = MPD::Client.new
|
|
13
|
+
client.connect('localhost', 6600)
|
|
14
|
+
|
|
15
|
+
# Get id of the first song in the playllist
|
|
16
|
+
song = client.playlistinfo(1).first
|
|
17
|
+
pp "#{song['artist']} - #{song['title']}"
|
|
18
|
+
song_id = song['id']
|
|
19
|
+
|
|
20
|
+
# Specifies the portion of the song that shall be played
|
|
21
|
+
client.rangeid(song_id, [60, 70])
|
|
22
|
+
|
|
23
|
+
# Play the playlist at song 1
|
|
24
|
+
client.play(1)
|
|
25
|
+
|
|
26
|
+
pp client.status
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler.setup :default
|
|
5
|
+
|
|
6
|
+
require 'logger'
|
|
7
|
+
require 'mpd_client'
|
|
8
|
+
|
|
9
|
+
# MPD::Client.log = Logger.new($stderr)
|
|
10
|
+
|
|
11
|
+
client = MPD::Client.new
|
|
12
|
+
|
|
13
|
+
type = ARGV[0]
|
|
14
|
+
what = ARGV[1]
|
|
15
|
+
|
|
16
|
+
client = MPD::Client.new
|
|
17
|
+
client.log = Logger.new($stderr)
|
|
18
|
+
|
|
19
|
+
# Connecting to the server
|
|
20
|
+
client.connect('localhost', 6600)
|
|
21
|
+
|
|
22
|
+
puts "MPD version: #{client.mpd_version}"
|
|
23
|
+
puts "mpd_client version: #{MPD::Client::VERSION}"
|
|
24
|
+
|
|
25
|
+
client.stop
|
|
26
|
+
client.clear # clear the current playlist
|
|
27
|
+
|
|
28
|
+
# Finds songs in the db that are exactly `what`.
|
|
29
|
+
# `type` can be any tag supported by MPD
|
|
30
|
+
# or one of the two special parameters:
|
|
31
|
+
# * 'file' - to search by full path (relative to database root),
|
|
32
|
+
# * 'any' - to match against all available tags.
|
|
33
|
+
songs = client.search(type, what)
|
|
34
|
+
|
|
35
|
+
client.command_list_ok_begin # start a command list to speed up operations
|
|
36
|
+
songs.each do |song|
|
|
37
|
+
client.add(song['file']) if song.key?('file')
|
|
38
|
+
end
|
|
39
|
+
client.command_list_end
|
|
40
|
+
|
|
41
|
+
client.play
|
|
42
|
+
|
|
43
|
+
client.close
|
|
44
|
+
client.disconnect # disconnect from the server
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler'
|
|
4
|
+
Bundler.setup :default
|
|
5
|
+
|
|
6
|
+
require 'logger'
|
|
7
|
+
require 'mpd_client'
|
|
8
|
+
|
|
9
|
+
MPD::Client.log = Logger.new($stderr)
|
|
10
|
+
|
|
11
|
+
# Stickers
|
|
12
|
+
# https://mpd.readthedocs.io/en/latest/protocol.html#stickers
|
|
13
|
+
|
|
14
|
+
client = MPD::Client.new
|
|
15
|
+
|
|
16
|
+
# Connecting to the server
|
|
17
|
+
client.connect('/run/mpd/socket')
|
|
18
|
+
|
|
19
|
+
puts "MPD version: #{client.mpd_version}"
|
|
20
|
+
puts "mpd_client version: #{MPD::Client::VERSION}"
|
|
21
|
+
|
|
22
|
+
uri = 'world/j/Jane Air/2012.Иллюзия полёта/12. Любить любовь.ogg'
|
|
23
|
+
|
|
24
|
+
# sticker set {TYPE} {URI} {NAME} {VALUE}
|
|
25
|
+
# Adds a sticker value to the specified object.
|
|
26
|
+
# If a sticker item with that name already exists, it is replaced.
|
|
27
|
+
#
|
|
28
|
+
client.sticker_set('song', uri, 'rating', '1')
|
|
29
|
+
|
|
30
|
+
# sticker get {TYPE} {URI} {NAME}
|
|
31
|
+
# Reads a sticker value for the specified object.
|
|
32
|
+
#
|
|
33
|
+
puts client.sticker_get('song', uri, 'rating')
|
|
34
|
+
|
|
35
|
+
# sticker list {TYPE} {URI}
|
|
36
|
+
# Lists the stickers for the specified object.
|
|
37
|
+
#
|
|
38
|
+
puts client.sticker_list('song', uri)
|
|
39
|
+
|
|
40
|
+
# sticker find {TYPE} {URI} {NAME}
|
|
41
|
+
# Searches the sticker database for stickers with the specified name, below the specified directory (URI).
|
|
42
|
+
# For each matching song, it prints the URI and that one sticker's value.
|
|
43
|
+
#
|
|
44
|
+
puts client.sticker_find('song', '/', 'rating')
|
|
45
|
+
|
|
46
|
+
# sticker delete {TYPE} {URI} [NAME]
|
|
47
|
+
# Deletes a sticker value from the specified object.
|
|
48
|
+
# If you do not specify a sticker name, all sticker values are deleted.
|
|
49
|
+
#
|
|
50
|
+
client.sticker_delete('song', uri, 'rating')
|
|
51
|
+
|
|
52
|
+
client.close
|
|
53
|
+
client.disconnect
|