kodi_client 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +56 -0
- data/.rubocop.yml +14 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +21 -0
- data/README.md +85 -0
- data/Rakefile +12 -0
- data/kodi_client.gemspec +33 -0
- data/lib/kodi_client/Chainable.rb +47 -0
- data/lib/kodi_client/global_types/addon_types.rb +182 -0
- data/lib/kodi_client/global_types/application_types.rb +58 -0
- data/lib/kodi_client/global_types/audio_types.rb +77 -0
- data/lib/kodi_client/global_types/global_types.rb +104 -0
- data/lib/kodi_client/global_types/gui_types.rb +185 -0
- data/lib/kodi_client/global_types/item_types.rb +18 -0
- data/lib/kodi_client/global_types/list_types.rb +246 -0
- data/lib/kodi_client/global_types/media_types.rb +50 -0
- data/lib/kodi_client/global_types/player_type.rb +300 -0
- data/lib/kodi_client/global_types/pvr_type.rb +17 -0
- data/lib/kodi_client/global_types/video_types.rb +118 -0
- data/lib/kodi_client/kodi_module.rb +86 -0
- data/lib/kodi_client/method/addons.rb +72 -0
- data/lib/kodi_client/method/application.rb +60 -0
- data/lib/kodi_client/method/gui.rb +62 -0
- data/lib/kodi_client/method/player.rb +220 -0
- data/lib/kodi_client/options.rb +27 -0
- data/lib/kodi_client/util/comparable.rb +17 -0
- data/lib/kodi_client/util/iterable.rb +11 -0
- data/lib/kodi_client.rb +37 -0
- metadata +77 -0
@@ -0,0 +1,300 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kodi_client/global_types/item_types'
|
4
|
+
require 'kodi_client/global_types/global_types'
|
5
|
+
require 'kodi_client/util/comparable'
|
6
|
+
require 'kodi_client/util/iterable'
|
7
|
+
|
8
|
+
module KodiClient
|
9
|
+
module Types
|
10
|
+
module Player
|
11
|
+
|
12
|
+
# enum for in/out zoom
|
13
|
+
module Zoom
|
14
|
+
extend Iterable
|
15
|
+
|
16
|
+
IN = 'in'
|
17
|
+
OUT = 'out'
|
18
|
+
end
|
19
|
+
|
20
|
+
# Player.ViewMode https://kodi.wiki/view/JSON-RPC_API/v12#Player.ViewMode
|
21
|
+
module ViewMode
|
22
|
+
extend Iterable
|
23
|
+
NORMAL = 'normal'
|
24
|
+
ZOOM = 'zoom'
|
25
|
+
STRETCH_4x3 = 'strech4x3'
|
26
|
+
WIDE_ZOOM = 'widezoom'
|
27
|
+
STRETCH_16x9 = 'stretch16x9'
|
28
|
+
ORIGINAL = 'original'
|
29
|
+
STRETCH_16x9_NONLIN = 'stretch16x9nonline'
|
30
|
+
ZOOM_120_WIDTH = 'zoom120width'
|
31
|
+
ZOOM_110_WIDTH = 'zoom110width'
|
32
|
+
end
|
33
|
+
|
34
|
+
# player types
|
35
|
+
module PlayerVisibilityType
|
36
|
+
extend Iterable
|
37
|
+
INTERNAL = 'internal'
|
38
|
+
EXTERNAL = 'external'
|
39
|
+
REMOTE = 'remote'
|
40
|
+
end
|
41
|
+
|
42
|
+
# Player.Type https://kodi.wiki/view/JSON-RPC_API/v12#Player.Type
|
43
|
+
module PlayerType
|
44
|
+
extend Iterable
|
45
|
+
|
46
|
+
VIDEO = 'video'
|
47
|
+
AUDIO = 'audio'
|
48
|
+
PICTURE = 'picture'
|
49
|
+
end
|
50
|
+
|
51
|
+
# Player.Repeat https://kodi.wiki/view/JSON-RPC_API/v12#Player.Repeat
|
52
|
+
module PlayerRepeat
|
53
|
+
extend Iterable
|
54
|
+
|
55
|
+
OFF = 'off'
|
56
|
+
ONE = 'one'
|
57
|
+
ALL = 'all'
|
58
|
+
CYCLE = 'cycle'
|
59
|
+
end
|
60
|
+
|
61
|
+
# player speed enum, -32 to 32
|
62
|
+
module PlayerSpeed
|
63
|
+
extend Iterable
|
64
|
+
|
65
|
+
MINUS_32 = -32
|
66
|
+
MINUS_16 = -16
|
67
|
+
MINUS_8 = -8
|
68
|
+
MINUS_4 = -4
|
69
|
+
MINUS_2 = -2
|
70
|
+
MINUS_1 = -1
|
71
|
+
NEUTRAL = 0
|
72
|
+
PLUS_1 = 1
|
73
|
+
PLUS_2 = 2
|
74
|
+
PLUS_4 = 4
|
75
|
+
PLUS_8 = 8
|
76
|
+
PLUS_16 = 16
|
77
|
+
PLUS_32 = 32
|
78
|
+
end
|
79
|
+
|
80
|
+
# player id and type
|
81
|
+
class Player
|
82
|
+
include Comparable
|
83
|
+
|
84
|
+
attr_reader :player_id, :player_type, :type, :name, :plays_audio, :plays_video
|
85
|
+
|
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)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Player Subtitle https://kodi.wiki/view/JSON-RPC_API/v12#Player.Subtitle
|
101
|
+
class Subtitle
|
102
|
+
include Comparable
|
103
|
+
|
104
|
+
attr_reader :index, :is_default, :is_forced, :is_impaired, :language, :name
|
105
|
+
|
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)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Player.Audio.Stream https://kodi.wiki/view/JSON-RPC_API/v12#Player.Audio.Stream
|
121
|
+
class AudioStream
|
122
|
+
include Comparable
|
123
|
+
|
124
|
+
attr_reader :bitrate, :channels, :codec, :index, :is_default, :is_forced, :is_original, :language,
|
125
|
+
:name, :sample_rate
|
126
|
+
|
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)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Player.Video.Stream https://kodi.wiki/view/JSON-RPC_API/v12#Player.Video.Stream
|
146
|
+
class VideoStream
|
147
|
+
include Comparable
|
148
|
+
|
149
|
+
attr_reader :codec, :height, :index, :language, :name, :width, :duration, :aspect
|
150
|
+
|
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)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# Player.Property.Name https://kodi.wiki/view/JSON-RPC_API/v12#Player.Property.Name
|
168
|
+
module PropertyName
|
169
|
+
extend Iterable
|
170
|
+
|
171
|
+
AUDIOSTREAMS = 'audiostreams'
|
172
|
+
CANCHANGESPEED = 'canchangespeed'
|
173
|
+
CANMOVE = 'canmove'
|
174
|
+
CANREPEAT = 'canrepeat'
|
175
|
+
CANROTATE = 'canrotate'
|
176
|
+
CANSEEK = 'canseek'
|
177
|
+
CANSHUFFLE = 'canshuffle'
|
178
|
+
CANZOOM = 'canzoom'
|
179
|
+
CURRENTAUDIOSTREAM = 'currentaudiostream'
|
180
|
+
CURRENTSUBTITLE = 'currentsubtitle'
|
181
|
+
CURRENTVIDEOSTREAM = 'currentvideostream'
|
182
|
+
LIVE = 'live'
|
183
|
+
PARTYMODE = 'partymode'
|
184
|
+
PERCENTAGE = 'percentage'
|
185
|
+
PLAYLISTID = 'playlistid'
|
186
|
+
POSITION = 'position'
|
187
|
+
REPEAT = 'repeat'
|
188
|
+
SHUFFLED = 'shuffled'
|
189
|
+
SPEED = 'speed'
|
190
|
+
SUBTITLEENABLED = 'subtitleenabled'
|
191
|
+
SUBTITLES = 'subtitles'
|
192
|
+
TIME = 'time'
|
193
|
+
TOTALTIME = 'totaltime'
|
194
|
+
TYPE = 'type'
|
195
|
+
VIDEOSTREAMS = 'videostreams'
|
196
|
+
end
|
197
|
+
|
198
|
+
# Player.Property.Value https://kodi.wiki/view/JSON-RPC_API/v12#Player.Property.Name
|
199
|
+
class PropertyValue
|
200
|
+
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)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
# return value for Player.GetViewMode
|
238
|
+
class PlayerViewMode
|
239
|
+
include Comparable
|
240
|
+
|
241
|
+
attr_reader :nonlinear_stretch, :pixel_ratio, :vertical_shift, :view_mode, :zoom
|
242
|
+
|
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)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# Player.Position.Time https://kodi.wiki/view/JSON-RPC_API/v12#Player.Position.Time
|
257
|
+
class PlayerPositionTime
|
258
|
+
include Comparable
|
259
|
+
|
260
|
+
attr_reader :hours, :minutes, :seconds, :milliseconds
|
261
|
+
|
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)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
# defines the jump size for seek
|
275
|
+
module SeekJump
|
276
|
+
include Iterable
|
277
|
+
|
278
|
+
SMALL_FORWARD = 'smallforward'
|
279
|
+
SMALL_BACKWARD = 'smallbackward'
|
280
|
+
BIG_FORWARD = 'bigforward'
|
281
|
+
BIG_BACKWARD = 'bigbackward'
|
282
|
+
end
|
283
|
+
|
284
|
+
# return value of Player.Seek
|
285
|
+
class SeekReturnValue
|
286
|
+
include Comparable
|
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
|
293
|
+
|
294
|
+
def ==(other)
|
295
|
+
compare(self, other)
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kodi_client/util/iterable'
|
4
|
+
|
5
|
+
module KodiClient
|
6
|
+
module Types
|
7
|
+
module PVR
|
8
|
+
|
9
|
+
# PVR.Channel.Type https://kodi.wiki/view/JSON-RPC_API/v12#PVR.Channel.Type
|
10
|
+
module ChannelType
|
11
|
+
TV = 'TV'
|
12
|
+
RADIO = 'Radio'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kodi_client/global_types/media_types'
|
4
|
+
require 'kodi_client/global_types/player_type'
|
5
|
+
require 'kodi_client/util/comparable'
|
6
|
+
|
7
|
+
module KodiClient
|
8
|
+
module Types
|
9
|
+
module Video
|
10
|
+
|
11
|
+
# Video.Details.Base https://kodi.wiki/view/JSON-RPC_API/v12#Video.Details.Base
|
12
|
+
module VideoDetailsBase
|
13
|
+
include Media::MediaDetailsBase
|
14
|
+
|
15
|
+
attr_reader :art, :play_count
|
16
|
+
|
17
|
+
def video_details_base(hash)
|
18
|
+
@art = Types::Media::MediaArtwork.new(hash['art'])
|
19
|
+
@play_count = ['playcount']
|
20
|
+
media_details_base(hash)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Video.Cast https://kodi.wiki/view/JSON-RPC_API/v12#Video.Cast
|
25
|
+
class VideoCast
|
26
|
+
include Comparable
|
27
|
+
|
28
|
+
attr_reader :name, :order, :role, :thumbnail
|
29
|
+
|
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)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Video.Details.Media https://kodi.wiki/view/JSON-RPC_API/v12#Video.Details.Media
|
43
|
+
module VideoDetailsMedia
|
44
|
+
include VideoDetailsBase
|
45
|
+
|
46
|
+
attr_reader :title
|
47
|
+
|
48
|
+
def video_details_media(hash)
|
49
|
+
@title = hash['title']
|
50
|
+
video_details_base(hash)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Video.Details.Item https://kodi.wiki/view/JSON-RPC_API/v12#Video.Details.Item
|
55
|
+
module VideoDetailsItem
|
56
|
+
include VideoDetailsMedia
|
57
|
+
|
58
|
+
attr_reader :date_added, :file, :last_played, :plot
|
59
|
+
|
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)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Video.Details.File https://kodi.wiki/view/JSON-RPC_API/v12#Video.Details.File
|
70
|
+
module VideoDetailsFile
|
71
|
+
include VideoDetailsItem
|
72
|
+
|
73
|
+
attr_reader :director, :resume, :runtime, :stream_details
|
74
|
+
|
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)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Video.Resume https://kodi.wiki/view/JSON-RPC_API/v12#Video.Resume
|
85
|
+
class VideoResume
|
86
|
+
include Comparable
|
87
|
+
|
88
|
+
attr_reader :position, :total
|
89
|
+
|
90
|
+
def initialize(hash)
|
91
|
+
@position = hash['position']
|
92
|
+
@total = hash['total']
|
93
|
+
end
|
94
|
+
|
95
|
+
def ==(other)
|
96
|
+
compare(self, other)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Video.Streams https://kodi.wiki/view/JSON-RPC_API/v12#Video.Streams
|
101
|
+
class Streams
|
102
|
+
include Comparable
|
103
|
+
|
104
|
+
attr_reader :audio, :subtitle, :video
|
105
|
+
|
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
|
111
|
+
|
112
|
+
def ==(other)
|
113
|
+
compare(self, other)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'http'
|
4
|
+
require 'kodi_client/util/comparable'
|
5
|
+
|
6
|
+
module KodiClient
|
7
|
+
|
8
|
+
# the client that stores
|
9
|
+
class KodiModule
|
10
|
+
|
11
|
+
def apply_options(options)
|
12
|
+
@endpoint_url = "#{options.tls ? 'https://' : 'http://'}#{options.ip}:#{options.port}/jsonrpc"
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
def invoke_api(request)
|
17
|
+
h = request.instance_variables.each_with_object({}) do |var, hash|
|
18
|
+
hash[var.to_s.delete('@')] = request.instance_variable_get(var)
|
19
|
+
end
|
20
|
+
@http_client ||= build_client
|
21
|
+
response = @http_client.post(@endpoint_url, json: h).to_s
|
22
|
+
JSON.parse(response)
|
23
|
+
end
|
24
|
+
|
25
|
+
def build_client
|
26
|
+
client = HTTP.headers(Content_Type: 'application/json')
|
27
|
+
if !@options.username.nil? && !@options.password.nil?
|
28
|
+
client = client.basic_auth({ user: @options.username, pass: @options.password })
|
29
|
+
end
|
30
|
+
|
31
|
+
client
|
32
|
+
end
|
33
|
+
|
34
|
+
private :build_client
|
35
|
+
end
|
36
|
+
|
37
|
+
# represents an error response
|
38
|
+
class KodiError
|
39
|
+
|
40
|
+
attr_reader :code, :message
|
41
|
+
|
42
|
+
def initialize(hash)
|
43
|
+
@code = hash['code']
|
44
|
+
@message = hash['message']
|
45
|
+
end
|
46
|
+
|
47
|
+
def ==(other)
|
48
|
+
@code == other.code && @message == other.message
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# represents a kodi requests
|
53
|
+
class KodiRequest
|
54
|
+
|
55
|
+
attr_accessor :id, :jsonrpc, :method, :params
|
56
|
+
|
57
|
+
def initialize(kodi_id, method, params = {}, jsonrpc = '2.0')
|
58
|
+
@id = kodi_id
|
59
|
+
@jsonrpc = jsonrpc
|
60
|
+
@method = method
|
61
|
+
@params = params
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# represents a kodi response
|
66
|
+
class KodiResponse
|
67
|
+
include Comparable
|
68
|
+
|
69
|
+
attr_reader :id, :jsonrpc, :result, :error
|
70
|
+
|
71
|
+
def initialize(hash)
|
72
|
+
@id = hash['id']
|
73
|
+
@jsonrpc = hash['jsonrpc']
|
74
|
+
@result = hash['result']
|
75
|
+
@error = KodiError.new(hash['error']) unless hash['error'].nil?
|
76
|
+
end
|
77
|
+
|
78
|
+
def error?
|
79
|
+
!@error.nil?
|
80
|
+
end
|
81
|
+
|
82
|
+
def ==(other)
|
83
|
+
compare(self, other)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kodi_client/kodi_module'
|
4
|
+
require 'kodi_client/global_types/addon_types'
|
5
|
+
require 'kodi_client/global_types/list_types'
|
6
|
+
|
7
|
+
module KodiClient
|
8
|
+
module Modules
|
9
|
+
# contains all Kodi Application methods
|
10
|
+
class Addons < KodiModule
|
11
|
+
|
12
|
+
EXECUTE_ADDON = 'Addons.ExecuteAddon'
|
13
|
+
GET_ADDON_DETAILS = 'Addons.GetAddonDetails'
|
14
|
+
GET_ADDONS = 'Addons.GetAddons'
|
15
|
+
SET_ADDON_ENABLED = 'Addons.SetAddonEnabled'
|
16
|
+
|
17
|
+
def get_addons(type = Types::Addons::AddonTypes::UNKNOWN,
|
18
|
+
content = Types::Addons::AddonContent::UNKNOWN,
|
19
|
+
enabled = nil, properties = [],
|
20
|
+
limit = Types::List::ListLimits.new(0, 50), installed = nil, kodi_id = 1)
|
21
|
+
request = KodiRequest.new(kodi_id, GET_ADDONS,
|
22
|
+
{
|
23
|
+
'type' => type,
|
24
|
+
'content' => content,
|
25
|
+
'enabled' => enabled.nil? || !enabled ? 'all' : 'enabled',
|
26
|
+
'properties' => properties,
|
27
|
+
'limits' => { 'start' => limit.list_start, 'end' => limit.list_end },
|
28
|
+
'installed' => installed.nil? || !installed ? 'all' : 'installed'
|
29
|
+
})
|
30
|
+
json = invoke_api(request)
|
31
|
+
|
32
|
+
result = json['result'].nil? ? nil : Types::Addons::Addons.new(json['result'])
|
33
|
+
json['result'] = result
|
34
|
+
KodiResponse.new(json)
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_addon_details(addon_id = nil, properties = [], kodi_id = 1)
|
38
|
+
request = KodiRequest.new(kodi_id, GET_ADDON_DETAILS,
|
39
|
+
{
|
40
|
+
'addonid' => addon_id,
|
41
|
+
'properties' => properties
|
42
|
+
})
|
43
|
+
json = invoke_api(request)
|
44
|
+
|
45
|
+
result = json['result'].nil? ? nil : Types::Addons::Addon.new(json['result'])
|
46
|
+
json['result'] = result
|
47
|
+
KodiResponse.new(json)
|
48
|
+
end
|
49
|
+
|
50
|
+
def execute_addon(addon_id = nil, params = '', wait = false, kodi_id = 1)
|
51
|
+
request = KodiRequest.new(kodi_id, EXECUTE_ADDON,
|
52
|
+
{
|
53
|
+
'addonid' => addon_id,
|
54
|
+
'params' => params,
|
55
|
+
'wait' => wait
|
56
|
+
})
|
57
|
+
json = invoke_api(request)
|
58
|
+
KodiResponse.new(json)
|
59
|
+
end
|
60
|
+
|
61
|
+
def set_addon_enabled(addon_id = nil, enabled = Types::Global::Toggle::TOGGLE, kodi_id = 1)
|
62
|
+
request = KodiRequest.new(kodi_id, SET_ADDON_ENABLED,
|
63
|
+
{
|
64
|
+
'addonid' => addon_id,
|
65
|
+
'enabled' => enabled
|
66
|
+
})
|
67
|
+
json = invoke_api(request)
|
68
|
+
KodiResponse.new(json)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,60 @@
|
|
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 Application < KodiModule
|
10
|
+
|
11
|
+
QUIT = 'Application.Quit'
|
12
|
+
SET_MUTE = 'Application.SetMute'
|
13
|
+
SET_VOLUME = 'Application.SetVolume'
|
14
|
+
GET_PROPERTIES = 'Application.GetProperties'
|
15
|
+
|
16
|
+
def quit(kodi_id = 1)
|
17
|
+
request = KodiRequest.new(kodi_id, QUIT)
|
18
|
+
json = invoke_api(request)
|
19
|
+
KodiResponse.new(json)
|
20
|
+
end
|
21
|
+
|
22
|
+
def mute(kodi_id = 1, mute_state: Types::Global::Toggle::TOGGLE)
|
23
|
+
request = KodiRequest.new(kodi_id, SET_MUTE, { 'mute' => mute_state })
|
24
|
+
json = invoke_api(request)
|
25
|
+
KodiResponse.new(json)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_properties(properties = Types::Application::PropertyName.all_properties, kodi_id = 1)
|
29
|
+
request = KodiRequest.new(kodi_id, GET_PROPERTIES, { 'properties' => properties })
|
30
|
+
json = invoke_api(request)
|
31
|
+
result = json['result'].nil? ? nil : Types::Application::PropertyValue.new(json['result'])
|
32
|
+
json['result'] = result
|
33
|
+
KodiResponse.new(json)
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_volume(volume, kodi_id = 1)
|
37
|
+
set_volume_incr_decr_vol(volume, kodi_id)
|
38
|
+
end
|
39
|
+
|
40
|
+
def increment_volume(kodi_id = 1)
|
41
|
+
set_volume_incr_decr_vol(Types::Global::IncrementDecrement::INCREMENT, kodi_id)
|
42
|
+
end
|
43
|
+
|
44
|
+
def decrement_volume(kodi_id = 1)
|
45
|
+
set_volume_incr_decr_vol(Types::Global::IncrementDecrement::INCREMENT, kodi_id)
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_volume_incr_decr_vol(volume, kodi_id = 1)
|
49
|
+
if volume.is_a?(Integer) && (volume > 100 || volume.negative?)
|
50
|
+
throw ArgumentError.new('Volume must be between 0 and 100.')
|
51
|
+
end
|
52
|
+
request = KodiRequest.new(kodi_id, SET_VOLUME, { 'volume' => volume })
|
53
|
+
json = invoke_api(request)
|
54
|
+
KodiResponse.new(json)
|
55
|
+
end
|
56
|
+
|
57
|
+
private :set_volume_incr_decr_vol
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|