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
@@ -17,6 +17,7 @@ module KodiClient
17
17
  h = request.instance_variables.each_with_object({}) do |var, hash|
18
18
  hash[var.to_s.delete('@')] = request.instance_variable_get(var)
19
19
  end
20
+
20
21
  @http_client ||= build_client
21
22
  response = @http_client.post(@endpoint_url, json: h).to_s
22
23
  JSON.parse(response)
@@ -28,8 +28,7 @@ module KodiClient
28
28
  'installed' => installed.nil? || !installed ? 'all' : 'installed'
29
29
  })
30
30
  json = invoke_api(request)
31
-
32
- result = json['result'].nil? ? nil : Types::Addons::Addons.new(json['result'])
31
+ result = Types::Addons::Addons.create(json['result'])
33
32
  json['result'] = result
34
33
  KodiResponse.new(json)
35
34
  end
@@ -42,7 +41,7 @@ module KodiClient
42
41
  })
43
42
  json = invoke_api(request)
44
43
 
45
- result = json['result'].nil? ? nil : Types::Addons::Addon.new(json['result'])
44
+ result = Types::Addons::Addon.create(json['result'])
46
45
  json['result'] = result
47
46
  KodiResponse.new(json)
48
47
  end
@@ -28,7 +28,7 @@ module KodiClient
28
28
  def get_properties(properties = Types::Application::PropertyName.all_properties, kodi_id = 1)
29
29
  request = KodiRequest.new(kodi_id, GET_PROPERTIES, { 'properties' => properties })
30
30
  json = invoke_api(request)
31
- result = json['result'].nil? ? nil : Types::Application::PropertyValue.new(json['result'])
31
+ result = Types::Application::PropertyValue.create(json['result'])
32
32
  json['result'] = result
33
33
  KodiResponse.new(json)
34
34
  end
@@ -28,7 +28,7 @@ module KodiClient
28
28
  params['type'] = type unless type.nil?
29
29
  request = KodiRequest.new(kodi_id, GET_FAVOURITES, params)
30
30
  json = invoke_api(request)
31
- result = json['result'].nil? ? nil : Types::Favourites::GetFavouriteReturned.new(json['result'])
31
+ result = Types::Favourites::GetFavouriteReturned.create(json['result'])
32
32
  json['result'] = result
33
33
  KodiResponse.new(json)
34
34
  end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kodi_client/kodi_module'
