From 2dd7a5b331b57db5c7aa5bef9540e3e198848060 Mon Sep 17 00:00:00 2001 From: ulrich Date: Thu, 01 Apr 2021 14:04:54 +0000 Subject: [PATCH] weiterspielen (erste Fassung fertig) --- src/de/uhilger/avdirektor/Server.java | 4 resources/start | 2 src/de/uhilger/avdirektor/handler/PlayHandler.java | 26 ++++-- src/de/uhilger/avdirektor/handler/PlayOnHandler.java | 69 +++++++++++++++++ src/de/uhilger/avdirektor/OMXLogLeser.java | 17 +++ src/de/uhilger/avdirektor/handler/LogHandler.java | 4 src/de/uhilger/avdirektor/handler/OMXPlayer.java | 95 +++++------------------ 7 files changed, 128 insertions(+), 89 deletions(-) diff --git a/resources/start b/resources/start index ebe6946..797764a 100755 --- a/resources/start +++ b/resources/start @@ -1,3 +1,3 @@ #!/bin/sh -java -Djava.util.logging.config.file=logging.properties -jar av-direktor.jar port=9090 nfs-prefix="/media/mc" & +java -Djava.util.logging.config.file=logging.properties -jar av-direktor.jar port=9090 player=omx & diff --git a/src/de/uhilger/avdirektor/OMXLogLeser.java b/src/de/uhilger/avdirektor/OMXLogLeser.java index 4db7bb4..91ff199 100644 --- a/src/de/uhilger/avdirektor/OMXLogLeser.java +++ b/src/de/uhilger/avdirektor/OMXLogLeser.java @@ -29,6 +29,16 @@ private static final long MILLIS = (long) 1000; private static final long MINSEC = (long) 60; + + + public String logDirLesen(File logDir) throws IOException, FileNotFoundException, ParseException { + Blocks blocks = new Blocks(); + File[] files = logDir.listFiles(); + for(File file : files) { + lesen(file, blocks); + } + return blocks.getTimeString(); + } /** * @@ -42,12 +52,13 @@ * * * @param logfile + * @param blocks * @return die Spieldauer als String im Format H:MM:SS * @throws FileNotFoundException * @throws IOException * @throws ParseException */ - public String lesen(File logfile) throws FileNotFoundException, IOException, ParseException { + public void lesen(File logfile, Blocks blocks) throws FileNotFoundException, IOException, ParseException { boolean inPause = false; logger.info("Starting to parse log.."); Date parseStart = new Date(); @@ -58,7 +69,7 @@ ++lineCount; String lastLine = ""; String line = r.readLine(); - Blocks blocks = new Blocks(); + //Blocks blocks = new Blocks(); Block currentBlock = new Block(); while(line != null) { ++lineCount; @@ -88,7 +99,7 @@ logger.log(Level.INFO, "{0} lines parsed in {1} seconds and {2} milliseconds.", new Object[]{lineCount, timeSeconds, restMillis}); - return blocks.getTimeString(); + //return blocks.getTimeString(); } class Block { diff --git a/src/de/uhilger/avdirektor/Server.java b/src/de/uhilger/avdirektor/Server.java index fd02b99..09ea814 100644 --- a/src/de/uhilger/avdirektor/Server.java +++ b/src/de/uhilger/avdirektor/Server.java @@ -25,10 +25,9 @@ import de.uhilger.avdirektor.handler.OMXPlayer; import de.uhilger.avdirektor.handler.PingHandler; import de.uhilger.avdirektor.handler.PlayHandler; -import de.uhilger.avdirektor.handler.Player; +import de.uhilger.avdirektor.handler.PlayOnHandler; import de.uhilger.avdirektor.handler.SeekHandler; import de.uhilger.avdirektor.handler.StopServerHandler; -import de.uhilger.avdirektor.handler.VLCPlayer; import java.io.IOException; import java.util.logging.Logger; import java.net.InetSocketAddress; @@ -63,6 +62,7 @@ server.createContext("/avd/ping", new PingHandler(OMXPlayer.F_PING)); server.createContext("/avd/server/stop", new StopServerHandler()); server.createContext("/avd/log", new LogHandler()); + server.createContext("/avd/playon", new PlayOnHandler(OMXPlayer.F_PLAY)); server.createContext("/avd/ui", new FileHandler(App.getInitParameter(App.IP_WWW_DATA))); //server.setExecutor(null); // creates a default executor server.setExecutor(Executors.newFixedThreadPool(20)); diff --git a/src/de/uhilger/avdirektor/handler/LogHandler.java b/src/de/uhilger/avdirektor/handler/LogHandler.java index b77b5da..02c67ed 100644 --- a/src/de/uhilger/avdirektor/handler/LogHandler.java +++ b/src/de/uhilger/avdirektor/handler/LogHandler.java @@ -37,6 +37,7 @@ @Override protected String process(HttpExchange t, String params) { + /* OMXLogLeser leser = new OMXLogLeser(); String lines = "Log nicht lesbar."; try { @@ -47,7 +48,8 @@ } catch (ParseException ex) { Logger.getLogger(LogHandler.class.getName()).log(Level.SEVERE, null, ex); } - return lines; + */ + return ""; } } diff --git a/src/de/uhilger/avdirektor/handler/OMXPlayer.java b/src/de/uhilger/avdirektor/handler/OMXPlayer.java index 991e12b..d360e13 100644 --- a/src/de/uhilger/avdirektor/handler/OMXPlayer.java +++ b/src/de/uhilger/avdirektor/handler/OMXPlayer.java @@ -22,12 +22,16 @@ import de.uhilger.avdirektor.MeldeThread; import de.uhilger.avdirektor.ProzessLauscher; import java.io.BufferedWriter; +import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.HttpURLConnection; import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -61,6 +65,7 @@ public static final String CMD_TOGGLE_SUB = "s"; public static final String F_PING = "ping"; public static final String F_PLAY = "play"; + public static final String F_PLAY_ON = "playon"; public static final String F_SEEK = "seek"; public static final String OPT_HDMI_AUDIO = "-o%20hdmi"; public static final String OPT_LOCAL_AUDIO = "-o%20local"; @@ -73,81 +78,27 @@ public static final String SP_VOR_30 = "rueck30"; public static final String SP_VOR_600 = "vor600"; - - /** - * Einen Prozess zum Abspielen mit dem omxplayer starten - * @param urlStr URL der Quelle, die abgespielt werden soll - * @param token - * @return Antwort des Servers - */ - /* - public String abspielen(String urlStr, String token) { - return abspielenMitParametern(urlStr, null, token); - } - */ - - /* - public String abspielenMitRueckmeldung(String urlStr, String meldeUrlStr, String token) { - return abspielenMitParameternUndRueckmeldung(urlStr, null, meldeUrlStr, token); - } - */ - - /** - * Einen Prozess zum Abspielen mit dem omxplayer starten - * und Parameter uebergeben.Moegliche Parameter fuer das Abspielen mit dem omxplayer - beschreibt die Seite - <a href="https://github.com/huceke/omxplayer/blob/master/README.md"target="_blank">Aufstellung der Parameter</a>.Die Zeichenkette parameter enthaelt Eintraege wie z.B. - * App.OPT_LOCAL_AUDIO oder App.OPT_HDMI_AUDIO. - Mehrere Parameter werden mit App.BLANK getrennt. - * @param urlStr der URL der Quelle, die abgespielt werden soll - * @param parameter die Parameter, die vom omxplayer angewendet werden sollen - * @param token - * @return Antwort des Servers - */ - /* - public String abspielenMitParametern(String urlStr, String parameter, String token) { - return abspielenMitParameternUndRueckmeldung(urlStr, parameter, null, token); - } - */ - @Override public String abspielen(String urlStr, String parameter, String meldeUrlStr, String token) { String antwort;// = null; try { - //Object o = t.getAttribute(App.PI_PLAYER); Process o = App.getPlayerProcess(); if(o != null) { tilgen(); } - StringBuilder kommando = new StringBuilder("omxplayer "); - if(parameter != null) { - kommando.append(parameter); - kommando.append(BLANK); - } + List<String> kommando = new ArrayList(); + kommando.add("omxplayer"); + kommando.addAll(Arrays.asList(parameter.split(BLANK))); if(urlStr.startsWith("http")) { - kommando.append(urlStr.replace(" ", "%20")); - kommando.append("?t="); - kommando.append(token); + kommando.add(urlStr.replace(" ", "%20")); } else { - /* - //url z.B.: Filme/H/HEAT_D2.m4v - - hier muss noch der Pfad hinzugefuegt werden, unter - dem auf dem raspi die Datenquelle via NFS eingebunden ist, - z.B. /media/mc/ - dieser Teil des Pfades muss in pirc als Init-Parameter oder - etwas aehnliches hinterlegt sein, weil es lokal zum jeweils - verwendeten raspi gehoert - - */ - - String pfad = App.getInitParameter("nfs-prefix"); - kommando.append(pfad); - - kommando.append(urlStr); - } + kommando.add(App.getInitParameter("nfs-prefix") + urlStr); + } + logger.log(Level.FINE, "parameter: {0}", parameter); logger.log(Level.FINE, "kommando: {0}", kommando.toString()); - Process player_process = Runtime.getRuntime().exec(kommando.toString()); + ProcessBuilder pb = new ProcessBuilder(kommando); + pb.directory(new File(System.getProperty("omx.wd"))); + Process player_process = pb.start(); if(meldeUrlStr != null) { MeldeThread mt = new MeldeThread(); mt.setProcess(player_process); @@ -155,10 +106,7 @@ mt.setMeldeUrl(meldeUrlStr); mt.start(); } - //servletContext.setAttribute(App.PI_PLAYER, player_process); - //t.setAttribute(App.PI_PLAYER, player_process); App.setPlayerProcess(player_process); - //Runtime.getRuntime().exec("killall dbus-daemon"); antwort = "Abspielen gestartet, url: " + urlStr; } catch(IOException ex) { @@ -184,16 +132,12 @@ public String tilgen() { String antwort; // = null; try { - //Object o = t.getAttribute(App.PI_PLAYER); Process o = App.getPlayerProcess(); if(o == null) { - //t.setAttribute(App.PI_PLAYER, null); - App.setPlayerProcess(null); - // t.removeAttribute(App.PI_PLAYER); antwort = "Es ist kein Player zum Beenden vorhanden, aber der Servlet-Kontext wurde bereinigt."; + App.setPlayerProcess(null); } else { - kommando(CMD_STOP); - //t.removeAttribute(PI_PLAYER); + kommando(CMD_STOP); // setzt den Prozess der App auf null antwort = "Player gestoppt, Kontext bereinigt."; } } @@ -253,7 +197,10 @@ conn.setRequestMethod("GET"); conn.connect(); int status = conn.getResponseCode(); - logger.log(Level.INFO, "Abspielen beendet, Meldung an {0} mit Statuscode {1} gesendet.", new Object[]{meldeUrlStr, status}); + logger.log(Level.INFO, + "Abspielen beendet, Meldung an {0} mit Statuscode {1} gesendet.", + new Object[]{meldeUrlStr, status}); + App.setPlayerProcess(null); } catch(IOException ex) { logger.log(Level.INFO, ex.getMessage(), ex); } diff --git a/src/de/uhilger/avdirektor/handler/PlayHandler.java b/src/de/uhilger/avdirektor/handler/PlayHandler.java index aa32fcd..ce37932 100644 --- a/src/de/uhilger/avdirektor/handler/PlayHandler.java +++ b/src/de/uhilger/avdirektor/handler/PlayHandler.java @@ -20,8 +20,11 @@ import com.sun.net.httpserver.HttpExchange; import de.uhilger.avdirektor.App; +import java.io.File; +import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; +import org.apache.commons.io.FileUtils; /** * Play @@ -51,14 +54,6 @@ super(cmd); } - @Override - protected String process(HttpExchange t, String params) { - String antwort = App.getPlayer().abspielen( - getParam(map, "titel"), params, getParam(map, "r"), "1"); - logger.log(Level.FINE, antwort); - return antwort; - } - protected StringBuilder buildParams(HttpExchange t) { StringBuilder params = super.buildParams(t); params.append("-b -o "); @@ -74,4 +69,19 @@ return params; } + @Override + protected String process(HttpExchange t, String params) { + if(cmd.equalsIgnoreCase(OMXPlayer.F_PLAY)) { + try { + FileUtils.deleteDirectory(new File(System.getProperty("omx.wd"), "omx-logs")); + } catch (IOException ex) { + logger.log(Level.SEVERE, null, ex); + } + } + String antwort = App.getPlayer().abspielen( + getParam(map, "titel"), params, getParam(map, "r"), "1"); + logger.log(Level.FINE, antwort); + return antwort; + } + } diff --git a/src/de/uhilger/avdirektor/handler/PlayOnHandler.java b/src/de/uhilger/avdirektor/handler/PlayOnHandler.java new file mode 100644 index 0000000..ea6dd8b --- /dev/null +++ b/src/de/uhilger/avdirektor/handler/PlayOnHandler.java @@ -0,0 +1,69 @@ +package de.uhilger.avdirektor.handler; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import de.uhilger.avdirektor.App; +import de.uhilger.avdirektor.OMXLogLeser; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.commons.io.FileUtils; + +/** + * z.B. + * http://rpi4-az:9090/avd/playon?th=1&ti=240&o=local&log=true&titel=http://amd-srv:9090/srv/Filme/C/casino_royale.m4v + * @author ulrich + */ +public class PlayOnHandler extends PlayHandler { + + private static final Logger logger = Logger.getLogger(PlayOnHandler.class.getName()); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd-hh-MM-ss"); + + public PlayOnHandler(String cmd) { + super(cmd); + } + + /* + 1. buildParams + 2. process + */ + + @Override + protected StringBuilder buildParams(HttpExchange t) { + String wd = System.getProperty("omx.wd"); + File targetDir = new File(wd, "omx-logs"); + try { + File logFile = new File(wd, "omxplayer.log"); + Date date = new Date(logFile.lastModified()); + File srcFile = new File(wd, "omxplayer-" + sdf.format(date) + ".log"); + logFile.renameTo(srcFile); + targetDir.mkdirs(); + FileUtils.moveFileToDirectory(srcFile, targetDir, false); + } catch (IOException ex) { + Logger.getLogger(PlayOnHandler.class.getName()).log(Level.SEVERE, null, ex); + } + StringBuilder params = super.buildParams(t); + params.append(" --pos "); + try { + // hier das Ergebnis der Log-Auswertung angeben + params.append(logsLesen(targetDir)); + } catch (IOException ex) { + Logger.getLogger(PlayOnHandler.class.getName()).log(Level.SEVERE, null, ex); + } catch (ParseException ex) { + Logger.getLogger(PlayOnHandler.class.getName()).log(Level.SEVERE, null, ex); + } + return params; + } + + private String logsLesen(File logDir) throws IOException, FileNotFoundException, ParseException { + OMXLogLeser leser = new OMXLogLeser(); + return leser.logDirLesen(logDir); + } + +} -- Gitblit v1.9.3