]> git.parisson.com Git - telemeta.git/commitdiff
#25: fix exception raising in exporters
authoryomguy <>
Wed, 11 Feb 2009 13:15:19 +0000 (13:15 +0000)
committeryomguy <>
Wed, 11 Feb 2009 13:15:19 +0000 (13:15 +0000)
modify some default css styles
cleanup

telemeta/export/core.py
telemeta/export/flac.py
telemeta/export/mp3.py
telemeta/export/ogg.py
telemeta/export/wav.py
telemeta/htdocs/css/telemeta.css
telemeta/templates/telemeta_default/mediaitem_detail.html
tests/wav_import.py

index a3d5129cf88bd0af658e94ec1c150a98b3c42fe0..28ffa2eff5c1275c1f3ad2951bde48693be07454 100644 (file)
@@ -47,8 +47,8 @@ class ExporterCore(Component):
         try:
             os.system('normalize-audio '+args+' "'+self.source+'"')
             return self.source
-        except IOError:
-            return 'Exporter error: Cannot normalize, path does not exist.'
+        except:
+            raise IOError('ExporterError: cannot normalize, path does not exist.')
 
     def check_md5_key(self):
         """ Check if the md5 key is OK and return a boolean """
@@ -57,7 +57,7 @@ class ExporterCore(Component):
                                 '" "'+self.dest+'.md5"')
             return 'OK' in md5_log.split(':')
         except IOError:
-            return 'Exporter error: Cannot check the md5 key...'
+            raise IOError('ExporterError: cannot check the md5 key.')
     
     def get_file_info(self):
         """ Return the list of informations of the dest """
@@ -72,8 +72,8 @@ class ExporterCore(Component):
                 line_split = line.split(':')
                 value = int(int(line_split[1])/(4*44100))
                 return value
-        except IOError:
-            return 'Exporter error: Cannot get the wav length...'
+        except:
+            raise IOError('ExporterError: cannot get the wav length.')
 
     def compare_md5_key(self, source, dest):
         """ Compare source and dest files wih md5 method """
@@ -149,7 +149,6 @@ class ExporterCore(Component):
                     close_fds = True)
         except:
             raise ExportProcessError('Command failure:', command, proc)
-            
 
         # Core processing
         while True:
@@ -184,7 +183,7 @@ def get_type(value):
     for type in types.keys():
         if isinstance(value, type) :
             return types[type]
-    raise TypeError, str(value) + ' has an unsupported type'
+    raise TypeError(str(value) + ' has an unsupported type')
 
 def get_cast(value, type) :
     """ Return value, casted into type """
@@ -196,7 +195,7 @@ def get_cast(value, type) :
         return int(value)
     elif type == 'str' :
         return str(value)
-    raise TypeError, type + ' is an unsupported type'
+    raise TypeError(type + ' is an unsupported type')
 
 def get_file_mime_type(path):
     """ Return the mime type of a file """
@@ -206,8 +205,8 @@ def get_file_mime_type(path):
             line_split = line.split(': ')
             mime = line_split[len(line_split)-1]
             return mime[:len(mime)-1]
-    except IOError:
-        return 'Exporter error [1]: path does not exist.'
+    except:
+        raise IOError('ExporterError: path does not exist.')
 
 def get_file_type_desc(path):
     """ Return the type of a file given by the 'file' command """
@@ -217,24 +216,24 @@ def get_file_type_desc(path):
             description = line.split(': ')
             description = description[1].split(', ')
             return description
-    except IOError:
-        return 'Exporter error [1]: path does not exist.'
+    except:
+        raise IOError('ExporterError: path does not exist.')
 
 def iswav(path):
     """ Tell if path is a WAV """
     try:
         mime = get_file_mime_type(path)
         return mime == 'audio/x-wav'
-    except IOError:
-        return 'Exporter error [1]: path does not exist.'
+    except:
+        raise IOError('ExporterError: path does not exist.')
 
 def iswav16(path):
     """ Tell if path is a 16 bit WAV """
     try:
         file_type_desc = get_file_type_desc(path)
         return iswav(path) and '16 bit' in file_type_desc
