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:
@@ -20,6 +20,9 @@ plugins {
|
||||
// In this section you declare where to find the dependencies of your project
|
||||
repositories {
|
||||
mavenCentral()
|
||||
flatDir {
|
||||
dirs new File(rootDir, 'libs')
|
||||
}
|
||||
}
|
||||
|
||||
// In this section you declare the dependencies for your production and test code
|
||||
@@ -31,6 +34,8 @@ dependencies {
|
||||
|
||||
implementation 'com.google.code.gson:gson:2.8.7'
|
||||
|
||||
implementation 'net.harawata:appdirs:1.2.1'
|
||||
|
||||
implementation project(":browserCommands")
|
||||
|
||||
// Declare the dependency for your favourite test framework you want to use in your tests.
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -18,5 +18,9 @@
|
||||
<AppenderRef ref="File"/>
|
||||
</Root>
|
||||
<Logger name="edu.regis.universeplayer.browserCommands.MessageRunner" level="trace"/>
|
||||
<Logger name="edu.regis.universeplayer.browserCommands.MessageHandler" level="trace"/>
|
||||
<Logger name="edu.regis.universeplayer.browserCommands.memoryMapping.MemoryRunner" level="trace"/>
|
||||
<Logger name="edu.regis.universeplayer.browserCommands.memoryMapping.MemoryHandler" level="trace"/>
|
||||
<Logger name="edu.regis.universeplayer.addon.BrowserLink" level="trace"/>
|
||||
</Loggers>
|
||||
</Configuration>
|
||||
Reference in New Issue
Block a user