Gilles has uploaded a new change for review. https://gerrit.wikimedia.org/r/257258
Change subject: Video engine ...................................................................... Video engine Bug: T120205 Bug: T120206 Change-Id: I5d1a24ed4f7d34fcc686ef7f871e9add9c154d8d --- A LICENSE A requirements.txt A setup.py A tox.ini A wikimedia_thumbor_video_engine/__init__.py 5 files changed, 184 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/thumbor/video-engine refs/changes/58/257258/1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..133846d --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Gilles Dubuc, Wikimedia Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..39195db --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +thumbor \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..11198f8 --- /dev/null +++ b/setup.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages + + +setup( + name='wikimedia_thumbor_video_engine', + version='0.1.1', + url='https://github.com/wikimedia/thumbor-video-engine', + license='MIT', + author='Gilles Dubuc, Wikimedia Foundation', + description='Thumbor video engine', + packages=find_packages(), + include_package_data=True, + zip_safe=False, + platforms='any', + install_requires=[ + 'thumbor', + ], + extras_require={ + 'tests': [ + 'pyvows', + 'coverage', + ], + }, + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Topic :: Software Development :: Libraries :: Python Modules' + ] +) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..9e359d2 --- /dev/null +++ b/tox.ini @@ -0,0 +1,12 @@ +[tox] +minversion = 1.6 +skipsdist = True +envlist = flake8 + +[testenv] +setenv = VIRTUAL_ENV={envdir} +deps = -r{toxinidir}/requirements.txt + +[testenv:flake8] +commands = flake8 {posargs} +deps = flake8 diff --git a/wikimedia_thumbor_video_engine/__init__.py b/wikimedia_thumbor_video_engine/__init__.py new file mode 100644 index 0000000..98bffe0 --- /dev/null +++ b/wikimedia_thumbor_video_engine/__init__.py @@ -0,0 +1,115 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# thumbor imaging service +# https://github.com/thumbor/thumbor/wiki + +# Licensed under the MIT license: +# http://www.opensource.org/licenses/mit-license +# Copyright (c) 2011 globo.com timeh...@corp.globo.com +# Copyright (c) 2015 Wikimedia Foundation + +# Ghostscript engine + +import os +import subprocess +from tempfile import NamedTemporaryFile + +from thumbor.engines import BaseEngine +from thumbor.engines.pil import Engine as PilEngine +from thumbor.utils import EXTENSION + + +# Unfortunately there is no elegant way to extend Thumbor to support +# a new MIME type, which is why this monkey-patching is done here +EXTENSION['video/ogg'] = '.ogv' +EXTENSION['video/webm'] = '.webm' + +old_get_mimetype = BaseEngine.get_mimetype + + +@classmethod +def new_get_mimetype(cls, buffer): + if buffer.startswith('\x1aE\xdf\xa3'): + return 'video/webm' + + if buffer.startswith('OggS'): + return 'video/ogg' + + return old_get_mimetype(buffer) + +BaseEngine.get_mimetype = new_get_mimetype + + +class Engine(PilEngine): + def should_run(self, extension, buffer): + return (extension == '.ogv' or extension == '.webm') + + def create_image(self, buffer): + self.video_buffer = buffer + + destination = NamedTemporaryFile(delete=False, suffix='.jpg') + source = NamedTemporaryFile(delete=False) + source.write(buffer) + source.close() + + command = [ + self.context.config.FFPROBE_PATH, + '-v', + 'error', + '-show_entries', + 'format=duration', + '-of', + 'default=noprint_wrappers=1:nokey=1', + source.name + ] + + duration = float(subprocess.check_output(command)) + + try: + seek = self.context.request.page + except (AttributeError, EOFError): + seek = duration / 2 + + command = [ + self.context.config.FFMPEG_PATH, + # Order is important, for fast seeking -ss has to come before -i + # As explained on https://trac.ffmpeg.org/wiki/Seeking + '-ss', + '%d' % seek, + '-i', + source.name, + '-y', + '-vframes', + '1', + '-an', + '-f', + 'image2', + '-nostats', + '-loglevel', + 'error', + destination.name + ] + + subprocess.call(command) + + with open(destination.name, 'rb') as f: + jpg = f.read() + + os.remove(source.name) + os.remove(destination.name) + + self.extension = '.jpg' + + return super(Engine, self).create_image(jpg) + + def read(self, extension=None, quality=None): + if ((extension == '.ogv' or extension == '.webm') and quality is None): + # We're saving the source, let's save the video + return self.video_buffer + + # Beyond this point we're saving the JPG result + if (extension == '.ogv' or extension == '.webm'): + extension = '.jpg' + + return super(Engine, self).read(extension, quality) -- To view, visit https://gerrit.wikimedia.org/r/257258 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5d1a24ed4f7d34fcc686ef7f871e9add9c154d8d Gerrit-PatchSet: 1 Gerrit-Project: thumbor/video-engine Gerrit-Branch: master Gerrit-Owner: Gilles <gdu...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits