kodi_client 0.5.5 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/kodi_client.gemspec +3 -3
  4. data/lib/kodi_client/Chainable.rb +3 -1
  5. data/lib/kodi_client/global_types/addon_types.rb +50 -52
  6. data/lib/kodi_client/global_types/application_types.rb +21 -23
  7. data/lib/kodi_client/global_types/audio_types.rb +179 -29
  8. data/lib/kodi_client/global_types/favourites_types.rb +14 -17
  9. data/lib/kodi_client/global_types/files_types.rb +68 -0
  10. data/lib/kodi_client/global_types/global_types.rb +18 -24
  11. data/lib/kodi_client/global_types/gui_types.rb +15 -16
  12. data/lib/kodi_client/global_types/item_types.rb +10 -2
  13. data/lib/kodi_client/global_types/list_types.rb +326 -98
  14. data/lib/kodi_client/global_types/media_types.rb +21 -13
  15. data/lib/kodi_client/global_types/player_type.rb +110 -110
  16. data/lib/kodi_client/global_types/profiles_types.rb +14 -14
  17. data/lib/kodi_client/global_types/system_types.rb +7 -9
  18. data/lib/kodi_client/global_types/video_types.rb +80 -43
  19. data/lib/kodi_client/method/addons.rb +7 -19
  20. data/lib/kodi_client/method/application.rb +1 -1
  21. data/lib/kodi_client/method/audio_library.rb +49 -0
  22. data/lib/kodi_client/method/favourites.rb +1 -1
  23. data/lib/kodi_client/method/files.rb +89 -0
  24. data/lib/kodi_client/method/gui.rb +2 -2
  25. data/lib/kodi_client/method/player.rb +6 -6
  26. data/lib/kodi_client/method/profiles.rb +2 -2
  27. data/lib/kodi_client/method/system.rb +1 -1
  28. data/lib/kodi_client/util/comparable.rb +4 -1
  29. data/lib/kodi_client/util/creatable.rb +106 -0
  30. data/lib/kodi_client.rb +10 -22
  31. metadata +9 -5
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'kodi_client/global_types/item_types'
4
4
  require 'kodi_client/util/comparable'
5
+ require 'kodi_client/util/creatable'
6
+ require 'kodi_client/util/iterable'
5
7
 
6
8
  module KodiClient
7
9
  module Types
@@ -10,6 +12,7 @@ module KodiClient
10
12
  # media types
11
13
  module MediaType
12
14
  extend Iterable
15
+
13
16
  VIDEO = 'video'
14
17
  AUDIO = 'audio'
15
18
  ALL = 'all'
@@ -21,28 +24,33 @@ module KodiClient
21
24
 
22
25
  attr_reader :fan_art, :thumbnail
23
26
 
24
- def media_details_base(hash)
25
- @fan_art = hash['fanart']
26
- @thumbnail = hash['thumbnail']
27
- item_details_base(hash)
27
+ def media_details_base_mappings
28
+ item_details_base_mappings
29
+ end
30
+
31
+ def media_details_base_by_hash(hash)
32
+ media_details_base(*Creatable.hash_to_arr(hash, %w[fan_art thumbnail label]), media_details_base_mappings)
33
+ end
34
+
35
+ def media_details_base(fan_art, thumbnail, label)
36
+ @fan_art = fan_art
37
+ @thumbnail = thumbnail
38
+ item_details_base(label)
28
39
  end
29
40
  end
30
41
 
31
42
  # Media.Artwork https://kodi.wiki/view/JSON-RPC_API/v12#Media.Artwork
32
43
  class MediaArtwork
33
44
  include Comparable
45
+ extend Creatable
34
46
 
35
47
  attr_reader :banner, :fan_art, :poster, :thumb
36
48
 
37
- def initialize(hash)
38
- @banner = hash['banner']
39
- @fan_art = hash['fanart']
40
- @poster = hash['poster']
41
- @thumb = hash['thumb']
42
- end
43
-
44
- def ==(other)
45
- compare(self, other)
49
+ def initialize(banner, fan_art, poster, thumb)
50
+ @banner = banner
51
+ @fan_art = fan_art
52
+ @poster = poster
53
+ @thumb = thumb
46
54
  end
