kodi_client 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5686743b785e5b591798992689064cec6c1e0d48a54721b97d9d28ae5a97ded3
4
- data.tar.gz: fc7516af1d65c10ef63897253979bdb67b8d74f6f11bb74c959ccc942f8c026e
3
+ metadata.gz: 5fea7dad06fe723225e4d8bf268db09490af87c98a74f653e5966f170d1156fd
4
+ data.tar.gz: a4d8a3dfcac1a85abbf1c073b0c2f6016de9de9d07249eabc5067fe47c829727
5
5
  SHA512:
6
- metadata.gz: ed6fbc05813a0f0a606c08c2e18606603af576e06f4af5941912097b477ad0a622a5ea7f47c7ce52062188b38522d60522337a06261d23f6894f5e1fbb6480c6
7
- data.tar.gz: fb200b6342ff5a29d291d60e8c8e61d53de6012bcc5b29058e16ae2eee8d3df9583ed7e8f6f78a72a2da02481d74e9e48d6dbc945dbad73ed85526e711220532
6
+ metadata.gz: 031fcbe6dc03750fa90d3b8d395f903082d6b2b8586f3fe49ff3d9d5ca3375501e2b8e34305808399026de10bd62a5cfc00bf3ad5fc505cb5043e47ba2cdc85f
7
+ data.tar.gz: 6e9622971b0e8737130feddefca5ac49a8efd4073dd4ec9719b524c2cb7ba3781e915322a03bd1ffac63fe4ab48b3ed1428a83135a69223add9a041b8ff1288d
data/kodi_client.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'kodi_client'
5
- spec.version = '0.6.0'
5
+ spec.version = '0.6.1'
6
6
  spec.authors = ['Christian Feier']
7
7
  spec.email = ['christian.feier@gmail.com']
8
8
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'kodi_client/global_types/item_types'
4
+ require 'kodi_client/global_types/list_types'
4
5
  require 'kodi_client/util/comparable'
5
6
  require 'kodi_client/util/iterable'
6
7
  require 'kodi_client/util/creatable'
@@ -118,17 +119,10 @@ module KodiClient
118
119
  attr_reader :addon_id, :author, :broken, :dependencies, :description, :disclaimer, :enabled, :extra_info,
119
120
  :fan_art, :installed, :name, :path, :rating, :summary, :thumbnail, :type, :version
120
121
 
121
- def self.create(hash)
122
- return nil if hash.nil?
122
+ fields_to_map %w[addon_id author broken dependencies description disclaimer enabled extra_info fan_art
123
+ installed name path rating summary thumbnail type version label]
123
124
 
124
- dependencies = AddonDependency.create_list(hash['dependencies'])
125
- extra_info = AddonExtraInfo.create_list(hash['extrainfo'])
126
-
127
- new(hash['addonid'], hash['author'], hash['broken'], dependencies, hash['description'], hash['disclaimer'],
128
- hash['enabled'], extra_info, hash['fanart'], hash['installed'], hash['name'], hash['path'],
129
- hash['rating'], hash['summary'], hash['thumbnail'], hash['type'], hash['version'],
130
- *hash_to_arr(hash, ['label']))
131
- end
125
+ type_mapping ['dependencies', AddonDependency, true], ['extrainfo', AddonExtraInfo, true]
132
126
 
133
127
  def initialize(addon_id, author, broken, dependencies, description, disclaimer, enabled, extra_info,
134
128
  fan_art, installed, name, path, rating, summary, thumbnail, type, version, label)
@@ -156,16 +150,11 @@ module KodiClient
156
150
  # getAddons return
157
151
  class Addons
158
152
  include Comparable
153
+ extend Creatable
159
154
 
160
155
  attr_reader :addons, :limits
161
156
 
162
- def self.create(hash)
163
- return nil if hash.nil?
164
-
165
- addons = AddonDetails.create_list(hash['addons'])
166
- limits = List::ListLimitsReturned.create(hash['limits'])
167
- new(addons, limits)
168
- end
157
+ type_mapping ['addons', AddonDetails, true], ['limits', List::ListLimitsReturned]
169
158
 
170
159
  def initialize(addons, limits)
171
160
  @addons = addons
@@ -176,14 +165,11 @@ module KodiClient
176
165
  # getAddon return
177
166
  class Addon
178
167
  include Comparable
168
+ extend Creatable
179
169
 
180
170
  attr_reader :addon
181
171
 
182
- def self.create(hash)
183
- return nil if hash.nil?
184
-
185
- new(AddonDetails.create(hash['addon']))
186
- end
172
+ type_mapping ['addon', AddonDetails]
187
173
 
188
174
  def initialize(addon)
189
175
  @addon = addon
@@ -20,6 +20,21 @@ module KodiClient
20
20
  LANGUAGE = 'language'
21
21
  end
22
22
 
23
+ # represent application properties version
24
+ class Version
25
+ include Comparable
26
+ extend Creatable
27
+
28
+ attr_reader :major, :minor, :revision, :tag
29
+
30
+ def initialize(major, minor, revision, tag)
31
+ @major = major
32
+ @minor = minor
33
+ @revision = revision
34
+ @tag = tag
35
+ end
36
+ end
37
+
23
38
  # Application.Property.Value https://kodi.wiki/view/JSON-RPC_API/v12#Application.Property.Value
24
39
  class PropertyValue
25
40
  include Comparable
@@ -27,12 +42,7 @@ module KodiClient
27
42
 