-    except IOError:
-        return 'Exporter error [1]: path does not exist.'
+    except:
+        raise IOError('ExporterError: path does not exist.')
 
 def get_file_name(path):
     """ Return the file name targeted in the path """
@@ -244,8 +243,8 @@ def split_file_name(file):
     """ Return main file name and its extension """
     try:
         return os.path.splitext(file)
-    except IOError:
-        return 'Exporter error [1]: path does not exist.'
+    except:
+        raise IOError('ExporterError: path does not exist.')
 
 def clean_word(word) :
     """ Return the word without excessive blank spaces, underscores and
index 116878bb186e43907b2a4d3e1be5f83946785abf..1f822b3dcb68815112bac82530c55762824a03d2 100644 (file)
@@ -55,8 +55,9 @@ class FlacExporter(ExporterCore):
                 info.append(clean_word(line[:-1]))
             self.info = info
             return self.info
-        except IOError:
-            return 'Exporter error [1]: file does not exist.'
+        except:
+            raise IOError('ExporterError: metaflac is not installed or ' + \
+                           'file does not exist.')
 
     def set_cache_dir(self,path):
         """Set the directory where cached files should be stored. Does nothing
@@ -74,8 +75,8 @@ class FlacExporter(ExporterCore):
             os.system('flac -d -o "'+dest+'" "'+self.source+'"')
             self.source = dest
             return dest
-        except IOError:
-            return 'ExporterError [2]: decoder not compatible.'
+        except:
+            raise IOError('ExporterError: decoder is not compatible.')
 
     def write_tags(self, file):
         media = FLAC(file)
@@ -84,8 +85,11 @@ class FlacExporter(ExporterCore):
                 media['DESCRIPTION'] = str(self.metadata[tag])
             else:
                 media[tag] = str(self.metadata[tag])
-        media.save()
-        
+        try:
+            media.save()
+        except:
+            raise IOError('ExporterError: cannot write tags.')
+
     def get_args(self,options=None):
         """Get process options and return arguments for the encoder"""
         args = []
@@ -108,7 +112,7 @@ class FlacExporter(ExporterCore):
                 #args.append('-c %s="%s"' % (arg, value))
 
         return args
-        
+
     def process(self, item_id, source, metadata, options=None):
         self.item_id = item_id
         self.source = source
@@ -116,9 +120,8 @@ class FlacExporter(ExporterCore):
         self.args = self.get_args(options)
         self.ext = self.get_file_extension()
         self.args = ' '.join(self.args)
