timer: add name/description, factor out "parse from epg event", fix some cases where...
authorFelix Domke <tmbinc@elitedvb.net>
Sat, 17 Dec 2005 02:56:52 +0000 (02:56 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sat, 17 Dec 2005 02:56:52 +0000 (02:56 +0000)
17 files changed:
Navigation.py
RecordTimer.py
lib/dvb/metaparser.cpp
lib/dvb/metaparser.h
lib/python/Components/MovieList.py
lib/python/Components/TimerList.py
lib/python/Screens/EpgSelection.py
lib/python/Screens/EventView.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Screens/TimerEdit.py
lib/python/Screens/TimerEntry.py
lib/service/iservice.h
lib/service/service.cpp
lib/service/servicedvb.cpp
lib/service/servicedvb.h
lib/service/servicedvbrecord.cpp
lib/service/servicemp3.h

index 09daff34eb34de92e1f812e7703a1b12454b2eef..751aca897d3c7a4638eb0a03748d914a513557c1 100644 (file)
@@ -77,10 +77,10 @@ class Navigation:
        def pause(self, p):
                return self.pnav.pause(p)
        
        def pause(self, p):
                return self.pnav.pause(p)
        
-       def recordWithTimer(self, begin, end, ref, epg, description):
+       def recordWithTimer(self, ref, begin, end, name, description, eit):
                if isinstance(ref, eServiceReference):
                        ref = ServiceReference.ServiceReference(ref)
                if isinstance(ref, eServiceReference):
                        ref = ServiceReference.ServiceReference(ref)
-               entry = RecordTimer.RecordTimerEntry(begin, end, ref, epg, description)
+               entry = RecordTimer.RecordTimerEntry(ref, begin, end, name, description, eit)
                self.RecordTimer.record(entry)
                return entry
        
                self.RecordTimer.record(entry)
                return entry
        
index 85e9d172c3ad840057e8c3937705565586e91a7b..f1b33592d616964a313983f8752b85d95c012bd4 100644 (file)
@@ -12,21 +12,34 @@ import NavigationInstance
 from Tools.XMLTools import elementsWithTag
 from ServiceReference import ServiceReference
 
 from Tools.XMLTools import elementsWithTag
 from ServiceReference import ServiceReference
 
+# ok, for descriptions etc we have:
+# service reference  (to get the service name)
+# name               (title)
+# description        (description)
+# event data         (ONLY for time adjustments etc.)
+
+
+# parses an event, and gives out a (begin, end, name, duration, eit)-tuple.
+def parseEvent(ev):
+       name = ev.getEventName()
+       description = ev.getShortDescription()
+       begin = ev.getBeginTime()
+       end = begin + ev.getDuration()
+       eit = None
+       return (begin, end, name, description, eit)
+
 class RecordTimerEntry(timer.TimerEntry):
 class RecordTimerEntry(timer.TimerEntry):
-       def __init__(self, begin, end, serviceref, epg, description):
+       def __init__(self, serviceref, begin, end, name, description, eit):
                timer.TimerEntry.__init__(self, int(begin), int(end))
                
                assert isinstance(serviceref, ServiceReference)
                
                self.service_ref = serviceref
                
                timer.TimerEntry.__init__(self, int(begin), int(end))
                
                assert isinstance(serviceref, ServiceReference)
                
                self.service_ref = serviceref
                
-               if epg is not None:
-                       self.epg_data = ""
-                       #str(epg.m_event_name)
-               else:
-                       self.epg_data = ""
+               self.eit = eit
                
                self.dontSave = False
                
                self.dontSave = False
+               self.name = name
                self.description = description
                self.timer = None
                self.record_service = None
                self.description = description
                self.timer = None
                self.record_service = None
@@ -37,26 +50,15 @@ class RecordTimerEntry(timer.TimerEntry):
                service_name = self.service_ref.getServiceName()
 #              begin_date = datetime.fromtimestamp(begin).strf...
                begin_date = ""
                service_name = self.service_ref.getServiceName()
 #              begin_date = datetime.fromtimestamp(begin).strf...
                begin_date = ""
-               if self.epg_data is not None:
-                       description = " - " + self.epg_data
-               else:
-                       description = ""
                
                
-               print "begin_date: " + str(begin_date)
-               print "service_name: " + str(service_name)
-               print "description: " + str(description)
+               print "begin_date: ", begin_date
+               print "service_name: ", service_name
+               print "name:", self.name
+               print "description: ", self.description
+
                self.Filename = Directories.getRecordingFilename(service_name)
                #begin_date + " - " + service_name + description)
                
                self.Filename = Directories.getRecordingFilename(service_name)
                #begin_date + " - " + service_name + description)
                
-               # build filename from epg
-               
-               # pff das geht noch nicht...
-#              if epg == None:
-#                      self.Filename = "recording.ts"
-#              else:
-#                      self.Filename = "record_" + str(epg.m_event_name) + ".ts"
-#              
-#              print "------------ record filename: %s" % (self.Filename)
        
        def tryPrepare(self):
                self.calculateFilename()
        
        def tryPrepare(self):
                self.calculateFilename()
@@ -70,7 +72,9 @@ class RecordTimerEntry(timer.TimerEntry):
 
                        f = open(self.Filename + ".ts.meta", "w")
                        f.write(str(self.service_ref) + "\n")
 
                        f = open(self.Filename + ".ts.meta", "w")
                        f.write(str(self.service_ref) + "\n")
-                       f.write(self.epg_data + "\n")
+                       f.write(self.name + "\n")
+                       f.write(self.description + "\n")
+                       f.write(str(self.begin) + "\n")
                        del f
                        return True
 
                        del f
                        return True
 
@@ -116,11 +120,12 @@ def createTimer(xml):
        begin = int(xml.getAttribute("begin"))
        end = int(xml.getAttribute("end"))
        serviceref = ServiceReference(str(xml.getAttribute("serviceref")))
        begin = int(xml.getAttribute("begin"))
        end = int(xml.getAttribute("end"))
        serviceref = ServiceReference(str(xml.getAttribute("serviceref")))
-       description = xml.getAttribute("description")
-       repeated = xml.getAttribute("repeated")
-       epgdata = xml.getAttribute("epgdata")
-       #filename = xml.getAttribute("filename")
-       entry = RecordTimerEntry(begin, end, serviceref, epgdata, description)
+       description = xml.getAttribute("description").encode("utf-8")
+       repeated = xml.getAttribute("repeated").encode("utf-8")
+       eit = xml.getAttribute("eit").encode("utf-8")
+       name = xml.getAttribute("name").encode("utf-8")
+       #filename = xml.getAttribute("filename").encode("utf-8")
+       entry = RecordTimerEntry(serviceref, begin, end, name, description, eit)
        entry.repeated = int(repeated)
        return entry
 
        entry.repeated = int(repeated)
        return entry
 
@@ -132,7 +137,7 @@ class RecordTimer(timer.Timer):
                
                try:
                        self.loadTimer()
                
                try:
                        self.loadTimer()
-               except:
+               except IOError:
                        print "unable to load timers from file!"
                        
        def isRecording(self):
                        print "unable to load timers from file!"
                        
        def isRecording(self):
@@ -168,14 +173,16 @@ class RecordTimer(timer.Timer):
                        t.setAttribute("end", str(timer.end))
                        t.setAttribute("serviceref", str(timer.service_ref))
                        t.setAttribute("repeated", str(timer.repeated))                 
                        t.setAttribute("end", str(timer.end))
                        t.setAttribute("serviceref", str(timer.service_ref))
                        t.setAttribute("repeated", str(timer.repeated))                 
-                       #t.setAttribute("epgdata", timer.)
-                       t.setAttribute("description", "no description") # timer.description)
+                       t.setAttribute("name", timer.name)
+                       t.setAttribute("description", timer.description)
+                       t.setAttribute("eit", str(timer.eit))
+                       
                        root_element.appendChild(t)
                        t = doc.createTextNode("\n")
                        root_element.appendChild(t)
 
                file = open(self.Filename, "w")
                        root_element.appendChild(t)
                        t = doc.createTextNode("\n")
                        root_element.appendChild(t)
 
                file = open(self.Filename, "w")
-               doc.writexml(codecs.getwriter('UTF-8')(file))
+               doc.writexml(file)
                file.write("\n")
                file.close()
        
                file.write("\n")
                file.close()
        
@@ -189,8 +196,6 @@ class RecordTimer(timer.Timer):
                
                entry.repeated = False
 
                
                entry.repeated = False
 
-               entry.repeated = False
-
                if entry.state == timer.TimerEntry.StateRunning:
                        print "remove running timer."
                        entry.end = time.time()
                if entry.state == timer.TimerEntry.StateRunning:
                        print "remove running timer."
                        entry.end = time.time()
index 90b02c0670c69d37431e7fad76b02b16cbfaee2a..5c098150e62a1a672accc6325f7416b017297ad9 100644 (file)
@@ -34,6 +34,9 @@ int eDVBMetaParser::parseFile(const std::string &tsname)
                case 2:
                        m_description = line;
                        break;
                case 2:
                        m_description = line;
                        break;
+               case 3:
+                       m_time_create = atoi(line);
+                       break;
                default:
                        break;
                }
                default:
                        break;
                }
