diff options
author | Ben Sturmfels <ben@sturm.com.au> | 2020-04-01 16:52:05 +1100 |
---|---|---|
committer | Ben Sturmfels <ben@sturm.com.au> | 2020-04-01 16:52:05 +1100 |
commit | 1038aea822fdc8a84745bd44cc96ed97d66bbc28 (patch) | |
tree | 4f684a61a72f9b5b612e864ee1e455f3651381eb | |
parent | ad3a0aea833a26735d1d2986f427e9f286dbac21 (diff) | |
download | mediagoblin-1038aea822fdc8a84745bd44cc96ed97d66bbc28.tar.lz mediagoblin-1038aea822fdc8a84745bd44cc96ed97d66bbc28.tar.xz mediagoblin-1038aea822fdc8a84745bd44cc96ed97d66bbc28.zip |
Fix audio thumbnailing once and for all.
This change adds a Python 3-specific audio thumbnailer that side-steps the
bundled Python 2-only `audioprocessing` module. Instead of an audio spectrogram,
Python 3 users will get a static image.
This also allows me to remove my ineffective customisations to
`audioprocessing`, returning it to the upstream version as should always be the
case for vendored code in "extlib".
-rw-r--r-- | extlib/freesound/audioprocessing.py | 27 | ||||
-rw-r--r-- | mediagoblin/media_types/audio/transcoders.py | 27 |
2 files changed, 25 insertions, 29 deletions
diff --git a/extlib/freesound/audioprocessing.py b/extlib/freesound/audioprocessing.py index b9a96a97..b002ff8a 100644 --- a/extlib/freesound/audioprocessing.py +++ b/extlib/freesound/audioprocessing.py @@ -43,32 +43,7 @@ def get_sound_type(input_filename): try: import scikits.audiolab as audiolab except ImportError: - print("WARNING: audiolab is not installed so wav2png will not work") - - # Hack to prevent errors when uploading audio files. The issue is that - # scikits.audiolab does not support Python 3. By replacing it with a mock - # implementation here, we can accept audio files, but we won't get the nice - # waveform image. - import six - if six.PY3: - class MockSndfile(object): - def __init__(self, *args, **kwargs): - self.nframes = 0 - self.channels = 1 - self.samplerate = 44100 - - def read_frames(self, *args): - return [] - - def seek(self, *args): - return - - def close(self): - return - import unittest.mock as mock - audiolab = mock.Mock() - audiolab.Sndfile = MockSndfile - + print "WARNING: audiolab is not installed so wav2png will not work" import subprocess class AudioProcessingException(Exception): diff --git a/mediagoblin/media_types/audio/transcoders.py b/mediagoblin/media_types/audio/transcoders.py index f86528de..f78cbf28 100644 --- a/mediagoblin/media_types/audio/transcoders.py +++ b/mediagoblin/media_types/audio/transcoders.py @@ -20,8 +20,6 @@ try: except ImportError: import Image -from mediagoblin.media_types.audio import audioprocessing - _log = logging.getLogger(__name__) CPU_COUNT = 2 # Just assuming for now @@ -46,13 +44,17 @@ from gi.repository import GObject, Gst Gst.init(None) import numpy +import six -class AudioThumbnailer(object): +class Python2AudioThumbnailer(object): def __init__(self): _log.info('Initializing {0}'.format(self.__class__.__name__)) def spectrogram(self, src, dst, **kw): + # This third-party bundled module is Python 2-only. + from mediagoblin.media_types.audio import audioprocessing + width = kw['width'] height = int(kw.get('height', float(width) * 0.3)) fft_size = kw.get('fft_size', 2048) @@ -111,6 +113,25 @@ class AudioThumbnailer(object): th.save(dst) +class Python3AudioThumbnailer(Python2AudioThumbnailer): + """Dummy thumbnailer for Python 3. + + The Python package used for audio spectrograms, "scikits.audiolab", does not + support Python 3 and is a constant source of problems for people installing + MediaGoblin. Until the feature is rewritten, this thumbnailer class simply + provides a generic image. + + """ + def spectrogram(self, src, dst, **kw): + # Using PIL here in case someone wants to swap out the image for a PNG. + # This will convert to JPEG, where simply copying the file won't. + img = Image.open('mediagoblin/static/images/media_thumbs/video.jpg') + img.save(dst) + + +AudioThumbnailer = Python3AudioThumbnailer if six.PY3 else Python2AudioThumbnailer + + class AudioTranscoder(object): def __init__(self): _log.info('Initializing {0}'.format(self.__class__.__name__)) |