aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/epgcache.cpp36
-rw-r--r--lib/python/Screens/ChannelSelection.py7
-rw-r--r--lib/python/Screens/EventView.py4
-rw-r--r--lib/python/Screens/InfoBarGenerics.py2
-rw-r--r--lib/python/Screens/PictureInPicture.py21
-rw-r--r--lib/python/Tools/XMLTools.py2
-rw-r--r--lib/service/servicedvb.cpp7
-rw-r--r--lib/service/servicedvb.h1
8 files changed, 58 insertions, 22 deletions
diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp
index 6adab399..47da4101 100644
--- a/lib/dvb/epgcache.cpp
+++ b/lib/dvb/epgcache.cpp
@@ -21,6 +21,30 @@ descriptorMap eventData::descriptors;
__u8 eventData::data[4108];
extern const uint32_t crc32_table[256];
+const eServiceReference &handleGroup(const eServiceReference &ref)
+{
+ if (ref.flags & eServiceReference::isGroup)
+ {
+ ePtr<eDVBResourceManager> res;
+ if (!eDVBResourceManager::getInstance(res))
+ {
+ ePtr<iDVBChannelList> db;
+ if (!res->getChannelList(db))
+ {
+ eBouquet *bouquet=0;
+ if (!db->getBouquet(ref, bouquet))
+ {
+ std::list<eServiceReference>::iterator it(bouquet->m_services.begin());
+ if (it != bouquet->m_services.end())
+ return *it;
+ }
+ }
+ }
+ }
+ return ref;
+}
+
+
eventData::eventData(const eit_event_struct* e, int size, int type)
:ByteSize(size&0xFF), type(type&0xFF)
{
@@ -1317,7 +1341,7 @@ RESULT eEPGCache::lookupEventTime(const eServiceReference &service, time_t t, co
// if t == -1 we search the current event...
{
singleLock s(cache_lock);
- uniqueEPGKey key(service);
+ uniqueEPGKey key(handleGroup(service));
// check if EPG for this service is ready...
eventCache::iterator It = eventDB.find( key );
@@ -1393,7 +1417,7 @@ RESULT eEPGCache::lookupEventTime(const eServiceReference &service, time_t t, eP
RESULT eEPGCache::lookupEventId(const eServiceReference &service, int event_id, const eventData *&result )
{
singleLock s(cache_lock);
- uniqueEPGKey key( service );
+ uniqueEPGKey key(handleGroup(service));
eventCache::iterator It = eventDB.find( key );
if ( It != eventDB.end() && !It->second.first.empty() ) // entrys cached?
@@ -1450,7 +1474,7 @@ RESULT eEPGCache::lookupEventId(const eServiceReference &service, int event_id,
RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin, int minutes)
{
- eventCache::iterator It = eventDB.find( service );
+ eventCache::iterator It = eventDB.find(handleGroup(service));
if ( It != eventDB.end() && It->second.second.size() )
{
m_timemap_end = minutes != -1 ? It->second.second.upper_bound(begin+minutes*60) : It->second.second.end();
@@ -1474,7 +1498,7 @@ RESULT eEPGCache::startTimeQuery(const eServiceReference &service, time_t begin,
}
else
m_timemap_cursor = It->second.second.begin();
- const eServiceReferenceDVB &ref = (const eServiceReferenceDVB&)service;
+ const eServiceReferenceDVB &ref = (const eServiceReferenceDVB&)handleGroup(service);
currentQueryTsidOnid = (ref.getTransportStreamID().get()<<16) | ref.getOriginalNetworkID().get();
return 0;
}
@@ -1732,7 +1756,7 @@ PyObject *eEPGCache::lookupEvent(ePyObject list, ePyObject convertFunc)
break;
}
}
- eServiceReference ref(PyString_AS_STRING(service));
+ eServiceReference ref(handleGroup(eServiceReference(PyString_AS_STRING(service))));
if (ref.type != eServiceReference::idDVB)
{
eDebug("service reference for epg query is not valid");
@@ -2110,7 +2134,7 @@ PyObject *eEPGCache::search(ePyObject arg)
if (descridx > -1)
{
int maxcount=maxmatches;
- eServiceReferenceDVB ref(refstr?refstr:"");
+ eServiceReferenceDVB ref(refstr?(const eServiceReferenceDVB&)handleGroup(eServiceReference(refstr)):eServiceReferenceDVB(""));
// ref is only valid in SIMILAR_BROADCASTING_SEARCH
// in this case we start searching with the base service
bool first = ref.valid() ? true : false;
diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py
index 8d728f0c..6a5605c7 100644
--- a/lib/python/Screens/ChannelSelection.py
+++ b/lib/python/Screens/ChannelSelection.py
@@ -1043,7 +1043,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
if ref is None or ref != nref:
self.session.nav.playService(nref)
self.saveRoot()
- self.saveChannel()
+ self.saveChannel(nref)
config.servicelist.lastmode.save()
self.addToHistory(nref)
@@ -1086,7 +1086,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
self.setRoot(root)
self.session.nav.playService(ref)
self.setCurrentSelection(ref)
- self.saveChannel()
+ self.saveChannel(ref)
def saveRoot(self):
path = ''
@@ -1123,8 +1123,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
return True
return False
- def saveChannel(self):
- ref = self.session.nav.getCurrentlyPlayingServiceReference()
+ def saveChannel(self, ref):
if ref is not None:
refstr = ref.toString()
else:
diff --git a/lib/python/Screens/EventView.py b/lib/python/Screens/EventView.py
index 8a684ead..82bca9fd 100644
--- a/lib/python/Screens/EventView.py
+++ b/lib/python/Screens/EventView.py
@@ -3,7 +3,7 @@ from Components.ActionMap import ActionMap
from Components.Button import Button
from Components.Label import Label
from Components.ScrollLabel import ScrollLabel
-from enigma import eServiceEventPtr, eEPGCache, eTimer
+from enigma import eServiceEventPtr, eEPGCache, eTimer, eServiceReference
from ServiceReference import ServiceReference
from RecordTimer import RecordTimerEntry, parseEvent
from TimerEntry import TimerEntry
@@ -14,7 +14,7 @@ class EventViewBase:
self.similarEPGCB = similarEPGCB
self.cbFunc = callback
self.currentService=Ref
- self.isRecording = len(Ref.ref.getPath())
+ self.isRecording = (not Ref.ref.flags & eServiceReference.isGroup) and len(Ref.ref.getPath())
self.event = Event
self["epg_description"] = ScrollLabel()
self["datetime"] = Label()
diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
index 3ec37c64..ed8149e4 100644
--- a/lib/python/Screens/InfoBarGenerics.py
+++ b/lib/python/Screens/InfoBarGenerics.py
@@ -425,7 +425,7 @@ class InfoBarEPG:
service = servicelist.getNext()
if not service.valid(): #check if end of list
break
- if service.flags: #ignore non playable services
+ if service.flags & (eServiceReference.isDirectory | eServiceReference.isMarker): #ignore non playable services
continue
services.append(ServiceReference(service))
return services
diff --git a/lib/python/Screens/PictureInPicture.py b/lib/python/Screens/PictureInPicture.py
index 5c496833..bd340d88 100644
--- a/lib/python/Screens/PictureInPicture.py
+++ b/lib/python/Screens/PictureInPicture.py
@@ -1,5 +1,5 @@
from Screens.Screen import Screen
-from enigma import ePoint, eSize, eServiceCenter
+from enigma import ePoint, eSize, eServiceCenter, getBestPlayableServiceReference, eServiceReference
from Components.VideoWindow import VideoWindow
from Components.config import config, ConfigPosition
@@ -46,14 +46,19 @@ class PictureInPicture(Screen):
return (self.instance.size().width(), self.instance.size().height())
def playService(self, service):
- self.pipservice = eServiceCenter.getInstance().play(service)
- if self.pipservice and not self.pipservice.setTarget(1):
- self.pipservice.start()
- self.currentService = service
- return True
+ if service and (service.flags & eServiceReference.isGroup):
+ ref = getBestPlayableServiceReference(service, eServiceReference())
else:
- self.pipservice = None
- return False
+ ref = service
+ if ref:
+ self.pipservice = eServiceCenter.getInstance().play(ref)
+ if self.pipservice and not self.pipservice.setTarget(1):
+ self.pipservice.start()
+ self.currentService = service
+ return True
+ else:
+ self.pipservice = None
+ return False
def getCurrentService(self):
return self.currentService
diff --git a/lib/python/Tools/XMLTools.py b/lib/python/Tools/XMLTools.py
index e248c80e..72b90388 100644
--- a/lib/python/Tools/XMLTools.py
+++ b/lib/python/Tools/XMLTools.py
@@ -24,4 +24,4 @@ def mergeText(nodelist):
return rc
def stringToXML(text):
- return text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace("'", '&apos;').replace('"', '&quot;')
+ return text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace("'", '&apos;').replace('"', '&quot;')
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index 7f17fc84..0a7a6715 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -192,6 +192,13 @@ int eStaticServiceDVBBouquetInformation::getLength(const eServiceReference &ref)
return -1;
}
+#include <lib/dvb/epgcache.h>
+
+RESULT eStaticServiceDVBBouquetInformation::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time)
+{
+ return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr);
+}
+
class eStaticServiceDVBPVRInformation: public iStaticServiceInformation
{
DECLARE_REF(eStaticServiceDVBPVRInformation);
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index e12e3e19..b3978a42 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -277,6 +277,7 @@ public:
RESULT getName(const eServiceReference &ref, std::string &name);
int getLength(const eServiceReference &ref);
int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+ RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
};
#endif