-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

hi,

I attach a patch so that , when you reencode a file, the encodingserver
also creates a new FXD file to point to the reencoded file (so as to
preserve all metadata)

unfortunately it is not 100% satisfactory: when I first wrote it , I
wrote code in line 135 in video/plugins/reencode.py
that would get the FXD file name from the attribute 'fxd_file' in the
'VideoItem' object ; but it turns out that that is always None ; so I
added some hackish code to reverse-guess the FXD file name from the
video file name .

May someone fix this fact?

a.

ps: I attach the patch for SVN freevo 1.x , and for freevo 1.9.0 : there
is a slight difference in spacing


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkykP1wACgkQ9B/tjjP8QKQWyQCdEMcmj6hWth/JO1qVsrKO9BgR
PbMAn18U2n9IUwR1RY/rUahGR90gVDFS
=rgEU
-----END PGP SIGNATURE-----
Index: freevo-entrypoint/src/encodingcore.py
===================================================================
--- freevo-entrypoint.orig/src/encodingcore.py	2010-09-26 13:19:26.896194668 +0200
+++ freevo-entrypoint/src/encodingcore.py	2010-09-28 20:46:25.142152275 +0200
@@ -40,7 +40,7 @@
 from pprint import pformat
 from copy import copy
 from string import split, join
-from util.misc import uniquify_filename
+from util.misc import uniquify_filename, uniquify_filename_as_list
 
 import config
 import kaa.metadata
@@ -181,6 +181,7 @@
     @ivar _generateCL: function to generate the command line
     @ivar encodingopts: options for the different encoding steps
     @ivar source: source file to encode
+    @ivar fxd_file: fxd file associated to the source (or None if there is not one)
     @ivar output: output file after encoding
     @ivar name: friendly name of the job
     @ivar idnr: job id number
@@ -216,22 +217,24 @@
     @ivar threads: number of threads
     @ivar failed: has the job failed?
     """
-    def __init__(self, source, output, friendlyname, idnr, titlenum=None, rmsource=False):
+    def __init__(self, source, fxd_file, output, friendlyname, idnr, titlenum=None, rmsource=False):
         """
         Initialize an instance of an EncodingJob
         @param source: input source name