28
43
  attr_reader :name, :version, :muted, :volume
29
44
 
30
- def self.create(hash)
31
- return null if hash.nil?
32
-
33
- version = Version.create(hash['version'])
34
- new(hash['name'], version, hash['muted'], hash['volume'])
35
- end
45
+ type_mapping ['version', Version]
36
46
 
37
47
  def initialize(name, version, muted, volume)
38
48
  @name = name
@@ -41,21 +51,6 @@ module KodiClient
41
51
  @volume = volume
42
52
  end
43
53
  end
44
-
45
- # represent application properties version
46
- class Version
47
- include Comparable
48
- extend Creatable
49
-
50
- attr_reader :major, :minor, :revision, :tag
51
-
52
- def initialize(major, minor, revision, tag)
53
- @major = major
54
- @minor = minor
55
- @revision = revision
56
- @tag = tag
57
- end
58
- end
59
54
  end
60
55
  end
61
56
  end
@@ -38,9 +38,14 @@ module KodiClient
38
38
 
39
39
  attr_reader :art, :date_added, :genre
40
40
 
41
+ def audio_details_base_mappings
42
+ mappings = { 'art' => Creatable::CreateMap.new(Types::Media::MediaArtwork) }
43
+ mappings.merge(media_details_base_mappings)
44
+ end
45
+
41
46
  def audio_details_base_by_hash(hash)
42
- audio_details_base(Types::Media::MediaArtwork.create(hash['art']), hash['date_added'], hash['genre'],
43
- *Creatable.hash_to_arr(hash, %w[fan_art thumbnail label]))
47
+ audio_details_base(*Creatable.hash_to_arr(hash, %w[art date_added genre fan_art thumbnail label]),
48
+ audio_details_base_mappings)
44
49
  end
45
50
 
46
51
  def audio_details_base(art, date_added, genre, fan_art, thumbnail, label)
@@ -58,11 +63,16 @@ module KodiClient
58
63
  attr_reader :artist, :artist_id, :display_artist, :musicbrainz_album_artist_id, :original_date, :rating,
59
64
  :release_date, :sort_artist, :title, :user_rating, :votes, :year
60
65
 
66
+ def audio_details_media_mappings
67
+ audio_details_base_mappings
68
+ end
69
+
61
70
  def audio_details_media_by_hash(hash)
62
- audio_details_media(hash['artist'], hash['artistid'], hash['displayartist'], hash['musicbrainzalbumartistid'],
63
- hash['originaldate'], hash['rating'], hash['releasedate'], hash['sortartist'],
64
- hash['title'], hash['userrating'], hash['votes'], hash['year'],
65
- *Creatable.hash_to_arr(hash, %w[art date_added genre fan_art thumbnail label]))
71
+ audio_details_media(*Creatable.hash_to_arr(hash, %w[artist artist_id display_artist
72
+ musicbrainz_album_artist_id original_date rating
73
+ release_date sort_artist title user_rating votes year art
74
+ date_added genre fan_art thumbnail label],
75
+ audio_details_base_mappings))
66
76
  end
67
77
 