4
+ require 'kodi_client/global_types/files_types'
5
+ require 'kodi_client/global_types/list_types'
6
+
7
+ module KodiClient
8
+ module Modules
9
+ # contains all Kodi Application methods
10
+ class Files < KodiModule
11
+
12
+ GET_DIRECTORY = 'Files.GetDirectory'
13
+ GET_FILE_DETAILS = 'Files.GetFileDetails'
14
+ GET_SOURCES = 'Files.GetSources'
15
+ PREPARE_DOWNLOAD = 'Files.PrepareDownload'
16
+ SET_FILE_DETAILS = 'Files.SetFileDetails'
17
+
18
+ def get_directory(directory, media = Types::Files::Media::FILES,
19
+ properties = Types::List::ListFieldFiles.all_properties,
20
+ sort = Types::List::ListSort.new,
21
+ limits = Types::List::ListLimits.new(0, 50), kodi_id = 1)
22
+ request = KodiRequest.new(kodi_id, GET_DIRECTORY,
23
+ {
24
+ 'directory' => directory,
25
+ 'media' => media,
26
+ 'properties' => properties,
27
+ 'sort' => { 'ignorearticle' => sort.ignore_article, 'method' => sort.method,
28
+ 'order' => sort.order,
29
+ 'useartistsortname' => sort.use_artist_sort_name },
30
+ 'limits' => { 'start' => limits.list_start, 'end' => limits.list_end }
31
+ })
32
+ json = invoke_api(request)
33
+ result = KodiClient::Types::Files::GetDirectoryReturned.create(json['result'])
34
+ json['result'] = result
35
+ KodiResponse.new(json)
36
+ end
37
+
38
+ def get_file_details(file, media = Types::Files::Media::FILES,
39
+ properties = Types::List::ListFieldFiles.all_properties, kodi_id = 1)
40
+ request = KodiRequest.new(kodi_id, GET_FILE_DETAILS,
41
+ {
42
+ 'file' => file,
43
+ 'media' => media,
44
+ 'properties' => properties
45
+ })
46
+ json = invoke_api(request)
47
+ result = KodiClient::Types::List::ListItemFile.create(json['result'])
48
+ json['result'] = result
49
+ KodiResponse.new(json)
50
+ end
51
+
52
+ def get_sources(media = Types::Files::Media::FILES,
53
+ sort = Types::List::ListSort.new,
54
+ limits = Types::List::ListLimits.new(0, 50), kodi_id = 1)
55
+ request = KodiRequest.new(kodi_id, GET_SOURCES,
56
+ {
57
+ 'media' => media,
58
+ 'sort' => { 'ignorearticle' => sort.ignore_article, 'method' => sort.method,
59
+ 'order' => sort.order,
60
+ 'useartistsortname' => sort.use_artist_sort_name },
61
+ 'limits' => { 'start' => limits.list_start, 'end' => limits.list_end }
62
+ })
63
+ json = invoke_api(request)
64
+ result = KodiClient::Types::Files::GetSourcesReturned.create(json['result'])
65
+ json['result'] = result
66
+ KodiResponse.new(json)
67
+ end
68
+
69
+ def prepare_download(path, kodi_id = 1)
70
+ request = KodiRequest.new(kodi_id, PREPARE_DOWNLOAD, { 'path' => path })
71
+ json = invoke_api(request)
72
+ result = KodiClient::Types::Files::PrepareDownloadReturned.create(json['result'])
73
+ json['result'] = result
74
+ KodiResponse.new(json)
75
+ end
76
+
77
+ def set_file_details(file, media = Types::Files::Media::VIDEO, play_count = nil, last_played = nil,
78
+ resume = nil, kodi_id = 1)
79
+ params = { 'file' => file, 'media' => media}
80
+ params['playcount'] = play_count unless play_count.nil?
81
+ params['lastplayed'] = last_played unless last_played.nil?
82
+ params['resume'] = resume unless resume.nil?
83
+ request = KodiRequest.new(kodi_id, SET_FILE_DETAILS, params)
84
+ json = invoke_api(request)
85
+ KodiResponse.new(json)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -24,7 +24,7 @@ module KodiClient
24
24
  def get_properties(properties = Types::GUI::PropertyName.all_properties, kodi_id = 1)
25
25
  request = KodiRequest.new(kodi_id, GET_PROPERTIES, { 'properties' => properties })
26
26
  json = invoke_api(request)
27
- result = json['result'].nil? ? nil : KodiClient::Types::GUI::PropertyValue.new(json['result'])
27
+ result = KodiClient::Types::GUI::PropertyValue.create(json['result'])
28
28
  json['result'] = result
29
29
  KodiResponse.new(json)
30
30
  end
@@ -32,7 +32,7 @@ module KodiClient
32
32
  def get_stereoscopic_modes(kodi_id = 1)
33
33
  request = KodiRequest.new(kodi_id, GET_STEREOSCOPIC_MODES, {})
34
34
  json = invoke_api(request)
35
- result = json['result'].nil? ? nil : json['result']['stereoscopicmodes'].map { |it| Types::GUI::StereoscopyMode.new(it) }
35
+ result = Types::GUI::StereoscopyMode.create_list(json['result']['stereoscopicmodes'])
36
36
  json['result'] = result
37
37
  KodiResponse.new(json)
38
38
  end
@@ -41,7 +41,7 @@ module KodiClient
41
41
  def get_active_players(kodi_id = 1)
42
42
  request = KodiRequest.new(kodi_id, GET_ACTIVE_PLAYER, {})
43
43
  json = invoke_api(request)
