App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2021-04-01 a4b60759904ffdf61558e119e823abe77df6bb5b
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);
    }