roku_builder 3.9.0 → 3.10.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -5
- data/bin/roku +5 -1
- data/lib/roku_builder.rb +2 -0
- data/lib/roku_builder/config_parser.rb +2 -1
- data/lib/roku_builder/controller.rb +5 -4
- data/lib/roku_builder/controller_commands.rb +2 -1
- data/lib/roku_builder/navigator.rb +149 -16
- data/lib/roku_builder/version.rb +1 -1
- data/tests/roku_builder/navigator_test.rb +7 -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: cafc0b0138dbfd81a85b39a01e42c997a475be97
|
4
|
+
data.tar.gz: a66b55d7ef11b635798337edc9596d260cc9af00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d27e06b83ead8167213f203a075526c4232a81d838df4cdb76e993b56d20532ed43442a4c21ad7dfd9b8400a546e9aeb0d4ba177610a5657aa2cc23bbf13b47
|
7
|
+
data.tar.gz: 8e0ea288ef29387ffaabcbba427ed034a7bab2b826d45c954fd81294fd48b1a4709e63bccc5992b8deb22a338a37095321f58d3bf064b0baaac6949b7ea789dd
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
roku_builder (3.
|
4
|
+
roku_builder (3.10.0)
|
5
5
|
faraday (~> 0.9)
|
6
6
|
faraday-digestauth (~> 0.2)
|
7
7
|
git (~> 1.3)
|
@@ -13,7 +13,7 @@ PATH
|
|
13
13
|
GEM
|
14
14
|
remote: https://rubygems.org/
|
15
15
|
specs:
|
16
|
-
byebug (9.0.
|
16
|
+
byebug (9.0.6)
|
17
17
|
coderay (1.1.1)
|
18
18
|
coveralls (0.8.15)
|
19
19
|
json (>= 1.8, < 3)
|
@@ -58,7 +58,7 @@ GEM
|
|
58
58
|
lumberjack (1.0.10)
|
59
59
|
method_source (0.8.2)
|
60
60
|
mini_portile2 (2.1.0)
|
61
|
-
minitest (5.9.
|
61
|
+
minitest (5.9.1)
|
62
62
|
minitest-autotest (1.0.3)
|
63
63
|
minitest-server (~> 1.0)
|
64
64
|
minitest-server (1.0.4)
|
@@ -80,7 +80,7 @@ GEM
|
|
80
80
|
coderay (~> 1.1.0)
|
81
81
|
method_source (~> 0.8.1)
|
82
82
|
slop (~> 3.4)
|
83
|
-
rake (11.
|
83
|
+
rake (11.3.0)
|
84
84
|
rb-fsevent (0.9.7)
|
85
85
|
rb-inotify (0.9.7)
|
86
86
|
ffi (>= 0.5.0)
|
@@ -93,7 +93,7 @@ GEM
|
|
93
93
|
simplecov-html (~> 0.10.0)
|
94
94
|
simplecov-html (0.10.0)
|
95
95
|
slop (3.6.0)
|
96
|
-
term-ansicolor (1.
|
96
|
+
term-ansicolor (1.4.0)
|
97
97
|
tins (~> 1.0)
|
98
98
|
thor (0.19.1)
|
99
99
|
tins (1.12.0)
|
data/bin/roku
CHANGED
@@ -52,10 +52,14 @@ parser = OptionParser.new do |opts|
|
|
52
52
|
options[:delete] = true
|
53
53
|
end
|
54
54
|
|
55
|
-
opts.on("-N", "--
|
55
|
+
opts.on("-N", "--nav CMD", "Command: send the given command to the roku") do |n|
|
56
56
|
options[:navigate] = n
|
57
57
|
end
|
58
58
|
|
59
|
+
opts.on("--navigate", "Command: Run interactive navigator") do
|
60
|
+
options[:navigator] = true
|
61
|
+
end
|
62
|
+
|
59
63
|
opts.on("-S", "--screencapture", "Command: save a screencapture to the output file/folder") do
|
60
64
|
options[:screencapture] = true
|
61
65
|
end
|
data/lib/roku_builder.rb
CHANGED
@@ -228,7 +228,8 @@ module RokuBuilder
|
|
228
228
|
end
|
229
229
|
# Create Navigate Config
|
230
230
|
if options[:navigate]
|
231
|
-
|
231
|
+
commands = options[:navigate].split(/, */).map{|c| c.to_sym}
|
232
|
+
configs[:navigate_config] = {commands: commands}
|
232
233
|
end
|
233
234
|
# Create Text Config
|
234
235
|
configs[:text_config] = {text: options[:text]}
|
@@ -161,8 +161,9 @@ module RokuBuilder
|
|
161
161
|
# @return [Array<Symbol>] List of command symbols that can be used in the options hash
|
162
162
|
def self.commands
|
163
163
|
[:sideload, :package, :test, :deeplink,:configure, :validate, :delete,
|
164
|
-
:navigate, :text, :build, :monitor, :update, :screencapture,
|
165
|
-
:screens, :applist, :print, :profile, :dostage,
|
164
|
+
:navigate, :navigator, :text, :build, :monitor, :update, :screencapture,
|
165
|
+
:key, :screen, :screens, :applist, :print, :profile, :dostage,
|
166
|
+
:dounstage]
|
166
167
|
end
|
167
168
|
|
168
169
|
# List of depricated options
|
@@ -192,8 +193,8 @@ module RokuBuilder
|
|
192
193
|
# List of commands that require a device
|
193
194
|
# @return [Array<Symbol>] List of commands that require a device
|
194
195
|
def self.device_commands
|
195
|
-
[:sideload, :package, :test, :deeplink, :delete, :navigate, :
|
196
|
-
:monitor, :screencapture, :applist, :profile ]
|
196
|
+
[:sideload, :package, :test, :deeplink, :delete, :navigate, :navigator,
|
197
|
+
:text, :monitor, :screencapture, :applist, :profile ]
|
197
198
|
end
|
198
199
|
|
199
200
|
|
@@ -15,6 +15,7 @@ module RokuBuilder
|
|
15
15
|
config_key: :monitor_config },
|
16
16
|
navigate: { klass: Navigator, method: :nav, config_key: :navigate_config,
|
17
17
|
failure: FAILED_NAVIGATING },
|
18
|
+
navigator: { klass: Navigator, method: :interactive },
|
18
19
|
screen: { klass: Navigator, method: :screen, config_key: :screen_config,
|
19
20
|
failure: FAILED_NAVIGATING },
|
20
21
|
key: { klass: Keyer, method: :rekey, config_key: :key },
|
@@ -200,7 +201,7 @@ module RokuBuilder
|
|
200
201
|
success = instance.send(method)
|
201
202
|
end
|
202
203
|
return failure unless failure.nil? or success
|
203
|
-
logger.
|
204
|
+
logger.debug "#{klass} call #{method} successfully"
|
204
205
|
SUCCESS
|
205
206
|
end
|
206
207
|
end
|
@@ -8,17 +8,91 @@ module RokuBuilder
|
|
8
8
|
# Setup navigation commands
|
9
9
|
def init
|
10
10
|
@commands = {
|
11
|
-
up: "Up",
|
12
|
-
down: "Down",
|
13
|
-
right: "Right",
|
14
|
-
left: "Left",
|
15
|
-
select: "Select",
|
16
|
-
back: "Back",
|
17
11
|
home: "Home",
|
18
12
|
rew: "Rev",
|
19
13
|
ff: "Fwd",
|
20
14
|
play: "Play",
|
21
|
-
|
15
|
+
select: "Select",
|
16
|
+
left: "Left",
|
17
|
+
right: "Right",
|
18
|
+
down: "Down",
|
19
|
+
up: "Up",
|
20
|
+
back: "Back",
|
21
|
+
replay: "InstantReplay",
|
22
|
+
info: "Info",
|
23
|
+
backspace: "Backspace",
|
24
|
+
search: "Search",
|
25
|
+
enter: "Enter",
|
26
|
+
volumedown: "VolumeDown",
|
27
|
+
volumeup: "VolumeUp",
|
28
|
+
mute: "VolumeMute",
|
29
|
+
channelup: "ChannelUp",
|
30
|
+
channeldown: "ChannelDown",
|
31
|
+
tuner: "InputTuner",
|
32
|
+
hdmi1: "InputHDMI1",
|
33
|
+
hdmi2: "InputHDMI2",
|
34
|
+
hdmi3: "InputHDMI3",
|
35
|
+
hdmi4: "InputHDMI4",
|
36
|
+
avi: "InputAVI"
|
37
|
+
}
|
38
|
+
|
39
|
+
@keys = {
|
40
|
+
"\e[1~": :home,
|
41
|
+
"<": :rew,
|
42
|
+
">": :ff,
|
43
|
+
"=": :play,
|
44
|
+
"\\": :select,
|
45
|
+
"\e[D": :left,
|
46
|
+
"\e[C": :right,
|
47
|
+
"\e[B": :down,
|
48
|
+
"\e[A": :up,
|
49
|
+
"\t": :back,
|
50
|
+
"@": :replay,
|
51
|
+
"*": :info,
|
52
|
+
"\u007f": :backspace,
|
53
|
+
"?": :search,
|
54
|
+
"\r": :enter,
|
55
|
+
"\e[5~": :volumeup,
|
56
|
+
"\e[6~": :volumedown,
|
57
|
+
"\e[4~": :mute
|
58
|
+
#"": :channeldown,
|
59
|
+
#"": :channelup,
|
60
|
+
#"": :tuner,
|
61
|
+
#"": :hdmi1,
|
62
|
+
#"": :hdmi2,
|
63
|
+
#"": :hdmi3,
|
64
|
+
#"": :hdmi4,
|
65
|
+
#"": :avi,
|
66
|
+
}
|
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,
|
22
96
|
}
|
23
97
|
|
24
98
|
@screens = {
|
@@ -33,21 +107,29 @@ module RokuBuilder
|
|
33
107
|
network: [:home, :home, :home, :home, :home, :right, :left, :right, :left, :right],
|
34
108
|
reboot: [:home, :home, :home, :home, :home, :up, :rew, :rew, :ff, :ff]
|
35
109
|
}
|
110
|
+
|
111
|
+
@runable = [
|
112
|
+
:secret, :channels
|
113
|
+
]
|
36
114
|
end
|
37
115
|
|
38
116
|
# Send a navigation command to the roku device
|
39
117
|
# @param command [Symbol] The smbol of the command to send
|
40
118
|
# @return [Boolean] Success
|
41
|
-
def nav(
|
42
|
-
|
43
|
-
|
119
|
+
def nav(commands:)
|
120
|
+
commands.each do |command|
|
121
|
+
if @commands.has_key?(command)
|
122
|
+
conn = multipart_connection(port: 8060)
|
44
123
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
124
|
+
path = "/keypress/#{@commands[command]}"
|
125
|
+
@logger.debug("Send Command: "+path)
|
126
|
+
response = conn.post path
|
127
|
+
return false unless response.success?
|
128
|
+
else
|
129
|
+
return false
|
130
|
+
end
|
50
131
|
end
|
132
|
+
return true
|
51
133
|
end
|
52
134
|
|
53
135
|
# Type text on the roku device
|
@@ -57,17 +139,47 @@ module RokuBuilder
|
|
57
139
|
conn = multipart_connection(port: 8060)
|
58
140
|
text.split(//).each do |c|
|
59
141
|
path = "/keypress/LIT_#{CGI::escape(c)}"
|
142
|
+
@logger.debug("Send Letter: "+path)
|
60
143
|
response = conn.post path
|
61
144
|
return false unless response.success?
|
62
145
|
end
|
63
146
|
return true
|
64
147
|
end
|
65
148
|
|
149
|
+
def interactive
|
150
|
+
running = true
|
151
|
+
@logger.info("Key Mappings:")
|
152
|
+
@key_mappings.each_pair {|key, command|
|
153
|
+
@logger.info("#{key} -> #{@commands[command]}")
|
154
|
+
}
|
155
|
+
@logger.info("Control-C -> Exit")
|
156
|
+
while running
|
157
|
+
char = read_char
|
158
|
+
@logger.debug("Char: #{char.inspect}")
|
159
|
+
if char == "\u0003"
|
160
|
+
running = false
|
161
|
+
else
|
162
|
+
Thread.new(char) {|char|
|
163
|
+
if @keys[char.to_sym] != nil
|
164
|
+
nav(commands:[@keys[char.to_sym]])
|
165
|
+
elsif char.inspect.force_encoding("UTF-8").ascii_only?
|
166
|
+
type(text: char)
|
167
|
+
end
|
168
|
+
}
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
66
173
|
# Show the commands for one of the roku secret screens
|
67
174
|
# @param type [Symbol] The type of screen to show
|
68
175
|
# @return [Boolean] Screen found
|
69
176
|
def screen(type:)
|
70
177
|
if @screens.has_key?(type)
|
178
|
+
if @runable.include?(type)
|
179
|
+
nav(commands: @screens[type])
|
180
|
+
else
|
181
|
+
@logger.unknown("Cannot run command automatically")
|
182
|
+
end
|
71
183
|
display = []
|
72
184
|
count = []
|
73
185
|
@screens[type].each do |command|
|
@@ -86,7 +198,12 @@ module RokuBuilder
|
|
86
198
|
string = string + @commands[display[i]]+", "
|
87
199
|
end
|
88
200
|
end
|
89
|
-
|
201
|
+
|
202
|
+
if @runable.include?(type)
|
203
|
+
@logger.info(string.strip)
|
204
|
+
else
|
205
|
+
@logger.unknown(string.strip)
|
206
|
+
end
|
90
207
|
else
|
91
208
|
return false
|
92
209
|
end
|
@@ -97,5 +214,21 @@ module RokuBuilder
|
|
97
214
|
def screens
|
98
215
|
@screens.keys.each {|screen| @logger.unknown(screen)}
|
99
216
|
end
|
217
|
+
|
218
|
+
def read_char
|
219
|
+
STDIN.echo = false
|
220
|
+
STDIN.raw!
|
221
|
+
|
222
|
+
input = STDIN.getc.chr
|
223
|
+
if input == "\e" then
|
224
|
+
input << STDIN.read_nonblock(3) rescue nil
|
225
|
+
input << STDIN.read_nonblock(2) rescue nil
|
226
|
+
end
|
227
|
+
ensure
|
228
|
+
STDIN.echo = true
|
229
|
+
STDIN.cooked!
|
230
|
+
|
231
|
+
return input
|
232
|
+
end
|
100
233
|
end
|
101
234
|
end
|
data/lib/roku_builder/version.rb
CHANGED
@@ -67,7 +67,7 @@ class NavigatorTest < Minitest::Test
|
|
67
67
|
result = nil
|
68
68
|
Faraday.stub(:new, connection, faraday) do
|
69
69
|
if type == :nav
|
70
|
-
result = navigator.nav(
|
70
|
+
result = navigator.nav(commands: [input])
|
71
71
|
elsif type == :text
|
72
72
|
result = navigator.type(text: input)
|
73
73
|
end
|
@@ -91,11 +91,14 @@ class NavigatorTest < Minitest::Test
|
|
91
91
|
}
|
92
92
|
navigator = RokuBuilder::Navigator.new(**device_config)
|
93
93
|
|
94
|
-
logger.expect(:
|
94
|
+
logger.expect(:info, nil, ["Home x 5, Fwd x 3, Rev x 2,"])
|
95
|
+
logger.expect(:unknown, nil, ["Cannot run command automatically"])
|
95
96
|
logger.expect(:unknown, nil, ["Home x 5, Up, Rev x 2, Fwd x 2,"])
|
96
97
|
|
97
|
-
navigator.
|
98
|
-
|
98
|
+
navigator.stub(:nav, nil) do
|
99
|
+
navigator.screen(type: :secret)
|
100
|
+
navigator.screen(type: :reboot)
|
101
|
+
end
|
99
102
|
|
100
103
|
logger.verify
|
101
104
|
end
|
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.
|
4
|
+
version: 3.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- greeneca
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|