kodi_client 0.5.0 → 0.6.0

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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/kodi_client.gemspec +5 -2
  4. data/lib/kodi_client/Chainable.rb +3 -1
  5. data/lib/kodi_client/global_types/addon_types.rb +60 -48
  6. data/lib/kodi_client/global_types/application_types.rb +19 -16
  7. data/lib/kodi_client/global_types/audio_types.rb +41 -30
  8. data/lib/kodi_client/global_types/favourites_types.rb +18 -17
  9. data/lib/kodi_client/global_types/files_types.rb +82 -0
  10. data/lib/kodi_client/global_types/global_types.rb +29 -27
  11. data/lib/kodi_client/global_types/gui_types.rb +21 -15
  12. data/lib/kodi_client/global_types/input_types.rb +1 -1
  13. data/lib/kodi_client/global_types/item_types.rb +6 -2
  14. data/lib/kodi_client/global_types/list_types.rb +414 -91
  15. data/lib/kodi_client/global_types/media_types.rb +16 -11
  16. data/lib/kodi_client/global_types/player_type.rb +126 -107
  17. data/lib/kodi_client/global_types/profiles_types.rb +80 -0
  18. data/lib/kodi_client/global_types/pvr_type.rb +2 -0
  19. data/lib/kodi_client/global_types/system_types.rb +6 -9
  20. data/lib/kodi_client/global_types/video_types.rb +68 -41
  21. data/lib/kodi_client/kodi_module.rb +1 -0
  22. data/lib/kodi_client/method/addons.rb +2 -3
  23. data/lib/kodi_client/method/application.rb +1 -1
  24. data/lib/kodi_client/method/favourites.rb +1 -1
  25. data/lib/kodi_client/method/files.rb +89 -0
  26. data/lib/kodi_client/method/gui.rb +2 -2
  27. data/lib/kodi_client/method/player.rb +6 -6
  28. data/lib/kodi_client/method/profiles.rb +48 -0
  29. data/lib/kodi_client/method/system.rb +1 -1
  30. data/lib/kodi_client/util/comparable.rb +4 -1
  31. data/lib/kodi_client/util/creatable.rb +52 -0
  32. data/lib/kodi_client.rb +10 -9
  33. metadata +10 -5
@@ -3,6 +3,7 @@
3
3
  require 'kodi_client/global_types/global_types'
4
4
  require 'kodi_client/util/comparable'
5
5
  require 'kodi_client/util/iterable'
6
+ require 'kodi_client/util/creatable'
6
7
 
7
8
  module KodiClient
8
9
  module Types
@@ -10,6 +11,7 @@ module KodiClient
10
11
 
11
12
  # GUI.Window https://kodi.wiki/view/JSON-RPC_API/v12#GUI.Window
12
13
  module GUIWindow
14
+ extend Iterable
13
15
 
14
16
  ACCESSPOINTS = 'accesspoints'
15
17
  ADDON = 'addon'
@@ -139,6 +141,7 @@ module KodiClient
139
141
  class StereoscopyMode
140
142
  include Comparable
141
143
  include Iterable
144
+ extend Creatable
142
145
 
143
146
  attr_reader :label, :mode
144
147
 
@@ -152,32 +155,35 @@ module KodiClient
152
155
  ANAGLYPH_YELLOW_BLUE = 'anaglyph_yellow_blue'
153
156
  MONSCOPIC = 'monoscopic'
154
157
 
155
- def initialize(hash)
156
- @label = hash['label']
157
- @mode = hash['mode']
158
- end
159
-
160
- def ==(other)
161
- compare(self, other)
158
+ def initialize(label, mode)
159
+ @label = label
160
+ @mode = mode
162
161
  end
163
162
  end
164
163
 
165
164
  # GUI.Property.Value https://kodi.wiki/view/JSON-RPC_API/v12#GUI.Property.Value
166
165
  class PropertyValue
167
166
  include Comparable
167
+ extend Creatable
168
168
 
169
169
  attr_reader :current_control, :current_window, :fullscreen, :skin, :stereoscopic_mode
170
170
 
171
- def initialize(hash)
172
- @current_control = Global::IdLabel.new(hash['currentcontrol'])
173
- @current_window = Global::IdLabel.new(hash['currentwindow'])
174
- @fullscreen = hash['fullscreen']
175
- @skin = Global::IdName.new(hash['skin'])
176
- @stereoscopic_mode = StereoscopyMode.new(hash['stereoscopicmode'])
171
+ def self.create(hash)
172
+ return nil if hash.nil?
173
+
174
+ current_control = Global::IdLabel.create(hash['currentcontrol'])
175
+ current_window = Global::IdLabel.create(hash['currentwindow'])
176
+ skin = Global::IdName.create(hash['skin'])
177
+ stereoscopic_mode = StereoscopyMode.create(hash['stereoscopicmode'])
178
+ new(current_control, current_window, hash['fullscreen'], skin, stereoscopic_mode)
177
179
  end
178
180
 
179
- def ==(other)
180
- compare(self, other)
181
+ def initialize(current_control, current_window, fullscreen, skin, stereoscopic_mode)
182
+ @current_control = current_control
183
+ @current_window = current_window
184
+ @fullscreen = fullscreen
185
+ @skin = skin
186
+ @stereoscopic_mode = stereoscopic_mode
181
187
  end
182
188
  end
183
189
  end
@@ -8,7 +8,7 @@ module KodiClient
8
8
 
9
9
  # Input.Action https://kodi.wiki/view/JSON-RPC_API/v12#Input.Action
10
10
  module InputAction
11
- include Iterable
11
+ extend Iterable
12
12
 
13
13
  ANALOGFASTFORWARD = 'analogfastforward'
14
14
  ANALOGMOVE = 'analogmove'
@@ -9,8 +9,12 @@ module KodiClient
9
9
 
10
10
  attr_reader :label
11
11
 
12
- def item_details_base(hash)
13
- @label = hash['label']
12
+ def item_details_base_by_hash(hash)
13
+ item_details_base(hash['label'])
14
+ end
15
+
16
+ def item_details_base(label)
17
+ @label = label
14
18
  end
15
19
  end
16
20
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'kodi_client/util/comparable'
4
+ require 'kodi_client/util/creatable'
4
5
  require 'kodi_client/global_types/video_types'
5
6
  require 'kodi_client/global_types/audio_types'
6
7
 
@@ -18,26 +19,48 @@ module KodiClient
18
19
  @list_start = list_start
19
20
  @list_end = list_end
20
21
  end
21
-
22
- def ==(other)
23
- compare(self, other)
24
- end
25
22
  end
26
23
 
27
24
  # List.LimitsReturned https://kodi.wiki/view/JSON-RPC_API/v12#List.LimitsReturned
28
25
  class ListLimitsReturned
29
26
  include Comparable
27
+ extend Creatable
30
28
 
31
29
  attr_reader :list_start, :list_end, :total
32
30
 
33
- def initialize(hash)
34
- @list_start = hash['start']
35
- @list_end = hash['end']
36
- @total = hash['total']
31
+ def self.create(hash)
32
+ return nil if hash.nil?
33
+
34
+ new(hash['start'], hash['end'], hash['total'])
35
+ end
36
+
37
+ def initialize(list_start, list_end, total)
38
+ @list_start = list_start
39
+ @list_end = list_end
40
+ @total = total
37
41
  end
42
+ end
38
43
 
39
- def ==(other)
40
- compare(self, other)
44
+ # ascending/descending for sorting
45
+ module SortOrder
46
+ extend Iterable
47
+
48
+ ASCENDING = 'ascending'
49
+ DESCENDING = 'descending'
50
+ end
51
+
52
+ # List.Sort https://kodi.wiki/view/JSON-RPC_API/v12#List.Sort
53
+ class ListSort
54
+ include Comparable
55
+
56
+ attr_reader :ignore_article, :method, :order, :use_artist_sort_name
57
+
58
+ def initialize(ignore_article = false, method = ListSortMethod::NONE,
59
+ sort_order = SortOrder::ASCENDING, use_artist_sort_name = false)
60
+ @ignore_article = ignore_article
61
+ @method = method
62
+ @order = sort_order
63
+ @use_artist_sort_name = use_artist_sort_name
41
64
  end
42
65
  end
43
66
 
@@ -130,6 +153,95 @@ module KodiClient
130
153
  YEAR = 'year'
