aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/process_media/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin/process_media/__init__.py')
-rw-r--r--mediagoblin/process_media/__init__.py65
1 files changed, 39 insertions, 26 deletions
diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py
index 96fe49fe..346bb479 100644
--- a/mediagoblin/process_media/__init__.py
+++ b/mediagoblin/process_media/__init__.py
@@ -14,8 +14,9 @@
# 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/>.
-import Image
+import os
+import Image
from celery.task import Task
from celery import registry
@@ -31,7 +32,7 @@ MEDIUM_SIZE = 640, 640
def create_pub_filepath(entry, filename):
return mgg.public_store.get_unique_filepath(
['media_entries',
- unicode(entry['_id']),
+ unicode(entry._id),
filename])
@@ -56,7 +57,7 @@ class ProcessMedia(Task):
__import__(entry['media_type'])
process_image(entry)
except BaseProcessingFail, exc:
- mark_entry_failed(entry[u'_id'], exc)
+ mark_entry_failed(entry._id, exc)
return
except ImportError, exc:
mark_entry_failed(entry[u'_id'], exc)
@@ -68,9 +69,10 @@ class ProcessMedia(Task):
"""
If the processing failed we should mark that in the database.
- Assuming that the exception raised is a subclass of BaseProcessingFail,
- we can use that to get more information about the failure and store that
- for conveying information to users about the failure, etc.
+ Assuming that the exception raised is a subclass of
+ BaseProcessingFail, we can use that to get more information
+ about the failure and store that for conveying information to
+ users about the failure, etc.
"""
entry_id = args[0]
mark_entry_failed(entry_id, exc)
@@ -83,10 +85,10 @@ def mark_entry_failed(entry_id, exc):
"""
Mark a media entry as having failed in its conversion.
- Uses the exception that was raised to mark more information. If the
- exception is a derivative of BaseProcessingFail then we can store extra
- information that can be useful for users telling them why their media failed
- to process.
+ Uses the exception that was raised to mark more information. If
+ the exception is a derivative of BaseProcessingFail then we can
+ store extra information that can be useful for users telling them
+ why their media failed to process.
Args:
- entry_id: The id of the media entry
@@ -119,27 +121,34 @@ def process_image(entry):
Code to process an image
"""
workbench = mgg.workbench_manager.create_workbench()
+ # Conversions subdirectory to avoid collisions
+ conversions_subdir = os.path.join(
+ workbench.dir, 'conversions')
+ os.mkdir(conversions_subdir)
queued_filepath = entry['queued_media_file']
queued_filename = workbench.localized_file(
mgg.queue_store, queued_filepath,
'source')
+ extension = os.path.splitext(queued_filename)[1]
+
try:
thumb = Image.open(queued_filename)
except IOError:
raise BadMediaFail()
thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS)
- # ensure color mode is compatible with jpg
- if thumb.mode != "RGB":
- thumb = thumb.convert("RGB")
-
- thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg')
- thumb_file = mgg.public_store.get_file(thumb_filepath, 'w')
- with thumb_file:
- thumb.save(thumb_file, "JPEG", quality=90)
+ # Copy the thumb to the conversion subdir, then remotely.
+ thumb_filename = 'thumbnail' + extension
+ thumb_filepath = create_pub_filepath(entry, thumb_filename)
+ tmp_thumb_filename = os.path.join(
+ conversions_subdir, thumb_filename)
+ with file(tmp_thumb_filename, 'w') as thumb_file:
+ thumb.save(thumb_file)
+ mgg.public_store.copy_local_to_storage(
+ tmp_thumb_filename, thumb_filepath)
# If the size of the original file exceeds the specified size of a `medium`
# file, a `medium.jpg` files is created and later associated with the media
@@ -150,15 +159,18 @@ def process_image(entry):
if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]:
medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS)
- if medium.mode != "RGB":
- medium = medium.convert("RGB")
+ medium_filename = 'medium' + extension
+ medium_filepath = create_pub_filepath(entry, medium_filename)
+ tmp_medium_filename = os.path.join(
+ conversions_subdir, medium_filename)
+
+ with file(tmp_medium_filename, 'w') as medium_file:
+ medium.save(medium_file)
- medium_filepath = create_pub_filepath(entry, 'medium.jpg')
- medium_file = mgg.public_store.get_file(medium_filepath, 'w')
+ mgg.public_store.copy_local_to_storage(
+ tmp_medium_filename, medium_filepath)
- with medium_file:
- medium.save(medium_file, "JPEG", quality=90)
- medium_processed = True
+ medium_processed = True
# we have to re-read because unlike PIL, not everything reads
# things in string representation :)
@@ -167,7 +179,8 @@ def process_image(entry):
with queued_file:
original_filepath = create_pub_filepath(entry, queued_filepath[-1])
- with mgg.public_store.get_file(original_filepath, 'wb') as original_file:
+ with mgg.public_store.get_file(original_filepath, 'wb') \
+ as original_file:
original_file.write(queued_file.read())
mgg.queue_store.delete_file(queued_filepath)