App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2021-03-22 a7f0a18275d394ff92e44fcce55a511a54535787
Play/Stop erste fertige Fassung
4 files modified
125 ■■■■ changed files
src/de/uhilger/avdirektor/App.java 8 ●●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/CmdHandler.java 2 ●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/OMXPlayer.java 82 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/PlayHandler.java 33 ●●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/App.java
@@ -48,6 +48,8 @@
  
  private static HashMap initParams;
  
  private static Process playerproc;
  /**
   * @param args the command line arguments
   */
@@ -83,5 +85,11 @@
    return param;
  } 
  
  public static Process getPlayerProcess() {
    return playerproc;
  }
  
  public static void setPlayerProcess(Process p) {
    playerproc = p;
  }
}
src/de/uhilger/avdirektor/handler/CmdHandler.java
@@ -30,7 +30,7 @@
    logger.log(Level.FINE, "RequestURI: {0}", t.getRequestURI().toString());
    Map map = getQueryMap(t);
    
    String antwort = this.kommando(t, cmd);
    String antwort = this.kommando(cmd);
    logger.log(Level.FINE, antwort);
    
    String response = getResponseString(map, "cmd", antwort);
src/de/uhilger/avdirektor/handler/OMXPlayer.java
@@ -39,15 +39,50 @@
    }
  }
  
  /*
    bei etwas wie
    http://rpi4-az:9090/avd/play?t=/Filme/S/sound_city.m4v&p=--timeout=60%20--threshold=60
    sind = nicht nur nach dem Query-Parameter sondern auch in dessen Wert
    also erstmal nach & zerlegen:
    t=/Filme/S/sound_city.m4v
    p=--timeout=60%20--threshold=60
    dann die Position beim ersten = von links abschneiden
  */
  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.info("qPart: " + qPart);
        logger.finer("qPart: " + qPart);
        String pParts[] = qPart.split("=");
        map.put(pParts[0], pParts[1]);
        logger.finer("pParts[0]: " + pParts[0] + ", pParts[1]: " + pParts[1]);
        /*
        if(qPart.contains(" ")) {
          String pParts[] = qPart.split(" ");
          for(String pPart : pParts) {
            String ppParts[] = pPart.split("=");
            map.put(ppParts[0], ppParts[1]);
            logger.finer("ppParts[0]: " + ppParts[0] + ", ppParts[1]: " + ppParts[1]);
          }
        } else {
          String pParts[] = qPart.split("=");
          map.put(pParts[0], pParts[1]);
          logger.finer("pParts[0]: " + pParts[0] + ", pParts[1]: " + pParts[1]);
        }
        */
        /*
        String pParts[] = qPart.split("=");
        for(String pPart : pParts) {
          logger.finer("pPart: " + pPart);
        }
        */
      }
    }
    return map;
@@ -78,12 +113,12 @@
   * @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);
  }
  
  /**
@@ -99,16 +134,17 @@
   * @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) {
@@ -147,7 +183,8 @@
        mt.start();
      }
      //servletContext.setAttribute(App.PI_PLAYER, player_process);
      t.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;
    }
@@ -171,16 +208,18 @@
   * @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.";
      }
@@ -199,25 +238,28 @@
   * <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.";
src/de/uhilger/avdirektor/handler/PlayHandler.java
@@ -52,13 +52,40 @@
  
  private static final Logger logger = Logger.getLogger(PlayHandler.class.getName());
  /*
  rpi4-az:9090/avd/play?titel=/Filme/S/sound_city.m4v&to=60&ti=60&o=local
    OMXPlayer.abspielenMitParameternUndRueckmeldung(
      String urlStr, String parameter, String meldeUrlStr, String token)
    Parameter des Aufrufs play als query
    ?titel=/Filme/S/sound_city.m4v
    &ti=60
    &th=60
    &o=local|hdmi|both
    &r=http://uhilger.de/mc/api/usw
    r muss ganz wegbleiben, wenn keine Rueckmeldung gewuescht ist
  */
  @Override
  public void handle(HttpExchange t) throws IOException {
    logger.log(Level.FINE, "RequestURI: {0}", t.getRequestURI().toString());
    Map map = getQueryMap(t);
    
    String antwort = abspielenMitParameternUndRueckmeldung(t,
            getParam(map, "t"), getParam(map, "p"), getParam(map, "r"), "1");
    Map map = getQueryMap(t);
    StringBuilder params = new StringBuilder();
    params.append("-o ");
    params.append(getParam(map, "o"));
    params.append(" --threshold ");
    params.append(getParam(map, "th"));
    params.append(" --timeout ");
    params.append(getParam(map, "ti"));
    String antwort = abspielenMitParameternUndRueckmeldung(
            getParam(map, "titel"), params.toString(), getParam(map, "r"), "1");
    
    String response = getResponseString(map, "play", antwort);
    t.sendResponseHeaders(200, response.length());