/*
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;
}
}
}