44
- result = json['result'].nil? ? nil : json['result'].map { |it| Types::Player::Player.new(it) }
44
+ result = Types::Player::Player.create_list(json['result'])
45
45
  json['result'] = result
46
46
  KodiResponse.new(json)
47
47
  end
@@ -57,7 +57,7 @@ module KodiClient
57
57
  request = KodiRequest.new(kodi_id, GET_ITEM, { 'playerid' => player_id,
58
58
  'properties' => properties })
59
59
  json = invoke_api(request)
60
- result = Types::List::ListItemAll.new(json['result']['item'])
60
+ result = Types::List::ListItemAll.create(json['result']['item'])
61
61
  json['result'] = result
62
62
  KodiResponse.new(json)
63
63
  end
@@ -65,7 +65,7 @@ module KodiClient
65
65
  def get_players(media = Types::Media::MediaType::ALL, kodi_id = 1)
66
66
  request = KodiRequest.new(kodi_id, GET_PLAYERS, { 'media' => media })
67
67
  json = invoke_api(request)
68
- result = json['result'].map { |it| Types::Player::Player.new(it) }
68
+ result = Types::Player::Player.create_list(json['result'])
69
69
  json['result'] = result
70
70
  KodiResponse.new(json)
71
71
  end
@@ -74,7 +74,7 @@ module KodiClient
74
74
  request = KodiRequest.new(kodi_id, GET_PROPERTIES, { 'playerid' => player_id,
75
75
  'properties' => properties })
76
76
  json = invoke_api(request)
77
- result = Types::Player::PropertyValue.new(json['result'])
77
+ result = Types::Player::PropertyValue.create(json['result'])
78
78
  json['result'] = result
79
79
  KodiResponse.new(json)
80
80
  end
@@ -82,7 +82,7 @@ module KodiClient
82
82
  def get_view_mode(kodi_id = 1)
83
83
  request = KodiRequest.new(kodi_id, GET_VIEW_MODE, {})
84
84
  json = invoke_api(request)
85
- result = Types::Player::PlayerViewMode.new(json['result'])
85
+ result = Types::Player::PlayerViewMode.create(json['result'])
86
86
  json['result'] = result
87
87
  KodiResponse.new(json)
88
88
  end
@@ -130,7 +130,7 @@ module KodiClient
130
130
  def seek(player_id, value, kodi_id = 1)
131
131
  request = KodiRequest.new(kodi_id, SEEK, { 'playerid' => player_id, 'value' => value })
132
132
  json = invoke_api(request)
133
- result = Types::Player::SeekReturnValue.new(json['result'])
133
+ result = Types::Player::SeekReturned.create(json['result'])
134
134
  json['result'] = result
135
135
  KodiResponse.new(json)
136
136
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kodi_client/kodi_module'
4
+ require 'kodi_client/global_types/profiles_types'
5
+
6
+ module KodiClient
7
+ module Modules
8
+ # contains all Kodi Application methods
9
+ class Profiles < KodiModule
10
+
11
+ GET_CURRENT_PROFILE = 'Profiles.GetCurrentProfile'
12
+ GET_PROFILES = 'Profiles.GetProfiles'
13
+ LOAD_PROFILE = 'Profiles.LoadProfile'
14
+
15
+ def get_current_profile(properties = Types::Profiles::FieldsProfile.all_properties, kodi_id = 1)
16
+ request = KodiRequest.new(kodi_id, GET_CURRENT_PROFILE, { 'properties' => properties })
17
+ json = invoke_api(request)
18
+ result = Types::Profiles::DetailsProfile.create(json['result'])
19
+ json['result'] = result
20
+ KodiResponse.new(json)
21
+ end
22
+
23
+ def get_profiles(properties = Types::Profiles::FieldsProfile.all_properties,
24
+ limit = Types::List::ListLimits.new(0, 50),
25
+ sort = Types::List::ListSort.new, kodi_id = 1)
26
+ request = KodiRequest.new(kodi_id, GET_PROFILES,
27
+ { 'properties' => properties,
28
+ 'limits' => { 'start' => limit.list_start, 'end' => limit.list_end },
29
+ 'sort' => { 'ignorearticle' => sort.ignore_article, 'method' => sort.method,
30
+ 'order' => sort.order,
31
+ 'useartistsortname' => sort.use_artist_sort_name } })
32
+ json = invoke_api(request)
33
+ result = Types::Profiles::GetProfilesReturned.create(json['result'])
34
+ json['result'] = result
35
+ KodiResponse.new(json)
36
+ end
37
+
38
+ def load_profile(profile_name, password, prompt = false, kodi_id = 1)
39
+ request = KodiRequest.new(kodi_id, LOAD_PROFILE,
40
+ { 'profile' => profile_name,
41
+ 'password' => { 'value' => password.value, 'encryption' => password.encryption },
42
+ 'prompt' => prompt })
43
+ json = invoke_api(request)
44
+ KodiResponse.new(json)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -25,7 +25,7 @@ module KodiClient
25
25
  def get_properties(properties = Types::System::PropertyName.all_properties, kodi_id = 1)
