[MediaWiki-commits] [Gerrit] Ghostscript engine - change (thumbor/ghostscript-engine)
jenkins-bot has submitted this change and it was merged. Change subject: Ghostscript engine .. Ghostscript engine Bug: T120207 Change-Id: I60d92731c0806bace1e4012009f9d20ba8ee0df1 --- A LICENSE A requirements.txt A setup.py A tox.ini A wikimedia_thumbor_ghostscript_engine/__init__.py 5 files changed, 135 insertions(+), 0 deletions(-) Approvals: Ori.livneh: Looks good to me, approved Filippo Giunchedi: Looks good to me, but someone else must approve jenkins-bot: Verified diff --git a/LICENSE b/LICENSE new file mode 100644 index 000..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 000..6f55aaa --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +thumbor +wikimedia_thumbor_base_engine \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 000..a9a5691 --- /dev/null +++ b/setup.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages + + +setup( +name='wikimedia_thumbor_ghostscript_engine', +version='0.1.1', +url='https://github.com/wikimedia/thumbor-ghostscript-engine', +license='MIT', +author='Gilles Dubuc, Wikimedia Foundation', +description='Thumbor Ghostscript engine', +packages=find_packages(), +include_package_data=True, +zip_safe=False, +platforms='any', +install_requires=[ +'thumbor', +'wikimedia_thumbor_base_engine' +], +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 000..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_ghostscript_engine/__init__.py b/wikimedia_thumbor_ghostscript_engine/__init__.py new file mode 100644 index 000..59da1df --- /dev/null +++ b/wikimedia_thumbor_ghostscript_engine/__init__.py @@ -0,0 +1,64 @@ +#!/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 + +from wikimedia_thumbor_base_engine import BaseWikimediaEngine + + +BaseWikimediaEngine.add_format( +'application/pdf', +'.pdf', +lambda buffer: buffer.startswith('%PDF') +) + + +class Engine(BaseWikimediaEngine): +def should_run(self, extension, buffer): +return extension == '.pdf' + +def create_image(self, buffer): +self.pdf_buffer = buffer +self.prepare_temp_files(buffer) + +try: +page = self.context.request.page +except AttributeError: +page = 1 + +command = [ +self.context.config.GHOSTSCRIPT_PATH, +"-sDEVICE=jpeg", +"-sOutputFile=%s" % self.destination.name, +"-dFirstPage=%d" % page, +"-dLastPage=%d" % page, +"-r150", +"-dBATCH", +"-dNOPAUSE", +"-q", +"-f%s" % self.source.name +] + +jpg = self.exec_command(command) +self.extension
[MediaWiki-commits] [Gerrit] Ghostscript engine - change (thumbor/ghostscript-engine)
Gilles has uploaded a new change for review. https://gerrit.wikimedia.org/r/257180 Change subject: Ghostscript engine .. Ghostscript engine Bug: T120207 Change-Id: I60d92731c0806bace1e4012009f9d20ba8ee0df1 --- A LICENSE A requirements.txt A setup.py A tox.ini A wikimedia_thumbor_ghostscript_engine/__init__.py 5 files changed, 158 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/thumbor/ghostscript-engine refs/changes/80/257180/1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 000..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 000..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 000..f565bef --- /dev/null +++ b/setup.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages + + +setup( +name='wikimedia_thumbor_ghostscript_engine', +version='0.1.1', +url='https://github.com/wikimedia/thumbor-ghostscript-engine', +license='MIT', +author='Gilles Dubuc, Wikimedia Foundation', +description='Thumbor Ghostscript 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 000..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_ghostscript_engine/__init__.py b/wikimedia_thumbor_ghostscript_engine/__init__.py new file mode 100644 index 000..3ce4f66 --- /dev/null +++ b/wikimedia_thumbor_ghostscript_engine/__init__.py @@ -0,0 +1,89 @@ +#!/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['application/pdf'] = '.pdf' + +old_get_mimetype = BaseEngine.get_mimetype + +@classmethod +def new_get_mimetype(cls, buffer): +if buffer.startswith('%PDF'): +return 'application/pdf' + +return old_get_mimetype(buffer) + +BaseEngine.get_mimetype = new_get_mimetype + +class Engine(PilEngine): +def should_run(self, extension, buffer): +return (extension == '.pdf') + +def create_image(self, buffer): +destination = NamedTemporaryFile(delete=False) +source = NamedTemporaryFile(delete=False) +source.write(buffer) +source.close() + +self.pdf_buffer = buffer + +try: +page = self.context.request.page +except AttributeError: