mpd 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,35 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module MPD; class Controller
12
+
13
+ class Config < Hash
14
+ attr_reader :controller
15
+
16
+ def initialize (controller)
17
+ @controller = controller
18
+
19
+ controller.do_and_raise_if_needed(:config).each {|name, value|
20
+ self[name] = value
21
+ }
22
+
23
+ freeze
24
+ end
25
+
26
+ def respond_to_missing? (id, include_private = false)
27
+ include? id
28
+ end
29
+
30
+ def method_missing (id, *)
31
+ self[id]
32
+ end
33
+ end
34
+
35
+ end; end
@@ -0,0 +1,110 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module MPD; class Controller
12
+
13
+ class CurrentPlaylist
14
+ include Enumerable
15
+
16
+ attr_reader :controller
17
+
18
+ def initialize (controller)
19
+ @controller = controller
20
+ end
21
+
22
+ def version
23
+ controller.status.playlist.version
24
+ end
25
+
26
+ def length
27
+ controller.status.playlist.length
28
+ end
29
+
30
+ def add (uri, position = nil)
31
+ controller.do_and_raise_if_needed(:addid, uri, *position).first.last
32
+ end
33
+
34
+ def delete (what)
35
+ if what.is_a?(Integer) || what.is_a?(Range)
36
+ controller.do_and_raise_if_needed :delete, what
37
+ else
38
+ controller.do_and_raise_if_needed :deleteid, what
39
+ end
40
+
41
+ self
42
+ end
43
+
44
+ def move (from, to)
45
+ if from.is_a?(Integer) || what.is_a?(Range)
46
+ controller.do_and_raise_if_needed :move, from, to
47
+ else
48
+ controller.do_and_raise_if_needed :moveid, from, to
49
+ end
50
+
51
+ self
52
+ end
53
+
54
+ def clear
55
+ controller.do_and_raise_if_needed :clear
56
+ end
57
+
58
+ def save_as (name, force = false)
59
+ if force
60
+ controller.playlists[name].delete!
61
+ end
62
+
63
+ controller.do_and_raise_if_needed :save, name
64
+
65
+ self
66
+ end
67
+
68
+ def search (pattern, options = { tag: :title, strict: false })
69
+ Database::Song.from_data(controller.do_and_raise_if_needed(options[:strict] ? :playlistfind : :playlistsearch, options[:tag], pattern))
70
+ end
71
+
72
+ def each
73
+ return to_enum unless block_given?
74
+
75
+ Database::Song.from_data(controller.do(:playlistinfo)).each {|song|
76
+ yield song
77
+ }
78
+
79
+ self
80
+ end
81
+
82
+ def [] (id)
83
+ Database::Song.from_data(controller.do_and_raise_if_needed(:playlistid, id))
84
+ end
85
+
86
+ def priority (priority, *args)
87
+ controller.do_and_raise_if_needed :prio, priority, *args.select { |o| o.is_a?(Range) }
88
+ controller.do_and_raise_if_needed :prioid, priority, *args.reject { |o| o.is_a?(Range) }
89
+
90
+ self
91
+ end
92
+
93
+ def shuffle (range = nil)
94
+ controller.do_and_raise_if_needed :shuffle, *range
95
+
96
+ self
97
+ end
98
+
99
+ def swap (a, b)
100
+ if a.is_a?(Integer) && b.is_a?(Integer)
101
+ controller.do_and_raise_if_needed :swap, a, b
102
+ else
103
+ controller.do_and_raise_if_needed :swapip, a, b
104
+ end
105
+
106
+ self
107
+ end
108
+ end
109
+
110
+ end; end
@@ -0,0 +1,235 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module MPD; class Controller
12
+
13
+ class Database
14
+ class Song
15
+ Tags = Struct.new(:track, :title, :artist, :album, :genre, :date, :composer, :performer, :disc, :id)
16
+
17
+ def self.from_data (data, controller = nil)
18
+ if data.count { |name, _| name == :file } > 1
19
+ result = []
20
+ to_read = nil
21
+
22
+ data.each {|name, value|
23
+ if name == :file
24
+ if to_read
25
+ result << Song.from_data(to_read, controller)
26
+ end
27
+
28
+ to_read = [[name, value]]
29
+ else
30
+ to_read << [name, value]
31
+ end
32
+ }
33
+
34
+ result << Song.from_data(to_read, controller)
35
+
36
+ result
37
+ else
38
+ song = new(controller)
39
+
40
+ data.each {|name, value|
41
+ case name
42
+ when :file then song.file = value
43
+ when :Pos then song.position = value
44
+ when :Time then song.duration = value
45
+ when :Track then song.tags.track = value
46
+ when :Title then song.tags.title = value
47
+ when :Artist then song.tags.artist = value
48
+ when :Album then song.tags.album = value
49
+ when :Genre then song.tags.genre = value
50
+ when :Date then song.tags.date = value
51
+ when :Composer then song.tags.composer = value
52
+ when :Performer then song.tags.performer = value
53
+ when :Disc then song.tags.disc = value
54
+ when :MUSICBRAINZ_TRACKID then song.tags.id = value
55
+ end
56
+ }
57
+
58
+ song
59
+ end
60
+ end
61
+
62
+ def self.from_uri (uri, controller = nil)
63
+ if controller
64
+ from_data(controller.do_and_raise_if_needed(:listallinfo, uri), controller)
65
+ else
66
+ Song.new.tap {|song|
67
+ song.file = uri
68
+ }
69
+ end
70
+ end
71
+
72
+ attr_reader :controller, :tags
73
+ attr_accessor :file, :position, :duration
74
+
75
+ def initialize (controller = nil)
76
+ @controller = controller
77
+ @tags = Tags.new
78
+ end
79
+
80
+ def add
81
+ raise 'no controller, cannot add to playlist' unless controller
82
+ end
83
+
84
+ def respond_to_missing (id, include_private = false)
85
+ @tags.respond_to?(id, include_private)
86
+ end
87
+
88
+ def method_missing (id, *)
89
+ if @tags.respond_to? id
90
+ return @tags.__send__ id
91
+ end
92
+
93
+ super
94
+ end
95
+
96
+ alias uri file
97
+
98
+ def inspect
99
+ "#<#{self.class.name}: #{file.inspect}>"
100
+ end
101
+ end
102
+
103
+ class Directory
104
+ include Enumerable
105
+
106
+ attr_reader :database, :uri
107
+
108
+ def initialize (database, uri = nil)
109
+ @database = database
110
+ @uri = uri
111
+ end
112
+
113
+ def each
114
+ return enum_for :each unless block_given?
115
+
116
+ database.controller.do_and_raise_if_needed(:lsinfo, *uri).each {|name, value|
117
+ case name
118
+ when :file then yield Song.from_uri(value, database.controller)
119
+ when :directory then yield Directory.new(database, value)
120
+ end
121
+ }
122
+
123
+ self
124
+ end
125
+
126
+ def [] (name)
127
+ each { |n| return n if n.uri == name }
128
+
129
+ nil
130
+ end
131
+
132
+ def inspect
133
+ "#<#{self.class.name}: #{uri.inspect}>"
134
+ end
135
+ end
136
+
137
+ class Artist
138
+ attr_reader :database, :name
139
+
140
+ def initialize (database, name)
141
+ @database = database
142
+ @name = name
143
+ end
144
+
145
+ def nil?
146
+ name.empty?
147
+ end
148
+
149
+ def songs (strict = false)
150
+ database.search(name, tag: :artist, strict: strict)
151
+ end
152
+
153
+ def inspect
154
+ "#<#{self.class.name}: #{name.inspect}>"
155
+ end
156
+ end
157
+
158
+ class Element
159
+ attr_reader :database, :tag, :name
160
+
161
+ def initialize (database, tag, name)
162
+ @database = database
163
+ @tag = tag
164
+ @name = name
165
+ end
166
+
167
+ def nil?
168
+ name.empty?
169
+ end
170
+
171
+ def songs (strict = false)
172
+ database.search(name, tag: tag, strict: strict)
173
+ end
174
+
175
+ def inspect
176
+ "#<#{self.class.name.sub(/::Element$/, "::#{tag.capitalize}")}: #{name.inspect}>"
177
+ end
178
+ end
179
+
180
+ include Enumerable
181
+
182
+ attr_reader :controller, :root
183
+
184
+ def initialize (controller)
185
+ @controller = controller
186
+ @root = Directory.new(self)
187
+ end
188
+
189
+ def tags (name, artist = nil)
190
+ return enum_for :tags, name, artist unless block_given?
191
+
192
+ controller.do_and_raise_if_needed(:list, name, *artist).each {|_, value|
193
+ yield value
194
+ }
195
+ end
196
+
197
+ %w[artists albums genres composers performers].each {|name|
198
+ tag = name[0 .. -2].to_sym
199
+
200
+ define_method name do |artist = nil|
201
+ tags(tag, artist).map { |n| Element.new(self, tag, n) }
202
+ end
203
+ }
204
+
205
+ def search (pattern, options = { tag: :title, strict: false })
206
+ Song.from_data(controller.do_and_raise_if_needed(options[:strict] ? :find : :search, options[:tag], pattern))
207
+ end
208
+
209
+ def each (&block)
210
+ return to_enum unless block_given?
211
+
212
+ @root.each(&block)
213
+
214
+ self
215
+ end
216
+
217
+ def [] (name)
218
+ @root[name]
219
+ end
220
+
221
+ def update (*args)
222
+ options = args.last.is_a?(Hash) ? args.pop : { force: false }
223
+ uri = args.shift
224
+
225
+ if options[:force]
226
+ controller.do_and_raise_if_needed :rescan, *uri
227
+ else
228
+ controller.do_and_raise_if_needed :update, *uri
229
+ end
230
+
231
+ self
232
+ end
233
+ end
234
+
235
+ end; end
@@ -0,0 +1,54 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module MPD; class Controller
12
+
13
+ class Decoders
14
+ Decoder = Struct.new(:name, :suffixes, :mime_types)
15
+
16
+ include Enumerable
17
+
18
+ attr_reader :controller
19
+
20
+ def initialize (controller)
21
+ @controller = controller
22
+ @decoders = []
23
+
24
+ name = nil
25
+ suffixes = nil
26
+ mime_types = nil
27
+
28
+ controller.do_and_raise_if_needed(:decoders).each {|type, value|
29
+ if type == :plugin
30
+ if name
31
+ @decoders << Decoder.new(name, suffixes, mime_types)
32
+ end
33
+
34
+ name = value
35
+ suffixes = []
36
+ mime_types = []
37
+ elsif type == :suffix
38
+ suffixes << value
39
+ elsif type == :mime_type
40
+ mime_types << value
41
+ end
42
+ }
43
+ end
44
+
45
+ def each (&block)
46
+ return to_enum unless block_given?
47
+
48
+ @decoders.each(&block)
49
+
50
+ self
51
+ end
52
+ end
53
+
54
+ end; end
@@ -0,0 +1,42 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module MPD; class Controller
12
+
13
+ class Do < BasicObject
14
+ attr_reader :controller
15
+
16
+ def initialize (controller, &block)
17
+ @controller = controller
18
+ @commands = []
19
+
20
+ instance_exec &block if block
21
+ end
22
+
23
+ def method_missing (id, *args)
24
+ @commands << ::MPD::Protocol::Command.new(id, args)
25
+ end
26
+
27
+ def send
28
+ result = []
29
+
30
+ controller.puts ::MPD::Protocol::CommandList.new(@commands).to_s
31
+
32
+ @commands.each {|command|
33
+ result << ::MPD::Protocol::Response.read(controller, command)
34
+
35
+ break if result.last.is_a? ::MPD::Protocol::Error
36
+ } and controller.readline
37
+
38
+ result
39
+ end
40
+ end
41
+
42
+ end; end