Skip to content

Commit 5c1d168

Browse files
author
Chris Bellew
committed
Improved local client discovery; Scan all of a Plex Media Server's connections to find one that works. This will enable viewing content from a server you own but are trying to view from remotely.
1 parent 721bd96 commit 5c1d168

20 files changed

+972
-505
lines changed

Voice Control For Plex/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.atomjack.vcfp"
44
android:versionCode="15"
5-
android:versionName="1.8.1b" >
5+
android:versionName="1.8.1b1" >
66

77
<uses-permission android:name="com.mohammadag.googlesearchapi.permission.ACCESS_GGOGLE_SEARCH_API" />
88
<uses-permission android:name="android.permission.INTERNET" />

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,27 @@
1616
public class GDMService extends IntentService {
1717
public static final String MSG_RECEIVED = ".GDMService.MESSAGE_RECEIVED";
1818
public static final String SOCKET_CLOSED = ".GDMService.SOCKET_CLOSED";
19-
19+
20+
2021
public GDMService() {
2122
super("GDMService");
2223
}
24+
2325
@Override
2426
protected void onHandleIntent(Intent intent) {
2527
try
2628
{
2729
String origin = intent.getStringExtra("ORIGIN") == null ? "" : intent.getStringExtra("ORIGIN");
2830
String queryText = intent.getStringExtra("queryText");
31+
int port = intent.getIntExtra("port", 32414); // Default port, for Plex Media Servers (Clients use 32412)
2932
DatagramSocket socket = new DatagramSocket(32420);
3033
socket.setBroadcast(true);
3134
String data = "M-SEARCH * HTTP/1.0";
32-
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), getBroadcastAddress(), 32414);
35+
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), getBroadcastAddress(), port);
3336
socket.send(packet);
3437
Logger.i("Search Packet Broadcasted");
3538