index 7e2b67794163c329053a1f13a4b0c7b27298ae5e..60329ace640379ca23942bf29528a9867842bee0 100644 (file)
@@ -11,6 +11,7 @@ public:
 
        eServiceReferenceDVB m_ref;
        std::string m_name, m_description;
 
        eServiceReferenceDVB m_ref;
        std::string m_name, m_description;
+       int m_time_create;
 };
 
 #endif
 };
 
 #endif
index 9ab58704b712173a3a3c36b20f0793c28cf0bb4f..2e010ab6964897ad640c62739ddc5e2db1591702 100644 (file)
@@ -1,7 +1,8 @@
 from HTMLComponent import *
 from GUIComponent import *
 from HTMLComponent import *
 from GUIComponent import *
+from Tools.FuzzyDate import FuzzyTime
 
 
-from enigma import eListboxPythonMultiContent, eListbox, gFont
+from enigma import eListboxPythonMultiContent, eListbox, gFont, iServiceInformation
 
 from enigma import eServiceReference, eServiceCenter, \
        eServiceCenterPtr, iListableServicePtr, \
 
 from enigma import eServiceReference, eServiceCenter, \
        eServiceCenterPtr, iListableServicePtr, \
@@ -38,8 +39,17 @@ def MovieListEntry(serviceref, serviceHandler):
                len = "?:??"
        
        res.append((0, 0, 400, 30, 0, RT_HALIGN_LEFT, info.getName(serviceref)))
                len = "?:??"
        
        res.append((0, 0, 400, 30, 0, RT_HALIGN_LEFT, info.getName(serviceref)))