+        @param fxd_file: fxd file associated to the source (or None if there is not one)
         @param output: output file name
         @param friendlyname: name of the job
         @param idnr: job id number
         @param titlenum: titlenum number to re-encode
         @param rmsource: remove the source
         """
-        _debug_('encodingcore.EncodingJob.__init__(%s, %s, %s, %s, %s, %s)' % \
-            (source, output, friendlyname, idnr, titlenum, rmsource), 2)
+        _debug_('encodingcore.EncodingJob.__init__(%s, %s, %s, %s, %s, %s, %s)' % \
+            (source, fxd_file, output, friendlyname, idnr, titlenum, rmsource), 2)
         #currently only MEncoder can be used, but who knows what will happen in the future :)
         self._generateCL = self._GenerateCLMencoder
         self.encodingopts = EncodingOptions()
         self.source = source
+        self.fxd_file = fxd_file
         #note that we strip the extension from the self.output file name
         self.output = output
         self.temp_output = None #temporary output file for mencoder job
@@ -1097,7 +1100,8 @@
 
         output = self.currentjob.full_output_file_name()
         # check eventually that there is no file by the same name
-        unique_output = uniquify_filename(output)
+        unique_output_as_list = uniquify_filename_as_list(output)
+        unique_output = join(unique_output_as_list, '')
 
         if hasattr(self.currentjob,'thread'):
             if self.currentjob.thread.returncode:
@@ -1111,17 +1115,36 @@
 
         if self.currentjob.status == status.vpassfinal:
             _debug_('Job %s finished' % self.currentjob.idnr, DINFO)
-            if self.currentjob.rmsource:
-                _debug_('Removing source: %s' % self.currentjob.source)
-                try:
-                    os.remove(self.currentjob.source)
-                except OSError :
-                    _debug_('Cannot remove file '+self.currentjob.source, DWARNING)
             #
+            #print 'FXD in encoding core',self.currentjob.fxd_file
             try:
                 os.rename(self.currentjob.temp_output, unique_output)
-            except OSError :
-                _debug_('Cannot rename file to remove ~incomplete~ suffix '+self.currentjob.temp_output, DWARNING)
+                if self.currentjob.fxd_file:
+                    new_fxd_file=join(unique_output_as_list[:-1],'')+'.fxd'
+                    assert( self.currentjob.fxd_file != new_fxd_file)
+                    new_fxd_file_f=open(new_fxd_file,'w')
+                    #create new FXD pointing at the new reencoded file
+                    for a in open(self.currentjob.fxd_file):
+                        if '<file id' in a:
+                            #if '/' in a: usually only the basename is present in FXD files
+                            #    a=a.replace('>'+self.currentjob.source+'<',
+                            #                '>'+unique_output+'<')
+                            #else:
+                            a=a.replace('>'+os.path.basename(self.currentjob.source)+'<',
+                                        '>'+os.path.basename(unique_output)+'<')
+                        elif '<movie title' in a:
+                            #add the uniquifier token to the title as well, to distinguish the new FXD easily in the GUI
+                            a=a.replace('">',' '+unique_output_as_list[-2]+'">')
+                        new_fxd_file_f.write(a)
+                    new_fxd_file_f.close()
+                if self.currentjob.rmsource:
+                    _debug_('Removing source: %s' % self.currentjob.source)
+                    os.remove(self.currentjob.source)
+                    if self.currentjob.fxd_file:
+                        #FIXME SHOULD CHECK THAT THIS FXD FILE DOES NOT CONTAIN MULTIPLE SOURCES
+                        os.remove(self.currentjob.fxd_file)
+            except OSError, e :
+                _debug_('While doing the finishing part of a reencoding, OSError:'+str(e), DWARNING)
 
             #we are done with this job, remove it
             del self.qlist[0]
@@ -1183,8 +1206,7 @@
             if len(sys.argv) >= 4:
                 title = sys.argv[3]
 
-    encjob = EncodingJob(None, 'test.avi', 'lala', 456789)
-    encjob.source = source
+    encjob = EncodingJob(source, None, 'test.avi', 'lala', 456789)
     encjob.titlenum = titlenum
     if command == '--identify':
         encjob._identify()
Index: freevo-entrypoint/src/helpers/encodingserver.py
===================================================================
--- freevo-entrypoint.orig/src/helpers/encodingserver.py	2010-09-26 13:19:32.656194049 +0200
+++ freevo-entrypoint/src/helpers/encodingserver.py	2010-09-26 22:40:12.729846384 +0200
@@ -127,10 +127,11 @@
 
 
     @kaa.rpc.expose('initEncodingJob')
-    def _initEncodingJob(self, source, output, friendlyname='', chapter=None, rmsource=False):
+    def _initEncodingJob(self, source, fxd_file, output, friendlyname='', chapter=None, rmsource=False):
         """
         Initialise an encoding job
         @param source: source file to encode
+        @param fxd_file: fxd file associated to the source (or None if there is not one)
         @param output: output file to encode
         @param friendlyname: encoding job title
         @param chapter: chapter number to encode
@@ -146,7 +147,7 @@
         # devide or random number by 100 :)
         idnr = int((time.time() / random.random()) / 100)
         _debug_('idnr=%s' % (idnr), 2)
-        self.jobs[idnr] = EncodingJob(source, output, friendlyname, idnr, chapter, rmsource)
+        self.jobs[idnr] = EncodingJob(source, fxd_file, output, friendlyname, idnr, chapter, rmsource)
         _debug_('Initialized job %s (idnr: %s)' % (friendlyname, idnr), DINFO)
         if self.jobs[idnr].failed:
             return (False, 0)
Index: freevo-entrypoint/src/video/plugins/reencode.py
===================================================================
--- freevo-entrypoint.orig/src/video/plugins/reencode.py	2010-09-26 14:31:52.996197601 +0200
+++ freevo-entrypoint/src/video/plugins/reencode.py	2010-09-28 20:37:15.347203667 +0200
@@ -58,6 +58,7 @@
         self.server = EncodingClientActions()
         self.title = ''
         self.source = ''