26
26
  request = KodiRequest.new(kodi_id, GET_PROPERTIES, { 'properties' => properties })
27
27
  json = invoke_api(request)
28
- result = json['result'].nil? ? nil : Types::System::PropertyValue.new(json['result'])
28
+ result = Types::System::PropertyValue.create(json['result'])
29
29
  json['result'] = result
30
30
  KodiResponse.new(json)
31
31
  end
@@ -4,7 +4,6 @@ module KodiClient
4
4
 
5
5
  # offers compare methods
6
6
  module Comparable
7
-
8
7
  def compare(obj1, obj2)
9
8
  is_same = true
10
9
  obj1.instance_variables.each do |it|
@@ -13,5 +12,9 @@ module KodiClient
13
12
 
14
13
  is_same
15
14
  end
15
+
16
+ def ==(other)
17
+ compare(self, other)
18
+ end
16
19
  end
17
20
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KodiClient
4
+
5
+ # creates a create and create_list method by hash
6
+ module Creatable
7
+
8
+ def attr_accessor(*args)
9
+ attr_reader(*args)
10
+ attr_writer(*args)
11
+ end
12
+
13
+ def attr_reader(*args)
14
+ @kodi_fields = args.map { |it| it.to_s.gsub('_', '') }
15
+
16
+ args.each do |it|
17
+ inst_variable_name = "@#{it}".to_sym
18
+ define_method it do
19
+ instance_variable_get(inst_variable_name)
20
+ end
21
+ end
22
+ end
23
+
24
+ def attr_writer(*args)
25
+ args.each do |it|
26
+ inst_variable_name = "@#{it}".to_sym
27
+ define_method "#{it}=" do |new_value|
28
+ instance_variable_set(inst_variable_name, new_value)
29
+ end
30
+ end
31
+ end
32
+
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? }
40
+
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
47
+
48
+ def hash_to_arr(hash, fields)
49
+ Creatable.hash_to_arr(hash, fields)
50
+ end
51
+ end
52
+ end
data/lib/kodi_client.rb CHANGED
@@ -7,9 +7,11 @@ require 'kodi_client/Chainable'
7
7
  require 'kodi_client/method/addons'
8
8
  require 'kodi_client/method/application'
9
9
  require 'kodi_client/method/favourites'
10
+ require 'kodi_client/method/files'
10
11
  require 'kodi_client/method/gui'
11
12
  require 'kodi_client/method/input'
12
13
  require 'kodi_client/method/player'
14
+ require 'kodi_client/method/profiles'
13
15
  require 'kodi_client/method/system'
14
16
 
15
17
 
@@ -21,26 +23,25 @@ module KodiClient
21
23
  class Client
22
24
  include Chainable
23
25
 
24
- attr_reader :addons, :application, :gui, :player, :input, :favourites, :system
26
+ attr_reader :addons, :application, :favourites, :files, :gui, :input, :player, :profiles, :system
25
27
 