131
154
  end
132
155
 
156
+ # List.Fields.Files https://kodi.wiki/view/JSON-RPC_API/v12#List.Fields.Files
157
+ module ListFieldFiles
158
+ extend Iterable
159
+
160
+ ALBUM = 'album'
161
+ ALBUMARTIST = 'albumartist'
162
+ ALBUMARTISTID = 'albumartistid'
163
+ ALBUMID = 'albumid'
164
+ ALBUMLABEL = 'albumlabel'
165
+ ART = 'art'
166
+ ARTIST = 'artist'
167
+ ARTISTID = 'artistid'
168
+ CAST = 'cast'
169
+ COMMENT = 'comment'
170
+ COUNTRY = 'country'
171
+ DATEADDED = 'dateadded'
172
+ DESCRIPTION = 'description'
173
+ DIRECTOR = 'director'
174
+ DISC = 'disc'
175
+ DISPLAYARTIST = 'displayartist'
176
+ DURATION = 'duration'
177
+ EPISODE = 'episode'
178
+ EPISODEGUIDE = 'episodeguide'
179
+ FANART = 'fanart'
180
+ FILE = 'file'
181
+ FIRSTAIRED = 'firstaired'
182
+ GENRE = 'genre'
183
+ GENREID = 'genreid'
184
+ IMDBNUMBER = 'imdbnumber'
185
+ LASTMODIFIED = 'lastmodified'
186
+ LASTPLAYED = 'lastplayed'
187
+ LYRICS = 'lyrics'
188
+ MIMETYPE = 'mimetype'
189
+ MOOD = 'mood'
190
+ MPAA = 'mpaa'
191
+ MUSICBRAINZALBUMARTISTID = 'musicbrainzalbumartistid'
192
+ MUSICBRAINZALBUMID = 'musicbrainzalbumid'
193
+ MUSICBRAINZARTISTID = 'musicbrainzartistid'
194
+ MUSICBRAINZTRACKID = 'musicbrainztrackid'
195
+ ORIGINALTITLE = 'originaltitle'
196
+ PLAYCOUNT = 'playcount'
197
+ PLOT = 'plot'
198
+ PLOTOUTLINE = 'plotoutline'
199
+ PREMIERED = 'premiered'
200
+ PRODUCTIONCODE = 'productioncode'
201
+ RATING = 'rating'
202
+ RESUME = 'resume'
203
+ RUNTIME = 'runtime'
204
+ SEASON = 'season'
205
+ SET = 'set'
206
+ SETID = 'setid'
207
+ SHOWLINK = 'showlink'
208
+ SHOWTITLE = 'showtitle'
209
+ SIZE = 'size'
210
+ SORTTITLE = 'sorttitle'
211
+ SPECIALSORTEPISODE = 'specialsortepisode'
212
+ SPECIALSORTSEASON = 'specialsortseason'
213
+ STREAMDETAILS = 'streamdetails'
214
+ STUDIO = 'studio'
215
+ STYLE = 'style'
216
+ TAG = 'tag'
217
+ TAGLINE = 'tagline'
218
+ THEME = 'theme'
219
+ THUMBNAIL = 'thumbnail'
220
+ TITLE = 'title'
221
+ TOP250 = 'top250'
222
+ TRACK = 'track'
223
+ TRAILER = 'trailer'
224
+ TVSHOWID = 'tvshowid'
225
+ UNIQUEID = 'uniqueid'
226
+ VOTES = 'votes'
227
+ WATCHEDEPISODES = 'watchedepisodes'
228
+ WRITER = 'writer'
229
+ YEAR = 'year'
230
+ end
231
+
232
+ # File/Label tuple
233
+ class FileLabel
234
+ include Comparable
235
+ extend Creatable
236
+
237
+ attr_reader :file, :label
238
+
239
+ def initialize(file, label)
240
+ @file = file
241
+ @label = label
242
+ end
243
+ end
244
+
133
245
  # List.Item.Base https://kodi.wiki/view/JSON-RPC_API/v12#List.Item.Base
134
246
  module ListItemBase
135
247
  include Video::VideoDetailsFile
@@ -145,75 +257,116 @@ module KodiClient
145
257
  :special_sort_season, :studio, :style, :tag, :tag_line, :theme, :top250, :total_discs, :track,