47
55
  end
48
56
  end
@@ -4,6 +4,7 @@ require 'kodi_client/global_types/item_types'
4
4
  require 'kodi_client/global_types/global_types'
5
5
  require 'kodi_client/util/comparable'
6
6
  require 'kodi_client/util/iterable'
7
+ require 'kodi_client/util/creatable'
7
8
 
8
9
  module KodiClient
9
10
  module Types
@@ -20,6 +21,7 @@ module KodiClient
20
21
  # Player.ViewMode https://kodi.wiki/view/JSON-RPC_API/v12#Player.ViewMode
21
22
  module ViewMode
22
23
  extend Iterable
24
+
23
25
  NORMAL = 'normal'
24
26
  ZOOM = 'zoom'
25
27
  STRETCH_4x3 = 'strech4x3'
@@ -34,6 +36,7 @@ module KodiClient
34
36
  # player types
35
37
  module PlayerVisibilityType
36
38
  extend Iterable
39
+
37
40
  INTERNAL = 'internal'
38
41
  EXTERNAL = 'external'
39
42
  REMOTE = 'remote'
@@ -80,87 +83,75 @@ module KodiClient
80
83
  # player id and type
81
84
  class Player
82
85
  include Comparable
86
+ extend Creatable
83
87
 
84
88
  attr_reader :player_id, :player_type, :type, :name, :plays_audio, :plays_video
85
89
 
86
- def initialize(hash)
87
- @player_id = hash['playerid']
88
- @player_type = hash['playertype']
89
- @type = hash['type']
90
- @name = hash['name']
91
- @plays_audio = hash['playsaudio']
92
- @plays_video = hash['playsvideo']
93
- end
94
-
95
- def ==(other)
96
- compare(self, other)
90
+ def initialize(player_id, player_type, type, name, plays_audio, plays_video)
91
+ @player_id = player_id
92
+ @player_type = player_type
93
+ @type = type
94
+ @name = name
95
+ @plays_audio = plays_audio
96
+ @plays_video = plays_video
97
97
  end
98
98
  end
99
99
 
100
100
  # Player Subtitle https://kodi.wiki/view/JSON-RPC_API/v12#Player.Subtitle
101
101
  class Subtitle
102
102
  include Comparable
103
+ extend Creatable
103
104
 
104
105
  attr_reader :index, :is_default, :is_forced, :is_impaired, :language, :name
105
106
 
106
- def initialize(hash)
107
- @index = hash['index']
108
- @is_default = hash['isdefault']
109
- @is_forced = hash['isforced']
110
- @is_impaired = hash['isimpaired']
111
- @language = hash['language']
112
- @name = hash['name']
113
- end
114
-
115
- def ==(other)
116
- compare(self, other)
107
+ def initialize(index, is_default, is_forced, is_impaired, language, name)
108
+ @index = index
109
+ @is_default = is_default
110
+ @is_forced = is_forced
111
+ @is_impaired = is_impaired
112
+ @language = language
113
+ @name = name
117
114
  end
118
115
  end
119
116
 
120
117
  # Player.Audio.Stream https://kodi.wiki/view/JSON-RPC_API/v12#Player.Audio.Stream
121
118
  class AudioStream
122
119
  include Comparable
120
+ extend Creatable
123
121
 
124
122
  attr_reader :bitrate, :channels, :codec, :index, :is_default, :is_forced, :is_original, :language,
125
123
  :name, :sample_rate
126
124
 