-       res.append((0, 30, 200, 20, 1, RT_HALIGN_LEFT, "Toller Film"))
-       res.append((0, 50, 200, 20, 1, RT_HALIGN_LEFT, "Aufgenommen: irgendwann"))
+       
+       description = info.getInfoString(serviceref, iServiceInformation.sDescription)
+       begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate)
+       
+       begin_string = ""
+       if begin > 0:
+               t = FuzzyTime(begin)
+               begin_string = t[0] + ", " + t[1]
+       
+       res.append((0, 30, 200, 20, 1, RT_HALIGN_LEFT, description))
+       res.append((0, 50, 200, 20, 1, RT_HALIGN_LEFT, begin_string))
        res.append((200, 50, 200, 20, 1, RT_HALIGN_RIGHT, len))
        
        return res
        res.append((200, 50, 200, 20, 1, RT_HALIGN_RIGHT, len))
        
        return res
index b1e8bf4597a1143326615ae5a8cb8f3798e0126c..f4176fadef0f738fc60e202cf56f8339bff9142d 100644 (file)
@@ -26,9 +26,6 @@ RT_WRAP = 32
 def TimerEntryComponent(timer, processed):
        res = [ timer ]
        
 def TimerEntryComponent(timer, processed):
        res = [ timer ]
        
-       print time.strftime("%c", time.localtime(timer.begin))
-       print time.strftime("%c", time.localtime(timer.end))
-               
        res.append((0, 0, 400, 30, 0, RT_HALIGN_LEFT, timer.service_ref.getServiceName()))
        repeatedtext = ""
        days = [ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" ]
        res.append((0, 0, 400, 30, 0, RT_HALIGN_LEFT, timer.service_ref.getServiceName()))
        repeatedtext = ""
        days = [ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" ]
@@ -46,7 +43,7 @@ def TimerEntryComponent(timer, processed):
        else:
                res.append((0, 30, 200, 20, 1, RT_HALIGN_LEFT, repeatedtext + ("%s, %s ... %s" % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:]))))
 
        else:
                res.append((0, 30, 200, 20, 1, RT_HALIGN_LEFT, repeatedtext + ("%s, %s ... %s" % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:]))))
 
-       res.append((300, 0, 200, 20, 1, RT_HALIGN_RIGHT, timer.description))
+       res.append((300, 0, 200, 20, 1, RT_HALIGN_RIGHT, timer.name))
        
        if not processed:
                if timer.state == TimerEntry.StateWait:
        
        if not processed:
                if timer.state == TimerEntry.StateWait:
index db8be2e1aa8aafe2041481cd8af2cefd66ead4ee..4d288b0047ec8a6fb0aab1b5cb86aa20fe520723 100644 (file)
@@ -5,7 +5,7 @@ from Components.ActionMap import ActionMap
 from Screens.EventView import EventView
 from enigma import eServiceReference, eServiceEventPtr
 from Screens.FixedMenu import FixedMenu
 from Screens.EventView import EventView
 from enigma import eServiceReference, eServiceEventPtr
 from Screens.FixedMenu import FixedMenu
-from RecordTimer import RecordTimerEntry
+from RecordTimer import RecordTimerEntry, parseEvent
 from TimerEdit import TimerEditList
 from TimerEntry import TimerEntry
 from ServiceReference import ServiceReference
 from TimerEdit import TimerEditList
 from TimerEntry import TimerEntry
 from ServiceReference import ServiceReference
@@ -49,24 +49,15 @@ class EPGSelection(Screen):
                self.session.open(EventView, event, self.currentService, self.eventViewCallback)
        
        def timerAdd(self):
                self.session.open(EventView, event, self.currentService, self.eventViewCallback)
        
        def timerAdd(self):
