/*
|
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 <https://www.gnu.org/licenses/>.
|
*/
|
|
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<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 ");
|
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;
|
}
|
}
|
}
|