dmap-ng 0.2.5

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,24 @@
1
+ class DMAP
2
+ class TagBuilder
3
+ def initialize
4
+ @tags = []
5
+ end
6
+
7
+ def method_missing(meth, *args, &block)
8
+ return super unless meth.to_s.length == 4
9
+ if block_given?
10
+ nested = self.class.new
11
+ nested.instance_eval &block
12
+ value = nested.result
13
+ else
14
+ value = args.size > 1 ? args : args.first
15
+ end
16
+ @tags << Tag.new(meth, value)
17
+ nil
18
+ end
19
+
20
+ def result
21
+ @tags
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,426 @@
1
+ class DMAP
2
+ TAGS = {
3
+ :abal => ['daap.browsealbumlisting', :list],
4
+ :abar => ['daap.browseartistlisting', :list],
5
+ :abcp => ['daap.browsecomposerlisting', :list],
6
+ :abgn => ['daap.browsegenrelisting', :list],
7
+ :abpl => ['daap.baseplaylist', :byte],
8
+ :abro => ['daap.databasebrowse', :list],
9
+ :adbs => ['daap.databasesongs', :list],
10
+ :aeAI => ['com.apple.itunes.itms-artistid', :integer],
11
+ :aeCI => ['com.apple.itunes.itms-composerid', :integer],
12
+ :aeCR => ['com.apple.itunes.content-rating', :string],
13
+ :aeEN => ['com.apple.itunes.episode-num-str', :string],
14
+ :aeES => ['com.apple.itunes.episode-sort', :integer],
15
+ :aeFP => ['com.apple.itunes.req-fplay', :boolean],
16
+ :aeGU => ['com.apple.itunes.gapless-dur', :long],
17
+ :aeGD => ['com.apple.itunes.gapless-enc-dr', :integer],
18
+ :aeGE => ['com.apple.itunes.gapless-enc-del', :integer],
19
+ :aeGH => ['com.apple.itunes.gapless-heur', :integer],
20
+ :aeGI => ['com.apple.itunes.itms-genreid', :integer],
21
+ :aeGR => ['com.apple.itunes.gapless-resy', :long],
22
+ :aeHD => ['com.apple.itunes.is-hd-video', :boolean],
23
+ :aeHV => ['com.apple.itunes.has-video', :boolean],
24
+ :aeMK => ['com.apple.itunes.mediakind', :boolean],
25
+ :aeNN => ['com.apple.itunes.network-name', :string],
26
+ :aeNV => ['com.apple.itunes.norm-volume', :integer],
27
+ :aePC => ['com.apple.itunes.is-podcast', :boolean],
28
+ :aePI => ['com.apple.itunes.itms-playlistid', :integer],
29
+ :aePP => ['com.apple.itunes.is-podcast-playlist', :boolean],
30
+ :aePS => ['com.apple.itunes.special-playlist', :byte],
31
+ :aeSU => ['com.apple.itunes.season-num', :integer],
32
+ :aeSF => ['com.apple.itunes.itms-storefrontid', :integer],
33
+ :aeSG => ['com.apple.itunes.saved-genius', :boolean],
34
+ :aeSI => ['com.apple.itunes.itms-songid', :integer],
35
+ :aeSN => ['com.apple.itunes.series-name', :string],
36
+ :aeSP => ['com.apple.itunes.smart-playlist', :byte],
37
+ :aeSV => ['com.apple.itunes.music-sharing-version', :version],
38
+ :agrp => ['daap.songgrouping', :string],
39
+ :aply => ['daap.databaseplaylists', :list],
40
+ :aprm => ['daap.playlistrepeatmode', :byte],
41
+ :apro => ['daap.protocolversion', :version],
42
+ :apsm => ['daap.playlistshufflemode', :byte],
43
+ :apso => ['daap.playlistsongs', :list],
44
+ :arif => ['daap.resolveinfo', :list],
45
+ :arsv => ['daap.resolve', :list],
46
+ :asaa => ['daap.songalbumartist', :string],
47
+ :asai => ['daap.songalbumid', :long],
48
+ :asal => ['daap.songalbum', :string],
49
+ :asar => ['daap.songartist', :string],
50
+ :asbk => ['daap.bookmarkable', :byte],
51
+ :asbo => ['daap.songbookmark', :integer],
52
+ :asbr => ['daap.songbitrate', :short],
53
+ :asbt => ['daap.songbeatsperminute', :short],
54
+ :ascd => ['daap.songcodectype', :integer],
55
+ :ascm => ['daap.songcomment', :string],
56
+ :ascn => ['daap.songcontentdescription', :string],
57
+ :asco => ['daap.songcompilation', :byte],
58
+ :ascp => ['daap.songcomposer', :string],
59
+ :ascr => ['daap.songcontentrating', :byte],
60
+ :ascs => ['daap.songcodecsubtype', :integer],
61
+ :asct => ['daap.songcategory', :string],
62
+ :asda => ['daap.songdateadded', :time],
63
+ :asdb => ['daap.songdisabled', :byte],
64
+ :asdc => ['daap.songdisccount', :short],
65
+ :asdk => ['daap.songdatakind', :byte],
66
+ :asdm => ['daap.songdatemodified', :time],
67
+ :asdn => ['daap.songdiscnumber', :short],
68
+ :asdp => ['daap.songdatepurchased', :time],
69
+ :asdr => ['daap.songdatereleased', :time],
70
+ :asdt => ['daap.songdescription', :string],
71
+ :ased => ['daap.songextradata', :short],
72
+ :aseq => ['daap.songeqpreset', :string],
73
+ :asfm => ['daap.songformat', :string],
74
+ :asgn => ['daap.songgenre', :string],
75
+ :asgp => ['daap.songgapless', :byte],
76
+ :ashp => ['daap.songhasbeenplayed', :byte],
77
+ :asky => ['daap.songkeywords', :string],
78
+ :aslc => ['daap.songlongcontentdescription', :string],
79
+ :asls => ['daap.songlongsize', :long],
80
+ :aspu => ['daap.songpodcasturl', :string],
81
+ :asrv => ['daap.songrelativevolume', :signed_byte],
82
+ :assu => ['daap.sortalbum', :string],
83
+ :assa => ['daap.sortartist', :string],
84
+ :assc => ['daap.sortcomposer', :string],
85
+ :assl => ['daap.sortalbumartist', :string],
86
+ :assn => ['daap.sortname', :string],
87
+ :assp => ['daap.songstoptime', :integer],
88
+ :assr => ['daap.songsamplerate', :integer],
89
+ :asss => ['daap.sortseriesname', :string],
90
+ :asst => ['daap.songstarttime', :integer],
91
+ :assz => ['daap.songsize', :integer],
92
+ :astc => ['daap.songtrackcount', :short],
93
+ :astm => ['daap.songtime', :integer],
94
+ :astn => ['daap.songtracknumber', :short],
95
+ :asul => ['daap.songdataurl', :string],
96
+ :asur => ['daap.songuserrating', :byte],
97
+ :asyr => ['daap.songyear', :short],
98
+ :ated => ['daap.supportsextradata', :short],
99
+ :avdb => ['daap.serverdatabases', :list],
100
+ :ceJC => ['com.apple.itunes.jukebox-client-vote', :signed_byte],
101
+ :ceJI => ['com.apple.itunes.jukebox-current', :integer],
102
+ :ceJS => ['com.apple.itunes.jukebox-score', :signed_short],
103
+ :ceJV => ['com.apple.itunes.jukebox-vote', :short_integer], # Special case, 4 byte integer but data stored in first two bytes
104
+ :ceVO => ['com.apple.itunes.unknown-voting', :boolean],
105
+ :ceWM => ['com.apple.itunes.welcome-message', :string],
106
+ :"f\215ch" => ['dmap.haschildcontainers', :byte],
107
+ :mbcl => ['dmap.bag', :list],
108
+ :mccr => ['dmap.contentcodesresponse', :list],
109
+ :mcna => ['dmap.contentcodesname', :string],
110
+ :mcnm => ['dmap.contentcodesnumber', :integer],
111
+ :mcon => ['dmap.container', :list],
112
+ :mctc => ['dmap.containercount', :integer],
113
+ :mcti => ['dmap.containeritemid', :integer],
114
+ :mcty => ['dmap.contentcodestype', :short],
115
+ :mdcl => ['dmap.dictionary', :list],
116
+ :meds => ['dmap.editcommandssupported', :integer],
117
+ :miid => ['dmap.itemid', :integer],
118
+ :mikd => ['dmap.itemkind', :byte],
119
+ :mimc => ['dmap.itemcount', :integer],
120
+ :minm => ['dmap.itemname', :string],
121
+ :mlcl => ['dmap.listing', :list],
122
+ :mlid => ['dmap.sessionid', :integer],
123
+ :mlit => ['dmap.listingitem', :list],
124
+ :mlog => ['dmap.loginresponse', :list],
125
+ :mpco => ['dmap.parentcontainerid', :integer],
126
+ :mper => ['dmap.persistentid', :long],
127
+ :mpro => ['dmap.protocolversion', :version],
128
+ :mrco => ['dmap.returnedcount', :integer],
129
+ :msau => ['dmap.authenticationmethod', :byte],
130
+ :msal => ['dmap.supportsautologout', :byte],
131
+ :msas => ['dmap.authenticationschemes', :byte],
132
+ :msbr => ['dmap.supportsbrowse', :byte],
133
+ :msdc => ['dmap.databasescount', :integer],
134
+ :msed => ['unknown_msed', :byte], # TODO: Figure out what these are for
135
+ :msex => ['dmap.supportsextensions', :byte],
136
+ :msix => ['dmap.supportsindex', :byte],
137
+ :mslr => ['dmap.loginrequired', :byte],
138
+ :msma => ['unknown_msma', :long],
139
+ :msml => ['unknown_msml', :list],
140
+ :mspi => ['dmap.supportspersistentids', :byte],
141
+ :msqy => ['dmap.supportsquery', :byte],
142
+ :msrs => ['dmap.supportsresolve', :byte],
143
+ :msrv => ['dmap.serverinforesponse', :list],
144
+ :mstc => ['dmap.utctime', :time],
145
+ :mstm => ['dmap.timeoutinterval', :integer],
146
+ :msto => ['dmap.utcoffset', :signed_integer],
147
+ :msts => ['dmap.statusstring', :string],
148
+ :mstt => ['dmap.status', :integer],
149
+ :msup => ['dmap.supportsupdate', :byte],
150
+ :mtco => ['dmap.specifiedtotalcount', :integer],
151
+ :mudl => ['dmap.deletedidlisting', :list],
152
+ :mupd => ['dmap.updateresponse', :list],
153
+ :musr => ['dmap.serverrevision', :integer],
154
+ :muty => ['dmap.updatetype', :byte],
155
+
156
+ # dacp.availablerepeatstates
157
+ # dacp.availableshufflestates
158
+ # dacp.nowplaying
159
+ # dacp.playerstate
160
+ # dacp.shufflestate
161
+ # dacp.skipincrement
162
+ # dacp.userrating
163
+ # dacp.volumecontrollable
164
+ # dacp.nowplaying
165
+
166
+ # New tags
167
+ :cmgt => ['unknown.list', :list],
168
+ :cmvo => ['dmcp.volume', :integer], # 0 - 100
169
+ :caci => ['unknown.control_init', :list],
170
+ :cmik => ['unknown', :byte], #
171
+ :cmsp => ['unknown', :byte], #
172
+
173
+ # From /ctrl-int/1/getplayerstatus
174
+ :cmst => ['unknown.list', :list],
175
+ :cmsr => ['unknown.revision', :integer], # Looks like an integer
176
+ :caps => ['dacp.playerstate', :byte], # 3 -> paused, 4 -> playing
177
+ :cash => ['dacp.shufflestate', :boolean],
178
+ :carp => ['dacp.repeatstate', :byte], # 2 -> all, 1 -> single, 0 -> off
179
+ :cavc => ['dacp.volumecontrollable', :boolean], # could be byte
180
+ :caas => ['dacp.availableshufflestates', :integer], # eg 2
181
+ :caar => ['dacp.availablerepeatstates', :integer], # eg 6
182
+
183
+ :cann => ['dacp.track_name', :string], # name?
184
+ :cana => ['dacp.track_artist', :string], # name?
185
+ :canl => ['dacp.track_album', :string], # name?
186
+ :cang => ['dacp.track_genre', :string], # name?
187
+
188
+ :cant => ['dacp.playingtime', :integer], # in milliseconds
189
+ :cast => ['dacp.totaltime', :integer],
190
+
191
+ :canp => ['dacp.nowplaying', :string], # guessing the name
192
+ :cmmk => ['unknown', :integer],
193
+ :ceGS => ['unknown', :byte], # could be boolean same prefix as jukebox stuff further up
194
+
195
+ # Interesting strings from iTunes
196
+ # daap.baseplaylist
197
+ # daap.bookmarkable
198
+ # daap.browsealbumlisting
199
+ # daap.browseartistlisting
200
+ # daap.browsecomposerlisting
201
+ # daap.browsegenrelisting
202
+ # daap.databasebrowse
203
+ # daap.databaseplaylists
204
+ # daap.databasesongs
205
+ # daap.playlistrepeatmode
206
+ # daap.playlistshufflemode
207
+ # daap.playlistsongs
208
+ # daap.protocolversion
209
+ # daap.resolve
210
+ # daap.resolveinfo
211
+ # daap.serverdatabases
212
+ # daap.songalbum
213
+ # daap.songalbumartist
214
+ # daap.songalbumid
215
+ # daap.songartist
216
+ # daap.songbeatsperminute
217
+ # daap.songbitrate
218
+ # daap.songbookmark
219
+ # daap.songcategory
220
+ # daap.songcategory,daap.songextradata,daap.songcontentdescription,daap.songlongcontentdescription,daap.songkeywords,com.apple.itunes.is-podcast,com.apple.itunes.mediakind,com.apple.itunes.extended-media-kind,com.apple.itunes.series-name,com.apple.itunes.network-name,com.apple.itunes.episode-num-str,com.apple.itunes.episode-sort,com.apple.itunes.season-num,daap.songgapless,com.apple.itunes.gapless-enc-del,com.apple.itunes.gapless-heur,com.apple.itunes.gapless-enc-dr,com.apple.itunes.gapless-dur,com.apple.itunes.gapless-resy,com.apple.itunes.content-rating
221
+ # daap.songcodecsubtype
222
+ # daap.songcodectype
223
+ # daap.songcomment
224
+ # daap.songcompilation
225
+ # daap.songcomposer
226
+ # daap.songcontentdescription
227
+ # daap.songcontentrating
228
+ # daap.songdatakind
229
+ # daap.songdataurl
230
+ # daap.songdateadded
231
+ # daap.songdatemodified
232
+ # daap.songdatepurchased
233
+ # daap.songdatereleased
234
+ # daap.songdescription
235
+ # daap.songdisabled
236
+ # daap.songdisccount
237
+ # daap.songdiscnumber
238
+ # daap.songeqpreset
239
+ # daap.songextradata
240
+ # daap.songformat
241
+ # daap.songgapless
242
+ # daap.songgenre
243
+ # daap.songgrouping
244
+ # daap.songhasbeenplayed
245
+ # daap.songkeywords
246
+ # daap.songlongcontentdescription
247
+ # daap.songlongsize
248
+ # daap.songpodcasturl
249
+ # daap.songrelativevolume
250
+ # daap.songsamplerate
251
+ # daap.songsize
252
+ # daap.songstarttime
253
+ # daap.songstoptime
254
+ # daap.songtime
255
+ # daap.songtrackcount
256
+ # daap.songtracknumber
257
+ # daap.songuserrating
258
+ # daap.songyear
259
+ # daap.sortalbum
260
+ # daap.sortalbumartist
261
+ # daap.sortartist
262
+ # daap.sortcomposer
263
+ # daap.sortname
264
+ # daap.sortseriesname
265
+ # daap.supportsextradata
266
+ # dacp.availablerepeatstates
267
+ # dacp.availableshufflestates
268
+ # dacp.nowplaying
269
+ # dacp.playerstate
270
+ # dacp.playingtime
271
+ # dacp.repeatstate
272
+ # dacp.shufflestate
273
+ # dacp.skipincrement
274
+ # dacp.userrating
275
+ # dacp.volumecontrollable
276
+ # dmap.authenticationmethod
277
+ # dmap.authenticationschemes
278
+ # dmap.bag
279
+ # dmap.container
280
+ # dmap.containercount
281
+ # dmap.containeritemid
282
+ # dmap.contentcodesname
283
+ # dmap.contentcodesnumber
284
+ # dmap.contentcodesresponse
285
+ # dmap.contentcodestype
286
+ # dmap.databasescount
287
+ # dmap.deletedidlisting
288
+ # dmap.dictionary
289
+ # dmap.editcommandssupported
290
+ # dmap.haschildcontainers
291
+ # dmap.itemcount
292
+ # dmap.itemid
293
+ # dmap.itemid,dmap.itemname,dmap.itemkind,dmap.persistentid,daap.songalbum,daap.songgrouping,daap.songartist,daap.songalbumartist,daap.songbitrate,daap.songbeatsperminute,daap.songcomment,daap.songcodectype,daap.songcodecsubtype,daap.songcompilation,daap.songcomposer,daap.songdateadded,daap.songdatemodified,daap.songdisccount,daap.songdiscnumber,daap.songdisabled,daap.songeqpreset,daap.songformat,daap.songgenre,daap.songdescription,daap.songrelativevolume,daap.songsamplerate,daap.songsize,daap.songstarttime,daap.songstoptime,daap.songtime,daap.songtrackcount,daap.songtracknumber,daap.songuserrating,daap.songyear,daap.songdatakind,daap.songdataurl,daap.songcontentrating,com.apple.itunes.norm-volume,com.apple.itunes.itms-songid,com.apple.itunes.itms-artistid,com.apple.itunes.itms-playlistid,com.apple.itunes.itms-composerid,com.apple.itunes.itms-genreid,com.apple.itunes.itms-storefrontid,com.apple.itunes.has-video
294
+ # dmap.itemkind
295
+ # dmap.itemname
296
+ # dmap.listing
297
+ # dmap.listingitem
298
+ # dmap.loginrequired
299
+ # dmap.loginresponse
300
+ # dmap.parentcontainerid
301
+ # dmap.persistentid
302
+ # dmap.protocolversion
303
+ # dmap.returnedcount
304
+ # dmap.serverinforesponse
305
+ # dmap.serverrevision
306
+ # dmap.sessionid
307
+ # dmap.specifiedtotalcount
308
+ # dmap.status
309
+ # dmap.statusstring
310
+ # dmap.supportsautologout
311
+ # dmap.supportsbrowse
312
+ # dmap.supportsextensions
313
+ # dmap.supportsindex
314
+ # dmap.supportspersistentids
315
+ # dmap.supportsquery
316
+ # dmap.supportsresolve
317
+ # dmap.supportsupdate
318
+ # dmap.timeoutinterval
319
+ # dmap.updateresponse
320
+ # dmap.updatetype
321
+ # dmap.utcoffset
322
+ # dmap.utctime
323
+ # dmcp.volume
324
+ # com.apple.itunes.adam-ids-array
325
+ # com.apple.itunes.albumcoverdisplay
326
+ # com.apple.itunes.atvsettingsview
327
+ # com.apple.itunes.atvsetupview
328
+ # com.apple.itunes.atvstreamsettingsview
329
+ # com.apple.itunes.atvsyncsettingsview
330
+ # com.apple.itunes.audioEditor
331
+ # com.apple.itunes.browsebarview
332
+ # com.apple.itunes.checklistitem
333
+ # com.apple.itunes.columnsdisplay
334
+ # com.apple.itunes.content-rating
335
+ # com.apple.itunes.customwindowview
336
+ # com.apple.itunes.downloadsdisplay
337
+ # com.apple.itunes.drm-key1-id
338
+ # com.apple.itunes.drm-key2-id
339
+ # com.apple.itunes.drm-platform-id
340
+ # com.apple.itunes.drm-user-id
341
+ # com.apple.itunes.drm-versions
342
+ # com.apple.itunes.edittext
343
+ # com.apple.itunes.episode-num-str
344
+ # com.apple.itunes.episode-sort
345
+ # com.apple.itunes.extended-media-kind
346
+ # com.apple.itunes.flashipodsetuphandler
347
+ # com.apple.itunes.flat-chapter-data
348
+ # com.apple.itunes.gapless-dur
349
+ # com.apple.itunes.gapless-enc-del
350
+ # com.apple.itunes.gapless-enc-dr
351
+ # com.apple.itunes.gapless-heur
352
+ # com.apple.itunes.gapless-resy
353
+ # com.apple.itunes.geniusbarview
354
+ # com.apple.itunes.gradientframeview
355
+ # com.apple.itunes.has-chapter-data
356
+ # com.apple.itunes.has-video
357
+ # com.apple.itunes.iPodDiskUsageView
358
+ # com.apple.itunes.inlineedittextview
359
+ # com.apple.itunes.iphonesettingsview
360
+ # com.apple.itunes.iphonesetuphandler
361
+ # com.apple.itunes.ipodsettingsview
362
+ # com.apple.itunes.ipodsetuphandler
363
+ # com.apple.itunes.ipodshufflesettingsview
364
+ # com.apple.itunes.is-hd-video
365
+ # com.apple.itunes.is-podcast
366
+ # com.apple.itunes.is-podcast-playlist
367
+ # com.apple.itunes.itms-artistid
368
+ # com.apple.itunes.itms-composerid
369
+ # com.apple.itunes.itms-genreid
370
+ # com.apple.itunes.itms-playlistid
371
+ # com.apple.itunes.itms-songid
372
+ # com.apple.itunes.itms-storefrontid
373
+ # com.apple.itunes.jukebox-client-vote
374
+ # com.apple.itunes.jukebox-current
375
+ # com.apple.itunes.jukebox-score
376
+ # com.apple.itunes.jukebox-vote
377
+ # com.apple.itunes.lock_sync
378
+ # com.apple.itunes.mediakind
379
+ # com.apple.itunes.movielistitem
380
+ # com.apple.itunes.music-sharing-version
381
+ # com.apple.itunes.musicstoredisplay
382
+ # com.apple.itunes.network-name
383
+ # com.apple.itunes.non-drm-user-id
384
+ # com.apple.itunes.norm-volume
385
+ # com.apple.itunes.phonesettingsview
386
+ # com.apple.itunes.pictureanimationview
387
+ # com.apple.itunes.radiobutton
388
+ # com.apple.itunes.req-fplay
389
+ # com.apple.itunes.ringtoneeditorview
390
+ # com.apple.itunes.saved-genius
391
+ # com.apple.itunes.season-num
392
+ # com.apple.itunes.series-name
393
+ # com.apple.itunes.simplelistitem
394
+ # com.apple.itunes.smart-playlist
395
+ # com.apple.itunes.sourcedisplay
396
+ # com.apple.itunes.special-playlist
397
+ # com.apple.itunes.springboardworkaround
398
+ # com.apple.itunes.store-pers-id
399
+ # com.apple.itunes.storebrowsedisplay
400
+ # com.apple.itunes.storeprescienceview
401
+ # com.apple.itunes.storeview
402
+ # com.apple.itunes.summaryitemview
403
+ # com.apple.itunes.syncing
404
+ # com.apple.itunes.touchremotesetupview
405
+ # com.apple.itunes.trackdisplay
406
+ # com.apple.itunes.trackgroupdisplay
407
+ # com.apple.itunes.visualizerview
408
+
409
+ }
410
+
411
+ STATIC_LENGTH_TYPES = {
412
+ :boolean => [1, 'C'],
413
+ :byte => [1, 'C'],
414
+ :signed_byte => [1, 'c'],
415
+ :short => [2, 'n'],
416
+ :signed_short => [2, 's'],
417
+ :integer => [4, 'N'],
418
+ :signed_integer => [4, 'l'],
419
+ :long => [8, 'Q'],
420
+ :signed_long => [8, 'q'],
421
+ :version => [4, 'CCCC'],
422
+ :time => [4, 'N'],
423
+
424
+ :short_integer => [4, 'nxx'],
425
+ }
426
+ end
@@ -0,0 +1,11 @@
1
+ class TrueClass
2
+ def to_i
3
+ 1
4
+ end
5
+ end
6
+
7
+ class FalseClass
8
+ def to_i
9
+ 0
10
+ end
11
+ end