127
- def initialize(hash)
128
- @bitrate = hash['bitrate']
129
- @channels = hash['channels']
130
- @codec = hash['codec']
131
- @index = hash['index']
132
- @is_default = hash['isdefault']
133
- @is_forced = hash['isforced']
134
- @is_original = hash['isoriginal']
135
- @language = hash['language']
136
- @name = hash['name']
137
- @sample_rate = hash['samplerate']
138
- end
139
-
140
- def ==(other)
141
- compare(self, other)
125
+ def initialize(bitrate, channels, codec, index, is_default, is_forced, is_original, language, name, sample_rate)
126
+ @bitrate = bitrate
127
+ @channels = channels
128
+ @codec = codec
129
+ @index = index
130
+ @is_default = is_default
131
+ @is_forced = is_forced
132
+ @is_original = is_original
133
+ @language = language
134
+ @name = name
135
+ @sample_rate = sample_rate
142
136
  end
143
137
  end
144
138
 
145
139
  # Player.Video.Stream https://kodi.wiki/view/JSON-RPC_API/v12#Player.Video.Stream
146
140
  class VideoStream
147
141
  include Comparable
142
+ extend Creatable
148
143
 
149
144
  attr_reader :codec, :height, :index, :language, :name, :width, :duration, :aspect
150
145
 
151
- def initialize(hash)
152
- @codec = hash['codec']
153
- @height = hash['height']
154
- @index = hash['index']
155
- @language = hash['language']
156
- @name = hash['name']
157
- @width = hash['width']
158
- @duration = hash['duration']
159
- @aspect = hash['aspect']
160
- end
161
-
162
- def ==(other)
163
- compare(self, other)
146
+ def initialize(codec, height, index, language, name, width, duration, aspect)
147
+ @codec = codec
148
+ @height = height
149
+ @index = index
150
+ @language = language
151
+ @name = name
152
+ @width = width
153
+ @duration = duration
154
+ @aspect = aspect
164
155
  end
165
156
  end
166
157
 
@@ -198,76 +189,84 @@ module KodiClient
198
189
  # Player.Property.Value https://kodi.wiki/view/JSON-RPC_API/v12#Player.Property.Name
199
190
  class PropertyValue
200
191
  include Comparable
