/* Calypso - Media Player Remote Control via HTTP for Raspberry Pi Copyright (C) 2021-2023 Ulrich Hilger This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.calypso.actor; import de.uhilger.calypso.MeldeThread; import de.uhilger.calypso.Rueckmelder; import java.io.IOException; import java.util.ArrayList; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; /** * Der PlayActor loest das Abspielen eines Titels aus. * * Das koennte auch als Shell-Skript geschehen, aber abhaengig * vom verwendeten Abspielprogramm benoetigt man das Prozessobjekt * des laufenden Abspielprozesses im Verlauf des Abspielens noch, um * weitere Kommandos zu senden. * * Beim Abspieler mpv werden Kommandos allerdings ueber Unix Domain * Sockets gesendet, hierfuer waere also das Objekt des laufenden * Abspielprozesses nicht noetig. Man benoetigt es aber auch um * festzustellen, ob der Abspielprozess beendet ist. * * @author Ulrich Hilger */ 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(); ArrayList 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 "); 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"); } 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.toArray(String[]::new)); if (meldeUrlStr != null) { MeldeThread mt = new MeldeThread(); mt.setProcess(player_process); mt.lauscherHinzufuegen(new Rueckmelder()); mt.setMeldeUrl(meldeUrlStr); mt.start(); } return player_process; } catch (IOException ex) { logger = Logger.getLogger(PlayActor.class.getName()); logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex); ex.printStackTrace(); return null; } } else { Logger.getLogger(PlayActor.class.getName()).log(Level.INFO, "Titel fehlt"); return null; } } }