trunk 20080912
[gitenigma.git] / src / enigma_dyn_movieplayer.cpp
blob8c4958388bf0cb029b379853a1fbb457166b3972
1 /*
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
24 #include <map>
25 #include <time.h>
26 #include <fcntl.h>
27 #include <unistd.h>
28 #include <stdio.h>
29 #include <dirent.h>
30 #include <sys/types.h>
31 #include <sys/stat.h>
33 #include <sys/socket.h>
34 #include <sys/ioctl.h>
35 #include <net/if.h>
36 #include <arpa/inet.h>
37 #include <linux/if_ether.h>
38 #include <iomanip>
39 #include <iostream>
40 #include <fstream>
42 #include <enigma.h>
43 #include <enigma_main.h>
44 #include <enigma_standby.h>
45 #include <timer.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>
67 using namespace std;
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");
76 if (!result)
77 result = readFile(TEMPLATE_DIR + "movieplayer.xml");
78 return result;
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));
88 return result;
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"));
173 return result;
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, '&');
181 eString tmp;
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);
197 tmp = "";
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] + "\">";
205 else
206 tmp += "<option value=\"" + videoCodecs[i] + "\">";
208 tmp += videoCodecs[i];
209 tmp += "</option>";
211 result.strReplace("#VIDEOCODECS#", tmp);
212 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] + "\">";
218 else
219 tmp += "<option value=\"" + videoRatios[i] + "\">";
221 tmp += videoRatios[i];
222 tmp += "</option>";
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"));
231 return result;
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"));
252 return result;
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);
269 return result;
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"]);
283 eString result;
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";
294 result += mrl;
296 else
298 content->local_header["Content-Type"] = "text/html; charset=utf-8";
299 content->local_header["Cache-Control"] = "no-cache";
300 result = closeWindow(content, "", 500);
303 return result;
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);
319 #endif