201
-
202
- def initialize(hash)
203
- @audio_streams = hash['audiostreams'].map { |it| AudioStream.new(it) }
204
- @cache_percentage = hash['cachepercentage']
205
- @can_change_speed = hash['canchangespeed']
206
- @can_move = hash['canmove']
207
- @can_repeat = hash['canrepeat']
208
- @can_rotate = hash['canrotate']
209
- @can_seek = hash['canseek']
210
- @can_shuffle = hash['canshuffle']
211
- @can_zoom = hash['canzoom']
212
- @current_audio_stream = AudioStream.new(hash['currentaudiostream'])
213
- @current_subtitle = Subtitle.new(hash['currentsubtitle'])
214
- @current_video_stream = VideoStream.new(hash['currentvideostream'])
215
- @live = hash['live']
216
- @party_mode = hash['partymode']
217
- @percentage = hash['percentage']
218
- @playlist_id = hash['playlistid'].nil? ? -1 : hash['playlistid']
219
- @position = hash['position'].nil? ? -1 : hash['position']
220
- @position = hash['position'].nil? ? -1 : hash['position']
221
- @repeat = hash['repeat'].nil? ? PlayerRepeat::OFF : hash['repeat']
222
- @shuffled = hash['shuffled']
223
- @speed = hash['speed']
224
- @subtitle_enabled = hash['subtitleenabled']
225
- @subtitles = hash['subtitles'].map { |it| Subtitle.new(it) }
226
- @time = Types::Global::GlobalTime.new(hash['time'])
227
- @total_time = Types::Global::GlobalTime.new(hash['totaltime'])
228
- @type = hash['type'].nil? ? PlayerType::VIDEO : hash['type']
229
- @video_streams = hash['videostreams'].map { |it| VideoStream.new(it) }
230
- end
231
-
232
- def ==(other)
233
- compare(self, other)
192
+ extend Creatable
193
+
194
+ attr_reader :audio_streams, :cache_percentage, :can_change_speed, :can_move, :can_repeat, :can_rotate,
195
+ :can_seek, :can_shuffle, :can_zoom, :current_audio_stream, :current_subtitle, :current_video_stream,
196
+ :live, :party_mode, :percentage, :playlist_id, :position, :repeat, :shuffled, :speed,
197
+ :subtitle_enabled, :subtitles, :time, :total_time, :type, :video_streams
198
+
199
+ type_mapping ['audiostreams', AudioStream, true], ['currentaudiostream', AudioStream],
200
+ ['currentsubtitle', Subtitle], ['currentvideostream', VideoStream],
201
+ ['subtitles', Subtitle, true], ['time', Global::GlobalTime],
202
+ ['totaltime', Global::GlobalTime], ['videostreams', VideoStream, true]
203
+
204
+ def initialize(audio_streams, cache_percentage, can_change_speed, can_move, can_repeat, can_rotate, can_seek,
205
+ can_shuffle, can_zoom, current_audio_stream, current_subtitle, current_video_stream, live,
206
+ party_mode, percentage, playlist_id, position, repeat, shuffled, speed,
207
+ subtitle_enabled, subtitles, time, total_time, type, video_streams)
208
+ type = type.nil? ? PlayerType::VIDEO : type
209
+ playlist_id = playlist_id.nil? ? -1 : playlist_id
210
+ position = position.nil? ? -1 : position
211
+ repeat = repeat.nil? ? PlayerRepeat::OFF : repeat
212
+
213
+ @audio_streams = audio_streams
214
+ @cache_percentage = cache_percentage
215
+ @can_change_speed = can_change_speed
216
+ @can_move = can_move
217
+ @can_repeat = can_repeat
218
+ @can_rotate = can_rotate
219
+ @can_seek = can_seek
220
+ @can_shuffle = can_shuffle
221
+ @can_zoom = can_zoom
222
+ @current_audio_stream = current_audio_stream
223
+ @current_subtitle = current_subtitle
224
+ @current_video_stream = current_video_stream
225
+ @live = live
226
+ @party_mode = party_mode
227
+ @percentage = percentage
228
+ @playlist_id = playlist_id
229
+ @position = position
230
+ @repeat = repeat
231
+ @shuffled = shuffled
232
+ @speed = speed
233
+ @subtitle_enabled = subtitle_enabled
234
+ @subtitles = subtitles
235
+ @time = time
236
+ @total_time = total_time
237
+ @type = type
238
+ @video_streams = video_streams
234
239
  end
235
240
  end
236
241
 
237
242
  # return value for Player.GetViewMode
238
243
  class PlayerViewMode
239
244
  include Comparable
245
+ extend Creatable
240
246
 
241
247
  attr_reader :nonlinear_stretch, :pixel_ratio, :vertical_shift, :view_mode, :zoom
242
248
 
243
- def initialize(hash)
244
- @nonlinear_stretch = hash['nonlinearstretch']
245
- @pixel_ratio = hash['pixelratio']
246
- @vertical_shift = hash['verticalshift']
247
- @view_mode = hash['viewed']
248
- @zoom = hash['zoom']
249
- end
250
-
251
- def ==(other)
252
- compare(self, other)
249
+ def initialize(nonlinear_stretch, pixel_ratio, vertical_shift, view_mode, zoom)
250
+ @nonlinear_stretch = nonlinear_stretch
251
+ @pixel_ratio = pixel_ratio
252
+ @vertical_shift = vertical_shift
253
+ @view_mode = view_mode
254
+ @zoom = zoom
253
255
  end
254
256
  end
255
257
 
256
258
  # Player.Position.Time https://kodi.wiki/view/JSON-RPC_API/v12#Player.Position.Time
257
259
  class PlayerPositionTime
258
260
  include Comparable
261
+ extend Creatable
259
262
 
260
263
  attr_reader :hours, :minutes, :seconds, :milliseconds
261
264
 
262
- def initialize(hash)
263
- @hours = hash['hours']
264
- @minutes = hash['minutes']
265
- @seconds = hash['seconds']
266
- @milliseconds = hash['milliseconds']
267
- end
268
-
269
- def ==(other)
270
- compare(self, other)
265
+ def initialize(hours, minutes, seconds, milliseconds)
266
+ @hours = hours
267
+ @minutes = minutes
268
+ @seconds = seconds
269
+ @milliseconds = milliseconds
271
270
  end