26
28
  def initialize
27
29
  @addons = KodiClient::Modules::Addons.new
28
30
  @application = KodiClient::Modules::Application.new
29
31
  @favourites = KodiClient::Modules::Favourites.new
32
+ @files = KodiClient::Modules::Files.new
30
33
  @gui = KodiClient::Modules::GUI.new
31
34
  @input = KodiClient::Modules::Input.new
32
35
  @player = KodiClient::Modules::Player.new
36
+ @profiles = KodiClient::Modules::Profiles.new
33
37
  @system = KodiClient::Modules::System.new
34
38
  end
35
39
 
36
- def apply_options(options)
37
- @addons.apply_options(options)
38
- @application.apply_options(options)
39
- @gui.apply_options(options)
40
- @input.apply_options(options)
41
- @player.apply_options(options)
42
- @favourites.apply_options(options)
43
- @system.apply_options(options)
40
+ def apply_options_to_methods(options)
41
+ instance_variables.each do |it|
42
+ mod = instance_variable_get(it)
43
+ mod.apply_options(options) if mod.is_a?(KodiClient::KodiModule)
44
+ end
44
45
  end
45
46
  end
46
47
  end
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.5.0
4
+ version: 0.6.0
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-16 00:00:00.000000000 Z
11
+ date: 2021-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -25,9 +25,9 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 5.0.4
27
27
  description: A client for the Kodi JSON API v12, currently implemented methods are
28
- addons, application, favourites, gui, input, player and system (more will be added
29
- with the time). For more information how to use it and how to activate Remote Control
30
- in Kodi, please check the github page https://github.com/cfe86/RubyKodiClient
28
+ Addons, Application, Favourites, Files, GUI, Input, Player, Profiles and System
29
+ (more will be added with the time). For more information how to use it and how to
30
+ activate Remote Control in Kodi, please check the github page https://github.com/cfe86/RubyKodiClient
31
31
  email:
32
32
  - christian.feier@gmail.com
33
33
  executables: []
@@ -47,6 +47,7 @@ files:
47
47
  - lib/kodi_client/global_types/application_types.rb
48
48
  - lib/kodi_client/global_types/audio_types.rb
49
49
  - lib/kodi_client/global_types/favourites_types.rb
50
+ - lib/kodi_client/global_types/files_types.rb
50
51
  - lib/kodi_client/global_types/global_types.rb
51
52
  - lib/kodi_client/global_types/gui_types.rb
52
53
  - lib/kodi_client/global_types/input_types.rb
@@ -54,6 +55,7 @@ files:
54
55
  - lib/kodi_client/global_types/list_types.rb
55
56
  - lib/kodi_client/global_types/media_types.rb
56
57
  - lib/kodi_client/global_types/player_type.rb
58
+ - lib/kodi_client/global_types/profiles_types.rb
57
59
  - lib/kodi_client/global_types/pvr_type.rb
58
60
  - lib/kodi_client/global_types/system_types.rb
59
61
  - lib/kodi_client/global_types/video_types.rb
@@ -61,12 +63,15 @@ files:
61
63
  - lib/kodi_client/method/addons.rb
62
64
  - lib/kodi_client/method/application.rb
63
65
  - lib/kodi_client/method/favourites.rb
66
+ - lib/kodi_client/method/files.rb
64
67
  - lib/kodi_client/method/gui.rb
65
68
  - lib/kodi_client/method/input.rb
66
69
  - lib/kodi_client/method/player.rb
70
+ - lib/kodi_client/method/profiles.rb
67
71
  - lib/kodi_client/method/system.rb
68
72
  - lib/kodi_client/options.rb
69
73
  - lib/kodi_client/util/comparable.rb
74
+ - lib/kodi_client/util/creatable.rb
70
75
  - lib/kodi_client/util/iterable.rb
71
76
  homepage: https://github.com/cfe86/RubyKodiClient
72
77
  licenses: