new fields: part name, index, parts count
[audio.git] / apps / archive / tasks.py
old mode 100755 (executable)
new mode 100644 (file)
index e8ce4fb..a46b79c
@@ -4,6 +4,7 @@ import mimetypes
 import os
 import os.path
 import pipes
+import stat
 import subprocess
 from tempfile import NamedTemporaryFile
 from time import sleep
@@ -45,8 +46,11 @@ class AudioFormatTask(Task):
 
     @classmethod
     def set_tags(cls, audiobook, file_name):
+        tags = getattr(audiobook, "%s_tags" % cls.ext)['tags']
+        if not tags.get('flac_sha1'):
+            tags['flac_sha1'] = audiobook.get_source_sha1()
         audio = File(file_name)
-        for k, v in getattr(audiobook, "%s_tags" % cls.ext)['tags'].items():
+        for k, v in tags.items():
             audio[k] = v
         audio.save()
 
@@ -58,6 +62,7 @@ class AudioFormatTask(Task):
             ExistingFile(file_name),
             save=False
             )
+        os.chmod(getattr(audiobook, field).path, stat.S_IREAD|stat.S_IWRITE|stat.S_IRGRP|stat.S_IROTH)
         Audiobook.objects.filter(pk=audiobook.pk).update(
             **{field: getattr(audiobook, field)})
 
@@ -76,10 +81,13 @@ class AudioFormatTask(Task):
         tags = getattr(audiobook, "%s_tags" % cls.ext)
         prefix, slug = tags['url'].rstrip('/').rsplit('/', 1)
         name = tags['name']
-        command = UPLOAD_CMD + (u' %s %s %s > output.txt' % (
+        command = UPLOAD_CMD + (u' %s %s %s %s %s %s > output.txt' % (
             pipes.quote(os.path.join(UPLOAD_PATH, os.path.basename(path))),
             pipes.quote(slug),
-            pipes.quote(name)
+            pipes.quote(name),
+            pipes.quote(audiobook.part_name),
+            audiobook.index,
+            audiobook.parts_count,
             )).encode('utf-8')
         try:
             api.put(path, UPLOAD_PATH)
@@ -91,7 +99,7 @@ class AudioFormatTask(Task):
         except SystemExit, e:
             raise cls.RemoteOperationError
 
-    def run(self, aid):
+    def run(self, aid, publish=True):
         aid = int(aid)
         audiobook = Audiobook.objects.get(id=aid)
         self.set_status(aid, status.ENCODING)
@@ -111,10 +119,13 @@ class AudioFormatTask(Task):
         self.set_tags(audiobook, out_file.name)
         self.set_status(aid, status.SENDING)
 
-        self.put(audiobook, out_file.name)
+        if publish:
+            self.put(audiobook, out_file.name)
+            self.published(aid)
+        else:
+            self.set_status(aid, None)
 
         self.save(audiobook, out_file.name)
-        self.published(aid)
 
     def on_failure(self, exc, task_id, args, kwargs, einfo):
         aid = (args[0], kwargs.get('aid'))[0]
@@ -157,18 +168,22 @@ class Mp3Task(AudioFormatTask):
     def encode(in_path, out_path):
         # 44.1kHz 64kbps mono MP3
         subprocess.check_call(['ffmpeg', 
-            '-i', in_path,
+            '-i', in_path.encode('utf-8'),
             '-ar', '44100',
             '-ab', '64k',
             '-ac', '1',
             '-y',
-            out_path
+            '-acodec', 'libmp3lame',
+            out_path.encode('utf-8')
             ])
 
     @classmethod
     def set_tags(cls, audiobook, file_name):
+        mp3_tags = audiobook.mp3_tags['tags']
+        if not mp3_tags.get('flac_sha1'):
+            mp3_tags['flac_sha1'] = audiobook.get_source_sha1()
         audio = id3.ID3(file_name)
-        for k, v in audiobook.mp3_tags['tags'].items():
+        for k, v in mp3_tags.items():
             factory_tuple = cls.TAG_MAP[k]
             factory, tagtype = factory_tuple[:2]
             audio.add(factory(tagtype, v, *factory_tuple[2:]))
@@ -188,11 +203,12 @@ class OggTask(AudioFormatTask):
     @staticmethod
     def encode(in_path, out_path):
         # 44.1kHz 64kbps mono Ogg Vorbis
-        subprocess.check_call(['oggenc', 
-            in_path,
-            '--discard-comments',
-            '--resample', '44100',
-            '--downmix',
-            '-b', '64',
-            '-o', out_path
+        subprocess.check_call(['ffmpeg', 
+            '-i', in_path.encode('utf-8'),
+            '-ar', '44100',
+            '-ab', '64k',
+            '-ac', '1',
+            '-y',
+            '-acodec', 'libvorbis',
+            out_path.encode('utf-8')
             ])