diff --git a/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp b/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp
index 529dcecf2..e41b8fe53 100644
--- a/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp
+++ b/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp
@@ -873,35 +873,68 @@ void CControlAPI::ChannellistCGI(CyhookHandler *hh)
}
//-----------------------------------------------------------------------------
+// get actual and next event data for given channel
+//-----------------------------------------------------------------------------
+std::string CControlAPI::_GetBouquetActualEPGItem(CyhookHandler *hh, CZapitChannel * channel) {
+ std::string result, firstEPG, secondEPG = "";
+ t_channel_id current_channel = live_channel_id;
+ int percentage;
+ std::string timestr;
+
+// NeutrinoAPI->GetChannelEvents();
+ CSectionsdClient::responseGetCurrentNextInfoChannelID currentNextInfo;
+ CChannelEvent *event;
+ event = NeutrinoAPI->ChannelListEvents[channel->channel_id];
+
+ /* timer slider */
+ if (event && event->duration > 0)
+ percentage = 100 * (time(NULL) - event->startTime) / event->duration;
+ else
+ percentage = 100;
+
+ if ((event = NeutrinoAPI->ChannelListEvents[channel->channel_id])) {
+ sectionsd_getCurrentNextServiceKey(channel->channel_id & 0xFFFFFFFFFFFFULL, currentNextInfo);
+ timestr = timeString(event->startTime);
+
+ firstEPG += hh->outPair("startTime", timestr, true);
+ firstEPG += hh->outPair("description", hh->outValue(event->description), true);
+ firstEPG += hh->outPair("timeElapsed", string_printf("%d", (time(NULL) - event->startTime) / 60), true);
+ firstEPG += hh->outPair("timeTotal", string_printf("%d", event->duration / 60), true);
+ firstEPG += hh->outPair("percentage", string_printf("%d", percentage), false);
+
+ if (currentNextInfo.flags & CSectionsdClient::epgflags::has_next) {
+ timestr = timeString(currentNextInfo.next_zeit.startzeit);
+ secondEPG += hh->outPair("startTime", timestr, true);
+ secondEPG += hh->outPair("description", hh->outValue(currentNextInfo.next_name), false);
+ }
+ }
+
+ result += hh->outPair("isActiveChannel", (channel->channel_id == current_channel) ? "true" : "false", (firstEPG != ""));
+ if(firstEPG != "") {
+ result += hh->outCollection("firstEPG", firstEPG);
+ }
+ if(secondEPG != "") {
+ result += hh->outNext();
+ result += hh->outCollection("secondEPG", secondEPG);
+ }
+ return result;
+}
+
+//-----------------------------------------------------------------------------
+// produce data (collection) for given channel
std::string CControlAPI::_GetBouquetWriteItem(CyhookHandler *hh, CZapitChannel * channel, int bouquetNr, int nr) {
std::string result = "";
- if (hh->ParamList["format"] == "json") {
- result += string_printf("\t\t{\"number\": \"%u\", \"id\": \""
- PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS
- "\", \"short_id\": \""
- PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS
- "\", \"name\": \"%s\", \"logo\": \"%s\", \"bouquetnr\": \"%d\"}",
- nr,
- channel->channel_id,
- channel->channel_id&0xFFFFFFFFFFFFULL,
- channel->getName().c_str(),
- NeutrinoAPI->getLogoFile(hh->WebserverConfigList["Tuxbox.LogosURL"], channel->channel_id).c_str(),
- bouquetNr
- );
- }
- else if((hh->ParamList["format"] == "xml") || !(hh->ParamList["xml"].empty()) ) {
- result += string_printf("\n\t%u\n\t%d\n\t"
- PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS
- "\n\t"
- PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS
- "\n\t\n\n\n",
- nr,
- bouquetNr,
- channel->channel_id,
- channel->channel_id&0xFFFFFFFFFFFFULL,
- channel->getName().c_str(),
- NeutrinoAPI->getLogoFile(hh->WebserverConfigList["Tuxbox.LogosURL"], channel->channel_id).c_str()
- );
+ bool isEPGdetails = !(hh->ParamList["epg"].empty());
+ if (hh->outType == json || hh->outType == xml) {
+ result += hh->outPair("number", string_printf("%u", nr), true);
+ result += hh->outPair("id", string_printf(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, channel->channel_id), true);
+ result += hh->outPair("short_id", string_printf(PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS, channel->channel_id&0xFFFFFFFFFFFFULL), true);
+ result += hh->outPair("name", channel->getName(), true);
+ result += hh->outPair("logo", hh->outValue(NeutrinoAPI->getLogoFile(hh->WebserverConfigList["Tuxbox.LogosURL"], channel->channel_id)), true);
+ result += hh->outPair("bouquetnr", string_printf("%d", bouquetNr), isEPGdetails);
+ if(isEPGdetails)
+ result += _GetBouquetActualEPGItem(hh, channel);
+ result = hh->outArrayItem("channel", result, false);
}
else {
result += string_printf("%u "
@@ -919,8 +952,9 @@ std::string CControlAPI::_GetBouquetWriteItem(CyhookHandler *hh, CZapitChannel *
*
* @par nhttpd-usage
* Get bouquet list (all) oder filtered to a given bouquet number
+ * Option epg=true for actual and next epg data for each channel
* @code
- * /control/getbouquet?[bouquet=][&mode=TV|RADIO]
+ * /control/getbouquet?[bouquet=][&mode=TV|RADIO][&epg=true]
* @endcode
* Get the actual used bouquet number
* @code
@@ -1005,12 +1039,18 @@ void CControlAPI::GetBouquetCGI(CyhookHandler *hh) {
}
else {
ZapitChannelList channels;
+ int BouquetNr = -1; // -1 = all bouquets
+ int startBouquet = 0;
+ int bsize = (int) g_bouquetManager->Bouquets.size();
if (hh->ParamList["bouquet"] != "") {
// list for given bouquet
- int BouquetNr = atoi(hh->ParamList["bouquet"].c_str());
+ BouquetNr = atoi(hh->ParamList["bouquet"].c_str());
if (BouquetNr > 0)
BouquetNr--;
- channels = mode == CZapitClient::MODE_RADIO ? g_bouquetManager->Bouquets[BouquetNr]->radioChannels : g_bouquetManager->Bouquets[BouquetNr]->tvChannels;
+ startBouquet = BouquetNr;
+ bsize = BouquetNr+1;
+ }
+/* channels = mode == CZapitClient::MODE_RADIO ? g_bouquetManager->Bouquets[BouquetNr]->radioChannels : g_bouquetManager->Bouquets[BouquetNr]->tvChannels;
int num = 1 + (mode == CZapitClient::MODE_RADIO ? g_bouquetManager->radioChannelsBegin().getNrofFirstChannelofBouquet(BouquetNr)
: g_bouquetManager->tvChannelsBegin().getNrofFirstChannelofBouquet(BouquetNr));
for (int j = 0, size = (int) (channels.size()); j < size; j++) {
@@ -1022,8 +1062,8 @@ void CControlAPI::GetBouquetCGI(CyhookHandler *hh) {
}
}
else {
- // list all
- for (int i = 0, bsize = (int) g_bouquetManager->Bouquets.size(); i < bsize; i++) {
+*/ // list all
+ for (int i = startBouquet; i < bsize; i++) {
channels = mode == CZapitClient::MODE_RADIO ? g_bouquetManager->Bouquets[i]->radioChannels : g_bouquetManager->Bouquets[i]->tvChannels;
int num = 1 + (mode == CZapitClient::MODE_RADIO ? g_bouquetManager->radioChannelsBegin().getNrofFirstChannelofBouquet(i)
: g_bouquetManager->tvChannelsBegin().getNrofFirstChannelofBouquet(i));
@@ -1039,7 +1079,7 @@ void CControlAPI::GetBouquetCGI(CyhookHandler *hh) {
result += ",\n";
}
}
- }
+// }
result = hh->outArray("channels", result);
// write footer
if (outType == json) {
@@ -1210,10 +1250,10 @@ std::string CControlAPI::channelEPGformated(CyhookHandler *hh, int bouquetnr, t_
return result;
}
+
+//-----------------------------------------------------------------------------
// Detailed EPG list in XML or JSON
-
-
-
+//-----------------------------------------------------------------------------
void CControlAPI::epgDetailList(CyhookHandler *hh) {
// ------ get parameters -------
// max = maximal output items
diff --git a/src/nhttpd/tuxboxapi/coolstream/controlapi.h b/src/nhttpd/tuxboxapi/coolstream/controlapi.h
index 0c41100fe..fe7be648d 100644
--- a/src/nhttpd/tuxboxapi/coolstream/controlapi.h
+++ b/src/nhttpd/tuxboxapi/coolstream/controlapi.h
@@ -48,6 +48,7 @@ private:
void _SendTime(CyhookHandler *hh, struct tm *Time, int digits);
std::string _GetBouquetWriteItem(CyhookHandler *hh, CZapitChannel * channel, int bouquetNr, int nr);
std::string channelEPGformated(CyhookHandler *hh, int bouquetnr, t_channel_id channel_id, int max, long stoptime);
+ std::string _GetBouquetActualEPGItem(CyhookHandler *hh, CZapitChannel * channel);
//yweb
void YWeb_SendVideoStreamingPids(CyhookHandler *hh, int apid_no);