68
78
  def audio_details_media(artist, artist_id, display_artist, musicbrainz_album_artist_id, original_date,
@@ -83,6 +93,134 @@ module KodiClient
83
93
  audio_details_base(art, date_added, genre, fan_art, thumbnail, label)
84
94
  end
85
95
  end
96
+
97
+ # Audio.Fields.Album https://kodi.wiki/view/JSON-RPC_API/v12#Audio.Fields.Album
98
+ module AudioFieldsAlbum
99
+ extend Iterable
100
+
101
+ #album id
102
+ ALBUM_DURATION = 'albumduration'
103
+ ALBUM_LABEL = 'albumlabel'
104
+ ALBUM_STATUS = 'albumstatus'
105
+ ART = 'art'
106
+ ARTIST = 'artist'
107
+ ARTIST_ID = 'artistid'
108
+ COMPILATION = 'compilation'
109
+ DATE_ADDED = 'dateadded'
110
+ DATE_MODIFIED = 'datemodified'
111
+ DATE_NEW = 'datenew'
112
+ DESCRIPTION = 'description'
113
+ DISPLAY_ARTIST = 'displayartist'
114
+ FAN_ART = 'fanart'
115
+ GENRE = 'genre'
116
+ IS_BOX_SET = 'isboxset'
117
+ LAST_PLAYED = 'lastplayed'
118
+ MOOD = 'mood'
119
+ MUSICBRAINZ_ALBUM_ARTIST_ID = 'musicbrainzalbumartistid'
120
+ MUSICBRAINZ_ALBUM_ID = 'musicbrainzalbumid'
121
+ MUSICBRAINZ_RELEASE_GROUP_ID = 'musicbrainzreleasegroupid'
122
+ ORIGINAL_DATE = 'originaldate'
123
+ PLAY_COUNT = 'playcount'
124
+ RATING = 'rating'
125
+ RELEASE_DATE = 'releasedate'
126
+ RELEASE_TYPE = 'releasetype'
127
+ SONG_GENRES = 'songgenres'
128
+ SORT_ARTIST = 'sortartist'
129
+ SOURCE_ID = 'sourceid'
130
+ STYLE = 'style'
131
+ THEME = 'theme'
132
+ THUMBNAIL = 'thumbnail'
133
+ TITLE = 'title'
134
+ TOTAL_DISCS = 'totaldiscs'
135
+ TYPE = 'type'
136
+ USER_RATING = 'userrating'
137
+ VOTES = 'votes'
138
+ YEAR = 'year'
139
+ end
140
+
141
+ # Audio.Details.Genres https://kodi.wiki/view/JSON-RPC_API/v12#Audio.Details.Genres
142
+ class Genre
143
+ include Comparable
144
+ extend Creatable
145
+
146
+ attr_reader :genre_id, :title
147
+
148
+ def initialize(genre_id, title)
149
+ @genre_id = genre_id
150
+ @title = title
151
+ end
152
+ end
153
+
154
+ # Audio.Details.Album https://kodi.wiki/view/JSON-RPC_API/v12#Audio.Details.Album
155
+ class DetailsAlbum
156
+ include AudioDetailsMedia
157
+ include Comparable
158
+ extend Creatable
159
+
160
+ attr_reader :album_duration, :album_id, :album_label, :album_status, :compilation, :date_modified, :date_new,
161
+ :description, :is_box_set, :last_played, :mood, :musicbrainz_album_id, :musicbrainz_release_group_id,
162
+ :play_count, :release_type, :song_genres, :source_id, :style, :theme, :total_discs, :type
163
+
164
+ fields_to_map %w[album_duration album_id album_label album_status art artist artist_id compilation date_added
165
+ date_modified date_new description display_artist fan_art genre is_box_set label last_played
166
+ mood musicbrainz_album_artist_id musicbrainz_album_id musicbrainz_release_group_id
167
+ original_date play_count rating release_date release_type song_genres sort_artist source_id
168
+ style theme thumbnail title total_discs type user_rating votes year]
169
+
170
+ type_mapping ['songgenres', Genre, true], ['art', Types::Media::MediaArtwork]
171
+
172
+ def initialize(album_duration, album_id, album_label, album_status, art, artist, artist_id, compilation,
173
+ date_added, date_modified, date_new, description, display_artist, fan_art, genre, is_box_set,
174
+ label, last_played, mood, musicbrainz_album_artist_id, musicbrainz_album_id,
175
+ musicbrainz_release_group_id, original_date, play_count, rating, release_date, release_type,
176
+ song_genres, sort_artist, source_id, style, theme, thumbnail, title, total_discs, type,
177
+ user_rating, votes, year)
178
+ @album_duration = album_duration
179
+ @album_id = album_id
180
+ @album_label = album_label
181
+ @album_status = album_status
182
+ @compilation = compilation
183
+ @date_modified = date_modified
184
+ @date_new = date_new
185
+ @description = description
186
+ @is_box_set = is_box_set
187
+ @last_played = last_played
188
+ @mood = mood
189
+ @musicbrainz_album_id = musicbrainz_album_id
190
+ @musicbrainz_release_group_id = musicbrainz_release_group_id
191
+ @play_count = play_count
192
+ @release_type = release_type
193
+ @song_genres = song_genres
194
+ @source_id = source_id
195
+ @style = style
196
+ @theme = theme
197
+ @total_discs = total_discs
198
+ @type = type
199
+ audio_details_media(artist, artist_id, display_artist, musicbrainz_album_artist_id, original_date,
200
+ rating, release_date, sort_artist, title, user_rating, votes, year,
201
+ art, date_added, genre, fan_art, thumbnail, label)
202
+ end
203
+ end
204
+
205
+ # return type for AudioLibrary.GetAlbums
206
+ class GetAlbumsReturned
207
+ include Comparable
208
+ extend Creatable
209
+
210
+ attr_reader :albums, :limits
211
+
212
+ def self.lazy_type_mapping
213
+ {
214
+ 'albums' => Creatable::CreateMap.new(DetailsAlbum, true),
215
+ 'limits' => Creatable::CreateMap.new(List::ListLimitsReturned)
216
+ }
217
+ end
218
+
219
+ def initialize(albums, limits)
220
+ @albums = albums
221
+ @limits = limits
222
+ end
223
+ end
86
224
  end
87
225
  end
88
226
  end
@@ -54,11 +54,7 @@ module KodiClient
54
54
 
55
55
  attr_reader :favourites, :limits
56
56
 
57
- def self.create(hash)
58
- favourites = DetailsFavourite.create_list(hash['favourites'])
59
- limits = Types::List::ListLimitsReturned.create(hash['limits'])
60
- new(favourites, limits)
61
- end
57
+ type_mapping ['favourites', DetailsFavourite, true], ['limits', Types::List::ListLimitsReturned]
62
58
 
63
59
  def initialize(favourites, limits)
64
60
  @favourites = favourites
@@ -27,14 +27,7 @@ module KodiClient
27
27
 
28
28
  attr_reader :files, :limits
29
29
 
30
- def self.create(hash)
31
- return nil if hash.nil?
32
-
33
- files = Types::List::ListItemFile.create_list(hash['files'])
34
- limits = Types::List::ListLimitsReturned.create(hash['limits'])
35
-
36
- new(files, limits)
37
- end
30
+ type_mapping ['files', List::ListItemFile, true], ['limits', List::ListLimitsReturned]
38
31
 
39
32
  def initialize(files, limits)
40
33
  @files = files
@@ -49,14 +42,7 @@ module KodiClient
49
42
 
50
43
  attr_reader :sources, :limits
51
44
 
52
- def self.create(hash)
53
- return nil if hash.nil?
54
-
55
- sources = Types::List::FileLabel.create_list(hash['sources'])
56
- limits = Types::List::ListLimitsReturned.create(hash['limits'])
57
-
58
- new(sources, limits)
59
- end
45
+ type_mapping ['sources', List::FileLabel, true], ['limits', List::ListLimitsReturned]
60
46
 
61
47
  def initialize(sources, limits)
62
48
  @sources = sources
@@ -168,15 +168,8 @@ module KodiClient
168
168
 
169
169
  attr_reader :current_control, :current_window, :fullscreen, :skin, :stereoscopic_mode
170
170
 
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)
179
- end
171
+ type_mapping ['currentcontrol', Global::IdLabel], ['currentwindow', Global::IdLabel],
172
+ ['skin', Global::IdName], ['stereoscopicmode', StereoscopyMode]
180
173
 