146
258
  :trailer, :tv_show_id, :type, :unique_id, :votes, :watched_episodes, :writer
147
259
 
148
- def list_item_base(hash)
149
- @album = hash['album']
150
- @album_artist = hash['albumartist']
151
- @album_artist_id = hash['albumartistid']
152
- @album_id = hash['albumid']
153
- @album_release_type = hash['albumreleasetype']
154
- @album_status = hash['albumstatus']
155
- @bit_rate = hash['bitrate']
156
- @bpm = hash['bpm']
157
- @cast = hash['cast'].nil? ? [] : hash['cast'].map { |it| Types::Video::VideoCast.new(it) }
158
- @channels = hash['channels']
159
- @comment = hash['comment']
160
- @compilation = hash['compilation']
161
- @contributors = hash['contributors'].nil? ? [] : hash['contributors'].map { |it| Types::Audio::AudioContributor.new(it) }
162
- @country = hash['country']
163
- @description = hash['description']
164
- @disc = hash['disc']
165
- @disc_title = hash['disctitle']
166
- @display_composer = hash['displaycomposer']
167
- @display_conductor = hash['displayconductor']
168
- @display_lyricist = hash['displaylyricist']
169
- @display_orchestra = hash['displayorchestra']
170
- @duration = hash['duration']
171
- @dyn_path = hash['dynpath']
172
- @episode = hash['episode']
173
- @episode_guide = hash['episodeguide']
174
- @first_aired = hash['firstaired']
175
- @id = hash['id']
176
- @imdb_number = hash['imdbnumber']
177
- @is_box_set = hash['isboxset']
178
- @lyrics = hash['lyrics']
179
- @media_path = hash['mediapath']
180
- @mood = hash['mood']
181
- @mpaa = hash['mpaa']
182
- @musicbrainz_artist_id = hash['musicbrainzartistid']
183
- @musicbrainz_track_id = hash['musicbrainztrackid']
184
- @original_date = hash['originaldate']
185
- @original_title = hash['originaltitle']
186
- @plot_outline = hash['plotoutline']
187
- @premiered = hash['premiered']
188
- @production_code = hash['productioncode']
189
- @release_date = hash['releasedate']
190
- @release_type = hash['releasetype']
191
- @sample_rate = hash['samplerate']
192
- @season = hash['season']
193
- @set = hash['set']
194
- @set_id = hash['setid']
195
- @show_link = hash['showlink']
196
- @show_title = hash['showtitle']
197
- @sort_title = hash['sorttitle']
198
- @special_sort_episode = hash['specialsortepisode']
199
- @special_sort_season = hash['specialsortseason']
200
- @studio = hash['studio']
201
- @style = hash['style']
202
- @tag = hash['tag']
203
- @tag_line = hash['tagline']
204
- @theme = hash['theme']
205
- @top250 = hash['top250']
206
- @total_discs = hash['totaldiscs']
207
- @track = hash['track']
208
- @trailer = hash['trailer']
209
- @tv_show_id = hash['tvshowid']
210
- @type = hash['type'].nil? ? 'unknown' : hash['type']
211
- @unique_id = hash['uniqueid']
212
- @votes = hash['votes']
213
- @watched_episodes = hash['watchedepisodes']
214
- @writer = hash['writer']
215
- video_details_file(hash)
216
- audio_details_media(hash)
260
+ def list_item_base_by_hash(hash)
261
+ cast = Types::Video::VideoCast.create_list(hash['cast'])
262
+ contributors = Types::Audio::AudioContributor.create_list(hash['contributors'])
263
+ resume = Types::Video::VideoResume.create(hash['resume'])
264
+ stream_details = Types::Video::Streams.create(hash['streamdetails'])
265
+ art = Types::Media::MediaArtwork.create(hash['art'])
266
+ hash['type'] = 'unknown' if hash['type'].nil?
267
+ list_item_base(*Creatable.hash_to_arr(hash, %w[album album_artist album_artist_id album_id
268
+ album_release_type album_status bit_rate bpm]), cast,
269
+ hash['channels'], hash['comment'], hash['compilation'], contributors,
270
+ *Creatable.hash_to_arr(hash, %w[country description disc disc_title display_composer
271
+ display_conductor display_lyricist display_orchestra duration
272
+ dyn_path episode episode_guide first_aired id imdb_number
273
+ is_box_set lyrics media_path mood mpaa musicbrainz_artist_id
274
+ musicbrainz_track_id original_date original_title plot_outline
275
+ premiered production_code release_date release_type sample_rate
276
+ season set set_id show_link show_title sort_title
277
+ special_sort_episode special_sort_season studio style tag
278
+ tag_line theme top250 total_discs track trailer tv_show_id
279
+ type unique_id votes watched_episodes writer director]),
280
+ resume, hash['runtime'], stream_details,
281
+ *Creatable.hash_to_arr(hash, %w[date_added file last_played plot title]), art,
282
+ *Creatable.hash_to_arr(hash, %w[play_count fan_art thumbnail label artist artist_id
283
+ display_artist musicbrainz_album_artist_id rating sort_artist
284
+ user_rating year genre]))
285
+ end
286
+
287
+ def list_item_base(album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
288
+ bpm, cast, channels, comment, compilation, contributors, country, description, disc,
289
+ disc_title, display_composer, display_conductor, display_lyricist, display_orchestra,
290
+ duration, dyn_path, episode, episode_guide, first_aired, id, imdb_number, is_box_set,
291
+ lyrics, media_path, mood, mpaa, musicbrainz_artist_id, musicbrainz_track_id, original_date,
292
+ original_title, plot_outline, premiered, production_code, release_date, release_type,
293
+ sample_rate, season, set, set_id, show_link, show_title, sort_title, special_sort_episode,
294
+ special_sort_season, studio, style, tag, tag_line, theme, top250, total_discs, track,
295
+ trailer, tv_show_id, type, unique_id, votes, watched_episodes, writer, director, resume,
296
+ runtime, stream_details, date_added, file, last_played, plot, title, art, play_count,
297
+ fan_art, thumbnail, label, artist, artist_id, display_artist, musicbrainz_album_artist_id,
298
+ rating, sort_artist, user_rating, year, genre)
299
+ @album = album
300
+ @album_artist = album_artist
301
+ @album_artist_id = album_artist_id
302
+ @album_id = album_id
303
+ @album_release_type = album_release_type
304
+ @album_status = album_status
305
+ @bit_rate = bit_rate
306
+ @bpm = bpm
307
+ @cast = cast
308
+ @channels = channels
309
+ @comment = comment
310
+ @compilation = compilation
311
+ @contributors = contributors
312
+ @country = country
313
+ @description = description
314
+ @disc = disc
315
+ @disc_title = disc_title
316
+ @display_composer = display_composer
317
+ @display_conductor = display_conductor
318
+ @display_lyricist = display_lyricist
319
+ @display_orchestra = display_orchestra
320
+ @duration = duration
321
+ @dyn_path = dyn_path
322
+ @episode = episode
323
+ @episode_guide = episode_guide
324
+ @first_aired = first_aired
325
+ @id = id
326
+ @imdb_number = imdb_number
327
+ @is_box_set = is_box_set
328
+ @lyrics = lyrics
329
+ @media_path = media_path
330
+ @mood = mood
331
+ @mpaa = mpaa
332
+ @musicbrainz_artist_id = musicbrainz_artist_id
333
+ @musicbrainz_track_id = musicbrainz_track_id
334
+ @original_date = original_date
335
+ @original_title = original_title
336
+ @plot_outline = plot_outline
337
+ @premiered = premiered
338
+ @production_code = production_code
339
+ @release_date = release_date
340
+ @release_type = release_type
341
+ @sample_rate = sample_rate
342
+ @season = season
343
+ @set = set
344
+ @set_id = set_id
345
+ @show_link = show_link
346
+ @show_title = show_title
347
+ @sort_title = sort_title
348
+ @special_sort_episode = special_sort_episode
349
+ @special_sort_season = special_sort_season
350
+ @studio = studio
351
+ @style = style
352
+ @tag = tag
353
+ @tag_line = tag_line
354
+ @theme = theme
355
+ @top250 = top250
356
+ @total_discs = total_discs
357
+ @track = track
358
+ @trailer = trailer
359
+ @tv_show_id = tv_show_id
360
+ @type = type
361
+ @unique_id = unique_id
362
+ @votes = votes
363
+ @watched_episodes = watched_episodes
364
+ @writer = writer
365
+ video_details_file(director, resume, runtime, stream_details, date_added, file, last_played, plot, title,
366
+ art, play_count, fan_art, thumbnail, label)
367
+ audio_details_media(artist, artist_id, display_artist, musicbrainz_album_artist_id, original_date, rating,
368
+ release_date, sort_artist, title, user_rating, votes, year, art, date_added, genre,
369
+ fan_art, thumbnail, label)
217
370
  end
