Saman: Forke Dir doch einfach das restfulapi-Plugin auf github und entwickele da weiter, generiere daraus dann Pull-Requests / Patches für das Haupt-Repo.
Restfulapi-Plugin
-
-
Danke!
-
Moin,
und noch ein 'feature request', das ich gerne ins git übernehmen würde.
Der Patch ergänzt 'events' um drei neue Optionen:
- chevents -> EPG Einträge pro Kanal
- chfrom -> EPG ab Kanalnummer
- chto -> EPG bis Kanalnummer
Diff
Display More--- vdr-plugin-restfulapi/events.cpp 2013-03-01 11:23:10.531784913 +0100 +++ test/vdr-plugin-restfulapi/events.cpp 2013-03-04 08:33:06.716079827 +0100 @@ -59,6 +59,15 @@ return;*/ } + int channel_limit = q.getOptionAsInt("chevents"); + if ( channel_limit <= -1 ) channel_limit = 0; // default channel events is 0 -> all + + int channel_from = q.getOptionAsInt("chfrom"); + if ( channel_from <= -1 || channel != NULL ) channel_from = 0; // default channel number is 0 + + int channel_to = q.getOptionAsInt("chto"); + if ( channel_to <= 0 || channel != NULL ) channel_to = Channels.Count(); + if ( from <= -1 ) from = time(NULL); // default time is now if ( timespan <= -1 ) timespan = 0; // default timespan is 0, which means all entries will be returned int to = from + timespan; @@ -78,37 +87,36 @@ bool initialized = false; int total = 0; - for(int i=0;i<Channels.Count();i++) { + for(int i=0; i<Channels.Count(); i++) { const cSchedule *Schedule = Schedules->GetSchedule(Channels.Get(i)->GetChannelID()); - if ( channel == NULL || strcmp(channel->GetChannelID().ToString(), Channels.Get(i)->GetChannelID().ToString()) == 0) { - - if ( !Schedule ) { - if ( channel != NULL) { + if ((channel == NULL || strcmp(channel->GetChannelID().ToString(), Channels.Get(i)->GetChannelID().ToString()) == 0) && (i >= channel_from && i <= channel_to)) { + if (!Schedule) { + if (channel != NULL) { reply.httpReturn(404, "Could not find schedule!"); return; } } else { - if (!initialized) { eventList->init(); initialized = true; } int old = 0; - for(cEvent* event = Schedule->Events()->First(); event; event = Schedule->Events()->Next(event)) - { + int channel_events = 0; + for(cEvent* event = Schedule->Events()->First(); event; event = Schedule->Events()->Next(event)) { int ts = event->StartTime(); int te = ts + event->Duration(); - if ( (ts <= to && te > from) || (te > from && timespan == 0) ) { - if ( (event_id < 0 || event_id == (int)event->EventID()) && onlyCount != "true") { - eventList->addEvent(event); - } - }else{ - if(ts > to) break; - if(te <= from) { - old++; + if ((ts <= to && te > from) || (te > from && timespan == 0)) { + if (channel_limit == 0 || channel_limit > channel_events) { + if ((event_id < 0 || event_id == (int)event->EventID()) && onlyCount != "true") { + eventList->addEvent(event); + channel_events++; + } } + } else { + if (ts > to) break; + if (te <= from) old++; } } total += (Schedule->Events()->Count() - old);
-
Ich konnte die Probleme mit der json-Ausgabe auf die Version 2.1.1 von cxxtools zurückführen. Falls da noch jemand Probleme hat:
Diff
Display More--- cxxtools-2.1.1/src/utf8codec.cpp 2012-05-03 18:06:16.000000000 +0200 +++ b/cxxtools-2.1.1/src/utf8codec.cpp 2013-03-06 11:35:53.994565118 +0100 @@ -307,7 +307,7 @@ Char* to_next = to; const char* from_next = from; - r = codec.in(state, from, from + size, from_next, to, to + sizeof(to), to_next); + r = codec.in(state, from, from + size, from_next, to, to + sizeof(to) / sizeof(to[0]), to_next); if (r == error) throw ConversionError("character conversion failed");
-
Moin!
Prima! Aus kosmetischen Gründen würde ich noch das doppelte Leerzeichen vor dem ", to" eliminieren wollen...
Lars.
-
Done.
-
Moin,
zu den 'OPTIONS' habe ich noch was gefunden:
QuoteUnlike simple requests (discussed above), "preflighted" requests first send an HTTP OPTIONS request header to the resource on the other domain, in order to determine whether the actual request is safe to send. Cross-site requests are preflighted like this since they may have implications to user data. In particular, a request is preflighted if: ...
-
Moin,
als Antwort auf https://bugs.yavdr.com/issues/840
und weil ich es auch brauche würde ich das gerne übernehmen:Diff
Display Morediff -ruN vdr-plugin-restfulapi/info.cpp work/vdr-plugin-restfulapi/info.cpp --- vdr-plugin-restfulapi/info.cpp 2013-03-11 08:57:48.858068963 +0100 +++ work/vdr-plugin-restfulapi/info.cpp 2013-03-11 09:35:41.588234205 +0100 @@ -81,23 +81,25 @@ string eventTitle = ""; int start_time = -1; - int duration = -1; + int duration = -1; int eventId = -1; - if ( event != NULL) { + if (event != NULL) { eventTitle = event->Title(); - start_time = event->StartTime(); + start_time = event->StartTime(); duration = event->Duration(), eventId = (int)event->EventID(); } serializer.serialize(eventId, "eventid"); serializer.serialize(start_time, "start_time"); - serializer.serialize(duration, "duration"); + serializer.serialize(duration, "duration"); serializer.serialize(StringExtension::UTF8Decode(eventTitle), "title"); } } + serializer.serialize(StringExtension::UTF8Decode(VdrExtension::getVideoDiskSpace()), "diskspace"); + serializer.serialize(pl, "vdr"); serializer.finish(); } @@ -107,7 +109,6 @@ time_t now = time(0); StatusMonitor* statm = StatusMonitor::get(); - se.writeXmlHeader(); se.write("<info xmlns=\"http://www.domain.org/restfulapi/2011/info-xml\">\n"); se.write(" <version>0.0.1</version>\n"); @@ -122,7 +123,6 @@ restful_services[i]->Internal() ? "true" : "false")); } se.write(" </services>\n"); - if ( statm->getRecordingName().length() > 0 || statm->getRecordingFile().length() > 0 ) { se.write(cString::sprintf(" <video name=\"%s\">%s</video>\n", StringExtension::encodeToXml(statm->getRecordingName()).c_str(), StringExtension::encodeToXml(statm->getRecordingFile()).c_str())); @@ -140,12 +140,14 @@ string eventTitle = ""; if ( event->Title() != NULL ) { eventTitle = event->Title(); } - se.write(cString::sprintf(" <eventid>%i</eventid>\n", event->EventID())); + se.write(cString::sprintf(" <eventid>%i</eventid>\n", event->EventID())); se.write(cString::sprintf(" <start_time>%i</start_time>\n", (int)event->StartTime())); - se.write(cString::sprintf(" <duration>%i</duration>\n", (int)event->Duration())); - se.write(cString::sprintf(" <title>%s</title>\n", StringExtension::encodeToXml(eventTitle).c_str())); + se.write(cString::sprintf(" <duration>%i</duration>\n", (int)event->Duration())); + se.write(cString::sprintf(" <title>%s</title>\n", StringExtension::encodeToXml(eventTitle).c_str())); } } + + se.write(cString::sprintf(" <diskspace>%s</diskspace>\n", StringExtension::encodeToXml(VdrExtension::getVideoDiskSpace()).c_str())); se.write(" <vdr>\n"); se.write(" <plugins>\n"); diff -ruN vdr-plugin-restfulapi/tools.cpp work/vdr-plugin-restfulapi/tools.cpp --- vdr-plugin-restfulapi/tools.cpp 2013-03-11 08:57:48.866068965 +0100 +++ work/vdr-plugin-restfulapi/tools.cpp 2013-03-11 08:32:49.000000000 +0100 @@ -615,6 +615,15 @@ return (cEvent*)Schedule->GetEventAround(now); } +string VdrExtension::getVideoDiskSpace() +{ + int FreeMB, UsedMB; + int Percent = VideoDiskSpace(&FreeMB, &UsedMB); + ostringstream str; + str << FreeMB + UsedMB << "MB " << FreeMB << "MB " << Percent << "%"; + return str.str(); +} + // --- VdrMarks --------------------------------------------------------------- VdrMarks* VdrMarks::get() diff -ruN vdr-plugin-restfulapi/tools.h work/vdr-plugin-restfulapi/tools.h --- vdr-plugin-restfulapi/tools.h 2013-03-11 08:57:48.866068965 +0100 +++ work/vdr-plugin-restfulapi/tools.h 2013-03-11 09:27:13.233741458 +0100 @@ -173,6 +173,7 @@ static cEvent* GetEventById(tEventID eventID, cChannel* channel = NULL); static std::string getRelativeVideoPath(cRecording* recording); static cEvent* getCurrentEventOnChannel(cChannel* channel); + static std::string getVideoDiskSpace(); }; class VdrMarks
-
info.xml zeigt beim streamen oder scannen den Kanal des zweiten Tuners an.
Das hilft bei mir:Diff
Display Morediff -ruN vdr-plugin-restfulapi/statusmonitor.cpp work/vdr-plugin-restfulapi/statusmonitor.cpp --- vdr-plugin-restfulapi/statusmonitor.cpp 2013-03-11 08:57:48.866068965 +0100 +++ work/vdr-plugin-restfulapi/statusmonitor.cpp 2013-03-11 11:04:54.033523229 +0100 @@ -173,11 +173,13 @@ #if APIVERSNUM >= 10726 void StatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView) +{ + if (ChannelNumber != 0 && LiveView) { #else void StatusMonitor::ChannelSwitch(const cDevice *Device, int ChannelNumber) -#endif { if (ChannelNumber != 0) { +#endif channel_number = ChannelNumber; } }
-
Danke! Am besten auch an einen Bug hängen, wenn ich einen Thread im Portal gelesen habe, hab ich's meistens auch schon wieder vergessen...
Lars.
-
Ich konnte die Probleme mit der json-Ausgabe auf die Version 2.1.1 von cxxtools zurückführen. Falls da noch jemand Probleme hat:
Diff
Display More--- cxxtools-2.1.1/src/utf8codec.cpp 2012-05-03 18:06:16.000000000 +0200 +++ b/cxxtools-2.1.1/src/utf8codec.cpp 2013-03-06 11:35:53.994565118 +0100 @@ -307,7 +307,7 @@ Char* to_next = to; const char* from_next = from; - r = codec.in(state, from, from + size, from_next, to, to + sizeof(to), to_next); + r = codec.in(state, from, from + size, from_next, to, to + sizeof(to) / sizeof(to[0]), to_next); if (r == error) throw ConversionError("character conversion failed");
Danke für den Patch. Der VDR verabschiedete sich auch immer bei der Anzeige von Events als json. Nun scheint es zu gehen. -
Moin,
anbei ein Patch gegen https://github.com/Saman-VDR/vdr-plugin-restfulapi
Der Patch ergänzt info um ein paar Ausgaben und das Plugin um einen weiteren Service: audioEdit: Patch entfernt, Änderung ist im Git.
audio.xml?volume=180&track=33&mute=0&channel=0
audio.xml?volume=180 // 180 absolute
audio.xml?volume=020 // +20
audio.xml?volume=-20 // -20audio.xml
XML
Display More<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audio xmlns="http://www.domain.org/restfulapi/2011/audio-xml"> <volume>180</volume> <mute>0</mute> <tracks count="4"> <track type="1" description="Stereo" /> <track type="2" description="Stereo" /> <track type="3" description="Originalton" /> <track type="33" description="Dolby Digital 2.0" /> </tracks> <type>33</type> <description>Dolby Digital 2.0</description> <channel>dd 2.0</channel> </audio>
info.xml
XML
Display More<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <info xmlns="http://www.domain.org/restfulapi/2011/info-xml"> <version>0.0.1</version> <time>1372349805</time> <services> <service path="/info" version="1" internal="true" /> <service path="/channels" version="1" internal="true" /> <service path="/channels/groups" version="1" internal="true" /> <service path="/channels/image" version="1" internal="true" /> <service path="/events" version="1" internal="true" /> <service path="/events/image" version="1" internal="true" /> <service path="/events/search" version="1" internal="false" /> <service path="/recordings" version="1" internal="true" /> <service path="/recordings/cut" version="1" internal="true" /> <service path="/recordings/marks" version="1" internal="true" /> <service path="/remote" version="1" internal="true" /> <service path="/timers" version="1" internal="true" /> <service path="/osd" version="1" internal="true" /> <service path="/searchtimers" version="1" internal="false" /> <service path="/audio" version="1" internal="true" /> </services> <channel>S19.2E-1-1010-11150</channel> <channel_name>3sat HD</channel_name> <channel_number>8</channel_number> <eventid>9247</eventid> <start_time>1372347900</start_time> <duration>2700</duration> <title>Der Pazifische Feuerring (4/4)</title> <recording>false</recording> <diskspace>1405400MB 165977MB 88%</diskspace> <vdr> <version>2.0.2</version> <plugins> <plugin name="softhddevice" version="0.6.0" /> <plugin name="dbus2vdr" version="12e" /> <plugin name="skinnopacity" version="0.1.2" /> <plugin name="play" version="0.0.14" /> <plugin name="menuorg" version="0.5.1" /> <plugin name="channellists" version="0.0.5" /> <plugin name="markad" version="0.1.5pre" /> <plugin name="tvguide" version="0.0.5" /> <plugin name="music" version="0.9.9-dev2" /> <plugin name="epgsearch" version="1.0.1.beta5" /> <plugin name="yaepghd" version="0.0.5_pre1" /> <plugin name="extrecmenu" version="1.2.2" /> <plugin name="streamdev-server" version="0.6.0-git" /> <plugin name="cinebars" version="0.1.0" /> <plugin name="conflictcheckonly" version="0.0.1" /> <plugin name="live" version="0.3.0" /> <plugin name="osdserver" version="0.1.3" /> <plugin name="quickepgsearch" version="0.0.1" /> <plugin name="restfulapi" version="0.1.2" /> <plugin name="sleeptimer" version="0.8.3-201205011650dev" /> <plugin name="vnsiserver3" version="0.9.1" /> <plugin name="femon" version="2.0.0" /> <plugin name="epgsearchonly" version="0.0.1" /> </plugins> </vdr> </info>
-
Moin,
da hier niemand aufgeschrien hat, habe ich die Ergänzungen ins Git übernommen.
Der Patch muss also nicht mehr angewendet werden.Gruß S.
-
Moin!
In deinem git darfst du tun, was du möchtest...
Hatte noch keine Gelegenheit, den Patch einem Review zu unterziehen, habe es aber noch vor.Lars.
-
Ist schon klar, aber ich möchte es ja so einbauen, das es auch übernommen wird.
Vorschläge sind also immer willkommen.Mein Entwurf zum Testen des Volume-Reglers mit Safari und Chrome sieht so aus:
HTML
Display More<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>VDR-Audio</title> <meta name="description" content="tcpRemote - Layout für VDR-Audio"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="default"> <meta name="viewport" content="width=device-width, user-scalable=no" id="viewport"> <style type="text/css"> .button, .button:visited { width:92px; height:40px; margin:5px; vertical-align:middle; text-align:center; text-decoration:none; font-size:18px; font-weight:bold; line-height:2.3em; color:#fff; background-color:#ff5c00; overflow:hidden; display:inline-block; text-shadow:0 -1px 1px rgba(0,0,0,0.25); border-bottom:1px solid rgba(0,0,0,0.25); -moz-border-radius:6px; -webkit-border-radius:6px; -moz-box-shadow:0 1px 3px rgba(0,0,0,0.6); -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.6); position:relative; cursor:pointer; speak:none; } .button:active { top:1px; opacity:0.75; -moz-opacity:0.75; } input[type='range'] { -webkit-appearance: none !important; background:green; height:10px; width:300px; vertical-align:middle; margin:0px 10px 0px 10px; } input[type='range']::-webkit-slider-thumb { height:25px; width:25px; } </style> <script type="text/javascript" language="javascript"> var Setup = { vdrurl : "http://vdr", restfulport : ":8002", timeout : 0 } function _init() { setAudio(); Interval(); }; var interval = -1; function Interval() { window.clearInterval(interval); if (Setup.timeout > 0) interval = window.setInterval("setAudio()", Setup.timeout); } function rangeVolume(elementid) { var element = document.getElementById(elementid); var level = element.value; setVolume(level); var elements; elements = document.getElementsByName('volume_text'); for (var index = 0; index < elements.length; index++) elements.item(index).innerHTML=level; elements = document.getElementsByName('volume_range'); for (var index = 0; index < elements.length; index++) { if (elements.item(index) != element) elements.item(index).value=level; } }; function setVolume(level) { var xmlHttp = null; xmlHttp = new XMLHttpRequest(); if (xmlHttp) { xmlHttp.open("POST", Setup.vdrurl + Setup.restfulport + '/audio.xml?volume=' + level, true); xmlHttp.send(); } }; function setAudio(level) { if (level) level = "?"+level; else level = ""; var xmlHttp = null; xmlHttp = new XMLHttpRequest(); if (xmlHttp) { xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { var xmlElement = xmlHttp.responseXML.documentElement; if (!xmlElement) { alert("Failed to get valid XML"); } else { var volume = xmlElement.getElementsByTagName('volume')[0].firstChild.data; var mute = xmlElement.getElementsByTagName('mute')[0].firstChild.data; var tracks = xmlElement.getElementsByTagName('tracks')[0]; var track = xmlElement.getElementsByTagName('type')[0].firstChild.data; var desc = xmlElement.getElementsByTagName('description')[0].firstChild.data; var channel = xmlElement.getElementsByTagName('channel')[0].firstChild.data; var mute_str = ""; if (mute == 1) mute_str = "mute"; var text = "<div style='width:100%; font-size:28px; color:grey; text-align:center;'><b>VDR Audio</b></div>"; text += "<div style='width:100%;'><br></div>"; text += "<div style='float:left;'>"+desc+"     ("+channel+")</div>"; text += "<div align='right'>"; text += " <form action=''><select name='descriptions' style='vertical-align:middle;' onchange=\"setAudio('track='+this.form.descriptions.options[this.form.descriptions.selectedIndex].value); return false;\">"; for (var i = 0; i < tracks.getElementsByTagName('track').length; i++) { var type=tracks.getElementsByTagName('track')[i].attributes[0].nodeValue; var description=tracks.getElementsByTagName('track')[i].attributes[1].nodeValue if (type == track) text += " <option selected='selected' value='"+type+"'>"+description+"</option>"; else text += " <option value='"+type+"'>"+description+"</option>"; } text += " </select></form>"; text += "</div>"; text += "<div style='width:100%; clear:left;'><br></div>"; text += "<div style='width:100%; min-height:40px; line-height:2.3em; text-align:left;'>Lautstärke:"; text += " <input type='range' id='volume_details' name='volume_range' min='0' max='255' step='1' value='"+volume+"' onchange=\"rangeVolume('volume_details');\" />"; text += " <span name='volume_text' style='vertical-align:middle;'>"+volume+"   <span style='vertical-align:middle; color:red;'>"+mute_str+"</span>"; text += "</div>"; text += "<div style='width:100%;'><br></div>"; text += "<div style='width:100%; text-align:left; font-size:16px;'>"; if (channel.match(/left/g)) { text += " <input type='radio' name='left' value='1' checked='checked'> Mono L "; text += " <input type='radio' name='stereo' value='0' onchange=\"setAudio('channel=0'); return false;\"> Stereo "; text += " <input type='radio' name='right' value='2' onchange=\"setAudio('channel=2'); return false;\"> Mono R"; } else if (channel.match(/right/g)) { text += " <input type='radio' name='left' value='1' onchange=\"setAudio('channel=1'); return false;\"> Mono L "; text += " <input type='radio' name='stereo' value='0' onchange=\"setAudio('channel=0'); return false;\"> Stereo "; text += " <input type='radio' name='right' value='2' checked='checked'> Mono R"; } else if (track < 33) { text += " <input type='radio' name='left' value='1' onchange=\"setAudio('channel=1'); return false;\"> Mono L "; text += " <input type='radio' name='stereo' value='0' checked='checked'> Stereo "; text += " <input type='radio' name='right' value='2' onchange=\"setAudio('channel=2'); return false;\"> Mono R"; } text += "</div>"; if (mute == 1) mute_str = "Unmute"; else mute_str = "Mute"; text += "<div align='right'>"; text += " <a class='button' href='#' onclick=\"setAudio('mute=2'); return false;\">"+mute_str+"</a>"; text += "</div>"; document.getElementById('content').innerHTML = text; } } else { document.getElementById('content').innerHTML = "<div style='width:100%; font-size:28px; color:grey; text-align:center;'><b>VDR Audio</b> (offline)</div>"; } } } xmlHttp.open("POST", Setup.vdrurl + Setup.restfulport + '/audio.xml' + level, true); xmlHttp.send(); } }; </script> </head> <body onload="_init();" style='width:100%; background-color:#000000; font-size:24px; color:white; font-family:Arial, Helvetica, sans-serif;'> <div width='100%' align='center'> <div id="content" style='width:600px; background-color:#202020; padding:20px; margin:20px; -webkit-border-radius:12px;'> <div style='width:100%; font-size:28px; color:grey; text-align:center;'><b>VDR Audio</b></div> </div> </div> </body>
-
Ich vermute das hat sich aus dem sonst umständlichen Escapen des "+" ergeben - evtl. wäre ein audio.xml?volumeup=20 und audio.xml?volumedown=20 als sprechende Alternativen einfacher, dann könnte man in seinem Konstruktor für die URL auch mit Integern statt Strings für die Werte arbeiten.Dann habe ich noch eine Frage zur Methode - wenn ich das richtig interpretiere wird die Lautstärke im Patch per GET gesetzt, was ja ein bisschen einer "sicheren" Methode widerspricht (http://en.wikipedia.org/wiki/H…fer_Protocol#Safe_methods) - das gleiche hat sich bei Play auch schon eingeschlichen:
Quote
PlayThis service tells your VDR to play or rewind a recording:
Method: GET, POST
Examples:
GET http://<ip>:<port>/recordings/play/<number>
POST http://<ip>:<port>/recordings/play/<number>Description of the Parameters:
<number> - The number of the recording you want to play (GET).
<number> - The number of the recording you want to rewind (POST). -
Moin!
Ja, GET sollte nur Daten liefern, POST Daten verändern.
Lars.
-
Ich vermute das hat sich aus dem sonst umständlichen Escapen des "+" ergeben...
Richtig vermutetQuote... - evtl. wäre ein audio.xml?volumeup=20 und audio.xml?volumedown=20 als sprechende Alternativen einfacher, dann könnte man in seinem Konstruktor für die URL auch mit Integern statt Strings für die Werte arbeiten.
volumeup und -down kann ich gerne einbauen aber als Integer nehme ich es jetzt schon entgegen ( int level = q.getOptionAsInt("volume"); )Dann habe ich noch eine Frage zur Methode - wenn ich das richtig interpretiere wird die Lautstärke im Patch per GET gesetzt, was ja ein bisschen einer "sicheren" Methode widerspricht (http://en.wikipedia.org/wiki/Hypertext_T…ol#Safe_methods) - das gleiche hat sich bei Play auch schon eingeschlichen:...
Da hast du recht. Kann ich gerne ändern.
Wichtig ist mir nur, das beim setzen der Lautstärke das Ergebnis auch gleich zurück gegeben wird.
Das habe ich jetzt eben mit POST probiert und es funktioniert.Play - Was haltet ihr davon?
POST http://<ip>:<port>/recordings/playstart/<number>
POST http://<ip>:<port>/recordings/play/<number>oder
POST http://<ip>:<port>/recordings/rewind/<number>
rewind wird ihmo im VDR verwendet, ich finde das aber irgendwie missverständlich -
Habe den AudioResponder im Git angepasst.
Was meint ihr dazu?Code
Display Morevoid AudioResponder::reply(ostream& out, cxxtools::http::Request& request, cxxtools::http::Reply& reply) { QueryHandler::addHeader(reply); QueryHandler q("/audio", request); if (request.method() == "POST") { string vol = q.getOptionAsString("volume"); int level = q.getOptionAsInt("volume"); int mute = q.getOptionAsInt("mute"); int track = q.getOptionAsInt("track"); int channel = q.getOptionAsInt("channel"); if (vol.find("m") == 0) { cDevice::PrimaryDevice()->ToggleMute(); mute = -1; } else if (vol.find("0") == 0) { cDevice::PrimaryDevice()->SetVolume(level, false); } else if (vol.find("-") == 0) { cDevice::PrimaryDevice()->SetVolume(level, false); } else if ( level >= 0 && level <= 255 ) { cDevice::PrimaryDevice()->SetVolume(level, true); } if (mute >= 0) { if (mute == 2) { cDevice::PrimaryDevice()->ToggleMute(); } else if (cDevice::PrimaryDevice()->IsMute()) { if (mute == 0) cDevice::PrimaryDevice()->ToggleMute(); } else { if (mute == 1) cDevice::PrimaryDevice()->ToggleMute(); } } if (track >= 0) { const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(track)); if (TrackId && TrackId->id) cDevice::PrimaryDevice()->SetCurrentAudioTrack(eTrackType(track)); } if (channel >= 0 && channel < 3) { cDevice::PrimaryDevice()->SetAudioChannel(channel); } } if (request.method() == "POST" || request.method() == "GET") { AudioList* audioList; if ( q.isFormat(".html") ) { reply.addHeader("Content-Type", "text/html; charset=utf-8"); audioList = (AudioList*)new HtmlAudioList(&out); audioList->init(); } else if ( q.isFormat(".xml") ) { reply.addHeader("Content-Type", "text/xml; charset=utf-8"); audioList = (AudioList*)new XmlAudioList(&out); audioList->init(); } else { // if ( q.isFormat(".json") ) reply.addHeader("Content-Type", "application/json; charset=utf-8"); audioList = (AudioList*)new JsonAudioList(&out); } audioList->addContent(); audioList->finish(); delete audioList; } else { reply.httpReturn(403, "Only GET and POST methods are supported by the audio control"); } }
-
rewind wird ihmo im VDR verwendet, ich finde das aber irgendwie missverständlich
Ja, verständlich. Aber ich würde da von der Namenswahl so dicht wie möglich am vdr bleiben, dann finden sich die Leute besser zurecht, die den vdr schon kennen.
Sonst baut man sich eine eigene API zurecht, die man auch erst wieder lernen muss...Lars.
Participate now!
Don’t have an account yet? Register yourself now and be a part of our community!