-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEmbyConnectScreen.brs
230 lines (151 loc) · 6.22 KB
/
EmbyConnectScreen.brs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
Function createConnectSignInScreen(viewController As Object) As Object
obj = CreateObject("roAssociativeArray")
initBaseScreen(obj, viewController)
screen = CreateObject("roCodeRegistrationScreen")
screen.SetMessagePort(obj.Port)
screen.SetTitle("Emby Connect")
screen.AddParagraph("With Emby Connect you can easily access your Emby Server wherever you are and share with your family and friends.")
screen.AddParagraph(" ")
screen.AddFocalText("From your computer,", "spacing-dense")
screen.AddFocalText("go to emby.media/pin", "spacing-dense")
screen.AddFocalText("and enter this code:", "spacing-dense")
screen.SetRegistrationCode("retrieving code...")
screen.AddParagraph(" ")
screen.AddParagraph("This screen will automatically update once your Roku player has been linked to your Emby account.")
screen.AddButton(0, "get a new code")
screen.AddButton(1, "skip (connect to server manually)")
' Set standard screen properties/methods
obj.Screen = screen
obj.Show = pinShow
obj.HandleMessage = pinHandleMessage
obj.OnUrlEvent = pinOnUrlEvent
obj.OnTimerExpired = pinOnTimerExpired
obj.ScreenName = "EmbyConnect"
obj.pinResult = invalid
return obj
End Function
Sub pinShow()
m.Screen.Show()
context = CreateObject("roAssociativeArray")
context.requestType = "pin"
startPinHttpRequest(m, context)
' Create a timer for polling to see if the code has been linked.
m.timer = createTimer()
m.timer.Name = "poll"
m.timer.SetDuration(5000, true)
m.ViewController.AddTimer(m.timer, m)
End Sub
Function pinHandleMessage(msg) As Boolean
handled = false
if type(msg) = "roCodeRegistrationScreenEvent" then
handled = true
if msg.isScreenClosed() then
m.ViewController.PopScreen(m)
else if msg.isButtonPressed()
if msg.GetIndex() = 0 then
' Get new code
m.Screen.SetRegistrationCode("retrieving code...")
context = CreateObject("roAssociativeArray")
context.requestType = "pin"
startPinHttpRequest(m, context)
else if msg.GetIndex() = 1 then
facade = CreateObject("roOneLineDialog")
facade.SetTitle("Please wait...")
facade.ShowBusyAnimation()
facade.Show()
result = ConnectionManager().connectInitial()
facade.Close()
' Don't get stuck in a loop and keep coming back here
if result.State = "ConnectSignIn" then result.State = "ServerSelection"
navigateFromConnectionResult(result)
else
m.Screen.Close()
end if
end if
end if
return handled
End Function
Sub pinOnUrlEvent(msg, requestContext)
if requestContext.requestType = "pin" then
if msg.GetResponseCode() <> 200 then
Debug("Request for new PIN failed: " + tostr(msg.GetResponseCode()) + " - " + tostr(msg.GetFailureReason()))
dialog = createBaseDialog()
dialog.Title = "Server unavailable"
dialog.Text = "Emby Connect could not be reached, please try again later."
dialog.Show()
else
m.pinResult = ParseJSON(msg.GetString())
m.Screen.SetRegistrationCode(m.pinResult.Pin)
m.timer.Active = true
end if
else if requestContext.requestType = "poll" then
if msg.GetResponseCode() = 200 then
pollResultString = msg.GetString()
Debug("Poll result: " + pollResultString)
pollResult = ParseJSON(pollResultString)
if pollResult.IsExpired = true then
Debug("Expiring PIN, server response was " + tostr(msg.GetResponseCode()))
m.Screen.SetRegistrationCode("code expired")
m.pinResult = invalid
else if pollResult.IsConfirmed = true then
Debug("Pin confirmed")
onPinConfirmed(m.pinResult, m, m.timer)
end if
else
' Just treat the failure as expired (being lazy here)
Debug("Expiring PIN, server response was " + tostr(msg.GetResponseCode()))
m.Screen.SetRegistrationCode("code expired")
m.pinResult = invalid
end if
else if requestContext.requestType = "exchange" then
if msg.GetResponseCode() = 200 then
exchangeResult = ParseJSON(msg.GetString())
RegWrite("connectUserId", exchangeResult.UserId)
RegWrite("connectAccessToken", exchangeResult.AccessToken)
onPinExchanged(m)
else
' Just treat the failure as expired (being lazy here)
Debug("Expiring PIN, server response was " + tostr(msg.GetResponseCode()))
m.Screen.SetRegistrationCode("code expired")
m.pinResult = invalid
end if
end if
End Sub
Sub onPinExchanged(connectScreen)
facade = CreateObject("roOneLineDialog")
facade.SetTitle("Please wait...")
facade.ShowBusyAnimation()
facade.Show()
result = ConnectionManager().connectInitial()
' Don't get stuck in a loop and keep coming back here
if result.State = "ConnectSignIn" then
result.State = "ServerSelection"
end if
facade.Close()
connectScreen.Screen.Close()
navigateFromConnectionResult(result)
End Sub
Sub onPinConfirmed(pinResult, listener, timer)
timer.Active = false
request = ConnectionManager().getPinExchangeHttpRequest(pinResult)
body = "deviceId=" + getGlobalVar("rokuUniqueId", "Unknown") + "&pin=" + pinResult.Pin
context = CreateObject("roAssociativeArray")
context.requestType = "exchange"
GetViewController().StartRequest(request, listener, context, body, "post")
End Sub
Sub pinOnTimerExpired(timer)
if m.pinResult <> invalid then
context = CreateObject("roAssociativeArray")
context.requestType = "poll"
startPinPollHttpRequest(m.pinResult, m, context)
end if
End Sub
Sub startPinHttpRequest(listener, context)
request = ConnectionManager().getPinCreationHttpRequest()
body = "deviceId=" + getGlobalVar("rokuUniqueId", "Unknown")
GetViewController().StartRequest(request, listener, context, body, "post")
End Sub
Sub startPinPollHttpRequest(pinResult, listener, context)
request = ConnectionManager().getPinStatusHttpRequest(pinResult)
GetViewController().StartRequest(request, listener, context, invalid, "get")
End Sub