218
371
  end
219
372
 
@@ -221,26 +374,196 @@ module KodiClient
221
374
  class ListItemAll
222
375
  include ListItemBase
223
376
  include Comparable
377
+ extend Creatable
224
378
 
225
379
  attr_reader :channel, :channel_number, :channel_type, :end_time, :hidden, :locked, :start_time,
226
380
  :sub_channel_number
227
381
 
228
- def initialize(hash)
229
- @channel = hash['channel']
230
- @channel_number = hash['channelnumber']
231
- @channel_type = hash['channeltype']
232
- @end_time = hash['endtime']
233
- @hidden = hash['hidden']
234
- @locked = hash['locked']
235
- @start_time = hash['starttime']
236
- @sub_channel_number = hash['subchannelnumber']
237
- list_item_base(hash)
382
+ def self.create(hash)
383
+ return nil if hash.nil?
384
+
385
+ cast = Types::Video::VideoCast.create_list(hash['cast'])
386
+ contributors = Types::Audio::AudioContributor.create_list(hash['contributors'])
387
+ resume = Types::Video::VideoResume.create(hash['resume'])
388
+ stream_details = Types::Video::Streams.create(hash['streamdetails'])
389
+ art = Types::Media::MediaArtwork.create(hash['art'])
390
+ hash['type'] = 'unknown' if hash['type'].nil?
391
+ new(*Creatable.hash_to_arr(hash, %w[channel channel_number channel_type end_time hidden locked start_time
392
+ sub_channel_number album album_artist album_artist_id album_id
393
+ album_release_type album_status bit_rate bpm]), cast,
394
+ hash['channels'], hash['comment'], hash['compilation'], contributors,
395
+ *Creatable.hash_to_arr(hash, %w[country description disc disc_title display_composer
396
+ display_conductor display_lyricist display_orchestra duration
397
+ dyn_path episode episode_guide first_aired id imdb_number
398
+ is_box_set lyrics media_path mood mpaa musicbrainz_artist_id
399
+ musicbrainz_track_id original_date original_title plot_outline
400
+ premiered production_code release_date release_type sample_rate
401
+ season set set_id show_link show_title sort_title
402
+ special_sort_episode special_sort_season studio style tag
403
+ tag_line theme top250 total_discs track trailer tv_show_id
404
+ type unique_id votes watched_episodes writer director]),
405
+ resume, hash['runtime'], stream_details,
406
+ *Creatable.hash_to_arr(hash, %w[date_added file last_played plot title]), art,
407
+ *Creatable.hash_to_arr(hash, %w[play_count fan_art thumbnail label artist artist_id
408
+ display_artist musicbrainz_album_artist_id rating sort_artist
409
+ user_rating year genre]))
410
+ end
411
+
412
+ def initialize(channel, channel_number, channel_type, end_time, hidden, locked, start_time, sub_channel_number,
413
+ album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
414
+ bpm, cast, channels, comment, compilation, contributors, country, description, disc,
415
+ disc_title, display_composer, display_conductor, display_lyricist, display_orchestra,
416
+ duration, dyn_path, episode, episode_guide, first_aired, id, imdb_number, is_box_set,
417
+ lyrics, media_path, mood, mpaa, musicbrainz_artist_id, musicbrainz_track_id, original_date,
418
+ original_title, plot_outline, premiered, production_code, release_date, release_type,
419
+ sample_rate, season, set, set_id, show_link, show_title, sort_title, special_sort_episode,
420
+ special_sort_season, studio, style, tag, tag_line, theme, top250, total_discs, track,
421
+ trailer, tv_show_id, type, unique_id, votes, watched_episodes, writer, director, resume,
422
+ runtime, stream_details, date_added, file, last_played, plot, title, art, play_count,
423
+ fan_art, thumbnail, label, artist, artist_id, display_artist, musicbrainz_album_artist_id,
424
+ rating, sort_artist, user_rating, year, genre)
425
+
426
+ @channel = channel
427
+ @channel_number = channel_number
428
+ @channel_type = channel_type
429
+ @end_time = end_time
430
+ @hidden = hidden
431
+ @locked = locked
432
+ @start_time = start_time
433
+ @sub_channel_number = sub_channel_number
434
+
435
+ list_item_base(album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
436
+ bpm, cast, channels, comment, compilation, contributors, country, description, disc,
437
+ disc_title, display_composer, display_conductor, display_lyricist, display_orchestra,
438
+ duration, dyn_path, episode, episode_guide, first_aired, id, imdb_number, is_box_set,
439
+ lyrics, media_path, mood, mpaa, musicbrainz_artist_id, musicbrainz_track_id, original_date,
440
+ original_title, plot_outline, premiered, production_code, release_date, release_type,
441
+ sample_rate, season, set, set_id, show_link, show_title, sort_title, special_sort_episode,
442
+ special_sort_season, studio, style, tag, tag_line, theme, top250, total_discs, track,
443
+ trailer, tv_show_id, type, unique_id, votes, watched_episodes, writer, director, resume,
444
+ runtime, stream_details, date_added, file, last_played, plot, title, art, play_count,
445
+ fan_art, thumbnail, label, artist, artist_id, display_artist, musicbrainz_album_artist_id,
446
+ rating, sort_artist, user_rating, year, genre)
447
+ end
448
+ end
449
+
450
+ # List.Item.File https://kodi.wiki/view/JSON-RPC_API/v12#List.Item.File
451
+ class ListItemFile
452
+ include ListItemBase
453
+ include Comparable
454
+ extend Creatable
455
+
456
+ attr_reader :file, :file_type, :last_modified, :mime_type, :size
457
+
458
+ def self.create(hash)
459
+ return nil if hash.nil?
460
+
461
+ cast = Types::Video::VideoCast.create_list(hash['cast'])
462
+ contributors = Types::Audio::AudioContributor.create_list(hash['contributors'])
463
+ resume = Types::Video::VideoResume.create(hash['resume'])
464
+ stream_details = Types::Video::Streams.create(hash['streamdetails'])
465
+ art = Types::Media::MediaArtwork.create(hash['art'])
466
+ hash['type'] = 'unknown' if hash['type'].nil?
467
+ new(*Creatable.hash_to_arr(hash, %w[file_type last_modified mime_type size]),
468
+ *Creatable.hash_to_arr(hash, %w[album album_artist album_artist_id album_id
469
+ album_release_type album_status bit_rate bpm]), cast,
470
+ hash['channels'], hash['comment'], hash['compilation'], contributors,
471
+ *Creatable.hash_to_arr(hash, %w[country description disc disc_title display_composer
472
+ display_conductor display_lyricist display_orchestra duration
473
+ dyn_path episode episode_guide first_aired id imdb_number
474
+ is_box_set lyrics media_path mood mpaa musicbrainz_artist_id
475
+ musicbrainz_track_id original_date original_title plot_outline
476
+ premiered production_code release_date release_type sample_rate
477
+ season set set_id show_link show_title sort_title
478
+ special_sort_episode special_sort_season studio style tag
479
+ tag_line theme top250 total_discs track trailer tv_show_id
480
+ type unique_id votes watched_episodes writer director]),
481
+ resume, hash['runtime'], stream_details,
482
+ *Creatable.hash_to_arr(hash, %w[date_added file last_played plot title]), art,
483
+ *Creatable.hash_to_arr(hash, %w[play_count fan_art thumbnail label artist artist_id
484
+ display_artist musicbrainz_album_artist_id rating sort_artist
485
+ user_rating year genre]))
238
486
  end
