Skip to content

Commit 0fbf38a

Browse files
author
Chris Bellew
committed
Fixed crash when specifying a client in the query; Removed some extraneous code; Return http status code when server connection test fails.
1 parent e76ec8c commit 0fbf38a

File tree

6 files changed

+42
-131
lines changed

6 files changed

+42
-131
lines changed

Voice Control For Plex/src/main/java/com/atomjack/vcfp/LocalScan.java

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -157,58 +157,4 @@ public void onItemClick(AdapterView<?> parentAdapter, View view, int position,
157157

158158
});
159159
}
160-
161-
public void scanServersForClients() {
162-
ConcurrentHashMap<String, PlexServer> servers = VoiceControlForPlexApplication.servers;
163-
Logger.d("ScanServersForClients, number of servers = " + servers.size());
164-
serversScanned = 0;
165-
for(PlexServer thisServer : servers.values()) {
166-
// Skip non-owned servers
167-
if(!thisServer.owned)
168-
continue;
169-
Logger.d("ScanServersForClients server: %s", thisServer.name);
170-
PlexHttpClient.get(thisServer, "/clients", new PlexHttpMediaContainerHandler()
171-
{
172-
@Override
173-
public void onSuccess(MediaContainer clientMC)
174-
{
175-
serversScanned++;
176-
// Exclude non-Plex Home Theater clients (pre 1.0.7)
177-
Logger.d("clientMC size: %d", clientMC.clients.size());
178-
for(int i=0;i<clientMC.clients.size();i++) {
179-
if((!VoiceControlForPlexApplication.isVersionLessThan(clientMC.clients.get(i).version, VoiceControlForPlexApplication.MINIMUM_PHT_VERSION) || !clientMC.clients.get(i).product.equals("Plex Home Theater")) && !m_clients.containsKey(clientMC.clients.get(i).name)) {
180-
m_clients.put(clientMC.clients.get(i).name, clientMC.clients.get(i));
181-
}
182-
}
183-
184-
if(serversScanned == VoiceControlForPlexApplication.servers.size()) {
185-
searchDialog.dismiss();
186-
if(m_clients.size() == 0) {
187-
AlertDialog.Builder builder = new AlertDialog.Builder(context);
188-
builder.setTitle("No Plex Clients Found");
189-
builder.setCancelable(false)
190-
.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener()
191-
{
192-
public void onClick(DialogInterface dialog, int id)
193-
{
194-
dialog.cancel();
195-
}
196-
});
197-
AlertDialog d = builder.create();
198-
d.show();
199-
} else {
200-
Logger.d("Clients: " + m_clients.size());
201-
showPlexClients(m_clients);
202-
}
203-
}
204-
}
205-
206-
@Override
207-
public void onFailure(Throwable error) {
208-
searchDialog.dismiss();
209-
feedback.e(context.getResources().getString(R.string.got_error), error.getMessage());
210-
}
211-
});
212-
}
213-
}
214160
}

Voice Control For Plex/src/main/java/com/atomjack/vcfp/PlexSearchService.java

Lines changed: 28 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626