272
271
  end
273
272
 
@@ -282,17 +281,18 @@ module KodiClient
282
281
  end
283
282
 
284
283
  # return value of Player.Seek
285
- class SeekReturnValue
284
+ class SeekReturned
286
285
  include Comparable
286
+ extend Creatable
287
287
 
288
- def initialize(hash)
289
- @percentage = hash['percentage']
290
- @time = Types::Global::GlobalTime.new(hash['time'])
291
- @total_time = Types::Global::GlobalTime.new(hash['totaltime'])
292
- end
288
+ attr_reader :percentage, :time, :total_time
289
+
290
+ type_mapping ['time', Global::GlobalTime], ['totaltime', Global::GlobalTime]
293
291
 
294
- def ==(other)
295
- compare(self, other)
292
+ def initialize(percentage, time, total_time)
293
+ @percentage = percentage
294
+ @time = time
295
+ @total_time = total_time
296
296
  end
297
297
  end
298
298
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'kodi_client/util/comparable'
4
4
  require 'kodi_client/util/iterable'
5
+ require 'kodi_client/util/creatable'
5
6
  require 'kodi_client/global_types/item_types'
6
7
 
7
8
  module KodiClient
@@ -20,13 +21,16 @@ module KodiClient
20
21
  class DetailsProfile
21
22
  include Comparable
22
23
  include Items::ItemDetailsBase
24
+ extend Creatable
23
25
 
24
26
  attr_reader :lock_mode, :thumbnail
25
27
 
26
- def initialize(hash)
27
- @lock_mode = hash['lockmode']
28
- @thumbnail = hash['thumbnail']
29
- item_details_base(hash)
28
+ fields_to_map %w[lock_mode thumbnail label]
29
+
30
+ def initialize(lock_mode, thumbnail, label)
31
+ @lock_mode = lock_mode
32
+ @thumbnail = thumbnail
33
+ item_details_base(label)
30
34
  end
31
35
 
32
36
  def ==(other)
@@ -37,22 +41,22 @@ module KodiClient
37
41
  # return type for Profiles.GetProfiles
38
42
  class GetProfilesReturned
39
43
  include Comparable
44
+ extend Creatable
40
45
 
41
46
  attr_reader :limits, :profiles
42
47
 
43
- def initialize(hash)
44
- @limits = Types::List::ListLimitsReturned.new(hash['limits'])
45
- @profiles = hash['profiles'].nil? ? [] : hash['profiles'].map { |it| Types::Profiles::DetailsProfile.new(it) }
46
- end
48
+ type_mapping ['limits', List::ListLimitsReturned], ['profiles', DetailsProfile, true]
47
49
 
48
- def ==(other)
49
- compare(self, other)
50
+ def initialize(limits, profiles)
51
+ @limits = limits
52
+ @profiles = profiles
50
53
  end
51
54
  end
52
55
 
53
56
  # Profiles.Password https://kodi.wiki/view/JSON-RPC_API/v12#Profiles.Password
54
57
  class ProfilePassword
55
58
  include Comparable
59
+ extend Creatable
56
60
 
57
61
  attr_reader :value, :encryption
58
62
 
@@ -60,10 +64,6 @@ module KodiClient
60
64
  @value = value
61
65
  @encryption = encryption
62
66
  end
63
-
64
- def ==(other)
65
- compare(self, other)
66
- end
67
67
  end
68
68
  end
69
69
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'kodi_client/util/iterable'
4
4
  require 'kodi_client/util/comparable'
5
+ require 'kodi_client/util/creatable'
5
6
 
6
7
  module KodiClient
7
8
  module Types
@@ -20,18 +21,15 @@ module KodiClient
20
21
  # System.Property.Value https://kodi.wiki/view/JSON-RPC_API/v12#System.Property.Value
21
22
  class PropertyValue