-               epg = self["list"].getCurrent()
+               event = self["list"].getCurrent()
+               
+               if event is None:
+                       return
                
                
-               if (epg == None):
-                       description = "unknown event"
-               else:
-                       description = epg.getEventName()
-                       # FIXME we need a timestamp here:
-                       begin = epg.getBeginTime()
-                       
-                       print begin
-                       print epg.getDuration()
-                       end = begin + epg.getDuration()
-
-
                # FIXME only works if already playing a service
                serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference())
                
                # FIXME only works if already playing a service
                serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference())
                
-               newEntry = RecordTimerEntry(begin, end, serviceref, epg, description)
+               newEntry = RecordTimerEntry(serviceref, *parseEvent(event))
                self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry)
        
        def timerEditFinished(self, answer):
                self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry)
        
        def timerEditFinished(self, answer):
index 79d548af5e002e2087357b5e9a614228dba5941c..e3585b6709e17a4a5aa932a306e533d452b88aeb 100644 (file)
@@ -4,7 +4,7 @@ from Components.Label import Label
 from Components.ScrollLabel import ScrollLabel
 from enigma import eServiceEventPtr
 from ServiceReference import ServiceReference
 from Components.ScrollLabel import ScrollLabel
 from enigma import eServiceEventPtr
 from ServiceReference import ServiceReference
-from RecordTimer import RecordTimerEntry
+from RecordTimer import RecordTimerEntry, parseEvent
 from TimerEntry import TimerEntry
 
 class EventView(Screen):
 from TimerEntry import TimerEntry
 
 class EventView(Screen):
@@ -38,24 +38,7 @@ class EventView(Screen):
                        self.cbFunc(self.setEvent, +1)
                        
        def timerAdd(self):
                        self.cbFunc(self.setEvent, +1)
                        
        def timerAdd(self):
-               epg = self.event
-               
-               if (epg == None):
-                       description = "unknown event"
-               else:
-                       description = epg.getEventName()
-                       # FIXME we need a timestamp here:
-                       begin = epg.getBeginTime()
-                       
-                       print begin
-                       print epg.getDuration()
-                       end = begin + epg.getDuration()
-
-
-               # FIXME only works if already playing a service
-               serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference())
-               
-               newEntry = RecordTimerEntry(begin, end, serviceref, epg, description)
+               newEntry = RecordTimerEntry(self.currentService, *parseEvent(self.event))
                self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry)
 
        def timerEditFinished(self, answer):
                self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry)
 
        def timerEditFinished(self, answer):
index efcb0dad7255060cbddfe9898873bc63ea6e7b64..77c4a41581447ab7aea40b6948a2af4bc49496d6 100644 (file)
@@ -562,6 +562,8 @@ class InfoBarPVR:
                        }
                self.setSeekState(lookup[self.seekstate]);
 
                        }
                self.setSeekState(lookup[self.seekstate]);
 
+from RecordTimer import parseEvent
+
 class InfoBarInstantRecord:
        """Instant Record - handles the instantRecord action in order to 
        start/stop instant records"""
 class InfoBarInstantRecord:
        """Instant Record - handles the instantRecord action in order to 
        start/stop instant records"""
@@ -582,19 +584,25 @@ class InfoBarInstantRecord:
                        
        def startInstantRecording(self):
                serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
                        
        def startInstantRecording(self):
                serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
-                       
+               
                # try to get event info
                # try to get event info
-               epg = None
+               event = None
                try:
                        service = self.session.nav.getCurrentService()
                        info = service.info()
                        ev = info.getEvent(0)
                try:
                        service = self.session.nav.getCurrentService()
                        info = service.info()
                        ev = info.getEvent(0)
-                       epg = ev
+                       event = ev
                except:
                        pass
                
                except:
                        pass
                
+               if event is not None:
+                       data = parseEvent(event)
+                       data = (data[0], data[1] + 3600 * 10, data[2], data[3], data[4])
+               else:
+                       data = (time.time(), time.time() + 3600 * 10, "instant record", "", None)
+               
                # fix me, description. 
                # fix me, description. 
-               self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600 * 10, serviceref, epg, "instant record")
+               self.recording = self.session.nav.recordWithTimer(serviceref, *data)
                self.recording.dontSave = True
                
                #self["BlinkingPoint"].setConnect(lambda: self.recording.isRunning())
                self.recording.dontSave = True
                
                #self["BlinkingPoint"].setConnect(lambda: self.recording.isRunning())
index 5233da9b759eb099ab5c05e821053a82091b5a94..7373391349ba42790de80b3fa20258d75100955c 100644 (file)
@@ -6,7 +6,7 @@ from Components.Label import Label
 from Components.Button import Button
 from Components.TextInput import TextInput
 from TimerEntry import TimerEntry
 from Components.Button import Button
 from Components.TextInput import TextInput
 from TimerEntry import TimerEntry
