App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2021-03-31 94c45ccb52cff4fe8e4fc8b31cef9eb16da80c85
OMXPlayer Log verarbeiten
1 files added
2 files modified
12335 ■■■■■ changed files
omxplayer.log 12161 ●●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/OMXLogLeser.java 149 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/LogHandler.java 25 ●●●●● patch | view | raw | blame | history
omxplayer.log
New file
Diff too large
src/de/uhilger/avdirektor/OMXLogLeser.java
@@ -7,6 +7,13 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
@@ -16,36 +23,132 @@
public class OMXLogLeser {
  
  private static final Logger logger = Logger.getLogger(OMXLogLeser.class.getName());
  public static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  private static final long MILLIS = (long) 1000;
  private static final long MINSEC = (long) 60;
      
  public String lesen(File logfile) throws FileNotFoundException, IOException {
  /**
   *
   * <p>Die Spieldauer laut OMX-Log ergibt sich aus dem Zeitstempel des
   * letzten Eintrags abzueglich des Zeitstempels des
   * ersten Eintrags abzueglich der Pausen</p>
   *
   * <p>Eine Pause ist der Zeitraum vom Zeitstempel eines Eintrags mit
   * <code>Keyboard: character p (0x70)</code> bis zum Zeitstempel des
   * n&auml;chsten Eintrags mit <code>Keyboard: character p</code></p>
   *
   *
   * @param logfile
   * @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 {
    boolean inPause = false;
    logger.info("Starting to parse log..");
    Date parseStart = new Date();
    long lineCount = 0;
    InputStream is = new FileInputStream(logfile);
    BufferedReader r = new BufferedReader(new InputStreamReader(is));
    String firstLine = r.readLine();
    ++lineCount;
    String lastLine = "";
    if(firstLine != null) {
      long size = logfile.length();
      long pos = size - (long) 1000;
      logger.info("Size: " + size + ", Pos: " + pos); // 2.341.930 Bytes
      long skipped = r.skip(pos);
      logger.info("skipped: " + skipped);
      String line = r.readLine();
      while(line != null) {
        lastLine = line;
        logger.info(lastLine);
        line = r.readLine();
    String line = r.readLine();
    Blocks blocks = new Blocks();
    Block currentBlock = new Block();
    while(line != null) {
      ++lineCount;
      if(currentBlock.getStart() == null) {
        currentBlock.setStart(line.substring(0, 8));
      }
      if(line.contains("Keyboard: character p")) {
        if(inPause) {
          currentBlock.setStart(line.substring(0, 8));
        } else {
          currentBlock.setEnd(line.substring(0, 8));
          blocks.add(currentBlock);
          currentBlock = new Block();
        }
        inPause = !inPause;
      }
      lastLine = line;
      line = r.readLine();
    }
    r.close();
    is.close();
    StringBuilder sb = new StringBuilder();
    sb.append("\r\n---");
    sb.append("\r\nfirst line:\r\n");
    sb.append(firstLine);
    sb.append("\r\n\r\nlastLine\r\n");
    sb.append(lastLine);
    String lines = sb.toString();
    logger.info(lines);
    return lines;
    currentBlock.setEnd(lastLine.substring(0, 8));
    blocks.add(currentBlock);
    Date parseEnd = new Date();
    long timeMillis = parseEnd.getTime() - parseStart.getTime();
    long timeSeconds = timeMillis / MILLIS;
    long secMillis = timeSeconds * MILLIS;
    long restMillis = timeMillis - secMillis;
    logger.log(Level.INFO,
            "{0} lines parsed in {1} seconds and {2} milliseconds.",
            new Object[]{lineCount, timeSeconds, restMillis});
    return blocks.getTimeString();
  }
  
  class Block {
    private String start = null;
    private String end = null;
    public long getDuration() throws ParseException {
      Date startDate = sdf.parse(start);
      Date endDate = sdf.parse(end);
      return endDate.getTime() - startDate.getTime();
    }
    public String getStart() {
      return start;
    }
    public void setStart(String start) {
      //logger.log(Level.FINER, "Start: ''{0}''", start);
      this.start = start;
    }
    public String getEnd() {
      return end;
    }
    public void setEnd(String end) {
      //logger.log(Level.FINER, "End: ''{0}''", end);
      this.end = end;
    }
  }
  class Blocks {
    private final List<Block> blocks = new ArrayList();
    public void add(Block block) {
      blocks.add(block);
    }
    public long getDuration() throws ParseException {
      long duration = (long) 0;
      Iterator<Block> i = blocks.iterator();
      while(i.hasNext()) {
        Block b = i.next();
        duration += b.getDuration();
      }
      return duration;
    }
    public String getTimeString() throws ParseException {
      long diff = getDuration();
      long h = diff / MILLIS / MINSEC / MINSEC;
      long hmillis = h * MINSEC * MINSEC  * MILLIS;
      long m = (diff - hmillis) / MILLIS / MINSEC;
      long mmillis = m * MINSEC * MILLIS;
      long s = (diff - hmillis - mmillis) / MILLIS;
      //logger.log(Level.FINER, "{0}:{1}:{2}", new Object[]{h, m, s});
      return h + ":" + m + ":" + s;
    }
  }
}
src/de/uhilger/avdirektor/handler/LogHandler.java
@@ -3,7 +3,10 @@
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.avdirektor.OMXLogLeser;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.text.ParseException;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -14,15 +17,35 @@
public class LogHandler extends AbstractHandler {
  
  private static final Logger logger = Logger.getLogger(LogHandler.class.getName());
  @Override
  public void handle(HttpExchange t) throws IOException {
    logger.log(Level.FINE, "RequestURI: {0}", t.getRequestURI().toString());
    StringBuilder params = buildParams(t);
    String antwort = process(t, params.toString());
    sendResponse(t, cmd, antwort);
  }
  @Override
  protected void sendResponse(HttpExchange t, String cmd, String antwort) throws IOException {
    t.sendResponseHeaders(200, antwort.length());
    OutputStream os = t.getResponseBody();
    os.write(antwort.getBytes());
    os.close();
  }
  @Override
  protected String process(HttpExchange t, String params) {
    OMXLogLeser leser = new OMXLogLeser();
    String lines = "Log nicht lesbar.";
    try {
      lines = leser.lesen(new File("/home/ulrich/work/avd/omxplayer.log"));
      logger.info(new File(".").getAbsolutePath());
      lines = leser.lesen(new File("omxplayer.log"));
    } catch (IOException ex) {
      Logger.getLogger(LogHandler.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ParseException ex) {
      Logger.getLogger(LogHandler.class.getName()).log(Level.SEVERE, null, ex);
    }
    return lines;
  }