+        self.fxd_file = None
         self.output = ''
         self.resetprofile()
         self.timeslice = [ None, None ]
@@ -132,6 +133,7 @@
             self.item = item
             self.title = item.name
             self.source = item.filename
+            self.fxd_file = item.fxd_file
             #this is temporarily set , since it is called too often
             #(even when browsing a directory ot TV recordings)
             self.output = '(to be set later)'
@@ -460,9 +462,21 @@
 
         #we are going to create a job and send it to the encoding server, this can take some time while analyzing
 
+        #HACKISH CODE, this should be set somewhere else, but is not;
+        #so it is guessed here
+        if self.fxd_file == None:
+            self.fxd_file = os.path.splitext(self.source)[0]+'.fxd'
+            if not os.path.exists(self.fxd_file):
+                _debug_('Tried to guess the fxd file name but it does not exist: '+str(self.fxd_file), DWARNING)
+                self.fxd_file = None
+            elif os.path.basename(self.source) not in open(self.fxd_file).read():
+                _debug_('The guessed fxd file does not reference the required source: '+str(self.fxd_file)+' , '+str(self.source), DWARNING)
+                self.fxd_file = None
+        #print 'FXD in reencode.py',self.fxd_file
+
         box = PopupBox(text=_('Please wait, analyzing video...'))
         box.show()
-        (status, resp) = self.server.initEncodingJob(self.source, self.output, self.title)
+        (status, resp) = self.server.initEncodingJob(self.source, self.fxd_file, self.output, self.title)
         idnr = resp
         _debug_('initEncodingJob:status:%s resp:%s' % (status, resp))
         if not status:
Index: freevo-entrypoint/src/util/misc.py
===================================================================
--- freevo-entrypoint.orig/src/util/misc.py	2010-09-27 21:21:42.404576773 +0200
+++ freevo-entrypoint/src/util/misc.py	2010-09-27 21:32:57.880572222 +0200
@@ -55,7 +55,11 @@
     extensions must have a 'dot' in front). If 'filename' is not an
     absolute path, the directory is specified in 'directory'.  
     Example usage: uniquify_filename('/sbin/mkfs')
-    """        
+    """
+    return string.join(uniquify_filename_as_list(filename,directory,extensions), '')
+
+def uniquify_filename_as_list(filename,directory=None,extensions=None):
+    "same as uniquify_filename() , but returns (directory,separator,filename,uniquifier,extension)"
     assert type(extensions) == tuple or type(extensions) == list or \
         extensions == None
     if directory == None:
@@ -83,7 +87,7 @@
     while (filename+uniquifier) in files:
         N = N + 1
         uniquifier = '(%d)' % N
-    return directory+os.path.sep+filename+uniquifier+ext
+    return directory,os.path.sep,filename,uniquifier,ext
 
 
 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
Index: helpers/encodingserver.py
===================================================================
--- helpers/encodingserver.py	(revisione 11691)
+++ helpers/encodingserver.py	(copia locale)
@@ -127,10 +127,11 @@
 
 
     @kaa.rpc.expose('initEncodingJob')
