Changed media processing delegation to a 'sniffing' method
authorJoar Wandborg <git@wandborg.com>
Wed, 15 Feb 2012 00:15:29 +0000 (01:15 +0100)
committerJoar Wandborg <git@wandborg.com>
Wed, 15 Feb 2012 00:15:29 +0000 (01:15 +0100)
- Added sniff handlers to all media plugins
  All of them except audio returning False for ANYTHING
  at the moment.

mediagoblin/media_types/__init__.py
mediagoblin/media_types/ascii/__init__.py
mediagoblin/media_types/ascii/processing.py
mediagoblin/media_types/audio/processing.py
mediagoblin/media_types/audio/transcoders.py
mediagoblin/media_types/image/__init__.py
mediagoblin/media_types/image/processing.py
mediagoblin/media_types/video/__init__.py
mediagoblin/media_types/video/processing.py
mediagoblin/submit/views.py

index c53ef1ab32c4f9801ff9e76810bb3d4f9855ce85..19d822a315e6a2d112adfa0904e8809eb8a3103b 100644 (file)
 
 import os
 import sys
+import logging
+import tempfile
 
 from mediagoblin import mg_globals
 from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
 
+_log = logging.getLogger(__name__)
 
 class FileTypeNotSupported(Exception):
     pass
@@ -33,7 +36,17 @@ def sniff_media(media):
     Iterate through the enabled media types and find those suited
     for a certain file.
     '''
-    pass
+    media_file = tempfile.NamedTemporaryFile()
+    media_file.write(media.file.read())
+    media.file.seek(0)
+    for media_type, manager in get_media_managers():
+        _log.info('Sniffing {0}'.format(media_type))
+        if manager['sniff_handler'](media_file, media=media):
+            return media_type, manager
+
+    raise FileTypeNotSupported(
+        # TODO: Provide information on which file types are supported
+        _(u'Sorry, I don\'t support that file type :('))
 
 
 def get_media_types():
index 1c8ca56213b4fa1e87c4b8688a2abb71f847415e..856d1d7b176619ff992dfc3a8854962fc98d5f1d 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from mediagoblin.media_types.ascii.processing import process_ascii
+from mediagoblin.media_types.ascii.processing import process_ascii, \
+    sniff_handler
 
 
 MEDIA_MANAGER = {
     "human_readable": "ASCII",
     "processor": process_ascii, # alternately a string,
                                 # 'mediagoblin.media_types.image.processing'?
+    "sniff_handler": sniff_handler,
     "display_template": "mediagoblin/media_displays/ascii.html",
     "default_thumb": "images/media_thumbs/ascii.jpg",
     "accepted_extensions": [
index 7ece866e9365da4a353e5bb4a955537a56598cce..f698b97ac88ff525597f458cc8edec6796a03367 100644 (file)
@@ -24,6 +24,9 @@ from mediagoblin.media_types.ascii import asciitoimage
 
 _log = logging.getLogger(__name__)
 
+def sniff_handler(media_file, **kw):
+    return False
+
 def process_ascii(entry):
     '''
     Code to process a txt file
index beb12391885c718d805223a649bdd91587d4c75f..7aa7ace8fdb2e07c35ed750b0957fad5cb1eac98 100644 (file)
@@ -25,8 +25,15 @@ from mediagoblin.media_types.audio.transcoders import AudioTranscoder
 
 _log = logging.getLogger()
 
-def sniff_handler(media):
-    return True
+def sniff_handler(media_file, **kw):
+    transcoder = AudioTranscoder()
+    try:
+        data = transcoder.discover(media_file.name)
+
+        if data.is_audio == True and data.is_video == False:
+            return True
+    except:
+        return False
 
 def process_audio(entry):
     audio_config = mgg.global_config['media_type:mediagoblin.media_types.audio']
index e59214b0b9f8e78a9d67678d80b12f56d8a37487..c563496443a56bc1ee050b1d03113098c1e3e4ff 100644 (file)
@@ -62,8 +62,10 @@ class AudioTranscoder(object):
 
         # Instantiate MainLoop
         self._loop = gobject.MainLoop()
+        self._failed = None
 
     def discover(self, src):
+        self._src_path = src
         _log.info('Discovering {0}'.format(src))
         self._discovery_path = src
 
@@ -74,14 +76,17 @@ class AudioTranscoder(object):
 
         self._loop.run()  # Run MainLoop
 