239
487
 
240
- def ==(other)
241
- compare(self, other)
488
+ def initialize(file_type, last_modified, mime_type, size,
489
+ album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
490
+ bpm, cast, channels, comment, compilation, contributors, country, description, disc,
491
+ disc_title, display_composer, display_conductor, display_lyricist, display_orchestra,
492
+ duration, dyn_path, episode, episode_guide, first_aired, id, imdb_number, is_box_set,
493
+ lyrics, media_path, mood, mpaa, musicbrainz_artist_id, musicbrainz_track_id, original_date,
494
+ original_title, plot_outline, premiered, production_code, release_date, release_type,
495
+ sample_rate, season, set, set_id, show_link, show_title, sort_title, special_sort_episode,
496
+ special_sort_season, studio, style, tag, tag_line, theme, top250, total_discs, track,
497
+ trailer, tv_show_id, type, unique_id, votes, watched_episodes, writer, director, resume,
498
+ runtime, stream_details, date_added, file, last_played, plot, title, art, play_count,
499
+ fan_art, thumbnail, label, artist, artist_id, display_artist, musicbrainz_album_artist_id,
500
+ rating, sort_artist, user_rating, year, genre)
501
+ @file = file
502
+ @file_type = file_type
503
+ @last_modified = last_modified
504
+ @mime_type = mime_type
505
+ @size = size
506
+ list_item_base(album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
507
+ bpm, cast, channels, comment, compilation, contributors, country, description, disc,
508
+ disc_title, display_composer, display_conductor, display_lyricist, display_orchestra,
509
+ duration, dyn_path, episode, episode_guide, first_aired, id, imdb_number, is_box_set,
510
+ lyrics, media_path, mood, mpaa, musicbrainz_artist_id, musicbrainz_track_id, original_date,
511
+ original_title, plot_outline, premiered, production_code, release_date, release_type,
512
+ sample_rate, season, set, set_id, show_link, show_title, sort_title, special_sort_episode,
513
+ special_sort_season, studio, style, tag, tag_line, theme, top250, total_discs, track,
514
+ trailer, tv_show_id, type, unique_id, votes, watched_episodes, writer, director, resume,
515
+ runtime, stream_details, date_added, file, last_played, plot, title, art, play_count,
516
+ fan_art, thumbnail, label, artist, artist_id, display_artist, musicbrainz_album_artist_id,
517
+ rating, sort_artist, user_rating, year, genre)
242
518
  end
