2 * $Id: enigma_dyn_movieplayer.cpp,v 1.19 2005/12/23 17:00:08 digi_casi Exp $
4 * (C) 2005 by digi_casi <digi_casi@tuxbox.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #ifdef ENABLE_EXPERT_WEBIF
30 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <sys/ioctl.h>
36 #include <arpa/inet.h>
37 #include <linux/if_ether.h>
43 #include <enigma_main.h>
44 #include <enigma_standby.h>
46 #include <lib/driver/eavswitch.h>
47 #include <lib/dvb/dvb.h>
48 #include <lib/dvb/edvb.h>
49 #include <lib/dvb/epgcache.h>
50 #include <lib/dvb/servicestructure.h>
51 #include <lib/dvb/decoder.h>
52 #include <lib/dvb/dvbservice.h>
53 #include <lib/dvb/service.h>
54 #include <lib/dvb/record.h>
55 #include <lib/dvb/serviceplaylist.h>
57 #include <lib/system/info.h>
58 #include <lib/system/http_dyn.h>
59 #include <lib/system/econfig.h>
60 #include <enigma_dyn.h>
61 #include <enigma_dyn_utils.h>
62 #include <enigma_dyn_movieplayer.h>
63 #include <lib/movieplayer/movieplayer.h>
64 #include <lib/movieplayer/mpconfig.h>
65 #include <configfile.h>
69 eMoviePlayer moviePlayer
;
71 eString
streamingServerSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
73 content
->local_header
["Content-Type"]="text/xml; charset=iso-8859-1";
74 eMoviePlayer::getInstance()->mpconfig
.load();
75 eString result
= readFile("/var/tuxbox/config/movieplayer.xml");
77 result
= readFile(TEMPLATE_DIR
+ "movieplayer.xml");
82 eString
XSLMPSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
84 content
->local_header
["Content-Type"]="text/xml; charset=iso-8859-1";
85 eString result
= readFile(TEMPLATE_DIR
+ "XSLMPSettings.xsl");
86 result
.strReplace("#SERVEREDITBUTTON#", button(100, "Edit", NOCOLOR
, "javascript:editStreamingServerSettings()", "#000000", true));
87 result
.strReplace("#VLCEDITBUTTON#", button(100, "Edit", NOCOLOR
, "javascript:editStreamingServerVLCSettings()", "#000000", true));
92 eString
setStreamingServerSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
94 content
->local_header
["Content-Type"]="text/html; charset=iso-8859-1";
96 std::map
<eString
, eString
> opt
= getRequestOptions(opts
, '&');
98 eMoviePlayer::getInstance()->mpconfig
.load();
99 struct serverConfig server
= eMoviePlayer::getInstance()->mpconfig
.getServerConfig();
101 server
.serverIP
= opt
["serverIP"];
102 server
.startDir
= opt
["startDir"];
103 server
.CDDrive
= opt
["CDDrive"];
105 eMoviePlayer::getInstance()->mpconfig
.setServerConfig(server
);
106 eMoviePlayer::getInstance()->mpconfig
.save();
108 return closeWindow(content
, "", 500);
111 eString
setStreamingServerVideoSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
113 content
->local_header
["Content-Type"]="text/html; charset=iso-8859-1";
115 std::map
<eString
, eString
> opt
= getRequestOptions(opts
, '&');
117 struct videoTypeParms videoParms
;
119 videoParms
.name
= opt
["name"];
120 videoParms
.extension
= opt
["extension"];
121 videoParms
.videoRate
= opt
["videoRate"];
122 videoParms
.audioRate
= opt
["audioRate"];
123 videoParms
.videoCodec
= opt
["videoCodec"];
124 videoParms
.videoRatio
= opt
["videoRatio"];
125 videoParms
.transcodeVideo
= (opt
["transcodeVideo"] == "on");
126 videoParms
.transcodeAudio
= (opt
["transcodeAudio"] == "on");
127 videoParms
.fps
= opt
["fps"];
129 eMoviePlayer::getInstance()->mpconfig
.setVideoParms(videoParms
);
130 eMoviePlayer::getInstance()->mpconfig
.save();
132 return closeWindow(content
, "", 500);
136 eString
setStreamingServerVLCSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
138 content
->local_header
["Content-Type"]="text/html; charset=iso-8859-1";
140 std::map
<eString
, eString
> opt
= getRequestOptions(opts
, '&');
142 eMoviePlayer::getInstance()->mpconfig
.load();
143 struct serverConfig server
= eMoviePlayer::getInstance()->mpconfig
.getServerConfig();
145 server
.webifPort
= opt
["webifPort"];
146 server
.streamingPort
= opt
["streamingPort"];
147 server
.vlcUser
= opt
["vlcUser"];
148 server
.vlcPass
= opt
["vlcPass"];
150 eMoviePlayer::getInstance()->mpconfig
.setServerConfig(server
);
151 eMoviePlayer::getInstance()->mpconfig
.save();
153 return closeWindow(content
, "", 500);
156 eString
editStreamingServerSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
158 content
->local_header
["Content-Type"]="text/html; charset=iso-8859-1";
160 std::map
<eString
, eString
> opt
= getRequestOptions(opts
, '&');
162 eString result
= readFile(TEMPLATE_DIR
+ "editStreamingServerSettings.tmp");
164 eMoviePlayer::getInstance()->mpconfig
.load();
165 struct serverConfig server
= eMoviePlayer::getInstance()->mpconfig
.getServerConfig();
167 result
.strReplace("#SERVERIP#", server
.serverIP
);
168 result
.strReplace("#STARTDIR#", server
.startDir
);
169 result
.strReplace("#CDDRIVE#", server
.CDDrive
);
171 result
.strReplace("#CHANGEBUTTON#", button(100, "Change", TOPNAVICOLOR
, "javascript:submitSettings()", "#000000"));
176 eString
editStreamingServerVideoSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
178 content
->local_header
["Content-Type"]="text/html; charset=iso-8859-1";
180 std::map
<eString
, eString
> opt
= getRequestOptions(opts
, '&');
182 eString name
= opt
["name"];
183 eString extension
= opt
["extension"];
185 eString result
= readFile(TEMPLATE_DIR
+ "editStreamingServerVideoSettings.tmp");
187 struct videoTypeParms videoParms
;
188 eMoviePlayer::getInstance()->mpconfig
.load();
189 videoParms
= eMoviePlayer::getInstance()->mpconfig
.getVideoParms(name
, extension
);
191 struct codecs avCodecs
= eMoviePlayer::getInstance()->mpconfig
.getAVCodecs();
193 result
.strReplace("#NAME#", videoParms
.name
);
194 result
.strReplace("#EXTENSION#", videoParms
.extension
);
195 result
.strReplace("#VIDEORATE#", videoParms
.videoRate
);
196 result
.strReplace("#AUDIORATE#", videoParms
.audioRate
);
198 eString videoCodecs
[2];
199 videoCodecs
[0] = avCodecs
.mpeg1
;
200 videoCodecs
[1] = avCodecs
.mpeg2
;
201 for (int i
= 0; i
< 2; i
++)
203 if (videoCodecs
[i
] == videoParms
.videoCodec
)
204 tmp
+= "<option selected value=\"" + videoCodecs
[i
] + "\">";
206 tmp
+= "<option value=\"" + videoCodecs
[i
] + "\">";
208 tmp
+= videoCodecs
[i
];
211 result
.strReplace("#VIDEOCODECS#", tmp
);
213 static eString videoRatios
[] = {"352x288", "352x576", "480x576", "576x576", "704x576"};
214 for (int i
= 0; i
< 5; i
++)
216 if (videoRatios
[i
] == videoParms
.videoRatio
)
217 tmp
+= "<option selected value=\"" + videoRatios
[i
] + "\">";
219 tmp
+= "<option value=\"" + videoRatios
[i
] + "\">";
221 tmp
+= videoRatios
[i
];
224 result
.strReplace("#VIDEORATIOS#", tmp
);
225 result
.strReplace("#TRANSCODEVIDEO#", (videoParms
.transcodeVideo
? "checked" : ""));
226 result
.strReplace("#TRANSCODEAUDIO#", (videoParms
.transcodeAudio
? "checked" : ""));
227 result
.strReplace("#FPS#", videoParms
.fps
);
229 result
.strReplace("#CHANGEBUTTON#", button(100, "Change", TOPNAVICOLOR
, "javascript:submitSettings()", "#000000"));
234 eString
editStreamingServerVLCSettings(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
236 content
->local_header
["Content-Type"]="text/html; charset=iso-8859-1";
238 std::map
<eString
, eString
> opt
= getRequestOptions(opts
, '&');
240 eString result
= readFile(TEMPLATE_DIR
+ "editStreamingServerVLCSettings.tmp");
242 eMoviePlayer::getInstance()->mpconfig
.load();
243 struct serverConfig server
= eMoviePlayer::getInstance()->mpconfig
.getServerConfig();
245 result
.strReplace("#WEBIFPORT#", server
.webifPort
);
246 result
.strReplace("#STREAMINGPORT#", server
.streamingPort
);
247 result
.strReplace("#VLCUSER#", server
.vlcUser
);
248 result
.strReplace("#VLCPASS#", server
.vlcPass
);
250 result
.strReplace("#CHANGEBUTTON#", button(100, "Change", TOPNAVICOLOR
, "javascript:submitSettings()", "#000000"));
255 eString
getStreamingServer()
257 eString result
= readFile(TEMPLATE_DIR
+ "streamingServer.tmp");
259 eMoviePlayer::getInstance()->mpconfig
.load();
260 struct serverConfig server
= eMoviePlayer::getInstance()->mpconfig
.getServerConfig();
262 result
.strReplace("#DRIVE#", server
.CDDrive
);
263 result
.strReplace("#FILEBUTTON#", button(100, "File", NOCOLOR
, "javascript:playFile()", "#000000"));
264 result
.strReplace("#DVDBUTTON#", button(100, "DVD", NOCOLOR
, "javascript:playDVD()", "#000000"));
265 result
.strReplace("#VCDBUTTON#", button(100, "(S)VCD", NOCOLOR
, "javascript:playVCD()", "#000000"));
266 result
.strReplace("#SETTINGSBUTTON#", button(100, "Settings", NOCOLOR
, "javascript:settings()", "#000000"));
267 eString tmp
= button(100, "Terminate", RED
, "javascript:terminateStreaming()", "#FFFFFF");
268 result
.strReplace("#TERMINATEBUTTON#", tmp
);
272 eString
streamingServer(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
274 content
->local_header
["Content-Type"]="text/html; charset=utf-8";
275 return getStreamingServer();
278 eString
movieplayerm3u(eString request
, eString dirpath
, eString opts
, eHTTPConnection
*content
)
280 std::map
<eString
, eString
> opt
= getRequestOptions(opts
, '&');
281 eString command
= opt
["command"];
282 eString mrl
= httpUnescape(opt
["mrl"]);
285 eDebug("[MOVIEPLAYERPLS] command = %s, mrl = %s", command
.c_str(), mrl
.c_str());
286 moviePlayer
.control(command
.c_str(), mrl
.c_str());
288 if (command
== "start")
290 content
->local_header
["Content-Type"] = "video/mpegfile";
291 content
->local_header
["Cache-Control"] = "no-cache";
292 result
= "#EXTM3U\n";
293 result
+= "#EXTVLCOPT:sout=" + moviePlayer
.sout(mrl
) + "\n";
298 content
->local_header
["Content-Type"] = "text/html; charset=utf-8";
299 content
->local_header
["Cache-Control"] = "no-cache";
300 result
= closeWindow(content
, "", 500);
306 void ezapMoviePlayerInitializeDyn(eHTTPDynPathResolver
*dyn_resolver
, bool lockWeb
)
308 dyn_resolver
->addDyn("GET", "/cgi-bin/movieplayer.m3u", movieplayerm3u
, lockWeb
);
309 dyn_resolver
->addDyn("GET", "/cgi-bin/streamingServer", streamingServer
, lockWeb
);
310 dyn_resolver
->addDyn("GET", "/cgi-bin/streamingServerSettings", streamingServerSettings
, lockWeb
);
311 dyn_resolver
->addDyn("GET", "/cgi-bin/editStreamingServerSettings", editStreamingServerSettings
, lockWeb
);
312 dyn_resolver
->addDyn("GET", "/XSLMPSettings.xsl", XSLMPSettings
, lockWeb
);
313 dyn_resolver
->addDyn("GET", "/cgi-bin/setStreamingServerSettings", setStreamingServerSettings
, lockWeb
);
314 dyn_resolver
->addDyn("GET", "/cgi-bin/editStreamingServerVideoSettings", editStreamingServerVideoSettings
, lockWeb
);
315 dyn_resolver
->addDyn("GET", "/cgi-bin/setStreamingServerVideoSettings", setStreamingServerVideoSettings
, lockWeb
);
316 dyn_resolver
->addDyn("GET", "/cgi-bin/setStreamingServerVLCSettings", setStreamingServerVLCSettings
, lockWeb
);
317 dyn_resolver
->addDyn("GET", "/cgi-bin/editStreamingServerVLCSettings", editStreamingServerVLCSettings
, lockWeb
);