aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mediagoblin/processing.py16
-rw-r--r--mediagoblin/tests/test_processing.py20
2 files changed, 36 insertions, 0 deletions
diff --git a/mediagoblin/processing.py b/mediagoblin/processing.py
index 1c84c557..b0d5751e 100644
--- a/mediagoblin/processing.py
+++ b/mediagoblin/processing.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
+import os
from celery.task import Task
@@ -42,6 +43,21 @@ def create_pub_filepath(entry, filename):
# Media processing initial steps
################################
+class FilenameMunger(object):
+ MAX_FILENAME_LENGTH = 255
+
+ def __init__(self, path):
+ self.dirpath, self.basename = os.path.split(path)
+ self.basename, self.ext = os.path.splitext(self.basename)
+ self.ext = self.ext.lower()
+
+ def munge(self, fmtstr):
+ basename_len = (self.MAX_FILENAME_LENGTH -
+ len(fmtstr.format(basename='', ext=self.ext)))
+ return fmtstr.format(basename=self.basename[:basename_len],
+ ext=self.ext)
+
+
class ProcessMedia(Task):
"""
DEPRECATED -- This now resides in the individual media plugins
diff --git a/mediagoblin/tests/test_processing.py b/mediagoblin/tests/test_processing.py
new file mode 100644
index 00000000..6f3fad70
--- /dev/null
+++ b/mediagoblin/tests/test_processing.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+
+from nose.tools import assert_equal, assert_true, assert_false
+
+from mediagoblin import processing
+
+class TestProcessing(object):
+ def run_munge(self, input, format, output=None):
+ munger = processing.FilenameMunger(input)
+ result = munger.munge(format)
+ if output is None:
+ return result
+ assert_equal(output, result)
+
+ def test_easy_filename_munge(self):
+ self.run_munge('/home/user/foo.TXT', '{basename}bar{ext}', 'foobar.txt')
+
+ def test_long_filename_munge(self):
+ self.run_munge('{0}.png'.format('A' * 300), 'image-{basename}{ext}',
+ 'image-{0}.png'.format('A' * 245))