22
23
  include Comparable
24
+ extend Creatable
23
25
 
24
26
  attr_reader :can_hibernate, :can_reboot, :can_shutdown, :can_suspend
25
27
 
26
- def initialize(hash)
27
- @can_hibernate = hash['canhibernate']
28
- @can_reboot = hash['canreboot']
29
- @can_shutdown = hash['canshutdown']
30
- @can_suspend = hash['cansuspend']
31
- end
32
-
33
- def ==(other)
34
- compare(self, other)
28
+ def initialize(can_hibernate, can_reboot, can_shutdown, can_suspend)
29
+ @can_hibernate = can_hibernate
30
+ @can_reboot = can_reboot
31
+ @can_shutdown = can_shutdown
32
+ @can_suspend = can_suspend
35
33
  end
36
34
  end
37
35
  end
@@ -3,39 +3,45 @@
3
3
  require 'kodi_client/global_types/media_types'
4
4
  require 'kodi_client/global_types/player_type'
5
5
  require 'kodi_client/util/comparable'
6
+ require 'kodi_client/util/creatable'
6
7
 
7
8
  module KodiClient
8
9
  module Types
9
10
  module Video
10
-
11
11
  # Video.Details.Base https://kodi.wiki/view/JSON-RPC_API/v12#Video.Details.Base
12
12
  module VideoDetailsBase
13
13
  include Media::MediaDetailsBase
14
14
 
15
15
  attr_reader :art, :play_count
16
16
 
17
- def video_details_base(hash)
18
- @art = Types::Media::MediaArtwork.new(hash['art'])
19
- @play_count = ['playcount']
20
- media_details_base(hash)
17
+ def video_details_base_mappings
18
+ media_details_base_mappings
19
+ end
20
+
21
+ def video_details_base_by_hash(hash)
22
+ video_details_base(*Creatable.hash_to_arr(hash, %w[art play_count fan_art thumbnail label],
23
+ video_details_base_mappings))
24
+ end
25
+
26
+ def video_details_base(art, play_count, fan_art, thumbnail, label)
27
+ @art = art
28
+ @play_count = play_count
29
+ media_details_base(fan_art, thumbnail, label)
21
30
  end
22
31
  end
23
32
 
24
33
  # Video.Cast https://kodi.wiki/view/JSON-RPC_API/v12#Video.Cast
25
34
  class VideoCast
26
35
  include Comparable
36
+ extend Creatable
27
37
 
28
38
  attr_reader :name, :order, :role, :thumbnail
29
39
 
30
- def initialize(hash)
31
- @name = hash['name']
32
- @order = hash['order']
33
- @role = hash['role']
34
- @thumbnail = hash['thumbnail']
35
- end
36
-
37
- def ==(other)
38
- compare(self, other)
40
+ def initialize(name, order, role, thumbnail)
41
+ @name = name
42
+ @order = order
43
+ @role = role
44
+ @thumbnail = thumbnail
39
45
  end
40
46
  end
41
47
 
@@ -45,9 +51,18 @@ module KodiClient
45
51
 
46
52
  attr_reader :title
47
53
 
48
- def video_details_media(hash)
49
- @title = hash['title']
50
- video_details_base(hash)
54
+ def video_details_media_mappings
55
+ video_details_base_mappings
56
+ end
57
+
58
+ def video_details_media_by_hash(hash)
59
+ video_details_media(*Creatable.hash_to_arr(hash, %w[title art play_count fan_art thumbnail label]),
60
+ video_details_base_mappings)
61
+ end
62
+
63
+ def video_details_media(title, art, play_count, fan_art, thumbnail, label)
64
+ @title = title
65
+ video_details_base(art, play_count, fan_art, thumbnail, label)
51
66
  end
52
67
  end
53
68
 
@@ -57,12 +72,22 @@ module KodiClient
57
72
 
58
73
  attr_reader :date_added, :file, :last_played, :plot
59
74
 