181
174
  def initialize(current_control, current_window, fullscreen, skin, stereoscopic_mode)
182
175
  @current_control = current_control
@@ -9,8 +9,12 @@ module KodiClient
9
9
 
10
10
  attr_reader :label
11
11
 
12
+ def item_details_base_mappings
13
+ {}
14
+ end
15
+
12
16
  def item_details_base_by_hash(hash)
13
- item_details_base(hash['label'])
17
+ item_details_base(*Creatable.hash_to_arr(hash, %w[label], item_details_base_mappings))
14
18
  end
15
19
 
16
20
  def item_details_base(label)
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'kodi_client/util/comparable'
4
4
  require 'kodi_client/util/creatable'
5
+ require 'kodi_client/util/iterable'
5
6
  require 'kodi_client/global_types/video_types'
6
7
  require 'kodi_client/global_types/audio_types'
7
8
 
@@ -28,11 +29,7 @@ module KodiClient
28
29
 
29
30
  attr_reader :list_start, :list_end, :total
30
31
 
31
- def self.create(hash)
32
- return nil if hash.nil?
33
-
34
- new(hash['start'], hash['end'], hash['total'])
35
- end
32
+ fields_to_map %w[start end total]
36
33
 
37
34
  def initialize(list_start, list_end, total)
38
35
  @list_start = list_start
@@ -257,31 +254,34 @@ module KodiClient
257
254
  :special_sort_season, :studio, :style, :tag, :tag_line, :theme, :top250, :total_discs, :track,
258
255
  :trailer, :tv_show_id, :type, :unique_id, :votes, :watched_episodes, :writer
259
256
 
257
+ def list_item_base_mappings
258
+ mappings = {
259
+ 'cast' => Creatable::CreateMap.new(Video::VideoCast, true),
260
+ 'contributors' => Creatable::CreateMap.new(Audio::AudioContributor, true),
261
+ 'resume' => Creatable::CreateMap.new(Video::VideoResume),
262
+ 'streamdetails' => Creatable::CreateMap.new(Video::Streams),
263
+ 'art' => Creatable::CreateMap.new(Media::MediaArtwork)
264
+ }
265
+ mappings.merge(video_details_file_mappings).merge(audio_details_media_mappings)
266
+ end
267
+
260
268
  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]))
269
+ return nil if hash.nil?
270
+
271
+ list_item_base(*Creatable.hash_to_arr(
272
+ hash, %w[album album_artist album_artist_id album_id album_release_type album_status bit_rate
273
+ bpm cast channels comment compilation contributors country description disc
274
+ disc_title display_composer display_conductor display_lyricist display_orchestra
275
+ duration dyn_path episode episode_guide first_aired id imdb_number is_box_set
276
+ lyrics media_path mood mpaa musicbrainz_artist_id musicbrainz_track_id original_date
277
+ original_title plot_outline premiered production_code release_date release_type
278
+ sample_rate season set set_id show_link show_title sort_title special_sort_episode
279
+ special_sort_season studio style tag tag_line theme top250 total_discs track
280
+ trailer tv_show_id type unique_id votes watched_episodes writer director resume
281
+ runtime stream_details date_added file last_played plot title art play_count
282
+ fan_art thumbnail label artist artist_id display_artist musicbrainz_album_artist_id
283
+ rating sort_artist user_rating year genre], list_item_base_mappings
284
+ ))
285
285
  end
286
286
 
287
287
  def list_item_base(album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
@@ -375,38 +375,27 @@ module KodiClient
375
375
  include ListItemBase
376
376
  include Comparable
377
377
  extend Creatable
378
+ extend ListItemBase
378
379
 
379
380
  attr_reader :channel, :channel_number, :channel_type, :end_time, :hidden, :locked, :start_time,
380
381
  :sub_channel_number
381
382
 
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]))
383
+ fields_to_map %w[channel channel_number channel_type end_time hidden locked start_time sub_channel_number
384
+ album album_artist album_artist_id album_id album_release_type album_status bit_rate
385
+ bpm cast channels comment compilation contributors country description disc
386
+ disc_title display_composer display_conductor display_lyricist display_orchestra
387
+ duration dyn_path episode episode_guide first_aired id imdb_number is_box_set
388
+ lyrics media_path mood mpaa musicbrainz_artist_id musicbrainz_track_id original_date
389
+ original_title plot_outline premiered production_code release_date release_type
390
+ sample_rate season set set_id show_link show_title sort_title special_sort_episode
391
+ special_sort_season studio style tag tag_line theme top250 total_discs track
392
+ trailer tv_show_id type unique_id votes watched_episodes writer director resume
393
+ runtime stream_details date_added file last_played plot title art play_count
394
+ fan_art thumbnail label artist artist_id display_artist musicbrainz_album_artist_id
395
+ rating sort_artist user_rating year genre]
396
+
397
+ def self.lazy_type_mapping
398
+ list_item_base_mappings
410
399
  end
