Author: duncan
Date: Mon Jan 29 21:58:52 2007
New Revision: 9098

Modified:
   branches/rel-1/freevo/src/helpers/recordserver.py

Log:
[ 1645606 ] ivtv_record error when trying to record
Patch from Justin Wetherell applied.
The recent patch don't conform to the freevo standard 4 space indent, so some 
of these have been corrected.


Modified: branches/rel-1/freevo/src/helpers/recordserver.py
==============================================================================
--- branches/rel-1/freevo/src/helpers/recordserver.py   (original)
+++ branches/rel-1/freevo/src/helpers/recordserver.py   Mon Jan 29 21:58:52 2007
@@ -7,7 +7,7 @@
 #
 # -----------------------------------------------------------------------
 # Freevo - A Home Theater PC framework
-# Copyright (C) 2002 Krister Lagerstrom, et al. 
+# Copyright (C) 2002 Krister Lagerstrom, et al.
 # Please see the file freevo/Docs/CREDITS for a complete list of authors.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -214,48 +214,48 @@
                         return scheduledRecordings
                 except OSError:
                     pass
-                
+
             f = open(config.TV_RECORD_SCHEDULE, 'r')
             scheduledRecordings = unjellyFromXML(f)
             f.close()
-            
+
             try:
                 file_ver = scheduledRecordings.TYPES_VERSION
             except AttributeError:
                 _debug_('The cache does not have a version and must be 
recreated.', 1)
-    
+
             if file_ver != TYPES_VERSION:
                 _debug_(('ScheduledRecordings version number %s is stale (new 
is %s), must ' +
                         'be reloaded') % (file_ver, TYPES_VERSION), 1)
                 scheduledRecordings = None
             else:
                 _debug_('Got ScheduledRecordings (version %s).' % file_ver, 5)
-    
+
         if not scheduledRecordings:
             _debug_('GET: making a new ScheduledRecordings', 2)
             scheduledRecordings = ScheduledRecordings()
             self.saveScheduledRecordings(scheduledRecordings)
-    
+
         _debug_('ScheduledRecordings has %s items.' % \
                 len(scheduledRecordings.programList), 1)
-    
+
         try:
             mod_time = os.stat(config.TV_RECORD_SCHEDULE)[stat.ST_MTIME]
             self.scheduledRecordings_cache = mod_time, scheduledRecordings
         except OSError:
             pass
         return scheduledRecordings
-    
-    
+
+
     #
     # function to save the schedule to disk
     #
     def saveScheduledRecordings(self, scheduledRecordings=None):
-    
+
         if not scheduledRecordings:
             _debug_('SAVE: making a new ScheduledRecordings', 2)
             scheduledRecordings = ScheduledRecordings()
-    
+
         self.findOverlaps(scheduledRecordings)
         _debug_('SAVE: saving cached file (%s)' % config.TV_RECORD_SCHEDULE, 2)
         _debug_("SAVE: ScheduledRecordings has %s items." % 
len(scheduledRecordings.programList), 2)
@@ -264,7 +264,7 @@
         except IOError:
             os.unlink(config.TV_RECORD_SCHEDULE)
             f = open(config.TV_RECORD_SCHEDULE, 'w')
-            
+
         jellyToXML(scheduledRecordings, f)
         f.close()
 
@@ -309,56 +309,55 @@
         _debug_('Program Date: "%s"' % progStr, 5)
         _debug_('Todays Date : "%s"' % todayStr, 5)
         if (len(progStr)==8):
-           _debug_('Good date format', 5)
-           #Year
-           todaysYear=(todayStr[0:4])
-           progYear=(progStr[0:4])
-           #Month
-           todaysMonth=(todayStr[4:2])
-           progMonth=(progStr[4:2])
-           #Day
-           todaysDay=(todayStr[6:2])
-           progDay=(progStr[6:2])
-           if todaysYear > progYear:
-              #program from a previous year
-              return FALSE
-           elif progYear > todaysYear:
-              #program in the future
-              return TRUE
-           else:
-              _debug_('Same year', 5)
-              #program in the same year
-              if todaysMonth > progMonth:
-                 #program in a previous month
-                 return FALSE
-              elif progMonth > todaysMonth:
-                 #program in the future
-                 return TRUE
-              else:
-                 _debug_('Same month', 5)
-                 #program in the same month
-                 if todaysDay > progDay:
-                    #program was previous aired this month
+            _debug_('Good date format', 5)
+            #Year
+            todaysYear=(todayStr[0:4])
+            progYear=(progStr[0:4])
+            #Month
+            todaysMonth=(todayStr[4:2])
+            progMonth=(progStr[4:2])
+            #Day
+            todaysDay=(todayStr[6:2])
+            progDay=(progStr[6:2])
+            if todaysYear > progYear:
+                #program from a previous year
+                return FALSE
+            elif progYear > todaysYear:
+                #program in the future
+                return TRUE
+            else:
+                _debug_('Same year', 5)
+                #program in the same year
+                if todaysMonth > progMonth:
+                    #program in a previous month
                     return FALSE
-                 else:
-                    _debug_('Same day or in the upcoming month', 5)
-                    #program is today or in the upcoming days
+                elif progMonth > todaysMonth:
+                    #program in the future
                     return TRUE