243
519
  end
520
+
521
+ # methods for list sorting
522
+ module ListSortMethod
523
+ extend Iterable
524
+
525
+ NONE = 'none'
526
+ LABEL = 'label'
527
+ DATE = 'date'
528
+ SIZE = 'size'
529
+ FILE = 'file'
530
+ PATH = 'path'
531
+ DRIVE_TYPE = 'drivetype'
532
+ TITLE = 'title'
533
+ TRACK = 'track'
534
+ TIME = 'time'
535
+ ARTIST = 'artist'
536
+ ALBUM = 'album'
537
+ ALBUM_TYPE = 'albumtype'
538
+ GENRE = 'genre'
539
+ COUNTRY = 'country'
540
+ YEAR = 'year'
541
+ RATING = 'rating'
542
+ USER_RATING = 'userrating'
543
+ VOTES = 'votes'
544
+ TOP_250 = 'top250'
545
+ PROGRAM_COUNT = 'programcount'
546
+ PLAYLIST = 'playlist'
547
+ EPISODE = 'episode'
548
+ SEASON = 'season'
549
+ TOTAL_EPISODES = 'totalepisodes'
550
+ WATCHED_EPISODES = 'watchedepisodes'
551
+ TV_SHOW_STATUS = 'tvshowstatus'
552
+ TV_SHOW_TITLE = 'tvshowtitle'
553
+ SORT_TITLE = 'sorttitle'
554
+ PRODUCTION_CODE = 'productioncode'
555
+ MPAA = 'mpaa'
556
+ STUDIO = 'studio'
557
+ DATE_ADDED = 'dateadded'
558
+ LAST_PLAYED = 'lastplayed'
559
+ PLAY_COUNT = 'playcount'
560
+ LISTENERS = 'listeners'
561
+ BITRATE = 'bitrate'
562
+ RANDOM = 'random'
563
+ TOTAL_DISCS = 'totaldiscs'
564
+ ORIGINAL_DATE = 'originaldate'
565
+ BPM = 'bpm'
566
+ end
244
567
  end
245
568
  end
246
569
  end