2727
import java.util.ArrayList;
2828
import java.util.Arrays;
29+
import java.util.HashMap;
2930
import java.util.List;
31+
import java.util.Map;
3032
import java.util.concurrent.ConcurrentHashMap;
3133
import java.util.regex.Matcher;
3234
import java.util.regex.Pattern;
@@ -42,10 +44,11 @@ public class PlexSearchService extends Service {
4244
private Gson gson = new Gson();
4345

4446
private ConcurrentHashMap<String, PlexServer> plexmediaServers = new ConcurrentHashMap<String, PlexServer>();
45-
private int serversScanned = 0;
47+
private Map<String, PlexClient> clients;
48+
4649
private BroadcastReceiver gdmReceiver = new GDMReceiver();
4750
private Intent mServiceIntent;
48-
private List<PlexClient> clients;
51+
4952
private PlexClient client = null;
5053
private PlexServer specifiedServer = null;
5154
private int serversSearched = 0;
@@ -99,7 +102,7 @@ public int onStartCommand(Intent intent, int flags, int startId) {
99102
client = null;
100103

101104
queries = new ArrayList<String>();
102-
105+
clients = (HashMap)VoiceControlForPlexApplication.clients;
103106
resumePlayback = false;
104107

105108
specifiedServer = gson.fromJson(intent.getStringExtra(VoiceControlForPlexApplication.Intent.EXTRA_SERVER), PlexServer.class);
@@ -117,7 +120,8 @@ public int onStartCommand(Intent intent, int flags, int startId) {
117120
ArrayList<String> voiceResults = intent.getExtras().getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
118121
for(String q : voiceResults) {
119122
if(q.matches(getString(R.string.pattern_recognition))) {
120-
queries.add(q);
123+
if(!queries.contains(q.toLowerCase()))
124+
queries.add(q.toLowerCase());
121125
}
122126
}
123127
if(queries.size() == 0) {
@@ -178,6 +182,7 @@ public IBinder onBind(Intent intent) {
178182

179183
private void startup() {
180184
queryText = queries.remove(0);
185+
181186
Logger.d("Starting up with query string: %s", queryText);
182187
tracks = new ArrayList<PlexTrack>();
183188
videos = new ArrayList<PlexVideo>();
@@ -232,49 +237,11 @@ private void startup() {
232237
}
233238

234239
private void setClient() {
235-
Pattern p = Pattern.compile(getString(R.string.pattern_on_client), Pattern.DOTALL);
236-
Matcher matcher = p.matcher(queryText);
237-
if(!matcher.find()) {
238-
// Client not specified, so use default
239-
Logger.d("Using default client since none specified in query: %s", client.name);
240-
actionToDo = handleVoiceSearch();
241-
if(actionToDo == null) {
242-
startup();
243-
} else
244-
actionToDo.run();
245-
} else {
246-
// Get available clients
247-
Logger.d("getting all available clients");
248-
serversScanned = 0;
249-
clients = new ArrayList<PlexClient>();
250-
for(PlexServer server : plexmediaServers.values()) {
251-
Logger.d("ip: %s", server.activeConnection.address);
252-
Logger.d("port: %s", server.activeConnection.port);
253-
254-
PlexHttpClient.get(server, "/clients", new PlexHttpMediaContainerHandler() {
255-
@Override
256-
public void onSuccess(MediaContainer mc) {
257-
serversScanned++;
258-
Logger.d("Clients: %d", mc.clients.size());
259-
for (int i = 0; i < mc.clients.size(); i++) {
260-
clients.add(mc.clients.get(i));
261-
}
262-
if (serversScanned == plexmediaServers.size()) {
263-
actionToDo = handleVoiceSearch();
264-
if(actionToDo == null) {
265-
startup();
266-
} else
267-
actionToDo.run();
268-
}
269-
}
270-
271-
@Override
272-
public void onFailure(Throwable error) {
273-
feedback.e(getResources().getString(R.string.got_error), error.getMessage());
274-
}
275-
});
276-
}
277-
}
240+
actionToDo = handleVoiceSearch();
241+
if(actionToDo == null) {
242+
startup();
243+
} else
244+
actionToDo.run();
278245
}
279246

280247
private myRunnable handleVoiceSearch() {
@@ -298,9 +265,10 @@ private myRunnable handleVoiceSearch(boolean noChange) {
298265

299266
Logger.d("Clients: %d", clients.size());
300267
Logger.d("Specified client: %s", specifiedClient);
301-
for (int i = 0; i < clients.size(); i++) {
302-
if (clients.get(i).name.toLowerCase().equals(specifiedClient)) {
303-
client = clients.get(i);
268+
//for (int i = 0; i < clients.size(); i++) {
269+
for(PlexClient c : clients.values()) {
270+
if (c.name.toLowerCase().equals(specifiedClient)) {
271+
client = c;
304272
queryText = queryText.replaceAll(getString(R.string.pattern_on_client), "$1");
305273
Logger.d("query text now %s", queryText);
306274
break;
@@ -650,7 +618,7 @@ private void doMovieSearch(final String queryTerm) {
650618
@Override
651619
public void onSuccess() {
652620
server.movieSectionsSearched = 0;
653-
Logger.d("Searching server: %s, %d sections", server.name, server.movieSections.size());
621+
Logger.d("Searching server (for movies): %s, %d sections", server.name, server.movieSections.size());
654622
if(server.movieSections.size() == 0) {
655623
serversSearched++;
656624
if(serversSearched == plexmediaServers.size()) {
@@ -686,14 +654,15 @@ public void onSuccess(MediaContainer mc)
686654

687655
@Override
688656
public void onFailure(Throwable error) {
657+
error.printStackTrace();
689658
feedback.e(getResources().getString(R.string.got_error), error.getMessage());
690659
}
691660
});
692661
}
693662
}
694663

695664
@Override
696-
public void onFailure() {
665+
public void onFailure(int statusCode) {
697666
serversSearched++;
698667
if(serversSearched == plexmediaServers.size()) {
699668
onMovieSearchFinished(queryTerm);
@@ -899,7 +868,7 @@ public void onFailure(Throwable error) {
899868
}
900869

901870
@Override
902-
public void onFailure() {
871+
public void onFailure(int statusCode) {
903872
serversSearched++;
904873
if (serversSearched == plexmediaServers.size()) {
905874
onFinishedNextEpisodeSearch(queryTerm, fallback);
@@ -984,14 +953,15 @@ public void onSuccess(MediaContainer mc) {
984953

985954
@Override
986955
public void onFailure(Throwable error) {
956+
error.printStackTrace();
987957
feedback.e(getResources().getString(R.string.got_error), error.getMessage());
988958
}
989959
});
990960
}
991961
}
992962

993963
@Override
994-
public void onFailure() {
964+
public void onFailure(int statusCode) {
995965
serversSearched++;
996966
if (serversSearched == plexmediaServers.size()) {
997967
doLatestEpisode(queryTerm);
@@ -1114,7 +1084,7 @@ public void onFailure(Throwable error) {
11141084
}
11151085

11161086
@Override
1117-
public void onFailure() {
1087+
public void onFailure(int statusCode) {
11181088
serversSearched++;
11191089
if (serversSearched == plexmediaServers.size()) {
11201090
playSpecificEpisode(showSpecified);
@@ -1198,7 +1168,7 @@ public void onFailure(Throwable error) {
11981168
}
11991169

12001170
@Override
1201-
public void onFailure() {
1171+
public void onFailure(int statusCode) {
12021172
serversSearched++;
12031173
if (serversSearched == plexmediaServers.size()) {
12041174
doEpisodeSearch(queryTerm, season, episode);
@@ -1373,7 +1343,7 @@ public void onFailure(Throwable error) {
13731343
}
13741344

13751345
@Override
1376-
public void onFailure() {
1346+
public void onFailure(int statusCode) {
13771347
serversSearched++;
13781348
if(serversSearched == plexmediaServers.size()) {
13791349
if(albums.size() == 1) {
@@ -1469,7 +1439,7 @@ public void onFailure(Throwable error) {
14691439
}
14701440

14711441
@Override
1472-
public void onFailure() {
1442+
public void onFailure(int statusCode) {
14731443
serversSearched++;
14741444
if(serversSearched == plexmediaServers.size()) {
14751445
if(tracks.size() > 0) {

Voice Control For Plex/src/main/java/com/atomjack/vcfp/ServerFindHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
public interface ServerFindHandler {
44
void onSuccess();
5-
void onFailure();
5+
void onFailure(int statusCode);
66
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.atomjack.vcfp;
22

33
public interface ServerTestHandler {
4-
void onFinish(boolean available);
4+
void onFinish(int statusCode, boolean available);
55
}

Voice Control For Plex/src/main/java/com/atomjack/vcfp/activities/MainActivity.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,6 @@ public class MainActivity extends Activity implements TextToSpeech.OnInitListene
9999

100100
private Feedback feedback;
101101

102-
private Dialog searchDialog = null;
103-
104102
private FutureRunnable fetchPinTask;
105103

106104
private PlexServer server = null;
@@ -778,8 +776,6 @@ public void onNewIntent(Intent intent) {
778776
if (VoiceControlForPlexApplication.servers.size() > 0) {
779777
localScan.showPlexServers();
780778
} else {
781-
if (searchDialog != null)
782-
searchDialog.hide();
783779
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
784780
builder.setTitle(R.string.no_servers_found);
785781
builder.setCancelable(false)
@@ -802,8 +798,6 @@ public void onClick(DialogInterface dialog, int id) {
802798
mPrefsEditor.commit();
803799
localScan.showPlexClients(VoiceControlForPlexApplication.clients);
804800
} else {
805-
if (searchDialog != null)
806-
searchDialog.hide();
807801
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
808802
builder.setTitle(R.string.no_clients_found);
809803
builder.setCancelable(false)
@@ -816,9 +810,6 @@ public void onClick(DialogInterface dialog, int id) {
816810
d.show();
817811
}
818812
}
819-
} else if(origin.equals("ScanForClients")) {
820-
// No default server specified, so we need to search all servers for all clients
821-
localScan.scanServersForClients();
822813
}
823814
}
824815
}

Voice Control For Plex/src/main/java/com/atomjack/vcfp/model/PlexServer.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -156,16 +156,15 @@ private void findServerConnection(final int connectionIndex, final ServerFindHan
156156
final Connection connection = connections.get(connectionIndex);
157157
testServerConnection(connection, new ServerTestHandler() {
158158
@Override
159-
public void onFinish(boolean available) {
159+
public void onFinish(int statusCode, boolean available) {
160160
if(available) {
161161
// This connection replied, so let's use it
162162
activeConnection = connections.get(connectionIndex);
163163
handler.onSuccess();
164164
} else {
165165
int newConnectionIndex = connectionIndex + 1;
166-
// TODO: Fix this
167166
if(connections.size() <= newConnectionIndex)
168-
handler.onFailure();
167+
handler.onFailure(statusCode);
169168
else
170169
findServerConnection(newConnectionIndex, handler);
171170
}
@@ -175,22 +174,27 @@ public void onFinish(boolean available) {
175174

176175
private void testServerConnection(final Connection connection, final ServerTestHandler handler) {
177176
AsyncHttpClient httpClient = new AsyncHttpClient();
178-
Logger.d("testServerConnection: fetching %s", connection.uri);
177+
179178
// Set timeout to 2 seconds, we don't want this to take too long
180179
httpClient.setTimeout(2000);
180+
String url = connection.uri;
181181
if(accessToken != null)
182-
httpClient.addHeader(PlexHeaders.XPlexToken, accessToken);
183-
httpClient.get(connection.uri, new AsyncHttpResponseHandler() {
182+
url += String.format("/?%s=%s", PlexHeaders.XPlexToken, accessToken);
183+
Logger.d("testServerConnection: fetching %s", connection.uri);
184+
httpClient.get(url, new AsyncHttpResponseHandler() {
184185
@Override
185186
public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] responseBody) {
186187
Logger.d("%s success", connection.uri);
187-
handler.onFinish(true);
188+
handler.onFinish(statusCode, true);
188189
}
189190

190191
@Override
191192
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
193+
// unauthorized: 401
194+
// timeout: 0
195+
Logger.d("Status Code: %d", statusCode);
192196
Logger.d("%s failed", connection.uri);
193-
handler.onFinish(false);
197+
handler.onFinish(statusCode, false);
194198
}
195199
});
196200
}

0 commit comments

Comments
 (0)