App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2025-03-25 d38b2158e0c48558188caa4b05fc99b24146a4eb
Option Abspielen mit Untertitel-Datei hinzugefuegt
3 files added
1 files modified
62 ■■■■ changed files
resources/calypso.properties 4 ●●●● patch | view | raw | blame | history
resources/skripte/pause 3 ●●●●● patch | view | raw | blame | history
resources/skripte/seek 4 ●●●● patch | view | raw | blame | history
src/de/uhilger/calypso/actor/PlayActor.java 51 ●●●● patch | view | raw | blame | history
resources/calypso.properties
New file
@@ -0,0 +1,4 @@
port=9090
player=mpv
ctx=/calypso
skripte=conf/skripte
resources/skripte/pause
New file
@@ -0,0 +1,3 @@
#!/bin/sh
echo '{"command": ["cycle", "pause"]}' | socat - /tmp/mpvsocket
resources/skripte/seek
New file
@@ -0,0 +1,4 @@
#!/bin/sh
echo '{"command": ["seek", '$1']}' | socat - /tmp/mpvsocket
src/de/uhilger/calypso/actor/PlayActor.java
@@ -20,8 +20,8 @@
import de.uhilger.calypso.MeldeThread;
import de.uhilger.calypso.Rueckmelder;
import de.uhilger.calypso.http.Server;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -44,25 +44,58 @@
public class PlayActor {
  public Process run(Map parameter) {
    Logger logger = Logger.getLogger(PlayActor.class.getName());
    String meldeUrlStr = null;
    Object o = parameter.get("r");
    if (o instanceof String) {
      meldeUrlStr = (String) o;
    }
    StringBuilder kommando = new StringBuilder();
    //StringBuilder kommando = new StringBuilder();
    ArrayList<String> kommando = new ArrayList<>();
    o = parameter.get("titel");
    if (o instanceof String) {
      String titel = (String) o;
      kommando.append("mpv --input-ipc-server=/tmp/mpvsocket --no-terminal --no-sub ");
      if (titel.toLowerCase().endsWith(".mp3")) {
        kommando.append("--vo=null ");
      //kommando.append("mpv --input-ipc-server=/tmp/mpvsocket --no-terminal --no-sub ");
      kommando.add("mpv");
      kommando.add("--input-ipc-server=/tmp/mpvsocket");
      kommando.add("--no-terminal");
      /*
        wenn eine Untertitel-Datei verwendet werden soll, kommt von Tango
        &sub=on im Abspiel-URL zu Calypso.
        Calypso muss das umsetzen zu --sub-file=[Name des Videos mit Endung .srt],
        was voraussetzt, dass die gewuenschten Untertitel auf dem Server stets
        in einer Datei vorliegen, die so heisst wie das Video und die Endung .srt hat.
        Kommt von Tango der Abspiel-URL ohne den Zusatz &sub=on, muss stattdessen
        die Untertitel-Anzeige von mpv ausgeschaltet werden, damit nicht unkontrolliert
        irgendwelche Untertitel ausgegeben werden. Der Parameter fuer mpv lautet
        dann --no-sub
      */
      if(parameter.get("sub") != null) {
        StringBuilder subFileStr = new StringBuilder();
        logger.log(Level.FINEST, "titel: {0}", titel);
        subFileStr.append("--sub-file=");
        subFileStr.append(titel.substring(0, titel.lastIndexOf(".")));
        subFileStr.append(".srt");
        kommando.add(subFileStr.toString());
        logger.log(Level.FINEST, "subFileStr: {0}", subFileStr.toString());
      } else {
        kommando.add("--no-sub");
      }
      kommando.append(titel);
      Logger.getLogger(PlayActor.class.getName()).log(Level.FINE, kommando.toString());
      if (titel.toLowerCase().endsWith(".mp3")) {
        //kommando.append("--vo=null ");
        kommando.add("--vo=null");
      }
      //kommando.append(titel);
      kommando.add(titel);
      logger.log(Level.FINE, kommando.toString());
      Process player_process;
      try {
        player_process = Runtime.getRuntime().exec(kommando.toString());
        player_process = Runtime.getRuntime().exec(kommando.toArray(String[]::new));
        if (meldeUrlStr != null) {
          MeldeThread mt = new MeldeThread();
          mt.setProcess(player_process);
@@ -72,7 +105,7 @@
        }
        return player_process;
      } catch (IOException ex) {
        Logger logger = Logger.getLogger(PlayActor.class.getName());
        logger = Logger.getLogger(PlayActor.class.getName());
        logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
        ex.printStackTrace();
        return null;