-    def _initEncodingJob(self, source, output, friendlyname='', chapter=None, rmsource=False):
+    def _initEncodingJob(self, source, fxd_file, output, friendlyname='', chapter=None, rmsource=False):
         """
         Initialise an encoding job
         @param source: source file to encode
+        @param fxd_file: fxd file associated to the source (or None if there is not one)
         @param output: output file to encode
         @param friendlyname: encoding job title
         @param chapter: chapter number to encode
@@ -146,7 +147,7 @@
         # devide or random number by 100 :)
         idnr = int((time.time() / random.random()) / 100)
         _debug_('idnr=%s' % (idnr), 2)
-        self.jobs[idnr] = EncodingJob(source, output, friendlyname, idnr, chapter, rmsource)
+        self.jobs[idnr] = EncodingJob(source, fxd_file, output, friendlyname, idnr, chapter, rmsource)
         _debug_('Initialized job %s (idnr: %s)' % (friendlyname, idnr), DINFO)
         if self.jobs[idnr].failed:
             return (False, 0)
Index: video/plugins/reencode.py
===================================================================
--- video/plugins/reencode.py	(revisione 11691)
+++ video/plugins/reencode.py	(copia locale)
@@ -58,6 +58,7 @@
         self.server = EncodingClientActions()
         self.title = ''
         self.source = ''
+        self.fxd_file = None
         self.output = ''
         self.resetprofile()
         self.timeslice = [ None, None ]
@@ -132,6 +133,7 @@
             self.item = item
             self.title = item.name
             self.source = item.filename
+            self.fxd_file = item.fxd_file
             #this is temporarily set , since it is called too often
             #(even when browsing a directory ot TV recordings)
             self.output = '(to be set later)'
@@ -461,9 +463,21 @@
 
         #we are going to create a job and send it to the encoding server, this can take some time while analyzing
 
+        #HACKISH CODE, this should be set somewhere else, but is not;
+        #so it is guessed here
+        if self.fxd_file == None:
+            self.fxd_file = os.path.splitext(self.source)[0]+'.fxd'
+            if not os.path.exists(self.fxd_file):
+                _debug_('Tried to guess the fxd file name but it does not exist: '+str(self.fxd_file), DWARNING)
+                self.fxd_file = None
+            elif os.path.basename(self.source) not in open(self.fxd_file).read():
+                _debug_('The guessed fxd file does not reference the required source: '+str(self.fxd_file)+' , '+str(self.source), DWARNING)
+                self.fxd_file = None
+        #print 'FXD in reencode.py',self.fxd_file
+
         box = PopupBox(text=_('Please wait, analyzing video...'))
         box.show()
-        (status, resp) = self.server.initEncodingJob(self.source, self.output, self.title)
+        (status, resp) = self.server.initEncodingJob(self.source, self.fxd_file, self.output, self.title)
         idnr = resp
         _debug_('initEncodingJob:status:%s resp:%s' % (status, resp))
         if not status:
Index: encodingcore.py
===================================================================
--- encodingcore.py	(revisione 11691)
+++ encodingcore.py	(copia locale)
@@ -40,7 +40,7 @@
 from pprint import pprint, pformat
 from copy import copy
 from string import split, join
-from util.misc import uniquify_filename
+from util.misc import uniquify_filename, uniquify_filename_as_list
 
 import config
 import kaa.metadata
@@ -182,6 +182,7 @@
     @ivar _generateCL: function to generate the command line
     @ivar encodingopts: options for the different encoding steps
     @ivar source: source file to encode
+    @ivar fxd_file: fxd file associated to the source (or None if there is not one)
     @ivar output: output file after encoding
     @ivar name: friendly name of the job
     @ivar idnr: job id number
@@ -217,22 +218,24 @@
     @ivar threads: number of threads
     @ivar failed: has the job failed?
     """
-    def __init__(self, source, output, friendlyname, idnr, titlenum=None, rmsource=False):
+    def __init__(self, source, fxd_file, output, friendlyname, idnr, titlenum=None, rmsource=False):
         """
         Initialize an instance of an EncodingJob
         @param source: input source name
+        @param fxd_file: fxd file associated to the source (or None if there is not one)
         @param output: output file name
         @param friendlyname: name of the job
         @param idnr: job id number
         @param titlenum: titlenum number to re-encode
         @param rmsource: remove the source
         """
-        _debug_('encodingcore.EncodingJob.__init__(%s, %s, %s, %s, %s, %s)' % \
-            (source, output, friendlyname, idnr, titlenum, rmsource), 2)
+        _debug_('encodingcore.EncodingJob.__init__(%s, %s, %s, %s, %s, %s, %s)' % \
+            (source, fxd_file, output, friendlyname, idnr, titlenum, rmsource), 2)
         #currently only MEncoder can be used, but who knows what will happen in the future :)
         self._generateCL = self._GenerateCLMencoder
         self.encodingopts = EncodingOptions()
         self.source = source
+        self.fxd_file = fxd_file
         #note that we strip the extension from the self.output file name
         self.output = output
         self.temp_output = None #temporary output file for mencoder job
@@ -1076,7 +1079,8 @@
 
         output = self.currentjob.full_output_file_name()
         # check eventually that there is no file by the same name
