mirror of
https://github.com/moparisthebest/rcrdit
synced 2024-12-22 07:18:56 -05:00
Start of web application, getSchedule rest method works
This commit is contained in:
parent
b293263462
commit
c454eb713f
10
pom.xml
10
pom.xml
@ -121,6 +121,7 @@
|
|||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
<!-- version here should depend closely to version of slf4j-api above -->
|
<!-- version here should depend closely to version of slf4j-api above -->
|
||||||
<version>1.1.2</version>
|
<version>1.1.2</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.janino</groupId>
|
<groupId>org.codehaus.janino</groupId>
|
||||||
@ -129,19 +130,22 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- for webservice
|
<!-- for webservice -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.containers</groupId>
|
<groupId>org.glassfish.jersey.containers</groupId>
|
||||||
<artifactId>jersey-container-servlet</artifactId>
|
<artifactId>jersey-container-servlet</artifactId>
|
||||||
<version>${jersey.version}</version>
|
<version>${jersey.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.containers</groupId>
|
<groupId>org.glassfish.jersey.containers</groupId>
|
||||||
<artifactId>jersey-container-grizzly2-http</artifactId>
|
<artifactId>jersey-container-grizzly2-http</artifactId>
|
||||||
<version>${jersey.version}</version>
|
<version>${jersey.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
-->
|
<dependency>
|
||||||
|
<groupId>org.glassfish.jersey.media</groupId>
|
||||||
|
<artifactId>jersey-media-json-jackson</artifactId>
|
||||||
|
<version>${jersey.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
<rcrdit>
|
<rcrdit>
|
||||||
<!-- jdbc database path, sqlite/postgresql/oracle/anything jdbc should work too if proper libraries are available -->
|
<!-- jdbc database path, sqlite/postgresql/oracle/anything jdbc should work too if proper libraries are available -->
|
||||||
<databaseUrl>jdbc:mysql://localhost:3306/rcrdit?user=rcrdit&password=rcrdit</databaseUrl>
|
<databaseUrl>jdbc:mysql://localhost:3306/rcrdit?user=rcrdit&password=rcrdit</databaseUrl>
|
||||||
|
<!-- server uri (context path and port) for web application -->
|
||||||
|
<serverUri>http://localhost:8080/rcrdit/</serverUri>
|
||||||
<!-- path to xmltv.xml file normally generated by xmltv scripts from schedulesdirect or http://zap2xml.awardspace.info/ -->
|
<!-- path to xmltv.xml file normally generated by xmltv scripts from schedulesdirect or http://zap2xml.awardspace.info/ -->
|
||||||
<xmltvPath>/etc/xmltv.xml</xmltvPath>
|
<xmltvPath>/etc/xmltv.xml</xmltvPath>
|
||||||
<!-- all channels you recieve, one of the names from each channel from xmltv.xml above -->
|
<!-- all channels you recieve, one of the names from each channel from xmltv.xml above -->
|
||||||
|
@ -34,14 +34,26 @@ import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
|
|||||||
import net.fortuna.ical4j.model.component.VEvent;
|
import net.fortuna.ical4j.model.component.VEvent;
|
||||||
import net.fortuna.ical4j.model.component.VTimeZone;
|
import net.fortuna.ical4j.model.component.VTimeZone;
|
||||||
import net.fortuna.ical4j.model.property.*;
|
import net.fortuna.ical4j.model.property.*;
|
||||||
|
import org.glassfish.grizzly.http.server.CLStaticHttpHandler;
|
||||||
|
import org.glassfish.grizzly.http.server.HttpServer;
|
||||||
|
import org.glassfish.grizzly.http.server.StaticHttpHandler;
|
||||||
|
import org.glassfish.grizzly.http.server.StaticHttpHandlerBase;
|
||||||
|
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
|
||||||
|
import org.glassfish.jersey.server.ResourceConfig;
|
||||||
import org.moparscape.xml.impl.AbstractXmlElement;
|
import org.moparscape.xml.impl.AbstractXmlElement;
|
||||||
import org.moparscape.xml.impl.XmlElement;
|
import org.moparscape.xml.impl.XmlElement;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.ws.rs.ApplicationPath;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
import java.net.URI;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@ -58,7 +70,9 @@ import java.util.stream.Collectors;
|
|||||||
/**
|
/**
|
||||||
* Created by mopar on 2/16/17.
|
* Created by mopar on 2/16/17.
|
||||||
*/
|
*/
|
||||||
public class RcrdIt implements AutoCloseable {
|
@ApplicationPath("rest")
|
||||||
|
@Path("")
|
||||||
|
public class RcrdIt extends ResourceConfig implements AutoCloseable {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(RcrdIt.class);
|
private static final Logger log = LoggerFactory.getLogger(RcrdIt.class);
|
||||||
|
|
||||||
@ -74,10 +88,20 @@ public class RcrdIt implements AutoCloseable {
|
|||||||
private final List<AutoRec> autoRecs = new ArrayList<>();
|
private final List<AutoRec> autoRecs = new ArrayList<>();
|
||||||
private Tv schedule;
|
private Tv schedule;
|
||||||
|
|
||||||
|
private final String serverUri;
|
||||||
|
|
||||||
|
|
||||||
public RcrdIt(final File cfg) throws Exception {
|
public RcrdIt(final File cfg) throws Exception {
|
||||||
|
register(this);
|
||||||
final XmlElement rcrdit = AbstractXmlElement.getFactory().readFromFile(cfg);
|
final XmlElement rcrdit = AbstractXmlElement.getFactory().readFromFile(cfg);
|
||||||
this.databaseUrl = rcrdit.getChild("databaseUrl").getValue();
|
this.databaseUrl = rcrdit.getChild("databaseUrl").getValue();
|
||||||
|
|
||||||
|
// this needs to end in /
|
||||||
|
String serverUri = rcrdit.getChild("serverUri").getValue();
|
||||||
|
if (!serverUri.endsWith("/"))
|
||||||
|
serverUri += "/";
|
||||||
|
this.serverUri = serverUri;
|
||||||
|
|
||||||
this.xmltvPath = rcrdit.getChild("xmltvPath").getValue();
|
this.xmltvPath = rcrdit.getChild("xmltvPath").getValue();
|
||||||
this.allChannels = Arrays.stream(rcrdit.getChild("channels").getChildren("channel")).map(XmlElement::getValue).collect(Collectors.toSet());
|
this.allChannels = Arrays.stream(rcrdit.getChild("channels").getChildren("channel")).map(XmlElement::getValue).collect(Collectors.toSet());
|
||||||
|
|
||||||
@ -177,8 +201,10 @@ public class RcrdIt implements AutoCloseable {
|
|||||||
startTimers.clear();
|
startTimers.clear();
|
||||||
timer.purge();
|
timer.purge();
|
||||||
|
|
||||||
if (schedule.getPrograms().isEmpty() || autoRecs.isEmpty())
|
if (schedule.getPrograms().isEmpty() || autoRecs.isEmpty()) {
|
||||||
|
log.debug("nothing to import.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final MessageDigest md;
|
final MessageDigest md;
|
||||||
try {
|
try {
|
||||||
@ -390,6 +416,20 @@ public class RcrdIt implements AutoCloseable {
|
|||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("ping")
|
||||||
|
@Produces(MediaType.TEXT_PLAIN)
|
||||||
|
public String ping() {
|
||||||
|
return "pong";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("getSchedule")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public Tv getSchedule() {
|
||||||
|
return schedule;
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
final File cfg;
|
final File cfg;
|
||||||
if (args.length < 1 || !((cfg = new File(args[0])).exists())) {
|
if (args.length < 1 || !((cfg = new File(args[0])).exists())) {
|
||||||
@ -398,13 +438,38 @@ public class RcrdIt implements AutoCloseable {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.debug("rcrdit starting");
|
log.debug("rcrdit starting");
|
||||||
|
|
||||||
final RcrdIt rcrdIt = new RcrdIt(cfg);
|
final RcrdIt rcrdIt = new RcrdIt(cfg);
|
||||||
log.debug("rcrdit started");
|
|
||||||
|
final ApplicationPath ap = RcrdIt.class.getAnnotation(ApplicationPath.class);
|
||||||
|
|
||||||
|
final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(ap == null ? rcrdIt.serverUri : rcrdIt.serverUri + ap.value() + "/"), rcrdIt, false);
|
||||||
|
|
||||||
|
final File webapp = new File("./src/main/webapp/");
|
||||||
|
final StaticHttpHandlerBase staticHttpHandler;
|
||||||
|
|
||||||
|
if (new File(webapp, "index.html").canRead()) {
|
||||||
|
//staticHttpHandler = new CLStaticHttpHandler(new URLClassLoader(new URL[]{webapp.toURI().toURL()}));
|
||||||
|
staticHttpHandler = new StaticHttpHandler(webapp.getAbsolutePath());
|
||||||
|
staticHttpHandler.setFileCacheEnabled(false); // don't cache files, because we are in development?
|
||||||
|
System.out.println("File Caching disabled!");
|
||||||
|
} else {
|
||||||
|
staticHttpHandler = new CLStaticHttpHandler(RcrdIt.class.getClassLoader()); // jar class loader, leave cache enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
server.getServerConfiguration().addHttpHandler(staticHttpHandler,
|
||||||
|
rcrdIt.serverUri.replaceFirst("^[^/]+//[^/]+", "")
|
||||||
|
);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||||
log.debug("Shutdown requested");
|
log.debug("Shutdown requested");
|
||||||
|
server.shutdownNow();
|
||||||
rcrdIt.close();
|
rcrdIt.close();
|
||||||
log.debug("shutdown complete, exiting...");
|
log.debug("shutdown complete, exiting...");
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
}));
|
}));
|
||||||
|
log.debug("rcrdit started");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ public class RecordThread extends Thread {
|
|||||||
// new io from https://thomaswabner.wordpress.com/2007/10/09/fast-stream-copy-using-javanio-channels/
|
// new io from https://thomaswabner.wordpress.com/2007/10/09/fast-stream-copy-using-javanio-channels/
|
||||||
final ByteBuffer buffer = ByteBuffer.allocateDirect(bufferSize);
|
final ByteBuffer buffer = ByteBuffer.allocateDirect(bufferSize);
|
||||||
|
|
||||||
while(running) {
|
while (running) {
|
||||||
try (InputStream is = getInputStream.apply(recording);
|
try (InputStream is = getInputStream.apply(recording);
|
||||||
ReadableByteChannel ic = Channels.newChannel(is);
|
ReadableByteChannel ic = Channels.newChannel(is);
|
||||||
) {
|
) {
|
||||||
|
@ -36,7 +36,9 @@
|
|||||||
<else>
|
<else>
|
||||||
|
|
||||||
<if condition='isNull("logDir")'>
|
<if condition='isNull("logDir")'>
|
||||||
<then><property name="logDir" value="${logFile}" /></then>
|
<then>
|
||||||
|
<property name="logDir" value="${logFile}"/>
|
||||||
|
</then>
|
||||||
</if>
|
</if>
|
||||||
|
|
||||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
@ -44,7 +46,9 @@
|
|||||||
|
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
<!-- rollover daily -->
|
<!-- rollover daily -->
|
||||||
<fileNamePattern>/var/log/${logDir}/archive/%d{yyyy,aux}/%d{MM,aux}/%d{dd,aux}/${logFile}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
|
<fileNamePattern>
|
||||||
|
/var/log/${logDir}/archive/%d{yyyy,aux}/%d{MM,aux}/%d{dd,aux}/${logFile}-%d{yyyy-MM-dd}.%i.log.gz
|
||||||
|
</fileNamePattern>
|
||||||
<timeBasedFileNamingAndTriggeringPolicy
|
<timeBasedFileNamingAndTriggeringPolicy
|
||||||
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||||
<!-- or whenever the file size reaches 50MB -->
|
<!-- or whenever the file size reaches 50MB -->
|
||||||
|
28
src/main/webapp/index.html
Normal file
28
src/main/webapp/index.html
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<!--
|
||||||
|
~ rcrdit records TV programs from TV tuners
|
||||||
|
~ Copyright (C) 2017 Travis Burtrum
|
||||||
|
~
|
||||||
|
~ This program is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU Affero General Public License as
|
||||||
|
~ published by the Free Software Foundation, either version 3 of the
|
||||||
|
~ License, or (at your option) any later version.
|
||||||
|
~
|
||||||
|
~ This program is distributed in the hope that it will be useful,
|
||||||
|
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
~ GNU Affero General Public License for more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU Affero General Public License
|
||||||
|
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Rcrdit</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
hi
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user