-        self.command = 'sox "%s" -s -q -r 44100 -t wav -c2 - | flac -c %s - ' \
-                        % (self.source, self.args)
-        
+        self.command = 'sox "%s" -s -q -r 44100 -t wav -c2 - | flac -c %s - ' % (self.source, self.args)
+
         # Pre-proccessing
         self.dest = self.pre_process(self.item_id,
                                          self.source,
index ce0f4ed8055d961a219238b568bc8e6e028afcf5..b4903c385d4bee0a9a9af6eee7e00657890e8aa6 100644 (file)
@@ -73,16 +73,16 @@ class Mp3Exporter(ExporterCore):
                 info.append(clean_word(line[:-1]))
             self.info = info
             return self.info
-        except IOError:
-            return 'Exporter error [1]: file does not exist.'
+        except:
+            raise IOError('ExporterError: file does not exist.')
 
     def decode(self):
         try:
             os.system('sox "'+self.source+'" -s -q -r 44100 -t wav "' \
                         +self.cache_dir+os.sep+self.item_id+'"')
             return self.cache_dir+os.sep+self.item_id+'.wav'
-        except IOError:
-            return 'ExporterError [2]: decoder not compatible.'
+        except:
+            raise IOError('ExporterError: decoder is not compatible.')
 
     def write_tags(self):
         """Write all ID3v2.4 tags by mapping dub2id3_dict dictionnary with the
@@ -94,8 +94,14 @@ class Mp3Exporter(ExporterCore):
                 frame_text = self.dub2id3_dict[tag]
                 value = self.metadata[tag]
                 frame = mutagen.id3.Frames[frame_text](3,value)
-                id3.add(frame)
-        id3.save()
+                try:
+                    id3.add(frame)
+                except:
+                    raise IOError('ExporterError: cannot tag "'+tag+'"')
+        try:
+            id3.save()
+        except:
+            raise IOError('ExporterError: cannot write tags')
 
     def get_args(self, options=None):
         """Get process options and return arguments for the encoder"""
index 2d0e332643d8afa2a7c95aa16fcc487fb447e46f..b0fef85e38251f89109a4a18b3288fd33b5dd273 100644 (file)
@@ -57,8 +57,8 @@ class OggExporter(ExporterCore):
                 info.append(clean_word(line[:-1]))
             self.info = info
             return self.info
-        except IOError:
-            return 'Exporter error [1]: file does not exist.'
+        except:
+            raise IOError('ExporterError: file does not exist.')
 
     def set_cache_dir(self,path):
        self.cache_dir = path
@@ -68,8 +68,8 @@ class OggExporter(ExporterCore):
             os.system('oggdec -o "'+self.cache_dir+os.sep+self.item_id+
                       '.wav" "'+self.source+'"')
             return self.cache_dir+os.sep+self.item_id+'.wav'
-        except IOError:
-            return 'ExporterError [2]: decoder not compatible.'
+        except:
+            raise IOError('ExporterError: decoder is not compatible.')
 
     def write_tags(self):
         media = OggVorbis(self.dest)
@@ -101,8 +101,8 @@ class OggExporter(ExporterCore):
                 args.append('-c %s="%s"' % (arg, value))
 
         return args
-            
-    def process(self, item_id, source, metadata, options=None):        
+
+    def process(self, item_id, source, metadata, options=None):
         self.item_id = item_id
         self.source = source
         self.metadata = metadata
@@ -110,7 +110,7 @@ class OggExporter(ExporterCore):
         self.ext = self.get_file_extension()
         self.args = ' '.join(self.args)
         self.command = 'sox "%s" -s -q -r 44100 -t wav -c2 - | oggenc %s -' % (self.source, self.args)
-        
+
         # Pre-proccessing
         self.dest = self.pre_process(self.item_id,
                                         self.source,
@@ -120,7 +120,7 @@ class OggExporter(ExporterCore):
                                         self.options)
 
         # Processing (streaming + cache writing)
-        stream = self.core_process(self.command,self.buffer_size,self.dest)
+        stream = self.core_process(self.command, self.buffer_size, self.dest)
         for chunk in stream:
             yield chunk
     
index 86619f9dd9f691b9c449e6b25791b29903ed9fa4..f4af96b2dc320e727676eae267b405f6b8f2cb04 100644 (file)
@@ -30,7 +30,7 @@ class WavExporter(ExporterCore):
         self.dest = ''
         self.options = {}
         self.buffer_size = 0xFFFF
-        
+
     def get_format(self):
         return 'WAV'
     
@@ -51,8 +51,8 @@ class WavExporter(ExporterCore):
                 info.append(clean_word(line[:-1]))
             self.info = info
             return self.info
-        except IOError:
-            return 'Exporter error [1]: file does not exist.'
+        except:
+            raise IOError('ExporterError: wavinfo id not installed or file does not exist.')
 
     def set_cache_dir(self,path):
         self.cache_dir = path
@@ -65,8 +65,8 @@ class WavExporter(ExporterCore):
                       dest+'.wav"')
             self.source = dest
             return dest
-        except IOError:
-            return 'ExporterError [2]: decoder not compatible.'
+        except:
+            raise IOError('ExporterError: decoder is not compatible.')
 
     def write_tags(self):
         # Create metadata XML file !
@@ -76,8 +76,8 @@ class WavExporter(ExporterCore):
         """ Create the md5 keys of the dest """
         try:
             os.system('md5sum -b "'+self.dest+'" >"'+self.dest+'.md5"')
-        except IOError:
-            return 'Exporter error: Cannot create the md5 key...'
+        except:
+            raise IOError('ExporterError: cannot create the md5 key.')
     
     def create_par_key(self):
         """ Create the par2 keys of the dest """
@@ -89,18 +89,18 @@ class WavExporter(ExporterCore):
 
         try:
             os.system('par2 '+args+' "'+self.dest+'"')
-        except IOError:
-            return 'Exporter error: Cannot create the par2 key...'
+        except:
+            raise IOError('ExporterError: cannot create the par2 key.')
 
     def process(self, item_id, source, metadata, options=None):
         self.item_id = item_id
         self.source = source
         self.metadata = metadata
         self.options = {}
-        
+
         if not options is None:
             self.options = options
-            
+
         # Pre-proccessing
         self.ext = self.get_file_extension()
         self.dest = self.pre_process(self.item_id,
@@ -146,4 +146,4 @@ class WavExporter(ExporterCore):
             #if self.compare_md5_key():
             #os.system('cp -a "'+self.source+'" "'+ self.dest+'"')
             #print 'COPIED'
-            
+
index eda8cd9c31b6db8abd35bd4329f53f564a3034fb..4c70b6513d8c9b10f1707026a9d44eeccf244653 100644 (file)
@@ -24,7 +24,7 @@ a:link:hover, a:visited:hover {
 a img { border: none; }\r
 \r
 h3 {\r
-    font-size: 1.1em;\r
+    font-size: 1.2em;\r
     font-weight: bold;\r
     color: #353535;\r
 }\r
@@ -292,14 +292,14 @@ label.disabled { color: #d7d7d7 }
 \r
 /* Navigation (borrowed from Trac) */\r
 .nav h2, .nav hr { display: none }\r
-.nav ul { font-size: 10px; list-style: none; margin: 0; text-align: right }\r
+.nav ul { font-size: 10px; list-style: none; margin: 0; text-align: left }\r
 .nav li {\r
  border-right: 1px solid #d7d7d7;\r
  display: inline;\r
  padding: 0 .75em;\r
  white-space: nowrap;\r
 }\r
-.nav li.last { border-right: none }\r
+.nav li.last { border-right: 1px solid #000000; }\r
 \r
 /* Main navigation bar  (borrowed from Trac) */\r
 #menu {\r
@@ -310,6 +310,7 @@ label.disabled { color: #d7d7d7 }
  padding: .2em 0;\r
 }\r
 #menu li { border-right: none; padding: .25em 0 }\r
+#menu li.last { border-right: 1px solid #000 }\r
 #menu :link, #menu :visited {\r
  background: url(../images/dots.gif) 0 0 no-repeat;\r
  border-right: 1px solid #fff;\r
index 6eaa646032603ad6dcc8c99efb09eb13592b4a11..73ef7120f0563cd30bd6dd7d1df629c47b24e059 100644 (file)
@@ -29,7 +29,7 @@ load_player({{ item.get_duration }});
 \r
 {% if item %}\r
 {% block submenu %}\r
-    <h3>Item: {{ item.title }}</h3>\r
+    <h3>Item : {{ item.title }}</h3>\r
     <div><a href="{% url telemeta-item-dublincore item.id|urlencode %}">Dublin Core</a></div>\r
 {% endblock %}\r
 \r
@@ -161,7 +161,7 @@ load_player({{ item.get_duration }});
     </div>\r
     <div class="extraInfos">\r
     {% block musical_performances %}\r
-        <div class="folded">\r
+        <div>\r
             <h4><a href="#">Formation musicale</a></h4>\r
             <dl class="listing">\r
             {% if item.form_genr_style %}<dt>Forme / genre vernaculaire</dt><dd>{{ item.form_genr_style }}</dd>{% endif %}\r
@@ -192,7 +192,7 @@ load_player({{ item.get_duration }});
     </div>\r
     <div class="extraInfos">\r
     {% block document_identification %}\r
-        <div class="folded">\r
+        <div>\r
             <h4><a href="#">Identification du document</a></h4>\r
             <dl class="listing">\r
             {% if item.format %}<dt>Format</dt><dd>{{ item.format }}</dd>{% endif %}\r
@@ -204,7 +204,7 @@ load_player({{ item.get_duration }});
     </div>\r
     <div class="extraInfos">\r
     {% block document_data %}\r
-        <div class="folded">\r
+        <div>\r
             <h4><a href="#">Informations documentaires</a></h4>\r
             <dl class="listing">\r
             {% if item.choixcollecteur %}<dt>choixcollecteur</dt><dd>{{ item.choixcollecteur }}</dd>{% endif %}\r
index aee3c0a3644b0f8551467f3ef5fc0516cd23c435..8333b67b6b4e5b20dca560cc6f9a27495513b712 100644 (file)
@@ -25,7 +25,7 @@
 # >>> id_string = 'BM.2006.002.001--25__01-10'
 # >>> source_dir = '/home/momo/music/wav/CNRSMH_2006_002_GUYANE'
 # >>> source_file = 'CNRSMH_2006_002_001_10.wav'
-# >>> t = TelemetaWavImport(id_string, source_dir, source_file, source_file)
+# >>> t = TelemetaWavImport(id_string, source_dir, source_dir, source_file)
 # >>> t.main()
 
 
@@ -33,27 +33,31 @@ import os
 import sys
 import shutil
 import datetime
-from telemeta.models import MediaItem
-from django.conf import settings
+from django.core.management import setup_environ
 
 class TelemetaWavImport:
 
     def __init__(self, id_string, source_dir, source_file=None):
+        from telemeta.models import MediaItem
         self.item_media_root_dir = settings.MEDIA_ROOT + os.sep + 'items' + os.sep
+        #self.item_media_relative_dir = 'items' + os.sep
         self.source_dir = source_dir
         self.source_files = os.listdir(self.source_dir)
         self.source_file = source_file
         self.item_list = MediaItem.objects.filter(id__startswith=id_string)
         self.collection_id = self.item_list[0].collection_id
         self.year = datetime.datetime.now().strftime("%Y")
+        self.buffer_size = 0xFFFF
+        #self.dest_relative_dir = self.item_media_relative_dir + self.year + os.sep + self.collection_id + os.sep
         self.dest_dir = self.item_media_root_dir + self.year + os.sep + self.collection_id + os.sep
-  
-    def copy_files(self):
+        
+    def copy_files(self)
+        print self.dest_dir
         if not os.path.exists(self.dest_dir):
             os.makedirs(self.dest_dir)
         for file in self.source_files:
-            if not os.path.exists(self.dest_dir + file):
-                shutil.copy(self.source_dir + os.sep + file, self.dest_dir)
+            if not os.path.exists(self.dest_root_dir + file):
+                shutil.copy(self.source_dir + os.sep + file, self.dest_root_dir)
         
     def wav_import(self):
         if not self.source_file:
@@ -61,20 +65,54 @@ class TelemetaWavImport:
             self.files.sort()
         else:
             self.files = [self.source_file]
-        
         print self.files
+        
         i = 0
         if len(self.files) >= len(self.item_list):
             for item in self.item_list:
                 #item = MediaItem.objects.get(id=object.id)
                 print item.id + " : " + item.title + " : "
-                item.file._name = unicode(self.dest_dir + self.files[i])
+                f = open(self.files[i], 'r')
+                for chunk in f.read(self.buffer_size):
+                    if len(chunk) == 0:
+                        break
+                    else:
+                        item.file.write(chunk)
                 item.save()
-                print item.file._name
+                print item.file.name
+                #item.file.write = unicode(self.dest_dir + self.files[i])
                 i += 1
                 
     def main(self):
-        self.copy_files()
+        #self.copy_files()
         self.wav_import()
+
+
+def print_usage(tool_name):
+    print "Usage: "+tool_name+" <project_dir> <id_string> <source_dir> [<source_file>]"
+    print "  project_dir: the directory of the Django project which hosts Telemeta"
+    print "  id_string: the string to filter in the id table"
+    print "  source_dir: the directory containing the wav files to include"
+    print "  source_file: the wav file to include (optional)"
+
+def run():
+    if len(sys.argv) < 3:
+        print_usage(os.path.basename(sys.argv[0]))
+        sys.exit(1)
+    else:
+        project_dir = sys.argv[1]
+        id_string = sys.argv[2]
+        source_dir = sys.argv[3]
+        source_file = None
+        if len(sys.argv) == 5:
+            source_file = sys.argv[4]
+        #from django.conf import settings
+        import settings
+        sys.path.append(project_dir)
+        setup_environ(settings)
+        t = TelemetaWavImport(id_string, source_dir, source_file)
+        t.main()
         
-        
\ No newline at end of file
+if __name__ == '__main__':
+    run()
+                
\ No newline at end of file