App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2021-03-29 cfe3676d7c9667824c52bb5e5c782d4a9a89b672
VLCPlayer hinzugefuegt
7 files modified
2 files added
277 ■■■■ changed files
src/de/uhilger/avdirektor/App.java 29 ●●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/Server.java 3 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/AbstractHandler.java 3 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/CmdHandler.java 3 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/OMXPlayer.java 53 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/PlayHandler.java 3 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/Player.java 77 ●●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/SeekHandler.java 3 ●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/handler/VLCPlayer.java 103 ●●●●● patch | view | raw | blame | history
src/de/uhilger/avdirektor/App.java
@@ -18,6 +18,9 @@
package de.uhilger.avdirektor;
import de.uhilger.avdirektor.handler.OMXPlayer;
import de.uhilger.avdirektor.handler.Player;
import de.uhilger.avdirektor.handler.VLCPlayer;
import java.io.IOException;
import java.util.HashMap;
import java.util.logging.Level;
@@ -45,9 +48,15 @@
  public static final String IP_PORT = "port";
  public static final String IP_WWW_DATA = "www-data";
  public static final String IP_NFS_PREFIX = "nfs-prefix";
  public static final String IP_PLAYER = "player";
  public static final String VLC_PLAYER = "vlc";
  public static final String OMX_PLAYER = "omx";
  
  private static HashMap initParams;  
  private static Process playerproc;
  private static Player player;
  
  /**
   * @param args the command line arguments
@@ -59,6 +68,15 @@
      initParams.put(argParts[0], argParts[1]);
    }
        
    String playerType = getInitParameter(IP_PLAYER);
    switch(playerType) {
      case VLC_PLAYER:
        player = new VLCPlayer();
        break;
      case OMX_PLAYER:
        player = new OMXPlayer();
        break;
    }
    Server server = new Server(Integer.parseInt(getInitParameter(IP_PORT)));
    try {
      server.start();
@@ -87,4 +105,15 @@
  public static void setPlayerProcess(Process p) {
    playerproc = p;
  }
  public static Player getPlayer() {
    return player;
  }
  public static void setPlayer(Player pl) {
    player = pl;
  }
}
src/de/uhilger/avdirektor/Server.java
@@ -24,8 +24,10 @@
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.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;
@@ -38,7 +40,6 @@
public class Server {
  
  private static final Logger logger = Logger.getLogger(Server.class.getName());
  
  private int port;
  
src/de/uhilger/avdirektor/handler/AbstractHandler.java
@@ -32,7 +32,7 @@
 *
 * @author ulrich
 */
public abstract class AbstractHandler extends OMXPlayer implements HttpHandler {
public abstract class AbstractHandler implements HttpHandler {
  private static final Logger logger = Logger.getLogger(AbstractHandler.class.getName());
  
@@ -120,6 +120,5 @@
    buf.append(antwort);
    return buf.toString();
  }
  
}
src/de/uhilger/avdirektor/handler/CmdHandler.java
@@ -19,6 +19,7 @@
package de.uhilger.avdirektor.handler;
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.avdirektor.App;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -35,7 +36,7 @@
  }
  
  protected String process(HttpExchange t, String params) {
    String antwort = this.kommando(cmd);
    String antwort = App.getPlayer().kommando(cmd);
    logger.log(Level.FINE, antwort);
    return antwort;
  }
src/de/uhilger/avdirektor/handler/OMXPlayer.java
@@ -41,42 +41,38 @@
 *
 * @author ulrich
 */
public abstract class OMXPlayer implements ProzessLauscher {
public class OMXPlayer implements Player , ProzessLauscher {
  
  private static final Logger logger = Logger.getLogger(OMXPlayer.class.getName());
  
  public static final String CMD_STOP = "q";
  public static final String BLANK = " ";
  public static final String CMD_DEC_SPEED = "1";
  public static final String CMD_INC_SPEED = "2";
  public static final String CMD_PREV_AUDIO = "j";
  public static final String CMD_NEXT_AUDIO = "k";
  public static final String CMD_PREV_CHAPTER = "i";
  public static final String CMD_NEXT_CHAPTER = "o";
  public static final String CMD_PREV_SUB = "n";
  public static final String CMD_NEXT_SUB = "m";
  public static final String CMD_TOGGLE_SUB = "s";
  public static final String CMD_PAUSE_RESUME = "p";
  public static final String CMD_DEC_VOL = "-";
  public static final String CMD_INC_SPEED = "2";
  public static final String CMD_INC_VOL = "+";
  public static final String PFEIL_LINKS = "5b44";
  public static final String PFEIL_RECHTS = "5b43";
  public static final String PFEIL_HERAUF = "5b41";
  public static final String PFEIL_HERUNTER = "5b42";
  public static final String SP_RUECK_30 = "rueck30";
  public static final String SP_VOR_30 = "rueck30";
  public static final String SP_VOR_600 = "vor600";
  public static final String SP_RUECK_600 = "rueck600";
  public static final String OPT_LOCAL_AUDIO = "-o%20local";
  public static final String OPT_HDMI_AUDIO = "-o%20hdmi";
  public static final String CMD_NEXT_AUDIO = "k";
  public static final String CMD_NEXT_CHAPTER = "o";
  public static final String CMD_NEXT_SUB = "m";
  public static final String CMD_PAUSE_RESUME = "p";
  public static final String CMD_PREV_AUDIO = "j";
  public static final String CMD_PREV_CHAPTER = "i";
  public static final String CMD_PREV_SUB = "n";
  public static final String CMD_STOP = "q";
  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_SEEK = "seek";
  public static final String F_PING = "ping";
  public static final String OPT_HDMI_AUDIO = "-o%20hdmi";
  public static final String OPT_LOCAL_AUDIO = "-o%20local";
  public static final String PFEIL_HERAUF = "5b41";
  public static final String PFEIL_HERUNTER = "5b42";
  public static final String PFEIL_LINKS = "5b44";
  public static final String PFEIL_RECHTS = "5b43";
  public static final String SP_RUECK_30 = "rueck30";
  public static final String SP_RUECK_600 = "rueck600";
  public static final String SP_VOR_30 = "rueck30";
  public static final String SP_VOR_600 = "vor600";
  public static final String BLANK = " ";
  /**
   * Einen Prozess zum Abspielen mit dem omxplayer starten
@@ -114,6 +110,7 @@
  }
  */
  
