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

Reply via email to