roku_builder 3.10.1 → 3.10.2
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +16 -1
- data/config.json.example +28 -0
- data/lib/roku_builder/config_parser.rb +12 -2
- data/lib/roku_builder/config_validator.rb +16 -0
- data/lib/roku_builder/navigator.rb +33 -61
- data/lib/roku_builder/version.rb +1 -1
- data/tests/roku_builder/config_parser_test.rb +2 -1
- data/tests/roku_builder/navigator_test.rb +8 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89eb827a28c4963403052c57452f7d8eb6c0f23c
|
4
|
+
data.tar.gz: 3ad6a214d6c19145c031da0826e1d0fd39107476
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 691beafcc3b44dbba577d9f9a6df0648034175902c88ce73eccd801e7c8828440570e7238477a1a94a9cf84226f4088f8a49852d80ae33d090cb4a7792e6fa5f
|
7
|
+
data.tar.gz: ea13f123359361a924ac43c1c4a3c8de13314d1b084d46b8d18852a6cf7777f7316e59e76c6c3bc9165925a906a9a8bf9b7ce2014396f8f2062c152813a04d9c
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -30,6 +30,7 @@ The tool allows scripting of the following:
|
|
30
30
|
|
31
31
|
Other tasks the tool can complete:
|
32
32
|
|
33
|
+
* Device navigation
|
33
34
|
* Configuration Generation
|
34
35
|
* Configuration Validation
|
35
36
|
* Configuration Updating
|
@@ -82,6 +83,12 @@ configuration options:
|
|
82
83
|
* key -> keyed_pkg: path to a pkg file that has been signed
|
83
84
|
* key -> password: password for the signed pkg
|
84
85
|
|
86
|
+
There is an optional "input_mappings" section that will allow you to override
|
87
|
+
the default input mappings. In the section each key is a key press code. The
|
88
|
+
value is a array with the desired command to run and a human readable key name.
|
89
|
+
To see the key press code for a specific key the --navigate command can be run
|
90
|
+
with the --debug option on to see a print out of all the keys pressed.
|
91
|
+
|
85
92
|
|
86
93
|
#### Sideloading
|
87
94
|
|
@@ -254,10 +261,18 @@ You can delete the currently sideloaded app using the following command:
|
|
254
261
|
|
255
262
|
You can use a differnt configuration file useing the following option:
|
256
263
|
|
257
|
-
|
264
|
+
$ roku --delete --config <path>
|
258
265
|
|
259
266
|
This path will be expanded so you do not have to use the full path
|
260
267
|
|
268
|
+
You can use your keyboard to control the roku by running the following command:
|
269
|
+
|
270
|
+
$ roku --navigate
|
271
|
+
|
272
|
+
To see the key mapings you can run the following command:
|
273
|
+
|
274
|
+
$ roku --navigate -V
|
275
|
+
|
261
276
|
## Projects
|
262
277
|
|
263
278
|
The project used in the above examples is a smart default. If you are in a
|
data/config.json.example
CHANGED
@@ -29,5 +29,33 @@
|
|
29
29
|
"keyed_pkg": "<path/to/signed/package>",
|
30
30
|
"password": "<password>"
|
31
31
|
}
|
32
|
+
},
|
33
|
+
"input_mapping": {
|
34
|
+
"\\e[1~": [ "home", "Home" ],
|
35
|
+
"<": [ "rew", "<" ],
|
36
|
+
">": [ "ff", ">" ],
|
37
|
+
"=": [ "play", "=" ],
|
38
|
+
"\r": [ "select", "Enter" ],
|
39
|
+
"\\e[D": [ "left", "Left Arrow" ],
|
40
|
+
"\\e[C": [ "right", "Right Arrow" ],
|
41
|
+
"\\e[B": [ "down", "Down Arrow" ],
|
42
|
+
"\\e[A": [ "up", "Up Arrow" ],
|
43
|
+
"\t": [ "back", "Tab" ],
|
44
|
+
"": [ "replay", "" ],
|
45
|
+
"*": [ "info", "*" ],
|
46
|
+
"\u007f": [ "backspace", "Backspace" ],
|
47
|
+
"?": [ "search", "?" ],
|
48
|
+
"\\e\r": [ "enter", "Alt + Enter" ],
|
49
|
+
"\\e[5~": [ "volumeup", "Page Up" ],
|
50
|
+
"\\e[6~": [ "volumedown", "Page Down" ],
|
51
|
+
"\\e[4~": [ "mute", "End" ],
|
52
|
+
"": [ "channeldown", "" ],
|
53
|
+
"": [ "channelup", "" ],
|
54
|
+
"": [ "tuner", "" ],
|
55
|
+
"": [ "hdmi1", "" ],
|
56
|
+
"": [ "hdmi2", "" ],
|
57
|
+
"": [ "hdmi3", "" ],
|
58
|
+
"": [ "hdmi4", "" ],
|
59
|
+
"": [ "avi", "" ]
|
32
60
|
}
|
33
61
|
}
|
@@ -33,7 +33,7 @@ module RokuBuilder
|
|
33
33
|
return [UNKNOWN_STAGE, nil, nil] unless stage
|
34
34
|
setup_sideload_config(configs: configs, options: options)
|
35
35
|
setup_package_config(config: config, configs: configs, options: options, stage: stage)
|
36
|
-
setup_simple_configs(configs: configs, options: options, logger: logger)
|
36
|
+
setup_simple_configs(config: config, configs: configs, options: options, logger: logger)
|
37
37
|
return [SUCCESS, configs]
|
38
38
|
end
|
39
39
|
|
@@ -212,7 +212,7 @@ module RokuBuilder
|
|
212
212
|
# @param configs [Hash] The parsed configs hash
|
213
213
|
# @param options [Hash] The options hash
|
214
214
|
# @param logger [Logger] System logger
|
215
|
-
def self.setup_simple_configs(configs:, options:, logger:)
|
215
|
+
def self.setup_simple_configs(config:, configs:, options:, logger:)
|
216
216
|
# Create Manifest Config
|
217
217
|
configs[:manifest_config] = {
|
218
218
|
root_dir: configs[:project_config][:directory]
|
@@ -227,6 +227,16 @@ module RokuBuilder
|
|
227
227
|
configs[:monitor_config] = {type: options[:monitor].to_sym}
|
228
228
|
end
|
229
229
|
# Create Navigate Config
|
230
|
+
mappings = {}
|
231
|
+
if config[:input_mapping]
|
232
|
+
config[:input_mapping].each_pair {|key, value|
|
233
|
+
unless "".to_sym == key
|
234
|
+
key = key.to_s.sub(/\\e/, "\e").to_sym
|
235
|
+
mappings[key] = value
|
236
|
+
end
|
237
|
+
}
|
238
|
+
end
|
239
|
+
configs[:init_params][:navigator] = {mappings: mappings}
|
230
240
|
if options[:navigate]
|
231
241
|
commands = options[:navigate].split(/, */).map{|c| c.to_sym}
|
232
242
|
configs[:navigate_config] = {commands: commands}
|
@@ -22,6 +22,7 @@ module RokuBuilder
|
|
22
22
|
PROJECT_STAGE_METHOD_BAD = 18
|
23
23
|
KEY_MISSING_PATH = 19
|
24
24
|
KEY_MISSING_PASSWORD = 20
|
25
|
+
INVALID_MAPPING_INFO = 21
|
25
26
|
|
26
27
|
MISSING_STAGE_METHOD = -1
|
27
28
|
|
@@ -56,6 +57,11 @@ module RokuBuilder
|
|
56
57
|
validate_key(codes: codes, key: key_config)
|
57
58
|
}
|
58
59
|
end
|
60
|
+
if config[:input_mapping]
|
61
|
+
config[:input_mapping].each_value {|info|
|
62
|
+
validate_mapping(codes: codes, mapping: info)
|
63
|
+
}
|
64
|
+
end
|
59
65
|
codes.uniq!
|
60
66
|
codes.push(0) if codes.empty?
|
61
67
|
codes
|
@@ -87,6 +93,7 @@ module RokuBuilder
|
|
87
93
|
"A project as an invalid stage method.",
|
88
94
|
"A key is missing its keyed package path.",
|
89
95
|
"A key is missing its password.", #20
|
96
|
+
"A input mapping is invalid",
|
90
97
|
#===============WARNINGS===============#
|
91
98
|
"A project is missing its stage method."
|
92
99
|
]
|
@@ -172,6 +179,15 @@ module RokuBuilder
|
|
172
179
|
end
|
173
180
|
private_class_method :validate_key
|
174
181
|
|
182
|
+
def self.validate_mapping(codes:, mapping:)
|
183
|
+
errors=[
|
184
|
+
[INVALID_MAPPING_INFO, mapping.nil?],
|
185
|
+
[INVALID_MAPPING_INFO, (mapping.count != 2)]
|
186
|
+
]
|
187
|
+
process_errors(codes: codes, errors: errors)
|
188
|
+
end
|
189
|
+
private_class_method :validate_mapping
|
190
|
+
|
175
191
|
def self.process_errors(codes:, errors:)
|
176
192
|
errors.each do |error|
|
177
193
|
codes.push(error[0]) if error[1]
|
@@ -6,7 +6,7 @@ module RokuBuilder
|
|
6
6
|
class Navigator < Util
|
7
7
|
|
8
8
|
# Setup navigation commands
|
9
|
-
def init
|
9
|
+
def init(mappings:)
|
10
10
|
@commands = {
|
11
11
|
home: "Home",
|
12
12
|
rew: "Rev",
|
@@ -36,64 +36,36 @@ module RokuBuilder
|
|
36
36
|
avi: "InputAVI"
|
37
37
|
}
|
38
38
|
|
39
|
-
@
|
40
|
-
"\e[1~":
|
41
|
-
"<":
|
42
|
-
">":
|
43
|
-
"=":
|
44
|
-
"
|
45
|
-
"\e[D":
|
46
|
-
"\e[C":
|
47
|
-
"\e[B":
|
48
|
-
"\e[A":
|
49
|
-
"\t":
|
50
|
-
"
|
51
|
-
"*":
|
52
|
-
"\u007f":
|
53
|
-
"?":
|
54
|
-
"\r":
|
55
|
-
"\e[5~":
|
56
|
-
"\e[6~":
|
57
|
-
"\e[4~":
|
58
|
-
#"":
|
59
|
-
#"":
|
60
|
-
#"":
|
61
|
-
#"":
|
62
|
-
#"":
|
63
|
-
#"":
|
64
|
-
#"":
|
65
|
-
#"":
|
39
|
+
@mappings = {
|
40
|
+
"\e[1~": [ "home", "Home" ],
|
41
|
+
"<": [ "rew", "<" ],
|
42
|
+
">": [ "ff", ">" ],
|
43
|
+
"=": [ "play", "=" ],
|
44
|
+
"\r": [ "select", "Enter" ],
|
45
|
+
"\e[D": [ "left", "Left Arrow" ],
|
46
|
+
"\e[C": [ "right", "Right Arrow" ],
|
47
|
+
"\e[B": [ "down", "Down Arrow" ],
|
48
|
+
"\e[A": [ "up", "Up Arrow" ],
|
49
|
+
"\t": [ "back", "Tab" ],
|
50
|
+
#"": [ "replay", "" ],
|
51
|
+
"*": [ "info", "*" ],
|
52
|
+
"\u007f": [ "backspace", "Backspace" ],
|
53
|
+
"?": [ "search", "?" ],
|
54
|
+
"\e\r": [ "enter", "Alt + Enter" ],
|
55
|
+
"\e[5~": [ "volumeup", "Page Up" ],
|
56
|
+
"\e[6~": [ "volumedown", "Page Down" ],
|
57
|
+
"\e[4~": [ "mute", "End" ],
|
58
|
+
#"": [ "channeldown", "" ],
|
59
|
+
#"": [ "channelup", "" ],
|
60
|
+
#"": [ "tuner", "" ],
|
61
|
+
#"": [ "hdmi1", "" ],
|
62
|
+
#"": [ "hdmi2", "" ],
|
63
|
+
#"": [ "hdmi3", "" ],
|
64
|
+
#"": [ "hdmi4", "" ],
|
65
|
+
#"": [ "avi", "" ]
|
66
66
|
}
|
67
67
|
|
68
|
-
|
69
|
-
@key_mappings = {
|
70
|
-
"Home": :home,
|
71
|
-
"<": :rew,
|
72
|
-
">": :ff,
|
73
|
-
"=": :play,
|
74
|
-
"\\": :select,
|
75
|
-
"Left Arrow": :left,
|
76
|
-
"Right Arrow": :right,
|
77
|
-
"Down Arrow": :down,
|
78
|
-
"Up Arrow": :up,
|
79
|
-
"Tab": :back,
|
80
|
-
"@": :replay,
|
81
|
-
"*": :info,
|
82
|
-
"Backspace": :backspace,
|
83
|
-
"?": :search,
|
84
|
-
"Enter": :enter,
|
85
|
-
"Page Up": :volumeup,
|
86
|
-
"Page Down": :volumedown,
|
87
|
-
"End": :mute
|
88
|
-
#"": :channeldown,
|
89
|
-
#"": :channelup,
|
90
|
-
#"": :tuner,
|
91
|
-
#"": :hdmi1,
|
92
|
-
#"": :hdmi2,
|
93
|
-
#"": :hdmi3,
|
94
|
-
#"": :hdmi4,
|
95
|
-
#"": :avi,
|
96
|
-
}
|
68
|
+
@mappings.merge!(mappings)
|
97
69
|
|
98
70
|
@screens = {
|
99
71
|
platform: [:home, :home, :home, :home, :home, :ff, :play, :rew, :play, :ff],
|
@@ -149,8 +121,8 @@ module RokuBuilder
|
|
149
121
|
def interactive
|
150
122
|
running = true
|
151
123
|
@logger.info("Key Mappings:")
|
152
|
-
@
|
153
|
-
@logger.info("#{key} -> #{@commands[
|
124
|
+
@mappings.each_value {|key|
|
125
|
+
@logger.info("#{key[1]} -> #{@commands[key[0].to_sym]}")
|
154
126
|
}
|
155
127
|
@logger.info("Control-C -> Exit")
|
156
128
|
while running
|
@@ -160,8 +132,8 @@ module RokuBuilder
|
|
160
132
|
running = false
|
161
133
|
else
|
162
134
|
Thread.new(char) {|char|
|
163
|
-
if @
|
164
|
-
nav(commands:[@
|
135
|
+
if @mappings[char.to_sym] != nil
|
136
|
+
nav(commands:[@mappings[char.to_sym][0].to_sym])
|
165
137
|
elsif char.inspect.force_encoding("UTF-8").ascii_only?
|
166
138
|
type(text: char)
|
167
139
|
end
|
data/lib/roku_builder/version.rb
CHANGED
@@ -126,7 +126,8 @@ class ConfigParserTest < Minitest::Test
|
|
126
126
|
|
127
127
|
def test_deeplink_app_config
|
128
128
|
args = {
|
129
|
-
|
129
|
+
config: {},
|
130
|
+
configs: {project_config: {directory: "dir"}, init_params: {}},
|
130
131
|
options: {deeplink: "a:b", app_id: "xxxxxx"},
|
131
132
|
logger: Logger.new("/dev/null")
|
132
133
|
}
|
@@ -43,7 +43,8 @@ class NavigatorTest < Minitest::Test
|
|
43
43
|
ip: "111.222.333",
|
44
44
|
user: "user",
|
45
45
|
password: "password",
|
46
|
-
logger: Logger.new("/dev/null")
|
46
|
+
logger: Logger.new("/dev/null"),
|
47
|
+
init_params: {mappings: {}}
|
47
48
|
}
|
48
49
|
if success
|
49
50
|
if type == :nav
|
@@ -87,7 +88,8 @@ class NavigatorTest < Minitest::Test
|
|
87
88
|
ip: "111.222.333",
|
88
89
|
user: "user",
|
89
90
|
password: "password",
|
90
|
-
logger: logger
|
91
|
+
logger: logger,
|
92
|
+
init_params: {mappings: {}}
|
91
93
|
}
|
92
94
|
navigator = RokuBuilder::Navigator.new(**device_config)
|
93
95
|
|
@@ -109,7 +111,8 @@ class NavigatorTest < Minitest::Test
|
|
109
111
|
ip: "111.222.333",
|
110
112
|
user: "user",
|
111
113
|
password: "password",
|
112
|
-
logger: logger
|
114
|
+
logger: logger,
|
115
|
+
init_params: {mappings: {}}
|
113
116
|
}
|
114
117
|
navigator = RokuBuilder::Navigator.new(**device_config)
|
115
118
|
|
@@ -124,7 +127,8 @@ class NavigatorTest < Minitest::Test
|
|
124
127
|
ip: "111.222.333",
|
125
128
|
user: "user",
|
126
129
|
password: "password",
|
127
|
-
logger: logger
|
130
|
+
logger: logger,
|
131
|
+
init_params: {mappings: {}}
|
128
132
|
}
|
129
133
|
navigator = RokuBuilder::Navigator.new(**device_config)
|
130
134
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roku_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.10.
|
4
|
+
version: 3.10.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- greeneca
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|