411
400
 
412
401
  def initialize(channel, channel_number, channel_type, end_time, hidden, locked, start_time, sub_channel_number,
@@ -422,7 +411,6 @@ module KodiClient
422
411
  runtime, stream_details, date_added, file, last_played, plot, title, art, play_count,
423
412
  fan_art, thumbnail, label, artist, artist_id, display_artist, musicbrainz_album_artist_id,
424
413
  rating, sort_artist, user_rating, year, genre)
425
-
426
414
  @channel = channel
427
415
  @channel_number = channel_number
428
416
  @channel_type = channel_type
@@ -431,6 +419,7 @@ module KodiClient
431
419
  @locked = locked
432
420
  @start_time = start_time
433
421
  @sub_channel_number = sub_channel_number
422
+ type = type.nil? ? 'unknown' : type
434
423
 
435
424
  list_item_base(album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
436
425
  bpm, cast, channels, comment, compilation, contributors, country, description, disc,
@@ -452,37 +441,26 @@ module KodiClient
452
441
  include ListItemBase
453
442
  include Comparable
454
443
  extend Creatable
444
+ extend ListItemBase
455
445
 
456
446
  attr_reader :file, :file_type, :last_modified, :mime_type, :size
457
447
 
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]))
448
+ fields_to_map %w[file_type last_modified mime_type size
449
+ album album_artist album_artist_id album_id album_release_type album_status bit_rate
450
+ bpm cast channels comment compilation contributors country description disc
451
+ disc_title display_composer display_conductor display_lyricist display_orchestra
452
+ duration dyn_path episode episode_guide first_aired id imdb_number is_box_set
453
+ lyrics media_path mood mpaa musicbrainz_artist_id musicbrainz_track_id original_date
454
+ original_title plot_outline premiered production_code release_date release_type
455
+ sample_rate season set set_id show_link show_title sort_title special_sort_episode
456
+ special_sort_season studio style tag tag_line theme top250 total_discs track
457
+ trailer tv_show_id type unique_id votes watched_episodes writer director resume
458
+ runtime stream_details date_added file last_played plot title art play_count
459
+ fan_art thumbnail label artist artist_id display_artist musicbrainz_album_artist_id
460
+ rating sort_artist user_rating year genre]
461
+
462
+ def self.lazy_type_mapping
463
+ list_item_base_mappings
486
464
  end
487
465
 
488
466
  def initialize(file_type, last_modified, mime_type, size,
@@ -503,6 +481,7 @@ module KodiClient
503
481
  @last_modified = last_modified
504
482
  @mime_type = mime_type
505
483
  @size = size
484
+ type = type.nil? ? 'unknown' : type
506
485
  list_item_base(album, album_artist, album_artist_id, album_id, album_release_type, album_status, bit_rate,
507
486
  bpm, cast, channels, comment, compilation, contributors, country, description, disc,
508
487
  disc_title, display_composer, display_conductor, display_lyricist, display_orchestra,
@@ -3,6 +3,7 @@
3
3
  require 'kodi_client/global_types/item_types'
4
4
  require 'kodi_client/util/comparable'
5
5
  require 'kodi_client/util/creatable'
6
+ require 'kodi_client/util/iterable'
6
7
 
7
8
  module KodiClient
8
9
  module Types
@@ -23,10 +24,12 @@ module KodiClient
23
24
 
24
25
  attr_reader :fan_art, :thumbnail
25
26
 
27
+ def media_details_base_mappings
28
+ item_details_base_mappings
29
+ end
30
+
26
31
  def media_details_base_by_hash(hash)
27
- @fan_art = hash['fanart']
28
- @thumbnail = hash['thumbnail']
29
- item_details_base_by_hash(hash)
32
+ media_details_base(*Creatable.hash_to_arr(hash, %w[fan_art thumbnail label]), media_details_base_mappings)
30
33
  end
31
34
 
32
35
  def media_details_base(fan_art, thumbnail, label)
@@ -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
@@ -195,35 +196,20 @@ module KodiClient
195
196
  :live, :party_mode, :percentage, :playlist_id, :position, :repeat, :shuffled, :speed,
196
197
  :subtitle_enabled, :subtitles, :time, :total_time, :type, :video_streams
197
198
 
198
- def self.create(hash)
199
- return nil if hash.nil?
200
-
201
- audio_streams = AudioStream.create_list(hash['audiostreams'])
202
- current_audio_stream = AudioStream.create(hash['currentaudiostream'])
203
- current_subtitle = Subtitle.create(hash['currentsubtitle'])
204
- current_video_stream = VideoStream.create(hash['currentvideostream'])
205
- subtitles = Subtitle.create_list(hash['subtitles'])
206
- time = Types::Global::GlobalTime.create(hash['time'])
207
- total_time = Types::Global::GlobalTime.create(hash['totaltime'])
208
- video_streams = VideoStream.create_list(hash['videostreams'])
209
-
210
- hash['type'] = PlayerType::VIDEO if hash['type'].nil?
211
- hash['playlistid'] = -1 if hash['playlistid'].nil?
212
- hash['position'] = -1 if hash['position'].nil?
213
- hash['repeat'] = PlayerRepeat::OFF if hash['repeat'].nil?
214
-
215
- new(audio_streams, *Creatable.hash_to_arr(hash, %w[cache_percentage can_change_speed can_move
216
- can_repeat can_rotate can_seek can_shuffle can_zoom]),
217
- current_audio_stream, current_subtitle, current_video_stream,
218
- *Creatable.hash_to_arr(hash, %w[live party_mode percentage playlist_id position repeat
219
- shuffled speed subtitle_enabled]), subtitles, time, total_time,
220
- hash['type'], video_streams)
221
- end
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]
222
203
 
223
204
  def initialize(audio_streams, cache_percentage, can_change_speed, can_move, can_repeat, can_rotate, can_seek,
224
205
  can_shuffle, can_zoom, current_audio_stream, current_subtitle, current_video_stream, live,
225
206
  party_mode, percentage, playlist_id, position, repeat, shuffled, speed,
226
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
+
227
213
  @audio_streams = audio_streams
228
214
  @cache_percentage = cache_percentage
229
215
  @can_change_speed = can_change_speed
@@ -299,14 +285,9 @@ module KodiClient
299
285
  include Comparable
300
286
  extend Creatable
301
287
 
302
- def self.create(hash)
303
- return nil if hash.nil?
288
+ attr_reader :percentage, :time, :total_time
304
289
 
305
- time = Types::Global::GlobalTime.create(hash['time'])
306
- total_time = Types::Global::GlobalTime.create(hash['totaltime'])
307
-
308
- new(hash['percentage'], time, total_time)
309
- end
290
+ type_mapping ['time', Global::GlobalTime], ['totaltime', Global::GlobalTime]
310
291
 
311
292
  def initialize(percentage, time, total_time)
312
293
  @percentage = percentage
@@ -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
@@ -24,11 +25,7 @@ module KodiClient
24
25
 
25
26
  attr_reader :lock_mode, :thumbnail
26
27
 
27
- def self.create(hash)
28
- return nil if hash.nil?
29
-
30
- new(*Creatable.hash_to_arr(hash, %w[lock_mode thumbnail label]))
31
- end
28
+ fields_to_map %w[lock_mode thumbnail label]
32
29
 
33
30
  def initialize(lock_mode, thumbnail, label)
34
31
  @lock_mode = lock_mode
@@ -48,14 +45,7 @@ module KodiClient
48
45
 
49
46
  attr_reader :limits, :profiles
50
47
 
51
- def self.create(hash)
52
- return nil if hash.nil?
53
-
54
- limits = Types::List::ListLimitsReturned.create(hash['limits'])
55
- profiles = Types::Profiles::DetailsProfile.create_list(hash['profiles'])
56
-
57
- new(limits, profiles)
58
- end
48
+ type_mapping ['limits', List::ListLimitsReturned], ['profiles', DetailsProfile, true]
59
49
 
60
50
  def initialize(limits, profiles)
61
51
  @limits = limits
@@ -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
@@ -8,16 +8,19 @@ require 'kodi_client/util/creatable'
8
8
  module KodiClient
9
9
  module Types
10
10
  module Video
11
-
12
11
  # Video.Details.Base https://kodi.wiki/view/JSON-RPC_API/v12#Video.Details.Base
13
12
  module VideoDetailsBase
14
13
  include Media::MediaDetailsBase
15
14
 
16
15
  attr_reader :art, :play_count
17
16
 
17
+ def video_details_base_mappings
18
+ media_details_base_mappings
19
+ end
20
+
18
21
  def video_details_base_by_hash(hash)
19
- @art = Types::Media::MediaArtwork.create(hash['art'])
20
- video_details_base(art, ['playcount'], *Creatable.hash_to_arr(hash, %w[fan_art thumbnail label]))
22
+ video_details_base(*Creatable.hash_to_arr(hash, %w[art play_count fan_art thumbnail label],
23
+ video_details_base_mappings))
21
24
  end
22
25
 
23
26
  def video_details_base(art, play_count, fan_art, thumbnail, label)
@@ -48,9 +51,13 @@ module KodiClient
48
51
 
49
52
  attr_reader :title
50
53
 
54
+ def video_details_media_mappings
55
+ video_details_base_mappings
56
+ end
57
+
51
58
  def video_details_media_by_hash(hash)
52
- art = Types::Media::MediaArtwork.create(hash['art'])
53
- video_details_media(hash['title'], art, *Creatable.hash_to_arr(hash, %w[play_count fan_art thumbnail label]))
59
+ video_details_media(*Creatable.hash_to_arr(hash, %w[title art play_count fan_art thumbnail label]),
60
+ video_details_base_mappings)
54
61
  end
55
62
 
56
63
  def video_details_media(title, art, play_count, fan_art, thumbnail, label)
@@ -65,10 +72,14 @@ module KodiClient
65
72
 
66
73
  attr_reader :date_added, :file, :last_played, :plot
67
74
 
75
+ def video_details_item_mappings
76
+ video_details_media_mappings
77
+ end
78
+
68
79
  def video_details_item_by_hash(hash)
69
- art = Types::Media::MediaArtwork.create(hash['art'])
70
- video_details_item(*Creatable.hash_to_arr(hash, %w[date_added file last_played plot title]), art,
71
- *Creatable.hash_to_arr(hash, %w[play_count fan_art thumbnail label]))
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))
72
83
  end
73
84
 
74
85
  def video_details_item(date_added, file, last_played, plot, title, art, play_count, fan_art, thumbnail, label)
@@ -86,13 +97,18 @@ module KodiClient
86
97
 