-from RecordTimer import RecordTimerEntry
+from RecordTimer import RecordTimerEntry, parseEvent
 from time import *
 from ServiceReference import ServiceReference
 from Components.config import *
 from time import *
 from ServiceReference import ServiceReference
 from Components.config import *
@@ -54,34 +54,22 @@ class TimerEditList(Screen):
                self["timerlist"].invalidate()
        
        def addCurrentTimer(self):
                self["timerlist"].invalidate()
        
        def addCurrentTimer(self):
-               begin = time()
-               end = time() + 60
-               
-               epg = None
-               try:
-                       service = self.session.nav.getCurrentService()
+               event = None
+               service = self.session.nav.getCurrentService()
+               if service is not None:
                        info = service.info()
                        info = service.info()
-                       ev = info.getEvent(0)
-                       epg = ev
-               except:
-                       pass
-               
-               if (epg == None):
-                       description = "unknown event"
-               else:
-                       description = ev.getEventName()
-                       # FIXME we need a timestamp here:
-                       begin = ev.getBeginTime()
-                       
-                       print begin
-                       print ev.getDuration()
-                       end = begin + ev.getDuration()
-
+                       if info is not None:
+                               event = info.getEvent(0)
 
                # FIXME only works if already playing a service
                serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference())
                
 
                # FIXME only works if already playing a service
                serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference())
                
-               self.addTimer(RecordTimerEntry(begin, end, serviceref, epg, description))
+               if event is None:       
+                       data = (int(time()), int(time() + 60), "unknown event", "", None)
+               else:
+                       data = parseEvent(event)
+
+               self.addTimer(RecordTimerEntry(serviceref, *data))
                
        def addTimer(self, timer):
                self.session.openWithCallback(self.finishedAdd, TimerEntry, timer)
                
        def addTimer(self, timer):
                self.session.openWithCallback(self.finishedAdd, TimerEntry, timer)
@@ -103,4 +91,4 @@ class TimerEditList(Screen):
 
        def leave(self):
                self.session.nav.RecordTimer.saveTimer()
 
        def leave(self):
                self.session.nav.RecordTimer.saveTimer()
-               self.close()
\ No newline at end of file
+               self.close()
index a7cbad9b9bf9ecd5aa08d68d0df1656cf5ec0b5c..966bbab485b8a29ee12f88933ef3fb7ecd07b9b8 100644 (file)
@@ -78,6 +78,7 @@ class TimerEntry(Screen):
                                repeated = 0
                        
                        config.timerentry.type = configElement_nonSave("config.timerentry.type", configSelection, type, (_("once"), _("repeated")))
                                repeated = 0
                        
                        config.timerentry.type = configElement_nonSave("config.timerentry.type", configSelection, type, (_("once"), _("repeated")))
+                       config.timerentry.name = configElement_nonSave("config.timerentry.name", configText, self.timer.name, (configText.extendableSize, self.keyRightCallback))
                        config.timerentry.description = configElement_nonSave("config.timerentry.description", configText, self.timer.description, (configText.extendableSize, self.keyRightCallback))
 
                        config.timerentry.repeated = configElement_nonSave("config.timerentry.repeated", configSelection, repeated, (_("daily"), _("weekly"), _("Mon-Fri"), _("user defined")))
                        config.timerentry.description = configElement_nonSave("config.timerentry.description", configText, self.timer.description, (configText.extendableSize, self.keyRightCallback))
 
                        config.timerentry.repeated = configElement_nonSave("config.timerentry.repeated", configSelection, repeated, (_("daily"), _("weekly"), _("Mon-Fri"), _("user defined")))
@@ -126,6 +127,7 @@ class TimerEntry(Screen):
 
        def createSetup(self):
                self.list = []
 
        def createSetup(self):
                self.list = []
+               self.list.append(getConfigListEntry(_("Name"), config.timerentry.name))
                self.list.append(getConfigListEntry(_("Description"), config.timerentry.description))
                self.timerTypeEntry = getConfigListEntry(_("Timer Type"), config.timerentry.type)
                self.list.append(self.timerTypeEntry)
                self.list.append(getConfigListEntry(_("Description"), config.timerentry.description))
                self.timerTypeEntry = getConfigListEntry(_("Timer Type"), config.timerentry.type)
                self.list.append(self.timerTypeEntry)
@@ -227,6 +229,7 @@ class TimerEntry(Screen):
                return int(mktime(dt.timetuple()))
 
        def keyGo(self):
                return int(mktime(dt.timetuple()))
 
        def keyGo(self):
+               self.timer.name = config.timerentry.name.value
                self.timer.description = config.timerentry.description.value
                self.timer.resetRepeated()
                
                self.timer.description = config.timerentry.description.value
                self.timer.resetRepeated()
                
