App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2021-03-23 852f209e38278342948786f576c5a7a620a0d564
src/de/uhilger/avdirektor/handler/OMXPlayer.java
@@ -1,8 +1,3 @@
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package de.uhilger.avdirektor.handler;
import com.sun.net.httpserver.HttpExchange;
@@ -16,10 +11,19 @@
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * Methoden zur Ausfuehrung des Programmes omxplayer des Raspberry Pi
 * sowie zum Senden von Kommandos an eine laufende Instanz des
 * omxplayer.
 *
 * Die Klasse OMXPlayer stellt als abstrakte Basisklasse ihre Methoden
 * den Handler-Klassen zur Verfuegung.
 *
 * @author ulrich
 */
@@ -27,20 +31,18 @@
  
  private static final Logger logger = Logger.getLogger(OMXPlayer.class.getName());
  
  /**
   * Einen Prozess zum Abspielen mit dem omxplayer starten
   * @param t
   * @param urlStr  URL der Quelle, die abgespielt werden soll
   * @param token
   * @return Antwort des Servers
   */
  public String abspielen(HttpExchange t, String urlStr, String token) {
    return abspielenMitParametern(t, urlStr, null, token);
  public String abspielen(String urlStr, String token) {
    return abspielenMitParametern(urlStr, null, token);
  }
  
  public String abspielenMitRueckmeldung(HttpExchange t, String urlStr, String meldeUrlStr, String token) {
    return abspielenMitParameternUndRueckmeldung(t, urlStr, null, meldeUrlStr, token);
  public String abspielenMitRueckmeldung(String urlStr, String meldeUrlStr, String token) {
    return abspielenMitParameternUndRueckmeldung(urlStr, null, meldeUrlStr, token);
  }
  
  /**
@@ -50,22 +52,22 @@
  <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 t
   * @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(HttpExchange t, String urlStr, String parameter, String token) {
    return abspielenMitParameternUndRueckmeldung(t, urlStr, parameter, null, token);
  public String abspielenMitParametern(String urlStr, String parameter, String token) {
    return abspielenMitParameternUndRueckmeldung(urlStr, parameter, null, token);
  }
  
  public String abspielenMitParameternUndRueckmeldung(HttpExchange t, String urlStr, String parameter, String meldeUrlStr, String token) {
  public String abspielenMitParameternUndRueckmeldung(String urlStr, String parameter, String meldeUrlStr, String token) {
    String antwort;// = null;
    try {
      Object o = t.getAttribute(App.PI_PLAYER);
      //Object o = t.getAttribute(App.PI_PLAYER);
      Process o = App.getPlayerProcess();
      if(o != null) {
        tilgen(t);
        tilgen();
      }
      StringBuilder kommando = new StringBuilder("omxplayer ");
      if(parameter != null) {
@@ -104,6 +106,8 @@
        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;
    }
@@ -124,19 +128,20 @@
 entfernen und gibt so das Objekt wieder frei fuer die Ausfuehrung 
 weiterer Kommandos.
   *
   * @param t
   * @return die Antwort des Servers
   */
  public String tilgen(HttpExchange t) {
  public String tilgen() {
    String antwort; // = null;
    try {
      Object o = t.getAttribute(App.PI_PLAYER);
      //Object o = t.getAttribute(App.PI_PLAYER);
      Process o = App.getPlayerProcess();
      if(o == null) {
        t.setAttribute(App.PI_PLAYER, 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.";
      } else {
        kommando(t, App.CMD_STOP);
        kommando(App.CMD_STOP);
        //t.removeAttribute(PI_PLAYER);
        antwort = "Player gestoppt, Kontext bereinigt.";
      }
@@ -150,30 +155,32 @@
  
  /**
   * Dem laufenden Abspielprozess ein Kommando uebermitteln
   * @param t
   * @param k  das Kommando laut 
   * <a href="https://github.com/huceke/omxplayer/blob/master/README.md" target="_blank">Liste der Kommandos</a>
   * @return die Antwort des Servers
   */
  public String kommando(HttpExchange t, String k) {
  public String kommando(String k) {
    String antwort; // = null;
    try {
      Object o = t.getAttribute(App.PI_PLAYER);
      //Object o = t.getAttribute(App.PI_PLAYER);
      Process o = App.getPlayerProcess();
      if(o == null) {
        App.setPlayerProcess(null);
        //servletContext.removeAttribute(PI_PLAYER);
        t.setAttribute(App.PI_PLAYER, null);
        //t.setAttribute(App.PI_PLAYER, null);
        antwort = "Es wird nichts abgespielt dem ein Kommando gesendet werden kann.";
      } else {
        Process player_process = (Process) o;
        Process player_process = o;
        OutputStream os = player_process.getOutputStream();
        Writer out = new BufferedWriter(new OutputStreamWriter(os));
        out.write(k);
        out.flush();
        if(k.equals(App.CMD_STOP)) {
          out.close();
          App.setPlayerProcess(null);
          //player_process.destroy();
          //player_process = null;
          t.setAttribute(App.PI_PLAYER, null);
          //t.setAttribute(App.PI_PLAYER, null);
          //servletContext.removeAttribute(PI_PLAYER);
        }
        antwort = "Kommando '" + k + "' ausgefuehrt.";
@@ -185,6 +192,53 @@
    return antwort;
  }
  
  /* --- --- */
  protected String getParam(Map map, String key) {
    Object o = map.get(key);
    if(o != null) {
      return o.toString();
    } else {
      return null;
    }
  }
  /*
    Den Query-Teil einer URL in die Parameter zerlegen
  */
  protected Map getQueryMap(HttpExchange t) {
    HashMap map = new HashMap();
    String query = t.getRequestURI().getQuery();
    if(query != null && query.length() > 0) {
      String qParts[] = query.split("&");
      for(String qPart : qParts) {
        logger.finer("qPart: " + qPart);
        String pParts[] = qPart.split("=");
        map.put(pParts[0], pParts[1]);
        logger.finer("pParts[0]: " + pParts[0] + ", pParts[1]: " + pParts[1]);
      }
    }
    return map;
  }
  protected String getResponseString(Map map, String cmd, String antwort) {
    Set keys = map.keySet();
    StringBuilder buf = new StringBuilder();
    buf.append(cmd);
    buf.append(System.lineSeparator());
    keys.forEach((Object key) -> {
      buf.append("key: ");
      buf.append(key);
      buf.append(System.lineSeparator());
      buf.append("value: ");
      buf.append(map.get(key));
      buf.append(System.lineSeparator());
      //logger.log(Level.FINE, "key {0} value {1}", new Object[]{key, map.get(key)});
    });
    buf.append(antwort);
    return buf.toString();
  }
  /* ------ Implementierung ProzessLauscher ----------------- */
  
  @Override