87
98
  attr_reader :director, :resume, :runtime, :stream_details
88
99
 
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
+
89
108
  def video_details_file_by_hash(hash)
90
- resume = VideoResume.create(hash['resume'])
91
- stream_details = Streams.create(hash['streamdetails'])
92
- art = Types::Media::MediaArtwork.create(hash['art'])
93
- video_details_file(hash['director'], resume, hash['runtime'], stream_details,
94
- *Creatable.hash_to_arr(hash, %w[date_added file last_played plot title]), art,
95
- *Creatable.hash_to_arr(hash, %w[play_count fan_art thumbnail label]))
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))
96
112
  end
97
113
 
98
114
  def video_details_file(director, resume, runtime, stream_details, date_added, file, last_played, plot, title,
@@ -125,14 +141,8 @@ module KodiClient
125
141
 
126
142
  attr_reader :audio, :subtitle, :video
127
143
 
128
- def self.create(hash)
129
- return nil if hash.nil?
130
-
131
- audio = Types::Player::AudioStream.create_list(hash['audio'])
132
- subtitle = Types::Player::Subtitle.create_list(hash['subtitle'])
133
- video = Types::Player::VideoStream.create_list(hash['video'])
134
- new(audio, subtitle, video)
135
- end
144
+ type_mapping ['audio', Player::AudioStream, true], ['subtitle', Player::Subtitle, true],
145
+ ['video', Player::VideoStream, true]
136
146
 
137
147
  def initialize(audio, subtitle, video)
138
148
  @audio = audio
@@ -34,11 +34,8 @@ module KodiClient
34
34
  end
35
35
 
36
36
  def get_addon_details(addon_id = nil, properties = [], kodi_id = 1)
37
- request = KodiRequest.new(kodi_id, GET_ADDON_DETAILS,
38
- {
39
- 'addonid' => addon_id,
40
- 'properties' => properties
41
- })
37
+ request = KodiRequest.new(kodi_id, GET_ADDON_DETAILS, { 'addonid' => addon_id,
38
+ 'properties' => properties })
42
39
  json = invoke_api(request)
43
40
 
44
41
  result = Types::Addons::Addon.create(json['result'])
@@ -47,22 +44,14 @@ module KodiClient
47
44
  end
48
45
 
49
46
  def execute_addon(addon_id = nil, params = '', wait = false, kodi_id = 1)
50
- request = KodiRequest.new(kodi_id, EXECUTE_ADDON,
51
- {
52
- 'addonid' => addon_id,
53
- 'params' => params,
54
- 'wait' => wait
55
- })
47
+ request = KodiRequest.new(kodi_id, EXECUTE_ADDON, { 'addonid' => addon_id, 'params' => params,
48
+ 'wait' => wait })
56
49
  json = invoke_api(request)
57
50
  KodiResponse.new(json)
58
51
  end
59
52
 
60
53
  def set_addon_enabled(addon_id = nil, enabled = Types::Global::Toggle::TOGGLE, kodi_id = 1)
61
- request = KodiRequest.new(kodi_id, SET_ADDON_ENABLED,
62
- {
63
- 'addonid' => addon_id,
64
- 'enabled' => enabled
65
- })
54
+ request = KodiRequest.new(kodi_id, SET_ADDON_ENABLED, { 'addonid' => addon_id, 'enabled' => enabled })
66
55
  json = invoke_api(request)
67
56
  KodiResponse.new(json)
68
57
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kodi_client/kodi_module'
4
+ require 'kodi_client/global_types/application_types'
5
+
6
+ module KodiClient
7
+ module Modules
8
+ # contains all Kodi Application methods
9
+ class AudioLibrary < KodiModule
10
+
11
+ CLEAN = 'AudioLibrary.Clean'
12
+ EXPORT = 'AudioLibrary.Export'
13
+ GET_ALBUM_DETAILS = 'AudioLibrary.GetAlbumDetails'
14
+ GET_ALBUMS = 'AudioLibrary.GetAlbums'
15
+
16
+ def clean(show_dialogs = true, kodi_id = 1)
17
+ request = KodiRequest.new(kodi_id, CLEAN, { 'showdialogs' => show_dialogs })
18
+ json = invoke_api(request)
19
+ KodiResponse.new(json)
20
+ end
21
+
22
+ def export(path, kodi_id = 1)
23
+ request = KodiRequest.new(kodi_id, EXPORT, { 'options' => { 'path' => path } })
24
+ json = invoke_api(request)
25
+ KodiResponse.new(json)
26
+ end
27
+
28
+ def get_album_details(album_id, properties = Types::Audio::AudioFieldsAlbum.all_properties, kodi_id = 1)
29
+ request = KodiRequest.new(kodi_id, GET_ALBUM_DETAILS, { 'albumid' => album_id, 'properties' => properties })
30
+ json = invoke_api(request)
31
+ KodiResponse.new(json)
32
+ end
33
+
34
+ def get_albums(properties = Types::Audio::AudioFieldsAlbum.all_properties,
35
+ limits = Types::List::ListLimits.new(0, 50),
36
+ sort = Types::List::ListSort.new, include_singles = false, all_roles = false, kodi_id = 1)
37
+ request = KodiRequest.new(kodi_id, GET_ALBUMS,
38
+ { 'properties' => properties,
39
+ 'limits' => { 'start' => limits.list_start, 'end' => limits.list_end },
40
+ 'sort' => { 'ignorearticle' => sort.ignore_article, 'method' => sort.method,
41
+ 'order' => sort.order,
42
+ 'useartistsortname' => sort.use_artist_sort_name },
43
+ 'includesingles' => include_singles, 'allroles' => all_roles })
44
+ json = invoke_api(request)
45
+ KodiResponse.new(json)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -5,6 +5,68 @@ module KodiClient
5
5
  # creates a create and create_list method by hash
6
6
  module Creatable
7
7
 
8
+ def fields_to_map(fields)
9
+ @fields_to_map = fields
10
+ end
11
+
12
+ def type_mapping(*args)
13
+ return if args.nil?
14
+
15
+ @type_mapping = {}
16
+ args.map { |it| @type_mapping[it[0]] = Creatable::CreateMap.new(it[1], it[2].nil? ? false : it[2]) }
17
+ end
18
+
19
+ def lazy_type_mapping
20
+ {}
21
+ end
22
+
23
+ def create_list(hash)
24
+ hash.nil? ? [] : hash.map { |it| create(it) }.reject(&:nil?)
25
+ end
26
+
27
+ def create(hash)
28
+ return nil if hash.nil?
29
+
30
+ if @fields_to_map.nil? || @fields_to_map.empty?
31
+ fields = @kodi_fields
32
+ return nil if @kodi_fields.none? { |it| !hash[it.to_s.gsub('_', '')].nil? }
33
+ else
34
+ fields = @fields_to_map
35
+ end
36
+
37
+ mapping = @type_mapping.nil? ? lazy_type_mapping : @type_mapping
38
+ args = fields.map do |it|
39
+ field = it.to_s.gsub('_', '')
40
+ Creatable.extract_field_from_hash(field, hash, mapping)
41
+ end
42
+
43
+ new(*args)
44
+ end
45
+
46
+ def self.hash_to_arr(hash, fields, mapping = {})
47
+ return nil if hash.nil?
48
+
49
+ fields.map do |it|
50
+ field = it.to_s.gsub('_', '')
51
+ extract_field_from_hash(field, hash, mapping)
52
+ end
53
+ end
54
+
55
+ def hash_to_arr(hash, fields)
56
+ Creatable.hash_to_arr(hash, fields, @type_mapping.nil? ? {} : @type_mapping)
57
+ end
58
+
59
+ def self.extract_field_from_hash(field, hash, mapping)
60
+ map = mapping[field]
61
+ return nil if hash[field].nil? && map.nil?
62
+
63
+ return hash[field] if map.nil?
64
+
65
+ return map.type.create_list(hash[field]) if map.is_list
66
+
67
+ map.type.create(hash[field])
68
+ end
69
+
8
70
  def attr_accessor(*args)
9
71
  attr_reader(*args)
10
72
  attr_writer(*args)
@@ -30,23 +92,15 @@ module KodiClient
30
92
  end
31
93
  end
32
94
 
33
- def create_list(hash)
34
- hash.nil? ? [] : hash.map { |it| create(it) }
35
- end
36
-
37
- def create(hash)
38
- return nil if hash.nil?
39
- return nil if @kodi_fields.none? { |it| !hash[it].nil? }
95
+ # mapping class with the type and if it is a list field or not
96
+ class CreateMap
40
97
 
41
- new(*@kodi_fields.map { |it| hash[it] })
42
- end
43
-
44
- def self.hash_to_arr(hash, fields)
45
- fields.map { |it| hash[it.to_s.gsub('_', '')].nil? ? nil : hash[it.to_s.gsub('_', '')] }
46
- end
98
+ attr_reader :type, :is_list
47
99
 
48
- def hash_to_arr(hash, fields)
49
- Creatable.hash_to_arr(hash, fields)
100
+ def initialize(type, is_list = false)
101
+ @type = type
102
+ @is_list = is_list
103
+ end
50
104
  end
51
105
  end
52
106
  end
data/lib/kodi_client.rb CHANGED
@@ -5,6 +5,7 @@ require 'json'
5
5
 
6
6
  require 'kodi_client/Chainable'
7
7
  require 'kodi_client/method/addons'
8
+ require 'kodi_client/method/audio_library'
8
9
  require 'kodi_client/method/application'
9
10
  require 'kodi_client/method/favourites'
10
11
  require 'kodi_client/method/files'
@@ -23,10 +24,11 @@ module KodiClient
23
24
  class Client
24
25
  include Chainable
25
26
 
26
- attr_reader :addons, :application, :favourites, :files, :gui, :input, :player, :profiles, :system
27
+ attr_reader :audio_library, :addons, :application, :favourites, :files, :gui, :input, :player, :profiles, :system
27
28
 
28
29
  def initialize
29
30
  @addons = KodiClient::Modules::Addons.new
31
+ @audio_library = KodiClient::Modules::AudioLibrary.new
30
32
  @application = KodiClient::Modules::Application.new
31
33
  @favourites = KodiClient::Modules::Favourites.new
32
34
  @files = KodiClient::Modules::Files.new
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kodi_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Feier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-17 00:00:00.000000000 Z
11
+ date: 2021-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -62,6 +62,7 @@ files:
62
62
  - lib/kodi_client/kodi_module.rb
63
63
  - lib/kodi_client/method/addons.rb
64
64
  - lib/kodi_client/method/application.rb
65
+ - lib/kodi_client/method/audio_library.rb
65
66
  - lib/kodi_client/method/favourites.rb
66
67
  - lib/kodi_client/method/files.rb
67
68
  - lib/kodi_client/method/gui.rb