index 962e4a95399978909156f11758be6a5b8487868e..285063ec72de05b65f1d7bfb4f4e98c1be079089 100644 (file)
@@ -180,6 +180,9 @@ public:
        virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time=0);
                // returns true when not implemented
        virtual bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
        virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time=0);
                // returns true when not implemented
        virtual bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+
+       virtual int getInfo(const eServiceReference &ref, int w);
+       virtual std::string getInfoString(const eServiceReference &ref,int w);
 };
 
 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
 };
 
 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
@@ -216,6 +219,9 @@ public:
                sTSID,
                sNamespace,
                sProvider,
                sTSID,
                sNamespace,
                sProvider,
+               
+               sDescription,
+               sTimeCreate,    // unix time or string
        };
        enum { resNA = -1, resIsString = -2 };
 
        };
        enum { resNA = -1, resIsString = -2 };
 
@@ -293,6 +299,15 @@ public:
 
 TEMPLATE_TYPEDEF(ePtr<iSubserviceList>, iSubserviceListPtr);
 
 
 TEMPLATE_TYPEDEF(ePtr<iSubserviceList>, iSubserviceListPtr);
 
+class iTimeshiftService: public iObject
+{
+public:
+       virtual RESULT startTimeshift()=0;
+       virtual RESULT stopTimeshift()=0;
+};
+
+TEMPLATE_TYPEDEF(ePtr<iTimeshiftService>, iTimeshiftServicePtr);
+
 class iPlayableService: public iObject
 {
        friend class iServiceHandler;
 class iPlayableService: public iObject
 {
        friend class iServiceHandler;
@@ -316,6 +331,7 @@ public:
        virtual SWIG_VOID(RESULT) audioTracks(ePtr<iAudioTrackSelection> &SWIG_OUTPUT)=0;
        virtual SWIG_VOID(RESULT) subServices(ePtr<iSubserviceList> &SWIG_OUTPUT)=0;
        virtual SWIG_VOID(RESULT) frontendStatusInfo(ePtr<iFrontendStatusInformation> &SWIG_OUTPUT)=0;
        virtual SWIG_VOID(RESULT) audioTracks(ePtr<iAudioTrackSelection> &SWIG_OUTPUT)=0;
        virtual SWIG_VOID(RESULT) subServices(ePtr<iSubserviceList> &SWIG_OUTPUT)=0;
        virtual SWIG_VOID(RESULT) frontendStatusInfo(ePtr<iFrontendStatusInformation> &SWIG_OUTPUT)=0;
+       virtual SWIG_VOID(RESULT) timeshift(ePtr<iTimeshiftService> &SWIG_OUTPUT)=0;
 };
 
 TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
 };
 
 TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
index cc8a93151a3596e96ac9cfa8de37bedd99c3f762..150a0cd3298ca47c18500a9d77b084aa7cea973c 100644 (file)
@@ -155,6 +155,16 @@ RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
        return -1;
 }
 
        return -1;
 }
 
+int iStaticServiceInformation::getInfo(const eServiceReference &ref, int w)
+{
+       return -1;
+}
+
+std::string iStaticServiceInformation::getInfoString(const eServiceReference &ref, int w)
+{
+       return "";
+}
+
 int iServiceInformation::getInfo(int w)
 {
        return -1;
 int iServiceInformation::getInfo(int w)
 {
        return -1;
index a9d235ec9bac1e5876ff6515f02f724b241181d4..790bfca62bb4feef05b43aaff98ed7d0760541b7 100644 (file)
@@ -127,6 +127,9 @@ public:
        eStaticServiceDVBPVRInformation(const eServiceReference &ref);
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
        eStaticServiceDVBPVRInformation(const eServiceReference &ref);
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
+       
+       int getInfo(const eServiceReference &ref, int w);
+       std::string getInfoString(const eServiceReference &ref,int w);
 };
 
 DEFINE_REF(eStaticServiceDVBPVRInformation);
 };
 
 DEFINE_REF(eStaticServiceDVBPVRInformation);
@@ -160,7 +163,32 @@ int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref)
        return len / 90000;
 }
 
        return len / 90000;
 }
 