  @Override
  public String abspielen(String urlStr, String parameter, String meldeUrlStr, String token) {
    String antwort;// = null;
    try {
@@ -183,6 +180,7 @@
   *
   * @return die Antwort des Servers
   */
  @Override
  public String tilgen() {
    String antwort; // = null;
    try {
@@ -212,6 +210,7 @@
   * <a href="https://github.com/huceke/omxplayer/blob/master/README.md" target="_blank">Liste der Kommandos</a>
   * @return die Antwort des Servers
   */
  @Override
  public String kommando(String k) {
    String antwort; // = null;
    try {
src/de/uhilger/avdirektor/handler/PlayHandler.java
@@ -19,6 +19,7 @@
package de.uhilger.avdirektor.handler;
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.avdirektor.App;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -52,7 +53,7 @@
  @Override
  protected String process(HttpExchange t, String params) {
    String antwort = abspielen(
    String antwort = App.getPlayer().abspielen(
            getParam(map, "titel"), params, getParam(map, "r"), "1");    
    logger.log(Level.FINE, antwort);
    return antwort;
src/de/uhilger/avdirektor/handler/Player.java
New file
@@ -0,0 +1,77 @@
/*
 * 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 de.uhilger.avdirektor.ProzessLauscher;
/**
 *
 * @author ulrich
 */
public interface Player extends ProzessLauscher {
  /**
   * 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);
  }
   */
  String abspielen(String urlStr, String parameter, String meldeUrlStr, String token);
  /**
   * Dem laufenden Abspielprozess ein Kommando uebermitteln
   * @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
   */
  String kommando(String k);
  /* ------ Implementierung ProzessLauscher ----------------- */
  void prozessBeendet(String meldeUrlStr);
  /**
   * Einen eventuell laufenden Abspielprozess beenden und den
   * Servlet-Kontext bereinigen.Diese Methode kann auch verwendet werden, wenn es beim normalen
  Abspielen zu Fehlern kommt und womoeglich der Servlet-Kontext noch
  eine Referenz zu einem Abspielprozess enthaelt, die nicht mehr
  aktuell ist.
   *
   * Mit der Methode tilgen kann man eine solche Referenz
  entfernen und gibt so das Objekt wieder frei fuer die Ausfuehrung
  weiterer Kommandos.
   *
   * @return die Antwort des Servers
   */
  String tilgen();
}
src/de/uhilger/avdirektor/handler/SeekHandler.java
@@ -19,6 +19,7 @@
package de.uhilger.avdirektor.handler;
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.avdirektor.App;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -36,7 +37,7 @@
  @Override
  protected String process(HttpExchange t, String params) {
    String antwort = abspielen(
    String antwort = App.getPlayer().abspielen(
            getParam(map, "titel"), params, getParam(map, "r"), "1");    
    logger.log(Level.FINE, antwort);
    return antwort;
src/de/uhilger/avdirektor/handler/VLCPlayer.java
New file
@@ -0,0 +1,103 @@
/*
 * 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 de.uhilger.avdirektor.App;
import de.uhilger.avdirektor.MeldeThread;
import static de.uhilger.avdirektor.handler.OMXPlayer.BLANK;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author ulrich
 */
public class VLCPlayer implements Player {
  private static final Logger logger = Logger.getLogger(VLCPlayer.class.getName());
  @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("vlc --fullscreen ");
      /*
      if(parameter != null) {
        kommando.append(parameter);
        kommando.append(BLANK);
      }
      */
      if(urlStr.startsWith("http")) {
        kommando.append(urlStr.replace(" ", "%20"));
        kommando.append("?t=");
        kommando.append(token);
      } 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);
      }
      logger.log(Level.FINE, "kommando: {0}", kommando.toString());
      Process player_process = Runtime.getRuntime().exec(kommando.toString());
      if(meldeUrlStr != null) {
        MeldeThread mt = new MeldeThread();
        mt.setProcess(player_process);
        mt.lauscherHinzufuegen(this);
        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) {
      antwort = "Fehler: " + ex.getMessage();
    }
    return antwort;
  }
  @Override
  public String kommando(String k) {
    if(k.equalsIgnoreCase(OMXPlayer.CMD_STOP)) {
      Process p = App.getPlayerProcess();
      p.destroy();
      App.setPlayerProcess(null);
    }
    String antwort = "Kommando '" + k + "' ausgefuehrt.";
    return antwort;
  }
  @Override
  public void prozessBeendet(String meldeUrlStr) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }
  @Override
  public String tilgen() {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  }
}