App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
undisclosed
2023-01-08 929228226e08e352769810f729f0e9644a781bec
commit | author | age
929228 1 /*
U 2     Calypso - Media Player Remote Control via HTTP for Raspberry Pi
3     Copyright (C) 2021-2023  Ulrich Hilger
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 */
18
19 package de.uhilger.calypso.neu.actor;
20
21 import de.uhilger.calypso.neu.MeldeThread;
22 import de.uhilger.calypso.neu.Rueckmelder;
23 import de.uhilger.calypso.neu.http.Server;
24 import java.io.IOException;
25 import java.util.Map;
26 import java.util.logging.Level;
27 import java.util.logging.Logger;
28
29 /**
30  * Der PlayActor loest das Abspielen eines Titels aus. 
31  * 
32  * Das koennte auch als Shell-Skript geschehen, aber abhaengig 
33  * vom verwendeten Abspielprogramm benoetigt man das Prozessobjekt 
34  * des laufenden Abspielprozesses im Verlauf des Abspielens noch, um 
35  * weitere Kommandos zu senden.
36  * 
37  * Beim Abspieler mpv werden Kommandos allerdings ueber Unix Domain 
38  * Sockets gesendet, hierfuer waere also das Objekt des laufenden 
39  * Abspielprozesses nicht noetig. Man benoetigt es aber auch um 
40  * festzustellen, ob der Abspielprozess beendet ist.
41  * 
42  * @author Ulrich Hilger
43  */
44 public class PlayActor {
45
46   public Process run(Map parameter) {
47     String meldeUrlStr = null;
48     Object o = parameter.get("r");
49     if (o instanceof String) {
50       meldeUrlStr = (String) o;
51     }
52
53     StringBuilder kommando = new StringBuilder();
54     o = parameter.get("titel");
55     if (o instanceof String) {
56       String titel = (String) o;
57       if (titel.toLowerCase().endsWith(".mp3")) {
58         kommando.append("mpv --input-ipc-server=/tmp/mpvsocket --no-terminal --vo=null ");
59       } else {
60         kommando.append("mpv --input-ipc-server=/tmp/mpvsocket --no-terminal ");
61       }
62       kommando.append(Server.BLANK);
63       kommando.append(titel);
64       Logger.getLogger(PlayActor.class.getName()).log(Level.FINE, kommando.toString());
65       Process player_process;
66       try {
67         player_process = Runtime.getRuntime().exec(kommando.toString());
68         if (meldeUrlStr != null) {
69           MeldeThread mt = new MeldeThread();
70           mt.setProcess(player_process);
71           mt.lauscherHinzufuegen(new Rueckmelder());
72           mt.setMeldeUrl(meldeUrlStr);
73           mt.start();
74         }
75         return player_process;
76       } catch (IOException ex) {
77         Logger logger = Logger.getLogger(PlayActor.class.getName());
78         logger.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
79         ex.printStackTrace();
80         return null;
81       }
82     } else {
83       Logger.getLogger(PlayActor.class.getName()).log(Level.INFO, "Titel fehlt");
84       return null;
85     }
86   }
87 }