+int eStaticServiceDVBPVRInformation::getInfo(const eServiceReference &ref, int w)
+{
+       switch (w)
+       {
+       case iServiceInformation::sDescription:
+               return iServiceInformation::resIsString;
+       case iServiceInformation::sTimeCreate:
+               if (m_parser.m_time_create)
+                       return m_parser.m_time_create;
+               else
+                       return iServiceInformation::resNA;
+       default:
+               return iServiceInformation::resNA;
+       }
+}
 
 
+std::string eStaticServiceDVBPVRInformation::getInfoString(const eServiceReference &ref,int w)
+{
+       switch (w)
+       {
+       case iServiceInformation::sDescription:
+               return m_parser.m_description;
+       default:
+               return "";
+       }
+}
 
 class eDVBPVRServiceOfflineOperations: public iServiceOfflineOperations
 {
 
 class eDVBPVRServiceOfflineOperations: public iServiceOfflineOperations
 {
@@ -459,6 +487,7 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv
        m_reference(ref), m_dvb_service(service), m_service_handler(0), m_is_paused(0)
 {
        m_is_pvr = !ref.path.empty();
        m_reference(ref), m_dvb_service(service), m_service_handler(0), m_is_paused(0)
 {
        m_is_pvr = !ref.path.empty();
+       m_timeshift_enabled = 0;
        
        CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
        CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent);
        
        CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
        CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent);
@@ -619,14 +648,14 @@ RESULT eDVBServicePlay::connectEvent(const Slot2<void,iPlayableService*,int> &ev
 
 RESULT eDVBServicePlay::pause(ePtr<iPauseableService> &ptr)
 {
 
 RESULT eDVBServicePlay::pause(ePtr<iPauseableService> &ptr)
 {
-       if (m_is_pvr)
+       if (!m_is_pvr)
        {
        {
-               ptr = this;
-               return 0;
+               ptr = 0;
+               return -1;
        }
 
        }
 
-       ptr = 0;
-       return -1;
+       ptr = this;
+       return 0;
 }
 
 RESULT eDVBServicePlay::setSlowMotion(int ratio)
 }
 
 RESULT eDVBServicePlay::setSlowMotion(int ratio)
@@ -753,6 +782,17 @@ RESULT eDVBServicePlay::subServices(ePtr<iSubserviceList> &ptr)
        return 0;
 }
 
        return 0;
 }
 
+RESULT eDVBServicePlay::timeshift(ePtr<iTimeshiftService> &ptr)
+{
+       if (m_timeshift_enabled || !m_is_pvr)
+       {
+               ptr = this;
+               return 0;
+       }
+       ptr = 0;
+       return -1;
+}
+
 RESULT eDVBServicePlay::getName(std::string &name)
 {
        if (m_dvb_service)
 RESULT eDVBServicePlay::getName(std::string &name)
 {
        if (m_dvb_service)
@@ -939,6 +979,23 @@ RESULT eDVBServicePlay::getSubservice(eServiceReference &sub, unsigned int n)
        return -1;
 }
 
        return -1;
 }
 
+RESULT eDVBServicePlay::startTimeshift()
+{
+       if (m_timeshift_enabled)
+               return -1;
+       eDebug("TIMESHIFT - start!");
+       return 0;
+}
+
+RESULT eDVBServicePlay::stopTimeshift()
+{
+       if (!m_timeshift_enabled)
+               return -1;
+       m_timeshift_enabled = 0;
+       eDebug("timeshift disabled");
+       return 0;
+}
+
 DEFINE_REF(eDVBServicePlay)
 
 eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
 DEFINE_REF(eDVBServicePlay)
 
 eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
index 6b93469dc837cbf15a0b77ea2fb51c11e775bf22..e99faffd510db0c348ae99b0ecd01b77170f09ad 100644 (file)
@@ -55,7 +55,7 @@ private:
 class eDVBServicePlay: public iPlayableService, public iPauseableService, 
                public iSeekableService, public Object, public iServiceInformation, 
                public iAudioTrackSelection, public iFrontendStatusInformation,
 class eDVBServicePlay: public iPlayableService, public iPauseableService, 
                public iSeekableService, public Object, public iServiceInformation, 
                public iAudioTrackSelection, public iFrontendStatusInformation,
-               public iSubserviceList
+               public iSubserviceList, public iTimeshiftService
 {
 DECLARE_REF(eDVBServicePlay);
 public:
 {
 DECLARE_REF(eDVBServicePlay);
 public:
@@ -71,6 +71,7 @@ public:
        RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
        RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr);
        RESULT subServices(ePtr<iSubserviceList> &ptr);
        RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
        RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr);
        RESULT subServices(ePtr<iSubserviceList> &ptr);
+       RESULT timeshift(ePtr<iTimeshiftService> &ptr);
 
                // iPauseableService
        RESULT pause();
 
                // iPauseableService
        RESULT pause();
@@ -102,6 +103,10 @@ public:
        int getNumberOfSubservices();
        RESULT getSubservice(eServiceReference &subservice, unsigned int n);
 
        int getNumberOfSubservices();
        RESULT getSubservice(eServiceReference &subservice, unsigned int n);
 
+               // iTimeshiftService
+       RESULT startTimeshift();
+       RESULT stopTimeshift();
+
 private:
        friend class eServiceFactoryDVB;
        eServiceReference m_reference;
 private:
        friend class eServiceFactoryDVB;
        eServiceReference m_reference;
@@ -120,7 +125,7 @@ private:
        void serviceEvent(int event);
        Signal2<void,iPlayableService*,int> m_event;
        
        void serviceEvent(int event);
        Signal2<void,iPlayableService*,int> m_event;
        
-       int m_is_pvr, m_is_paused;
+       int m_is_pvr, m_is_paused, m_timeshift_enabled;
        
        int m_current_audio_stream;
        int selectAudioStream(int n);
        
        int m_current_audio_stream;
        int selectAudioStream(int n);
index 2f1dea0e38d9d452fb0a6a4fa59c712af168424e..f05a35a398c2900a2006a187010c318b9936a21f 100644 (file)
@@ -20,6 +20,33 @@ void eDVBServiceRecord::serviceEvent(int event)
        case eDVBServicePMTHandler::eventTuned:
        {
                eDebug("tuned..");
        case eDVBServicePMTHandler::eventTuned:
        {
                eDebug("tuned..");
+               if (!m_record)
+               {
+                       eDebug("Recording to %s...", m_filename.c_str());
+                       ::remove(m_filename.c_str());
+                       int fd = ::open(m_filename.c_str(), O_WRONLY|O_CREAT, 0644);
+                       if (fd == -1)
+                       {
+                               eDebug("eDVBServiceRecord - can't open hardcoded recording file!");
+                               return;
+//                             return -1;
+                       }
+                       ePtr<iDVBDemux> demux;
+                       if (m_service_handler.getDemux(demux))
+                       {
+                               eDebug("eDVBServiceRecord - NO DEMUX available!");
+                               return;
+//                             return -2;
+                       }
+                       demux->createTSRecorder(m_record);
+                       if (!m_record)
+                       {
+                               eDebug("eDVBServiceRecord - no ts recorder available.");
+                               return;
+//                             return -3;
+                       }
+                       m_record->setTargetFD(fd);
+               }
                break;
        }
        case eDVBServicePMTHandler::eventNewProgramInfo:
                break;
        }
        case eDVBServicePMTHandler::eventNewProgramInfo:
@@ -38,7 +65,7 @@ RESULT eDVBServiceRecord::prepare(const char *filename)
 {
        m_filename = filename;
        if (m_state == stateIdle)
 {
        m_filename = filename;
        if (m_state == stateIdle)
-               return m_service_handler.tune(m_ref);
+               doPrepare();
        else
                return -1;
 }
        else
                return -1;
 }
@@ -74,33 +101,9 @@ int eDVBServiceRecord::doPrepare()
                /* allocate a ts recorder if we don't already have one. */
        if (m_state == stateIdle)
        {
                /* allocate a ts recorder if we don't already have one. */
        if (m_state == stateIdle)
        {
-               eDebug("Recording to %s...", m_filename.c_str());
-               ::remove(m_filename.c_str());
-               int fd = ::open(m_filename.c_str(), O_WRONLY|O_CREAT, 0644);
-               if (fd == -1)
-               {
-                       eDebug("eDVBServiceRecord - can't open hardcoded recording file!");
-                       return -1;
-               }
-               ePtr<iDVBDemux> demux;
-               if (m_service_handler.getDemux(demux))
-               {
-                       eDebug("eDVBServiceRecord - NO DEMUX available!");
-                       return -2;
-               }
-               demux->createTSRecorder(m_record);
-               if (!m_record)
-               {
-                       eDebug("eDVBServiceRecord - no ts recorder available.");
-                       return -3;
-               }
-               m_record->setTargetFD(fd);
                m_pids_active.clear();
                m_state = statePrepared;
                m_pids_active.clear();
                m_state = statePrepared;
-       } else if ((m_state == statePrepared) || (m_state == stateRecording))
-       {
-                       /* when we're already recording, we already have a recorder allocated. */
-               assert(m_record);
+               m_service_handler.tune(m_ref);
        }
        return 0;
 }
        }
        return 0;
 }
@@ -111,6 +114,11 @@ int eDVBServiceRecord::doRecord()
        if (err)
                return err;
        
        if (err)
                return err;
        
+       if (!m_record)
+       {
+               eDebug("demux not available (tune failed?). cannot record.");
+               return -1;
+       }
        eDebug("starting recording..");
        
        eDVBServicePMTHandler::program program;
        eDebug("starting recording..");
        
        eDVBServicePMTHandler::program program;
index ac174c4121449c5ed90240137308c1761f83c9ef..c08278b835a95960e7e242c6487653ed39ee74aa 100644 (file)
@@ -64,7 +64,8 @@ public:
        RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr) { ptr = 0; return -1; }
        RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr) { ptr = 0; return -1; }
        RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
        RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr) { ptr = 0; return -1; }
        RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr) { ptr = 0; return -1; }
        RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
-
+       RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
+       
                // iPausableService
        RESULT pause();
        RESULT unpause();
                // iPausableService
        RESULT pause();
        RESULT unpause();