-        unique_output = uniquify_filename(output)
+        unique_output_as_list = uniquify_filename_as_list(output)
+        unique_output = join(unique_output_as_list, '')
 
         if hasattr(self.currentjob,'thread'):
             if self.currentjob.thread.returncode:
@@ -1090,17 +1094,36 @@
 
         if self.currentjob.status == status.vpassfinal:
             _debug_('Job %s finished' % self.currentjob.idnr, DINFO)
-            if self.currentjob.rmsource:
-                _debug_('Removing source: %s' % self.currentjob.source)
-                try:
-                    os.remove(self.currentjob.source)
-                except OSError :
-                    _debug_('Cannot remove file '+self.currentjob.source, DWARNING)
             #
+            #print 'FXD in encoding core',self.currentjob.fxd_file
             try:
                 os.rename(self.currentjob.temp_output, unique_output)
-            except OSError :
-                _debug_('Cannot rename file to remove ~incomplete~ suffix '+self.currentjob.temp_output, DWARNING)
+                if self.currentjob.fxd_file:
+                    new_fxd_file=join(unique_output_as_list[:-1],'')+'.fxd'
+                    assert( self.currentjob.fxd_file != new_fxd_file)
+                    new_fxd_file_f=open(new_fxd_file,'w')
+                    #create new FXD pointing at the new reencoded file
+                    for a in open(self.currentjob.fxd_file):
+                        if '<file id' in a:
+                            #if '/' in a: usually only the basename is present in FXD files
+                            #    a=a.replace('>'+self.currentjob.source+'<',
+                            #                '>'+unique_output+'<')
+                            #else:
+                            a=a.replace('>'+os.path.basename(self.currentjob.source)+'<',
+                                        '>'+os.path.basename(unique_output)+'<')
+                        elif '<movie title' in a:
+                            #add the uniquifier token to the title as well, to distinguish the new FXD easily in the GUI
+                            a=a.replace('">',' '+unique_output_as_list[-2]+'">')
+                        new_fxd_file_f.write(a)
+                    new_fxd_file_f.close()
+                if self.currentjob.rmsource:
+                    _debug_('Removing source: %s' % self.currentjob.source)
+                    os.remove(self.currentjob.source)
+                    if self.currentjob.fxd_file:
+                        #FIXME SHOULD CHECK THAT THIS FXD FILE DOES NOT CONTAIN MULTIPLE SOURCES
+                        os.remove(self.currentjob.fxd_file)
+            except OSError, e :
+                _debug_('While doing the finishing part of a reencoding, OSError:'+str(e), DWARNING)
 
             #we are done with this job, remove it
             del self.qlist[0]
@@ -1162,8 +1185,7 @@
             if len(sys.argv) >= 4:
                 title = sys.argv[3]
 
-    encjob = EncodingJob(None, 'test.avi', 'lala', 456789)
-    encjob.source = source
+    encjob = EncodingJob(source, None, 'test.avi', 'lala', 456789)
     encjob.titlenum = titlenum
     if command == '--identify':
         encjob._identify()
Index: util/misc.py
===================================================================
--- util/misc.py	(revisione 11691)
+++ util/misc.py	(copia locale)
@@ -53,9 +53,13 @@
     If 'extensions' contains a list of extensions, then only files in
     the directory with those extensions are considered (note that the
     extensions must have a 'dot' in front). If 'filename' is not an
-    absolute path, the directory is specified in 'directory'.
+    absolute path, the directory is specified in 'directory'.  
     Example usage: uniquify_filename('/sbin/mkfs')
     """
+    return string.join(uniquify_filename_as_list(filename,directory,extensions), '')
+
+def uniquify_filename_as_list(filename,directory=None,extensions=None):
+    "same as uniquify_filename() , but returns (directory,separator,filename,uniquifier,extension)"
     assert type(extensions) == tuple or type(extensions) == list or \
         extensions == None
     if directory == None:
@@ -83,7 +87,7 @@
     while (filename+uniquifier) in files:
         N = N + 1
         uniquifier = '(%d)' % N
-    return directory+os.path.sep+filename+uniquifier+ext
+    return directory,os.path.sep,filename,uniquifier,ext
 
 
 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Freevo-devel mailing list
Freevo-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freevo-devel

Reply via email to