60
- def video_details_item(hash)
61
- @date_added = hash['dateadded']
62
- @file = hash['file']
63
- @last_played = hash['lastplayed']
64
- @plot = hash['plot']
65
- video_details_media(hash)
75
+ def video_details_item_mappings
76
+ video_details_media_mappings
77
+ end
78
+
79
+ def video_details_item_by_hash(hash)
80
+ video_details_item(*Creatable.hash_to_arr(hash, %w[date_added file last_played plot title art
81
+ play_count fan_art thumbnail label],
82
+ video_details_item_mappings))
83
+ end
84
+
85
+ def video_details_item(date_added, file, last_played, plot, title, art, play_count, fan_art, thumbnail, label)
86
+ @date_added = date_added
87
+ @file = file
88
+ @last_played = last_played
89
+ @plot = plot
90
+ video_details_media(title, art, play_count, fan_art, thumbnail, label)
66
91
  end
67
92
  end
68
93
 
@@ -72,45 +97,57 @@ module KodiClient
72
97
 
73
98
  attr_reader :director, :resume, :runtime, :stream_details
74
99
 
75
- def video_details_file(hash)
76
- @director = hash['director']
77
- @resume = VideoResume.new(hash['resume'])
78
- @runtime = hash['runtime']
79
- @stream_details = Streams.new(hash['streamdetails'])
80
- video_details_item(hash)
100
+ def video_details_file_mappings
101
+ mappings = {
102
+ 'resume' => Creatable::CreateMap.new(VideoResume),
103
+ 'streamdetails' => Creatable::CreateMap.new(Streams)
104
+ }
105
+ mappings.merge(video_details_item_mappings)
106
+ end
107
+
108
+ def video_details_file_by_hash(hash)
109
+ video_details_file(*Creatable.hash_to_arr(hash, %w[director resume runtime stream_details date_added
110
+ file last_played plot title art play_count fan_art
111
+ thumbnail label], video_details_file_mappings))
112
+ end
113
+
114
+ def video_details_file(director, resume, runtime, stream_details, date_added, file, last_played, plot, title,
115
+ art, play_count, fan_art, thumbnail, label)
116
+ @director = director
117
+ @resume = resume
118
+ @runtime = runtime
119
+ @stream_details = stream_details
120
+ video_details_item(date_added, file, last_played, plot, title, art, play_count, fan_art, thumbnail, label)
81
121
  end
82
122
  end
83
123
 
84
124
  # Video.Resume https://kodi.wiki/view/JSON-RPC_API/v12#Video.Resume
85
125
  class VideoResume
86
126
  include Comparable
127
+ extend Creatable
87
128
 
88
129
  attr_reader :position, :total
89
130
 
90
- def initialize(hash)
91
- @position = hash['position']
92
- @total = hash['total']
93
- end
94
-
95
- def ==(other)
96
- compare(self, other)
131
+ def initialize(position, total)
132
+ @position = position
133
+ @total = total
97
134
  end
98
135
  end
99
136
 
100
137
  # Video.Streams https://kodi.wiki/view/JSON-RPC_API/v12#Video.Streams
101
138
  class Streams
102
139
  include Comparable
140
+ extend Creatable
103
141
 
104
142
  attr_reader :audio, :subtitle, :video
105
143
 
106
- def initialize(hash)
107
- @audio = hash['audio'].nil? ? [] : hash['audio'].map { |it| Types::Player::AudioStream.new(it) }
108
- @subtitle = hash['subtitle'].nil? ? [] : hash['subtitle'].map { |it| Types::Player::Subtitle.new(it) }
109
- @video = hash['video'].nil? ? [] : hash['video'].map { |it| Types::Player::VideoStream.new(it) }
110
- end
144
+ type_mapping ['audio', Player::AudioStream, true], ['subtitle', Player::Subtitle, true],
145
+ ['video', Player::VideoStream, true]
111
146
 
112
- def ==(other)
113
- compare(self, other)
147
+ def initialize(audio, subtitle, video)
148
+ @audio = audio
149
+ @subtitle = subtitle
150
+ @video = video
114
151
  end
115
152
  end
116
153
  end