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