+                else:
+                    _debug_('Same month', 5)
+                    #program in the same month
+                    if todaysDay > progDay:
+                        #program was previous aired this month
+                        return FALSE
+                    else:
+                        _debug_('Same day or in the upcoming month', 5)
+                        #program is today or in the upcoming days
+                        return TRUE
         else:
-           _debug_('No good date format, assuming new Episode to be on the 
safe side', 3)
-           return TRUE
+            _debug_('No good date format, assuming new Episode to be on the 
safe side', 3)
+            return TRUE
 
     #
     # Shrink a string by removing all spaces and making it
     # lower case and then returning the MD5 digest of it.
     #
     def shrink(self, text):
-       if text:
-           text = md5.new(text.lower().replace(' ', '')).hexdigest()
-       else:
-           text = ''
-
-       return text
+        if text:
+            text = md5.new(text.lower().replace(' ', '')).hexdigest()
+        else:
+            text = ''
+        return text
 
 
     def getPreviousRecordingKey(self, prog):
@@ -385,9 +384,9 @@
         self.loadPreviouslyRecordedShows()
         previous = self.getPreviousRecording(prog)
         if previous:
-           _debug_('Found duplicate, removing', 5)
-           del 
self.previouslyRecordedShows[self.getPreviousRecordingKey(previous)]
-           self.savePreviouslyRecordedShows()
+            _debug_('Found duplicate, removing', 5)
+            del 
self.previouslyRecordedShows[self.getPreviousRecordingKey(previous)]
+            self.savePreviouslyRecordedShows()
 
 
     def addDuplicate(self, prog=None):
@@ -415,41 +414,47 @@
 
     def addRecordingToSchedule(self, prog=None, inputSchedule=None):
         if inputSchedule:
-           scheduledRecordings=inputSchedule
+            scheduledRecordings=inputSchedule
         else:
-           scheduledRecordings = self.getScheduledRecordings()
+            scheduledRecordings = self.getScheduledRecordings()
         scheduledRecordings.addProgram(prog, tv_util.getKey(prog))
         if not inputSchedule:
-           self.saveScheduledRecordings(scheduledRecordings)
+            if config.DUPLICATE_DETECTION:
+                self.addDuplicate(prog)
+            self.saveScheduledRecordings(scheduledRecordings)
 
 
     def removeRecordingFromSchedule(self, prog=None, inputSchedule=None):
         if inputSchedule:
-           scheduledRecordings=inputSchedule
+            scheduledRecordings=inputSchedule
         else:
-           scheduledRecordings = self.getScheduledRecordings()
+            scheduledRecordings = self.getScheduledRecordings()
         scheduledRecordings.removeProgram(prog, tv_util.getKey(prog))
         if not inputSchedule:
-           self.saveScheduledRecordings(scheduledRecordings)
+            if config.DUPLICATE_DETECTION:
+                self.removeDuplicate(prog)
+            self.saveScheduledRecordings(scheduledRecordings)
 
 
     def conflictResolution(self, prog):
         def exactMatch(self, prog):
             if prog.desc:
-               descResult=FALSE
-               descMatches=None
-               (descResult, descMatches)=self.findMatches(prog.desc)
-               if descResult:
-                  _debug_('Exact Matches %s'%(len(descMatches)), 5)
-                  return descMatches
+                descResult=FALSE
+                descMatches=None
+                (descResult, descMatches)=self.findMatches(prog.desc)
+                if descResult:
+                    _debug_('Exact Matches %s' % (len(descMatches)), 5)
+                    return descMatches
+
             if prog.sub_title:
-               (sub_titleResult, 
sub_titleMatches)=self.findMatches(prog.sub_title)
-               descResult=FALSE
-               descMatches=None
-               if sub_titleResult:
-                  _debug_('Exact Matches %s'%(len(sub_titleMatches)), 5)
-                  return sub_titleMatches
-            return 0
+                sub_titleResult=FALSE
+                sub_titleMatches=None
+                (sub_titleResult, 
sub_titleMatches)=self.findMatches(prog.sub_title)
+                if sub_titleResult:
+                    _debug_('Exact Matches %s' % (len(sub_titleMatches)), 5)
+                    return sub_titleMatches
+            return None
+
         def getConflicts(self, prog, myScheduledRecordings):
             _debug_('Before mySched recordings; ignore all addProgram lines', 
5)
             self.addRecordingToSchedule(prog, myScheduledRecordings)
@@ -462,11 +467,11 @@
                 thisprog = progs[proglist[i]]
                 nextprog = progs[proglist[i+1]]
                 if thisprog.stop > nextprog.start:
-                   conflictRating=conflictRating+1
-                   if thisprog==prog:
-                      conflicts.append(nextprog)
-                   elif nextprog==prog:
-                      conflicts.append(thisprog)
+                    conflictRating=conflictRating+1
+                    if thisprog==prog:
+                        conflicts.append(nextprog)
+                    elif nextprog==prog:
+                        conflicts.append(thisprog)
             self.removeRecordingFromSchedule(prog, myScheduledRecordings)
             _debug_('After mySched recordings; stop ignoring all addProgram 
lines', 5)
             return (conflictRating,conflicts)
@@ -474,149 +479,167 @@
         def getRatedConflicts(self,prog,myScheduledRecordings):
             ratedConflicts=[]
             occurances = exactMatch(self,prog)
+            if not occurances:
+                #program no longer exists
+                return (FALSE,None,None)
             #Search through all occurances of looking for a non-conflicted 
occurance
             for oneOccurance in occurances:
                 (rating, 
conflictedProgs)=getConflicts(self,oneOccurance,myScheduledRecordings)
                 if rating==0:
-                   _debug_('No Conflict', 5)
-                   programsToChange=[]
-                   programsToChange.append(('add',oneOccurance))
-                   return(TRUE,ratedConflicts,programsToChange)
+                    _debug_('No Conflict', 5)
+                    programsToChange=[]
+                    programsToChange.append(('add',oneOccurance))
+                    return(TRUE,ratedConflicts,programsToChange)
                 _debug_('Conflict Found', 5)
                 ratedConflicts.append((rating,conflictedProgs,oneOccurance))
             return (FALSE,ratedConflicts,None)
 
         if config.CONFLICT_RESOLUTION:
-           _debug_('Conflict resolution enabled', 5)
-           ratedConflicts=[]
-           myScheduledRecordings = copy.deepcopy(self.getScheduledRecordings())
-
-           #Try to record it at its listed time
-           (rating, 
conflictedProg)=getConflicts(self,prog,myScheduledRecordings)
-           if rating==0:
-              #No need to do anything fancy; this will work at its defaul time
-              progsToChange=[]
-              progsToChange.append(('add',prog))
-              return (TRUE, 'No conflicts, using default time', progsToChange)
-
-           #Default time didn't work, let's try all times known
-           (result, ratedConflicts, 
progsToChange)=getRatedConflicts(self,prog,myScheduledRecordings)
-           if result:
-              #No conflicts
-              return (TRUE, 'No conflicts if new program is added', 
progsToChange)
-
-           _debug_('Going into conflict resolution via scheduled program 
re-scheduling', 5)
-           # No viable time to schedule the program without a conflict
-           # Try and reschedule the already scheduled program
-           atleastOneSingleConflict=FALSE
-           for 
(scheduledConflictRating,scheduledConflictPrograms,conflictProgram) in 
ratedConflicts:
-               #Only handle one conflict at the moment
-               if scheduledConflictRating==1:
-                  atleastOneSingleConflict=TRUE
-                  scheduledConflictProgram=scheduledConflictPrograms[0]
-                  #remove already scheduled program and try to reschedule it 
with the new program
-                  
self.removeRecordingFromSchedule(scheduledConflictProgram,myScheduledRecordings)
-                  
self.addRecordingToSchedule(conflictProgram,myScheduledRecordings)
-                  (result, ratedConflicts, 
progsToChange)=getRatedConflicts(self, \
-                                                                            
scheduledConflictProgram,\
-                                                                            
myScheduledRecordings)
-                  if result:
-                     #No conflicts
-                     progsToChange.append(('del',scheduledConflictProgram))
-                     progsToChange.append(('add',conflictProgram))
-                     return (TRUE, 'No conflicts if scheduled program is 
rescheduled', progsToChange)
-                  #Return this to original state
-                  
self.addRecordingToSchedule(scheduledConflictProgram,myScheduledRecordings)
-                  
self.removeRecordingFromSchedule(conflictProgram,myScheduledRecordings)
-           if not atleastOneSingleConflict:
-              #Dirty way to (not) handle multiple conflicts
-              return (FALSE, 'Cannot handle multiple conflicts: %s not 
scheduled'%(prog.title), None)
-
-           _debug_('Going into conflict resolution via priority', 5)
-           # No viable option to reschedule the original program
-           # Time to resolve the conflict via priority
-           tempRating=1000
-           tempConflicted=None
-           tempProg=None
-           #Find least conflicted
-           for (conflictedRating, conflictedPrograms, tempProgram) in 
ratedConflicts:
-               #Cannot handle multiple conflicts
-               conflictedProgram=conflictedPrograms[0]
-               if conflictedRating < tempRating:
-                  tempRating=conflictedRating
-                  tempConflicted=conflictedProgram
-                  tempProg=tempProgram
-           conflictedProgram=tempConflicted
-           prog=tempProgram
-
-           #Here is where it gets ugly
-           (isProgFav, progFav) = self.getFavoriteObject(prog)
-           (isConfFav, confFav) = self.getFavoriteObject(conflictedProgram)
-           if not isProgFav and isConfFav:
-              #Regular recording has higher priority then favorite
-              progsToChange=[]
-              progsToChange.append(('del', conflictedProgram))
-              progsToChange.append(('add', prog))
-              reason='New program is a regular recording(added), scheduled is 
a Favorite(removed)'
-              return (TRUE, reason, progsToChange)
-           elif isProgFav and not isConfFav:
-              #Regular recording has higher priority then favorite
-              progsToChange=[]
-              progsToChange.append(('del', prog))
-              progsToChange.append(('add', conflictedProgram))
-              reason='Scheduled program is a regular recording(added), new is 
a Favorite(removed)'
-              return (TRUE, reason, progsToChange)
-           elif not isProgFav and not isConfFav:
-              return (FALSE, 'Both are regular programs, not adding new 
recording', None)
-           elif isProgFav and isConfFav:
-              #Both are favorites, go by priority (lower is better)
-              if progFav.priority < confFav.priority:
-                 progsToChange=[]
-                 progsToChange.append(('del', conflictedProgram))
-                 progsToChange.append(('add', prog))
-                 reason='New program is higher rated(added), Scheduled is 
lower(removed)'
-                 return (TRUE, reason, progsToChange)
-              elif confFav.priority < progFav.priority:
-                 progsToChange=[]
-                 progsToChange.append(('del', prog))
-                 progsToChange.append(('add', conflictedProgram))
-                 reason='Scheduled program is higher rated(added), New is 
lower(removed)'
-                 return (TRUE, reason, progsToChange)
-              else:
-                 #Equal priority, not adding new program
-                 return (FALSE, 'Both are regular programs, not adding new 
recording', None)
-           else:
-              return (FALSE, 'No viable way to schedule', None)
+            _debug_('Conflict resolution enabled', 5)
+            ratedConflicts=[]
+            myScheduledRecordings = 
copy.deepcopy(self.getScheduledRecordings())
+
+            #Try to record it at its listed time
+            (rating, 
conflictedProg)=getConflicts(self,prog,myScheduledRecordings)
+            if rating==0:
+                #No need to do anything fancy; this will work at its defaul 
time
+                progsToChange=[]
+                progsToChange.append(('add',prog))
+                return (TRUE, 'No conflicts, using default time', 
progsToChange)
+
+            #Default time didn't work, let's try all times known
+            (result, ratedConflicts, 
progsToChange)=getRatedConflicts(self,prog,myScheduledRecordings)
+            if result:
+                #No conflicts
+                return (TRUE, 'No conflicts if new program is added', 
progsToChange)
+            if not ratedConflicts:
+                #Program no longer exists, should never hit this unless 
schedule changes
+                return (FALSE, 'Cannot schedule, new prog no longer exists', 
None)
+
+            _debug_('Going into conflict resolution via scheduled program 
re-scheduling', 5)
+            # No viable time to schedule the program without a conflict
+            # Try and reschedule the already scheduled program
+            atleastOneSingleConflict=FALSE
+            for 
(scheduledConflictRating,scheduledConflictPrograms,conflictProgram) in 
ratedConflicts:
+                #Only handle one conflict at the moment
+                if scheduledConflictRating==1:
+                    atleastOneSingleConflict=TRUE
+                    scheduledConflictProgram=scheduledConflictPrograms[0]
+                    #remove already scheduled program and try to reschedule it 
with the new program
+                    
self.removeRecordingFromSchedule(scheduledConflictProgram,myScheduledRecordings)
+                    
self.addRecordingToSchedule(conflictProgram,myScheduledRecordings)
+                    (result, ratedConflicts, 
progsToChange)=getRatedConflicts(self, \
+                        scheduledConflictProgram, myScheduledRecordings)
+                    if result:
+                        #No conflicts
+                        progsToChange.append(('del',scheduledConflictProgram))
+                        progsToChange.append(('add',conflictProgram))
+                        return (TRUE, 'No conflicts if scheduled program is 
rescheduled', progsToChange)
+                    if not ratedConflicts:
+                        #Program no longer exists, should never hit this 
unless schedule changes
+                        progsToChange.append(('del',scheduledConflictProgram))
+                        progsToChange.append(('add',conflictProgram))
+                        return (TRUE, 'Cannot find conflicted program, adding 
new', progsToChange)
+                    #Return this to original state
+                    
self.addRecordingToSchedule(scheduledConflictProgram,myScheduledRecordings)
+                    
self.removeRecordingFromSchedule(conflictProgram,myScheduledRecordings)
+            if not atleastOneSingleConflict:
+                #Dirty way to (not) handle multiple conflicts
+                return (FALSE, 'Cannot handle multiple conflicts: %s not 
scheduled' % (prog.title), None)
+
+            _debug_('Going into conflict resolution via priority', 5)
+            # No viable option to reschedule the original program
+            # Time to resolve the conflict via priority
+            tempRating=1000
+            tempConflicted=None
+            tempProg=None
+            #Find least conflicted
+            for (conflictedRating, conflictedPrograms, tempProgram) in 
ratedConflicts:
+                #Cannot handle multiple conflicts
+                conflictedProgram=conflictedPrograms[0]
+                if conflictedRating < tempRating:
+                    tempRating=conflictedRating
+                    tempConflicted=conflictedProgram
+                    tempProg=tempProgram
+            conflictedProgram=tempConflicted
+            prog=tempProgram
+
+            #Here is where it gets ugly
+            (isProgFav, progFav) = self.getFavoriteObject(prog)
+            (isConfFav, confFav) = self.getFavoriteObject(conflictedProgram)
+            if not isProgFav and isConfFav:
+                #Regular recording has higher priority then favorite
+                progsToChange=[]
+                progsToChange.append(('del', conflictedProgram))
+                progsToChange.append(('add', prog))
+                reason='New program is a regular recording(added), scheduled 
is a Favorite(removed)'
+                return (TRUE, reason, progsToChange)
+            elif isProgFav and not isConfFav:
+                #Regular recording has higher priority then favorite
+                progsToChange=[]
+                progsToChange.append(('del', prog))
+                progsToChange.append(('add', conflictedProgram))
+                reason='Scheduled program is a regular recording(added), new 
is a Favorite(removed)'
+                return (TRUE, reason, progsToChange)
+            elif not isProgFav and not isConfFav:
+                return (FALSE, 'Both are regular programs, not adding new 
recording', None)
+            elif isProgFav and isConfFav:
+                #Both are favorites, go by priority (lower is better)
+                if progFav.priority < confFav.priority:
+                    progsToChange=[]
+                    progsToChange.append(('del', conflictedProgram))
+                    progsToChange.append(('add', prog))
+                    reason='New program is higher rated(added), Scheduled is 
lower(removed)'
+                    return (TRUE, reason, progsToChange)
+                elif confFav.priority < progFav.priority:
+                    progsToChange=[]
+                    progsToChange.append(('del', prog))
+                    progsToChange.append(('add', conflictedProgram))
+                    reason='Scheduled program is higher rated(added), New is 
lower(removed)'
+                    return (TRUE, reason, progsToChange)
+                else:
+                    #Equal priority, not adding new program
+                    return (FALSE, 'Both are regular programs, not adding new 
recording', None)
+            else:
+                return (FALSE, 'No viable way to schedule', None)
         else:
-           progsToChange=[]
-           progsToChange.append(('add', prog))
-           return (TRUE, 'Conflict resolution disabled', progsToChange)
+            progsToChange=[]
+            progsToChange.append(('add', prog))
+            return (TRUE, 'Conflict resolution disabled', progsToChange)
 
 
     def checkOnlyNewDetection(self, prog=None):
         if config.ONLY_NEW_DETECTION:
-           _debug_('Only new episode detection enabled', 5)
-           if not self.doesFavoriteRecordOnlyNewEpisodes(prog):
-              return (TRUE, 'Favorite records all episodes, record')
-           if self.newEpisode(prog):
-              return (TRUE, 'New episode, record')
-           else:
-              return (FALSE, 'Old episode, do not record')
+            _debug_('Only new episode detection enabled', 5)
+            if not self.doesFavoriteRecordOnlyNewEpisodes(prog):
+                return (TRUE, 'Favorite records all episodes, record')
+            if self.newEpisode(prog):
+                return (TRUE, 'New episode, record')
+            else:
+                return (FALSE, 'Old episode, do not record')
         else:
-           return (TRUE, 'Only new episode detection disabled, record')
+            return (TRUE, 'Only new episode detection disabled, record')
 
 
     def checkDuplicateDetection(self, prog=None):
         if config.DUPLICATE_DETECTION:
-           _debug_('Duplicate detection enabled', 5)
-           if self.doesFavoriteAllowDuplicates(prog):
-              return (TRUE, 'Favorite allows duplicates, record')
-           if not self.duplicate(prog):
-              return (TRUE, 'Not a duplicate, record')
-           else:
-              return (FALSE, 'Duplicate recording, do not record')
+            _debug_('Duplicate detection enabled', 5)
+            if self.doesFavoriteAllowDuplicates(prog):
+                return (TRUE, 'Favorite allows duplicates, record')
+            if not self.duplicate(prog):
+                return (TRUE, 'Not a duplicate, record')
+            else:
+                return (FALSE, 'Duplicate recording, do not record')
         else:
-           return (TRUE, 'Duplicate detection is disabled, record')
+            return (TRUE, 'Duplicate detection is disabled, record')
+
+
+    def setTunerid(self, prog):
+        for chan in guide.chan_list:
+            if prog.channel_id == chan.id:
+                _debug_('scheduleRecording: "%s"' % (prog), 3)
+                prog.tunerid = chan.tunerid
+        return prog
 
 
     def scheduleRecording(self, prog=None):
@@ -624,55 +647,46 @@
 
         if not prog:
             return (FALSE, 'no prog')
-    
+
         now = time.time()
         if now > prog.stop:
             return (FALSE, 'cannot record it if it is over')
-            
+
         self.updateGuide()
-    
-        for chan in guide.chan_list:
-            if prog.channel_id == chan.id:
-                _debug_('scheduleRecording: "%s"' % (prog), 3)
-                prog.tunerid = chan.tunerid
 
         (isFav, favorite) = self.isProgAFavorite(prog)
         if isFav:
-           (onlyNewBool, onlyNewReason) = self.checkOnlyNewDetection(prog)
-           _debug_('Only new episode detection result: %s reason 
%s'%(onlyNewBool,onlyNewReason), 3)
-           if not onlyNewBool:
-              #failed only new episode check (old episode, etc)
-              return (FALSE, onlyNewReason)
-
-           (duplicateBool, duplicateReason) = 
self.checkDuplicateDetection(prog)
-           _debug_('Duplicate detection result: %s reason %s' % 
(duplicateBool,duplicateReason), 3)
-           if not duplicateBool:
-              #failed duplicate check (duplicate, etc)
-              return (FALSE, duplicateReason)
+            (onlyNewBool, onlyNewReason) = self.checkOnlyNewDetection(prog)
+            _debug_('Only new episode detection result: %s reason %s' % 
(onlyNewBool,onlyNewReason), 3)
+            if not onlyNewBool:
+                #failed only new episode check (old episode, etc)
+                return (FALSE, onlyNewReason)
+
+            (duplicateBool, duplicateReason) = 
self.checkDuplicateDetection(prog)
+            _debug_('Duplicate detection result: %s reason %s' % 
(duplicateBool,duplicateReason), 3)
+            if not duplicateBool:
+                #failed duplicate check (duplicate, etc)
+                return (FALSE, duplicateReason)
 
         (ableToResolveBool, resolutionReason, progsToChange) = 
self.conflictResolution(prog)
         _debug_('Conflict resolution result: %s reason %s' % 
(ableToResolveBool,resolutionReason), 3)
         if not ableToResolveBool:
-           #No viable solution was found
-           return (FALSE, resolutionReason)
+            #No viable solution was found
+            return (FALSE, resolutionReason)
 
         if progsToChange:
-           for (cmd, prog) in progsToChange:
-               if cmd=='add':
-                  _debug_('SCHEDULER: adding %s'%(prog.title), 3)
-                  if config.DUPLICATE_DETECTION:
-                     self.addDuplicate(prog)
-                  self.addRecordingToSchedule(prog)
-               elif cmd=='del':
-                  _debug_('SCHEDULER: removing %s'%(prog.title), 3)
-                  if config.DUPLICATE_DETECTION:
-                     self.removeDuplicate(prog)
-                  self.removeRecordingFromSchedule(prog)
+            for (cmd, prog) in progsToChange:
+                prog=self.setTunerid(prog)
+                if cmd=='add':
+                    _debug_('SCHEDULER: adding %s' % (prog.title), 3)
+                    self.addRecordingToSchedule(prog)
+                elif cmd=='del':
+                    _debug_('SCHEDULER: removing %s' % (prog.title), 3)
+                    self.removeRecordingFromSchedule(prog)
         else:
-           _debug_('SCHEDULER: adding %s'%(prog.title), 3)
-           if config.DUPLICATE_DETECTION:
-              self.addDuplicate(prog)
-           self.addRecordingToSchedule(prog)
+            prog=self.setTunerid(prog)
+            _debug_('SCHEDULER: adding %s' % (prog.title), 3)
+            self.addRecordingToSchedule(prog)
 
         # check, maybe we need to start right now
         self.checkToRecord()
@@ -693,18 +707,15 @@
             if String(saved_prog) == String(prog):
                 prog = saved_prog
                 break
-            
+
         try:
             recording = prog.isRecording
         except Exception, e:
             print 'prog.isRecording:', e
             recording = FALSE
 
-        if config.DUPLICATE_DETECTION:
-           self.removeDuplicate(prog)
-        scheduledRecordings = self.getScheduledRecordings()
-        scheduledRecordings.removeProgram(prog, tv_util.getKey(prog))
-        self.saveScheduledRecordings(scheduledRecordings)
+        self.removeRecordingFromSchedule(prog)
+
         now = time.time()
 
         # if now >= prog.start and now <= prog.stop and recording:
@@ -713,12 +724,12 @@
             rec_plugin = plugin.getbyname('RECORD')
             if rec_plugin:
                 rec_plugin.Stop()
-       
+
         return (TRUE, 'recording removed')
-   
+
 
     def isProgScheduled(self, prog, schedule=None):
-    
+
         if schedule == {}:
             return (FALSE, 'prog not scheduled')
 
@@ -757,7 +768,7 @@
         global guide
 
         _debug_('findMatches: %s' % find, 3)
-    
+
         matches = []
         max_results = 500
 
@@ -778,13 +789,13 @@
                 if not find or regex.match(prog.title) or 
regex.match(prog.desc) \
                    or regex.match(prog.sub_title):
                     if movies_only:
-                        # We can do better here than just look for the MPAA 
+                        # We can do better here than just look for the MPAA
                         # rating.  Suggestions are welcome.
                         if 'MPAA' in prog.utf2str().getattr('ratings').keys():
                             matches.append(prog.utf2str())
                             _debug_('PROGRAM MATCH 2: %s' % prog, 5)
                     else:
-                        # We should never get here if not find and not 
+                        # We should never get here if not find and not
                         # movies_only.
                         matches.append(prog.utf2str())
                         _debug_('PROGRAM MATCH 3: %s' % prog, 5)
@@ -802,7 +813,7 @@
         global guide
         guide = tv.epg_xmltv.get_guide()
 
-        
+
     def checkToRecord(self):
         rec_cmd = None
         rec_prog = None
@@ -840,7 +851,7 @@
                 # and how much they overlap, or chop one short
                 duration = int((prog.stop + config.TV_RECORD_PADDING_POST) - 
now)
                 if duration < 10:
-                    return 
+                    return
 
                 if currently_recording:
                     # Hey, something is already recording!
@@ -856,7 +867,7 @@
                             and now < (prog.stop + 
config.TV_RECORD_PADDING_POST):
                             _debug_('Ignoring %s' % prog, 3)
                             continue
-                        sr.removeProgram(currently_recording, 
+                        sr.removeProgram(currently_recording,
                                          tv_util.getKey(currently_recording))
                         plugin.getbyname('RECORD').Stop()
                         time.sleep(5)
@@ -873,17 +884,17 @@
                                       (prog.start - 
config.TV_RECORD_PADDING_PRE)
                             if overlap <= ((config.TV_RECORD_PADDING_PRE +
                                             config.TV_RECORD_PADDING_POST)/4):
-                                sr.removeProgram(currently_recording, 
+                                sr.removeProgram(currently_recording,
                                                  
tv_util.getKey(currently_recording))
                                 plugin.getbyname('RECORD').Stop()
                                 time.sleep(5)
                                 _debug_('CALLED RECORD STOP 2: %s' % 
currently_recording, 3)
-                            else: 
+                            else:
                                 delay_recording = TRUE
-                        else: 
+                        else:
                             delay_recording = TRUE
-                             
-                        
+
+
                 if delay_recording:
                     _debug_('delaying: %s' % prog, 3)
                 else:
@@ -943,22 +954,22 @@
     def addFavorite(self, name, prog, exactchan=FALSE, exactdow=FALSE, 
exacttod=FALSE):
         if not name:
             return (FALSE, 'no name')
-    
+
         (status, favs) = self.getFavorites()
         priority = len(favs) + 1
         fav = tv.record_types.Favorite(name, prog, exactchan, exactdow, 
exacttod, priority, allowDuplicates, onlyNew)
-    
+
         scheduledRecordings = self.getScheduledRecordings()
         scheduledRecordings.addFavorite(fav)
         self.saveScheduledRecordings(scheduledRecordings)
         self.addFavoriteToSchedule(fav)
 
         return (TRUE, 'favorite added')
-    
-    
+
+
     def addEditedFavorite(self, name, title, chan, dow, mod, priority, 
allowDuplicates, onlyNew):
         fav = tv.record_types.Favorite()
-    
+
         fav.name = name
         fav.title = title
         fav.channel = chan
@@ -967,19 +978,19 @@
         fav.priority = priority
         fav.allowDuplicates = allowDuplicates
         fav.onlyNew = onlyNew
-    
+
         scheduledRecordings = self.getScheduledRecordings()
         scheduledRecordings.addFavorite(fav)
         self.saveScheduledRecordings(scheduledRecordings)
         self.addFavoriteToSchedule(fav)
 
         return (TRUE, 'favorite added')
-    
-    
+
+
     def removeFavorite(self, name=None):
         if not name:
             return (FALSE, 'no name')
-       
+
         (status, fav) = self.getFavorite(name)
         self.removeFavoriteFromSchedule(fav)
         scheduledRecordings = self.getScheduledRecordings()
@@ -987,46 +998,46 @@
         self.saveScheduledRecordings(scheduledRecordings)
 
         return (TRUE, 'favorite removed')
-       
-    
+
+
     def clearFavorites(self):
         scheduledRecordings = self.getScheduledRecordings()
         scheduledRecordings.clearFavorites()
         self.saveScheduledRecordings(scheduledRecordings)
 
         return (TRUE, 'favorites cleared')
-    
-    
+
+
     def getFavorites(self):
         return (TRUE, self.getScheduledRecordings().getFavorites())
-    
-    
+
+
     def getFavorite(self, name):
         (status, favs) = self.getFavorites()
-    
+
         if favs.has_key(name):
-            fav = favs[name] 
+            fav = favs[name]
             return (TRUE, fav)
         else:
             return (FALSE, 'not a favorite')
-    
-    
+
+
     def adjustPriority(self, favname, mod=0):
         save = []
         mod = int(mod)
         (status, me) = self.getFavorite(favname)
         oldprio = int(me.priority)
         newprio = oldprio + mod
-    
+
         _debug_('ap: mod=%s' % mod, 3)
-       
+
         sr = self.getScheduledRecordings()
         favs = sr.getFavorites().values()
-    
+
         _debug_('adjusting prio of '+favname, 3)
         for fav in favs:
             fav.priority = int(fav.priority)
-    
+
             if fav.name == me.name:
                 _debug_('MATCH', 5)
                 fav.priority = newprio
@@ -1039,19 +1050,19 @@
                     continue
                 fav.priority = fav.priority + 1
                 _debug_('moved prio of %s: %s => %s' % (fav.name, 
fav.priority-1, fav.priority), 3)
-                
+
             if mod > 0:
                 if fav.priority > newprio or fav.priority < oldprio:
                     _debug_('skipping: %s' % fav.name, 3)
                     continue
                 fav.priority = fav.priority - 1
                 _debug_('moved prio of %s: %s => %s' % (fav.name, 
fav.priority+1, fav.priority), 3)
-    
+
         sr.setFavoritesList(favs)
         self.saveScheduledRecordings(sr)
 
         return (TRUE, 'priorities adjusted')
-    
+
     def getFavoriteObject(self, prog, favs=None):
         #more liberal favorite check that returns an object
         if not favs:
@@ -1061,16 +1072,16 @@
                return (TRUE, fav)
         # if we get this far prog is not a favorite
         return (FALSE, 'not a favorite')
-    
+
     def isProgAFavorite(self, prog, favs=None):
         if not favs:
             (status, favs) = self.getFavorites()
-    
+
         lt = time.localtime(prog.start)
         dow = '%s' % lt[6]
         mod = '%s' % ((lt[3]*60)+(lt[4] / 30 * 30))
         mod = '%s' % ((lt[3]*60)+lt[4])
-    
+
         for fav in favs.values():
             if Unicode(prog.title).lower().find(Unicode(fav.title).lower()) >= 
0:
                 if fav.channel == 
tv_util.get_chan_displayname(prog.channel_id) \
@@ -1079,7 +1090,7 @@
                         if Unicode(fav.mod) == Unicode(mod) \
                         or Unicode(fav.mod) == u'ANY':
                             return (TRUE, fav.name)
-    
+
         # if we get this far prog is not a favorite
         return (FALSE, 'not a favorite')
 
@@ -1090,8 +1101,8 @@
             if Unicode(prog.title).lower().find(Unicode(fav.title).lower()) >= 
0:
                _debug_('NEW: %s'%fav.onlyNew, 5)
                if fav.onlyNew == '1':
-                  return TRUE 
-    
+                  return TRUE
+
     def doesFavoriteAllowDuplicates(self, prog, favs=None):
         if not favs:
            (status, favs) = self.getFavorites()
@@ -1100,14 +1111,14 @@
                _debug_('DUP: %s'%fav.allowDuplicates, 5)
                if fav.allowDuplicates == '1':
                   return TRUE
-    
+
     def removeFavoriteFromSchedule(self, fav):
         # TODO: make sure the program we remove is not
         #       covered by another favorite.
-    
+
         tmp = {}
         tmp[fav.name] = fav
-    
+
         scheduledRecordings = self.getScheduledRecordings()
         progs = scheduledRecordings.getProgramList()
         for prog in progs.values():
@@ -1116,15 +1127,15 @@
                 self.removeScheduledRecording(prog)
 
         return (TRUE, 'favorite unscheduled')
-    
-    
+
+
     def addFavoriteToSchedule(self, fav):
         global guide
         favs = {}
         favs[fav.name] = fav
 
         self.updateGuide()
-    
+
         for ch in guide.chan_list:
             for prog in ch.programs:
                 (isFav, favorite) = self.isProgAFavorite(prog, favs)
@@ -1133,40 +1144,40 @@
                     self.scheduleRecording(prog)
 
         return (TRUE, 'favorite scheduled')
-    
-    
+
+
     def updateFavoritesSchedule(self):
         #  TODO: do not re-add a prog to record if we have
         #        previously decided not to record it.
 
         global guide
-    
+
         self.updateGuide()
-    
+
         # First get the timeframe of the guide.
         last = 0
         for ch in guide.chan_list:
             for prog in ch.programs:
                 if prog.start > last: last = prog.start
-    
+
         scheduledRecordings = self.getScheduledRecordings()
-    
+
         (status, favs) = self.getFavorites()
 
         if not len(favs):
             return (FALSE, 'there are no favorites to update')
-       
-    
+
+
         # Then remove all scheduled favorites in that timeframe to
         # make up for schedule changes.
         progs = scheduledRecordings.getProgramList()
         for prog in progs.values():
-    
+
             # try:
             #     favorite = prog.isFavorite
             # except:
             #     favorite = FALSE
-    
+
             # if prog.start <= last and favorite:
             (isFav, favorite) = self.isProgAFavorite(prog, favs)
             if prog.start <= last and isFav:
@@ -1174,7 +1185,7 @@
                 isRec = hasattr(prog, "isRecording") and prog.isRecording
                 if not isRec:
                     self.removeScheduledRecording(prog)
-    
+
         for ch in guide.chan_list:
             for prog in ch.programs:
                 (isFav, favorite) = self.isProgAFavorite(prog, favs)
@@ -1184,7 +1195,7 @@
                     self.scheduleRecording(prog)
 
         return (TRUE, 'favorites schedule updated')
-    
+
 
     #################################################################
     #  Start XML-RPC published methods.                             #
@@ -1463,21 +1474,21 @@
         fxd.info['plot'] = fxd.str2XML(rec_prog.desc)
         fxd.info['runtime'] = None
         fxd.info['recording_timestamp'] = str(time.time())
-        fxd.info['year'] = time.strftime('%m-%d ' + config.TV_TIMEFORMAT, 
+        fxd.info['year'] = time.strftime('%m-%d ' + config.TV_TIMEFORMAT,
                                          time.localtime(rec_prog.start))
-        fxd.title = rec_prog.title 
+        fxd.title = rec_prog.title
         fxd.writeFxd()
-            
+
 
     def startMinuteCheck(self):
         next_minute = (int(time.time()/60) * 60 + 60) - int(time.time())
         _debug_('top of the minute in %s seconds' % next_minute, 1)
         reactor.callLater(next_minute, self.minuteCheck)
-        
+
     def minuteCheck(self):
         next_minute = (int(time.time()/60) * 60 + 60) - int(time.time())
         if next_minute != 60:
-            # Compensate for timer drift 
+            # Compensate for timer drift
             if DEBUG:
                 log.debug('top of the minute in %s seconds' % next_minute)
             reactor.callLater(next_minute, self.minuteCheck)
@@ -1491,7 +1502,7 @@
         #print 'RECORDSERVER GOT EVENT NOTICE'
         # Use callLater so that handleEvents will get called the next time
         # through the main loop.
-        reactor.callLater(0, self.handleEvents) 
+        reactor.callLater(0, self.handleEvents)
 
 
     def handleEvents(self):
@@ -1569,7 +1580,7 @@
                     snapshot(prog.filename)
                 except:
                     # If automatic pickling fails, use on-demand caching when
-                    # the file is accessed instead. 
+                    # the file is accessed instead.
                     os.rename(vfs.getoverlay(prog.filename + '.raw.tmp'),
                               
vfs.getoverlay(os.path.splitext(prog.filename)[0] + '.png'))
                     pass
@@ -1589,7 +1600,7 @@
                 print 'not handling event %s' % str(event)
                 return
         else:
-            print 'no event to get' 
+            print 'no event to get'
 
 
 def main():
@@ -1602,7 +1613,7 @@
     rs.startMinuteCheck()
     rc_object.subscribe(rs.eventNotice)
     app.run(save=0)
-    
+
 
 if __name__ == '__main__':
     import traceback

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to