Adds the ability to play youtube videos.

It still needs a bit of work, but playing and pausing are operational.
This commit is contained in:
Markil3
2021-08-16 22:42:44 -06:00
parent b546c81fa1
commit ede9132279
23 changed files with 799 additions and 140 deletions

View File

@@ -27,8 +27,16 @@ import java.util.HashMap;
*/
public class BrowserLink extends MessageRunner
{
// private static final Logger logger = LoggerFactory.getLogger(BrowserLink.class);
public static final Gson gson = new Gson();
private static final Logger logger = LoggerFactory.getLogger(BrowserLink.class);
public static final Gson gson;
static
{
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(StackTraceElement.class, new StackTraceElementSerializer());
builder.registerTypeAdapter(Throwable.class, new ThrowableSerializer());
gson = builder.create();
}
/**
* Creates a message runner.
@@ -41,8 +49,12 @@ public class BrowserLink extends MessageRunner
@Override
public byte[] serializeObject(Object message)
{
String val = gson.toJson(message);
return val.getBytes(StandardCharsets.UTF_8);
JsonElement val = gson.toJsonTree(message);
if (val.isJsonObject())
{
((JsonObject) val).addProperty("type", message.getClass().getName());
}
return val.toString().getBytes(StandardCharsets.UTF_8);
}
@Override
@@ -197,6 +209,7 @@ public class BrowserLink extends MessageRunner
try
{
clazz = Class.forName(message.getAsJsonPrimitive("type").getAsString());
message.remove("type");
}
catch (ClassNotFoundException | ClassCastException e)
{

View File

@@ -10,7 +10,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.concurrent.ExecutionException;
@@ -22,23 +21,33 @@ public class Main
public static void main(String[] args) throws IOException, InterruptedException
{
ServerSocket socketSource = null;
Socket socket = null;
MessageHandler interfaceLink;
BrowserLink browserLink;
Thread interfaceThread, browserThread;
Socket socket;
try
{
logger.debug("Connecting to browser");
browserLink = new BrowserLink("BrowserLink");
try
{
logger.debug("Connecting to browser");
browserLink = new BrowserLink("BrowserLink");
logger.debug("Setting up server");
socketSource = new ServerSocket(BrowserConstants.PORT);
logger.debug("Server started");
socket = socketSource.accept();
logger.debug("Setting up connection");
socket = new Socket(BrowserConstants.IP,BrowserConstants.PORT);
logger.debug("Connection established");
interfaceLink = new MessageHandler("InterfaceHandler", socket.getInputStream(), socket.getOutputStream()) {
@Override
protected boolean onRun()
{
if (!socket.isConnected() || socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown())
{
logger.debug("Socket closed, shutting down");
return true;
}
return false;
}
};
logger.debug("Connection received");
interfaceLink = new MessageHandler("InterfaceHandler", socket.getInputStream(), socket.getOutputStream());
/*
* Pretty much just forwards any messages to the browser and
* returns their value.
@@ -64,6 +73,7 @@ public class Main
catch (IOException e)
{
logger.error("Could not initialize socket", e);
browserLink.sendObject("quit");
throw e;
}
}
@@ -75,29 +85,6 @@ public class Main
finally
{
logger.debug("Shutting down interface link");
if (socket != null)
{
try
{
socket.close();
}
catch (IOException e)
{
logger.error("Could not close socket", e);
}
finally
{
logger.debug("Shutting down server");
try
{
socketSource.close();
}
catch (IOException e)
{
logger.error("Could not close server", e);
}
}
}
}
}

View File

@@ -0,0 +1,33 @@
/*
* Copyright (c) 2021 William Hubbard. All Rights Reserved.
*/
package edu.regis.universeplayer.addon;
import com.google.gson.*;
import java.lang.reflect.Type;
public class StackTraceElementSerializer implements JsonSerializer<StackTraceElement>, JsonDeserializer<StackTraceElement>
{
@Override
public JsonElement serialize(StackTraceElement src, Type typeOfSrc, JsonSerializationContext context)
{
JsonObject ob = new JsonObject();
ob.addProperty("loader", src.getClassLoaderName());
ob.addProperty("class", src.getClassName());
ob.addProperty("file", src.getFileName());
ob.addProperty("line", src.getLineNumber());
ob.addProperty("method", src.getMethodName());
ob.addProperty("module", src.getModuleName());
ob.addProperty("version", src.getModuleVersion());
return ob;
}
@Override
public StackTraceElement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
JsonObject ob = json.getAsJsonObject();
return new StackTraceElement(ob.get("loader").getAsString(), ob.get("module").getAsString(), ob.get("version").getAsString(), ob.get("class").getAsString(), ob.get("method").getAsString(), ob.get("file").getAsString(), ob.get("line").getAsInt());
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (c) 2021 William Hubbard. All Rights Reserved.
*/
package edu.regis.universeplayer.addon;
import com.google.gson.*;
import java.lang.reflect.Type;
public class ThrowableSerializer implements JsonSerializer<Throwable>, JsonDeserializer<Throwable>
{
@Override
public JsonElement serialize(Throwable src, Type typeOfSrc, JsonSerializationContext context)
{
JsonObject ob = new JsonObject();
ob.addProperty("message", src.getMessage());
ob.add("cause", context.serialize(src.getCause()));
JsonArray stack = new JsonArray();
for (StackTraceElement trace: src.getStackTrace())
{
stack.add(context.serialize(trace));
}
ob.add("trace", stack);
JsonArray suppressed = new JsonArray();
for (Throwable throwable: src.getSuppressed())
{
suppressed.add(context.serialize(throwable));
}
ob.add("suppressed", suppressed);
return ob;
}
@Override
public Throwable deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
JsonObject ob = json.getAsJsonObject();
Throwable throwable = new Throwable(ob.get("message").getAsString(), context.deserialize(ob.get("cause"), typeOfT));
throwable.initCause(context.deserialize(ob.get("cause"), Throwable.class));
JsonArray traceJson = ob.getAsJsonArray("trace");
StackTraceElement[] trace = new StackTraceElement[traceJson.size()];
for (int i = 0; i < trace.length; i++)
{
trace[i] = context.deserialize(traceJson.get(i), StackTraceElement.class);
}
throwable.setStackTrace(trace);
JsonArray suppressed = ob.getAsJsonArray("suppressed");
for (JsonElement el: suppressed)
{
throwable.addSuppressed(context.deserialize(el, Throwable.class));
}
return throwable;
}
}