+        if self._failed:
+            raise self._failed
+
         # Once MainLoop has returned, return discovery data
-        return self._discovery_data
+        return getattr(self, '_discovery_data', False)
 
     def __on_discovered(self, data, is_media):
         if not is_media:
-            self.halt()
+            self._failed = BadMediaFail()
             _log.error('Could not discover {0}'.format(self._src_path))
-            raise BadMediaFail()
+            self.halt()
 
         _log.debug('Discovered: {0}'.format(data.__dict__))
 
@@ -91,6 +96,7 @@ class AudioTranscoder(object):
         self.halt()
 
     def transcode(self, src, dst, **kw):
+        _log.info('Transcoding {0} into {1}'.format(src, dst))
         self._discovery_data = kw.get('data', self.discover(src))
 
         self.__on_progress = kw.get('progress_callback')
index 98e0c32a83a9d9dad4f4afee4225fceed504fe01..d4720fabd2015a454194957bf77f9812fcfc0531 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from mediagoblin.media_types.image.processing import process_image
+from mediagoblin.media_types.image.processing import process_image, \
+    sniff_handler
 
 
 MEDIA_MANAGER = {
     "human_readable": "Image",
     "processor": process_image, # alternately a string,
                                 # 'mediagoblin.media_types.image.processing'?
+    "sniff_handler": sniff_handler,
     "display_template": "mediagoblin/media_displays/image.html",
     "default_thumb": "images/media_thumbs/image.jpg",
     "accepted_extensions": ["jpg", "jpeg", "png", "gif", "tiff"]}
index 769de89b13cc504b8689230a184d833edec69edb..d301a69f07479487dd29478d036dbe2dc970f16c 100644 (file)
@@ -23,6 +23,9 @@ from mediagoblin.processing import BadMediaFail, \
 from mediagoblin.tools.exif import exif_fix_image_orientation, \
     extract_exif, clean_exif, get_gps_data, get_useful
 
+def sniff_handler(media_file, **kw):
+    return False
+
 def process_image(entry):
     """
     Code to process an image
index ed542f160065e93b296dc904f9f50d891c6a3589..5351abe68473801e3ea5a3f1b7018e6a090c191d 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from mediagoblin.media_types.video.processing import process_video
+from mediagoblin.media_types.video.processing import process_video, \
+    sniff_handler
 
 
 MEDIA_MANAGER = {
     "human_readable": "Video",
     "processor": process_video, # alternately a string,
                                 # 'mediagoblin.media_types.image.processing'?
+    "sniff_handler": sniff_handler,
     "display_template": "mediagoblin/media_displays/video.html",
     "default_thumb": "images/media_thumbs/video.jpg",
     "accepted_extensions": [
index 089d96fbf801e4b20605e89ece6dc028b57d759e..1890ef0cc90bd67bd8c3e0bbcdd32c6c3cc2ff4c 100644 (file)
@@ -28,6 +28,8 @@ logging.basicConfig()
 _log = logging.getLogger(__name__)
 _log.setLevel(logging.DEBUG)
 
+def sniff_handler(media_file, **kw):
+    return False
 
 def process_video(entry):
     """
index cdd097ecc5c0f71af1024de99e72fb083a819d3b..4fafe1e32b3e6d6d2ac476cc0e3cf17d634d6775 100644 (file)
@@ -35,7 +35,7 @@ from mediagoblin.decorators import require_active_login
 from mediagoblin.submit import forms as submit_forms, security
 from mediagoblin.processing import mark_entry_failed, ProcessMedia
 from mediagoblin.messages import add_message, SUCCESS
-from mediagoblin.media_types import get_media_type_and_manager, \
+from mediagoblin.media_types import sniff_media, \
     InvalidFileType, FileTypeNotSupported
 
 
@@ -55,7 +55,11 @@ def submit_start(request):
         else:
             try:
                 filename = request.POST['file'].filename
-                media_type, media_manager = get_media_type_and_manager(filename)
+
+                # Sniff the submitted media to determine which
+                # media plugin should handle processing
+                media_type, media_manager = sniff_media(
+                    request.POST['file'])
 
                 # create entry and save in database
                 entry = request.db.MediaEntry()
@@ -164,7 +168,6 @@ def submit_start(request):
                 This section is intended to catch exceptions raised in 
                 mediagobling.media_types
                 '''
-
                 if isinstance(e, InvalidFileType) or \
                         isinstance(e, FileTypeNotSupported):
                     submit_form.file.errors.append(