zaheer - in flumotion/trunk: . flumotion/component/consumers/disker

flumotion-commit at lists.fluendo.com flumotion-commit at lists.fluendo.com
Fri Jun 1 15:31:56 CEST 2007


Author: zaheer
Date: Fri Jun  1 15:31:49 2007
New Revision: 5084

Modified:
   flumotion/trunk/ChangeLog
   flumotion/trunk/flumotion/component/consumers/disker/disker.py
Log:
	* flumotion/component/consumers/disker/disker.py
	  (Disker._notify_caps_cb, Disker.configure_pipeline,
	  Disker.eventStarted, Disker.eventStopped):
	Port of disker to new scheduling code.



Modified: flumotion/trunk/ChangeLog
==============================================================================
--- flumotion/trunk/ChangeLog	(original)
+++ flumotion/trunk/ChangeLog	Fri Jun  1 15:31:49 2007
@@ -1,3 +1,10 @@
+2007-06-01  Zaheer Abbas Merali  <zaheerabbas at merali dot org>
+
+	* flumotion/component/consumers/disker/disker.py
+	  (Disker._notify_caps_cb, Disker.configure_pipeline,
+	  Disker.eventStarted, Disker.eventStopped):
+	Port of disker to new scheduling code.
+
 2007-05-30  Michael Smith <msmith at fluendo.com>
 
 	* flumotion/component/misc/httpfile/httpfile.py:

Modified: flumotion/trunk/flumotion/component/consumers/disker/disker.py
==============================================================================
--- flumotion/trunk/flumotion/component/consumers/disker/disker.py	(original)
+++ flumotion/trunk/flumotion/component/consumers/disker/disker.py	Fri Jun  1 15:31:49 2007
@@ -275,7 +275,8 @@
         self.caps = caps
 
         if new and self._recordAtStart:
-            reactor.callLater(0, self.change_filename)
+            reactor.callLater(0, self.change_filename, 
+                self._startFilenameTemplate)
 
     # callback for when a client is removed so we can figure out
     # errors
@@ -305,90 +306,36 @@
         self._recordAtStart = properties.get('start-recording', True)
         self._defaultFilenameTemplate = properties.get('filename', 
             '%s.%%Y%%m%%d-%%H%%M%%S' % self.getName())
+        self._startFilenameTemplaye = self._defaultFilenameTemplate
         icalfn = properties.get('ical-schedule')
-        if icalfn:
-            ical = open(icalfn, "rb").read()
-            self.parse_ical(ical)
-            self._recordAtStart = False
+        if HAS_ICAL:
+            from flumotion.component.base import scheduler
+            self.icalScheduler = scheduler.ICalScheduler(open(
+                icalfn, 'r'))
+            self.icalScheduler.subscribe(self.eventStarted,
+                self.eventStopped)
+            currentEvents = self.icalScheduler.getCurrentEvents()
+            if currentEvents:
+                self._startFilenameTemplate = currentEvents[0].content
+                self._recordAtStart = True
+            else:
+                self._recordAtStart = False
+        else:
+            self.warning("An ical file has been specified for "
+                         "scheduling but the necessary modules "
+                         "dateutil and/or icalendar are not installed")
 
         sink = self.get_element('fdsink')
         sink.get_pad('sink').connect('notify::caps', self._notify_caps_cb)
         # connect to client-removed so we can detect errors in file writing
         sink.connect('client-removed', self._client_removed_cb)
 
-    # add code that lets recordings be schedules
-    # TODO: resolve overlapping events
-    def schedule_recording(self, whenStart, whenEnd, recur=None, 
-                           filenameTemplate=None):
-        """
-        Sets a recording to start at a time in the future for a specified
-        duration.
-        @param whenStart time of when to start recording
-        @type whenStart datetime
-        @param whenEnd time of when to end recording
-        @type whenEnd datetime
-        @param recur recurrence rule
-        @type recur icalendar.props.vRecur
-        @param filenameTemplate strftime formatted string to decide filename
-        @type filenameTemplate string
-        """
-        now = datetime.now()
-
-        startRecurRule = None
-        endRecurRule = None
-
-        if recur:
-            self.debug("Have a recurrence rule, parsing")
-            # create dateutil.rrule from the recurrence rules
-            startRecurRule = rrule.rrulestr(recur.ical(), dtstart=whenStart)
-            endRecurRule = rrule.rrulestr(recur.ical(), dtstart=whenEnd) 
-            if now >= whenStart:
-                self.debug("Initial start before now (%r), finding new starts",
-                    whenStart)
-                whenStart = startRecurRule.after(now)
-                whenEnd = endRecurRule.after(now)
-                self.debug("New start is now %r", whenStart)
-
-        if now < whenStart:
-            start = whenStart - now
-            startSecs = start.days * 86400 + start.seconds
-            self.debug("scheduling a recording %d seconds away", startSecs)
-            reactor.callLater(startSecs, 
-                self.start_scheduled_recording, startRecurRule, whenStart,
-                filenameTemplate)
-            end = whenEnd - now
-            endSecs = end.days * 86400 + end.seconds
-            reactor.callLater(endSecs, 
-                self.stop_scheduled_recording, endRecurRule, whenEnd)
-        else:
-            self.warning("attempt to schedule in the past!")
-
-    def start_scheduled_recording(self, recurRule, when, filenameTemplate):
+    def eventStarted(self, event):
+        filenameTemplate = event.content
         self.change_filename(filenameTemplate)
-        if recurRule:
-            now = datetime.now()
-            nextTime = recurRule.after(when)
-            recurInterval = nextTime - now
-            self.debug("recurring start interval: %r", recurInterval)
-            recurIntervalSeconds = recurInterval.days * 86400 + \
-                recurInterval.seconds
-            self.debug("recurring start in %d seconds", recurIntervalSeconds)
-            reactor.callLater(recurIntervalSeconds, 
-                self.start_scheduled_recording,
-                recurRule, nextTime, filenameTemplate)
 
-    def stop_scheduled_recording(self, recurRule, when):
+    def eventStopped(self, event):
         self.stop_recording()
-        if recurRule:
-            now = datetime.now()
-            nextTime = recurRule.after(when)
-            recurInterval = nextTime - now
-            recurIntervalSeconds = recurInterval.days * 86400 + \
-                recurInterval.seconds
-            self.debug("recurring stop in %d seconds", recurIntervalSeconds)
-            reactor.callLater(recurIntervalSeconds, 
-                self.stop_scheduled_recording,
-                recurRule, nextTime)
 
     def parse_ical(self, icsStr):
         if HAS_ICAL:


More information about the flumotion-commit mailing list