36-
byte[] buf = new byte[256];
39+
byte[] buf = new byte[8096];
3740
packet = new DatagramPacket(buf, buf.length);
3841
socket.setSoTimeout(2000);
3942
boolean listening = true;
@@ -43,7 +46,8 @@ protected void onHandleIntent(Intent intent) {
4346
{
4447
socket.receive(packet);
4548
String packetData = new String(packet.getData());
46-
if (packetData.contains("HTTP/1.0 200 OK"))
49+
if (packetData.startsWith("HTTP/1.0 200 OK") ||
50+
packetData.startsWith("HELLO * HTTP/1.0")) // A version of the Roku is known to send this invalid response.
4751
{
4852
Logger.i("PMS Packet Received");
4953
//Broadcast Received Packet
@@ -63,6 +67,7 @@ protected void onHandleIntent(Intent intent) {
6367
Intent socketBroadcast = new Intent(GDMService.SOCKET_CLOSED);
6468
socketBroadcast.putExtra("ORIGIN", origin);
6569
socketBroadcast.putExtra("class", intent.getSerializableExtra("class"));
70+
socketBroadcast.putExtra(VoiceControlForPlexApplication.Intent.SCAN_TYPE, intent.getStringExtra(VoiceControlForPlexApplication.Intent.SCAN_TYPE));
6671
if(queryText != null) {
6772
socketBroadcast.putExtra("queryText", queryText);
6873
}

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

Lines changed: 12 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public void searchForPlexServers() {
6161
mServiceIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
6262
mServiceIntent.putExtra("ORIGIN", theClass.getSimpleName());
6363
mServiceIntent.putExtra("class", theClass);
64+
mServiceIntent.putExtra(VoiceControlForPlexApplication.Intent.SCAN_TYPE, "server");
6465
context.startService(mServiceIntent);
6566
}
6667

@@ -96,102 +97,37 @@ public void onItemClick(AdapterView<?> parentAdapter, View view, int position, l
9697
});
9798
}
9899

99-
public void getClients() {
100-
getClients(new PlexServer("none"));
101-
}
102-
103-
public void getClients(PlexServer _server) {
100+
public void searchForPlexClients() {
101+
Logger.d("searchForPlexClients()");
104102
if(!VoiceControlForPlexApplication.isWifiConnected(context)) {
105103
VoiceControlForPlexApplication.showNoWifiDialog(context);
106104
return;
107105
}
108-
server = _server;
109-
if(_server.name.equals("none"))
110-
server = gson.fromJson(mPrefs.getString("Server", ""), PlexServer.class);
111-
if(server == null || server.name.equals(context.getResources().getString(R.string.scan_all))) {
112-
scanForClients();
113-
} else {
114-
getClients(new MediaContainer());
115-
}
116-
}
117106

118-
public void getClients(MediaContainer mc) {
119-
PlexServer server = gson.fromJson(mPrefs.getString("Server", ""), PlexServer.class);
120-
if(mc.machineIdentifier != null) {
121-
server.machineIdentifier = mc.machineIdentifier;
122-
SharedPreferences.Editor mPrefsEditor = mPrefs.edit();
123-
mPrefsEditor.putString("Server", gson.toJson(server));
124-
mPrefsEditor.commit();
125-
}
126-
if(searchDialog == null) {
127-
searchDialog = new Dialog(context);
128-
}
107+
searchDialog = new Dialog(context);
129108

130109
searchDialog.setContentView(R.layout.search_popup);
131-
searchDialog.setTitle("Searching for Plex Clients");
110+
searchDialog.setTitle(context.getResources().getString(R.string.searching_for_plex_clients));
132111

133112
searchDialog.show();
134-
PlexHttpClient.get(server, "/clients", new PlexHttpMediaContainerHandler() {
135-
@Override
136-
public void onSuccess(MediaContainer clientMC) {
137-
// Exclude non-Plex Home Theater clients (pre 1.0.7)
138-
Map<String, PlexClient> clients = new HashMap<String, PlexClient>();
139-
for (int i = 0; i < clientMC.clients.size(); i++) {
140-
if (!VoiceControlForPlexApplication.isVersionLessThan(clientMC.clients.get(i).version, VoiceControlForPlexApplication.MINIMUM_PHT_VERSION) || !clientMC.clients.get(i).product.equals("Plex Home Theater")) {
141-
clients.put(clientMC.clients.get(i).name, clientMC.clients.get(i));
142-
}
143-
}
144113

145-
searchDialog.dismiss();
146-
if (clients.size() == 0) {
147-
AlertDialog.Builder builder = new AlertDialog.Builder(context);
148-
builder.setTitle("No Plex Clients Found");
149-
builder.setCancelable(false)
150-
.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {
151-
public void onClick(DialogInterface dialog, int id) {
152-
dialog.cancel();
153-
}
154-
});
155-
AlertDialog d = builder.create();
156-
d.show();
157-
} else {
158-
Logger.d("Clients: " + clients.size());
159-
SharedPreferences.Editor mPrefsEditor = mPrefs.edit();
160-
mPrefsEditor.putString(Preferences.SAVED_CLIENTS, gson.toJson(clients));
161-
mPrefsEditor.commit();
162-
showPlexClients(clients);
163-
}
164-
}
165-
166-
@Override
167-
public void onFailure(Throwable error) {
168-
searchDialog.dismiss();
169-
feedback.e(context.getResources().getString(R.string.got_error), error.getMessage());
170-
}
171-
});
172-
}
173-
174-
public void scanForClients() {
175-
if(searchDialog == null) {
176-
searchDialog = new Dialog(context);
177-
}
178-
179-
searchDialog.setContentView(R.layout.search_popup);
180-
searchDialog.setTitle("Searching for Plex Clients");
181-
182-
searchDialog.show();
183114
Intent mServiceIntent = new Intent(context, GDMService.class);
184-
mServiceIntent.putExtra("ORIGIN", "ScanForClients");
115+
mServiceIntent.putExtra("port", 32412); // Port for clients
116+
mServiceIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
117+
mServiceIntent.putExtra("ORIGIN", theClass.getSimpleName());
185118
mServiceIntent.putExtra("class", theClass);
119+
mServiceIntent.putExtra(VoiceControlForPlexApplication.Intent.SCAN_TYPE, "client");
186120
context.startService(mServiceIntent);
187121
}
188122

189123
public void showPlexClients(Map<String, PlexClient> clients) {
124+
if(searchDialog != null)
125+
searchDialog.dismiss();
190126
if(serverSelectDialog == null) {
191127
serverSelectDialog = new Dialog(context);
192128
}
193129
serverSelectDialog.setContentView(R.layout.server_select);
194-
serverSelectDialog.setTitle("Select a Plex Client");
130+
serverSelectDialog.setTitle(R.string.select_plex_client);
195131
serverSelectDialog.show();
196132

197133
final ListView serverListView = (ListView)serverSelectDialog.findViewById(R.id.serverListView);

0 commit comments

Comments
 (0)