thumbor / graphicsmagick-engine

Thumbor engine for the GraphicsMagick imaging library.
MIT License
8 stars 7 forks source link

filters:watermark fails with NotImplementedError #3

Closed cosmicvibes closed 10 years ago

cosmicvibes commented 10 years ago

When using the watermark filer with the GraphicsMagick engine it fails with the error below (500: Internal Server Error).

Example URL passed would be:

http://mythumborserver.net:8888/unsafe/300x300/filters:watermark(http://myimageserver.net/watermark.png,-10,-10,100)/http://myimageserver.net/testimage.jpg

Error message:

2014-04-30 09:27:44 thumbor:ERROR ERROR: Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1192, in _stack_context_handle_exception
    raise_exc_info((type, value, traceback))
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1375, in wrapper
    result = method(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/handlers/imaging.py", line 85, in get
    return self.execute_image_operations()
  File "/usr/local/lib/python2.7/dist-packages/thumbor/handlers/__init__.py", line 69, in execute_image_operations
    self.filters_runner.apply_filters(thumbor.filters.PHASE_PRE_LOAD, self.get_image)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/filters/__init__.py", line 80, in apply_filters
    callback()
  File "/usr/local/lib/python2.7/dist-packages/thumbor/handlers/__init__.py", line 91, in get_image
    self._fetch(self.context.request.image_url, self.context.request.extension, callback)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/handlers/__init__.py", line 268, in _fetch
    callback(False, buffer=buffer)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/handlers/__init__.py", line 89, in callback
    Transformer(self.context).transform(after_transform_cb)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/transformer.py", line 88, in transform
    self.smart_detect()
  File "/usr/local/lib/python2.7/dist-packages/thumbor/transformer.py", line 121, in smart_detect
    self.do_image_operations()
  File "/usr/local/lib/python2.7/dist-packages/thumbor/transformer.py", line 197, in do_image_operations
    self.done_callback()
  File "/usr/local/lib/python2.7/dist-packages/thumbor/handlers/__init__.py", line 128, in after_transform
    self.filters_runner.apply_filters(thumbor.filters.PHASE_POST_TRANSFORM, finish_callback)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/filters/__init__.py", line 90, in apply_filters
    exec_one_filter()
  File "/usr/local/lib/python2.7/dist-packages/thumbor/filters/__init__.py", line 89, in exec_one_filter
    f.run(exec_one_filter)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/filters/__init__.py", line 195, in run
    self.runnable_method(callback, *self.params)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/filters/__init__.py", line 22, in wrapper
    return fn(self, *args2)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/filters/watermark.py", line 64, in watermark
    self.on_image_ready(buffer)
  File "/usr/local/lib/python2.7/dist-packages/thumbor/filters/watermark.py", line 23, in on_image_ready
    mode, data = self.watermark_engine.image_data_as_rgb()
  File "/usr/local/lib/python2.7/dist-packages/thumbor/engines/__init__.py", line 216, in image_data_as_rgb
    raise NotImplementedError()
NotImplementedError
heynemann commented 10 years ago

Can you put your thumbor.conf without the sensitive parts?

cosmicvibes commented 10 years ago

Sure. Though at this stage I have no sensitive parts! In fact the only two options I believe I have changed is to switch to the graphics-magick engine, and set the quality:

################################### Logging ####################################

## Log Format to be used by thumbor when writing log messages.
## Defaults to: %(asctime)s %(name)s:%(levelname)s %(message)s
#THUMBOR_LOG_FORMAT = '%(asctime)s %(name)s:%(levelname)s %(message)s'

## Date Format to be used by thumbor when writing log messages.
## Defaults to: %Y-%m-%d %H:%M:%S
#THUMBOR_LOG_DATE_FORMAT = '%Y-%m-%d %H:%M:%S'

################################################################################

################################### Imaging ####################################

## Max width in pixels for images read or generated by thumbor
## Defaults to: 0
#MAX_WIDTH = 0

## Max height in pixels for images read or generated by thumbor
## Defaults to: 0
#MAX_HEIGHT = 0

## Min width in pixels for images read or generated by thumbor
## Defaults to: 1
#MIN_WIDTH = 1

## Min width in pixels for images read or generated by thumbor
## Defaults to: 1
#MIN_HEIGHT = 1

## Allowed domains for the http loader to download. These are regular
## expressions.
## Defaults to: []
#ALLOWED_SOURCES = #    [
#    ]

## Quality index used for generated JPEG images
## Defaults to: 80
QUALITY = 95 

## Quality index used for generated WebP images. If not set (None) the same level
## of JPEG quality will be used.
## Defaults to: None
#WEBP_QUALITY = None

## Specifies whether WebP format should be used automatically if the request
## accepts it (via Accept header)
## Defaults to: False
#AUTO_WEBP = False

## Max AGE sent as a header for the image served by thumbor in seconds
## Defaults to: 86400
#MAX_AGE = 86400

## Indicates the Max AGE header in seconds for temporary images (images with
## failed smart detection)
## Defaults to: 0
#MAX_AGE_TEMP_IMAGE = 0

## Indicates whether thumbor should rotate images that have an Orientation EXIF
## header
## Defaults to: False
#RESPECT_ORIENTATION = False

## Ignore errors during smart detections and return image as a temp image (not
## saved in result storage and with MAX_AGE_TEMP_IMAGE age)
## Defaults to: False
#IGNORE_SMART_ERRORS = False

## Preserves exif information in generated images. Increases image size in
## kbytes, use with caution.
## Defaults to: False
#PRESERVE_EXIF_INFO = False

## Indicates whether thumbor should enable the EXPERIMENTAL support for animated
## gifs.
## Defaults to: True
#ALLOW_ANIMATED_GIFS = True

################################################################################

################################ Extensibility #################################

## The loader thumbor should use to load the original image. This must be the
## full name of a python module (python must be able to import it)
## Defaults to: thumbor.loaders.http_loader
#LOADER = 'thumbor.loaders.http_loader'

## The file storage thumbor should use to store original images. This must be the
## full name of a python module (python must be able to import it)
## Defaults to: thumbor.storages.file_storage
#STORAGE = 'thumbor.storages.file_storage'

## The result storage thumbor should use to store generated images. This must be
## the full name of a python module (python must be able to import it)
## Defaults to: None
#RESULT_STORAGE = None

## The imaging engine thumbor should use to perform image operations. This must
## be the full name of a python module (python must be able to import it)
## Defaults to: thumbor.engines.pil
#ENGINE = 'thumbor.engines.pil'
ENGINE = 'graphicsmagick_engine'
################################################################################

################################### Security ###################################

## The security key thumbor uses to sign image URLs
## Defaults to: MY_SECURE_KEY
#SECURITY_KEY = 'MY_SECURE_KEY'

## Indicates if the /unsafe URL should be available
## Defaults to: True
ALLOW_UNSAFE_URL = True

## Indicates if encrypted (old style) URLs should be allowed
## Defaults to: True
#ALLOW_OLD_URLS = True

################################################################################

################################# File Loader ##################################

## The root path where the File Loader will try to find images
## Defaults to: /tmp
#FILE_LOADER_ROOT_PATH = '/tmp'

################################################################################

################################# HTTP Loader ##################################

## The maximum number of seconds libcurl can take to connect to an image being
## loaded
## Defaults to: 5
#HTTP_LOADER_CONNECT_TIMEOUT = 5

## The maximum number of seconds libcurl can take to download an image
## Defaults to: 20
#HTTP_LOADER_REQUEST_TIMEOUT = 20

## Indicates whether libcurl should follow redirects when downloading an image
## Defaults to: True
#HTTP_LOADER_FOLLOW_REDIRECTS = True

## Indicates the number of redirects libcurl should follow when downloading an
## image
## Defaults to: 5
#HTTP_LOADER_MAX_REDIRECTS = 5

## Indicates whether thumbor should forward the user agent of the requesting user
## Defaults to: False
#HTTP_LOADER_FORWARD_USER_AGENT = False

## Default user agent for thumbor http loader requests
## Defaults to: Thumbor/4.1.3
#HTTP_LOADER_DEFAULT_USER_AGENT = 'Thumbor/4.1.3'

## The proxy host needed to load images through
## Defaults to: None
#HTTP_LOADER_PROXY_HOST = None

## The proxy port for the proxy host
## Defaults to: None
#HTTP_LOADER_PROXY_PORT = None

## The proxy username for the proxy host
## Defaults to: None
#HTTP_LOADER_PROXY_USERNAME = None

## The proxy password for the proxy host
## Defaults to: None
#HTTP_LOADER_PROXY_PASSWORD = None

################################################################################

################################# File Storage #################################

## Expiration in seconds for the images in the File Storage. Defaults to one
## month
## Defaults to: 2592000
#STORAGE_EXPIRATION_SECONDS = 2592000

## Indicates whether thumbor should store the signing key for each image in the
## file storage. This allows the key to be changed and old images to still be
## properly found
## Defaults to: False
#STORES_CRYPTO_KEY_FOR_EACH_IMAGE = False

## The root path where the File Storage will try to find images
## Defaults to: /tmp/thumbor/storage
#FILE_STORAGE_ROOT_PATH = '/tmp/thumbor/storage'

################################################################################

#################################### Upload ####################################

## Max size in Kb for images uploaded to thumbor
## Aliases: MAX_SIZE
## Defaults to: 0
#UPLOAD_MAX_SIZE = 0

## Indicates whether thumbor should enable File uploads
## Aliases: ENABLE_ORIGINAL_PHOTO_UPLOAD
## Defaults to: False
#UPLOAD_ENABLED = False

## The type of storage to store uploaded images with
## Aliases: ORIGINAL_PHOTO_STORAGE
## Defaults to: thumbor.storages.file_storage
#UPLOAD_PHOTO_STORAGE = 'thumbor.storages.file_storage'

## Indicates whether image deletion should be allowed
## Aliases: ALLOW_ORIGINAL_PHOTO_DELETION
## Defaults to: False
#UPLOAD_DELETE_ALLOWED = False

## Indicates whether image overwrite should be allowed
## Aliases: ALLOW_ORIGINAL_PHOTO_PUTTING
## Defaults to: False
#UPLOAD_PUT_ALLOWED = False

## Default filename for image uploaded
## Defaults to: image
#UPLOAD_DEFAULT_FILENAME = 'image'

################################################################################

############################### MongoDB Storage ################################

## MongoDB storage server host
## Defaults to: localhost
#MONGO_STORAGE_SERVER_HOST = 'localhost'

## MongoDB storage server port
## Defaults to: 27017
#MONGO_STORAGE_SERVER_PORT = 27017

## MongoDB storage server database name
## Defaults to: thumbor
#MONGO_STORAGE_SERVER_DB = 'thumbor'

## MongoDB storage image collection
## Defaults to: images
#MONGO_STORAGE_SERVER_COLLECTION = 'images'

################################################################################

################################ Redis Storage #################################

## Redis storage server host
## Defaults to: localhost
#REDIS_STORAGE_SERVER_HOST = 'localhost'

## Redis storage server port
## Defaults to: 6379
#REDIS_STORAGE_SERVER_PORT = 6379

## Redis storage database index
## Defaults to: 0
#REDIS_STORAGE_SERVER_DB = 0

## Redis storage server password
## Defaults to: None
#REDIS_STORAGE_SERVER_PASSWORD = None

################################################################################

############################### Memcache Storage ###############################

## List of Memcache storage server hosts
## Defaults to: ['localhost:11211']
#MEMCACHE_STORAGE_SERVERS = #    [
#        'localhost:11211',
#    ]

################################################################################

################################ Mixed Storage #################################

## Mixed Storage file storage. This must be the full name of a python module
## (python must be able to import it)
## Defaults to: thumbor.storages.no_storage
#MIXED_STORAGE_FILE_STORAGE = 'thumbor.storages.no_storage'

## Mixed Storage signing key storage. This must be the full name of a python
## module (python must be able to import it)
## Defaults to: thumbor.storages.no_storage
#MIXED_STORAGE_CRYPTO_STORAGE = 'thumbor.storages.no_storage'

## Mixed Storage detector information storage. This must be the full name of a
## python module (python must be able to import it)
## Defaults to: thumbor.storages.no_storage
#MIXED_STORAGE_DETECTOR_STORAGE = 'thumbor.storages.no_storage'

################################################################################

##################################### Meta #####################################

## The callback function name that should be used by the META route for JSONP
## access
## Defaults to: None
#META_CALLBACK_NAME = None

################################################################################

################################## Detection ###################################

## List of detectors that thumbor should use to find faces and/or features. All
## of them must be full names of python modules (python must be able to import
## it)
## Defaults to: []
#DETECTORS = #    [
#    ]

## The cascade file that opencv will use to detect faces
## Defaults to: haarcascade_frontalface_alt.xml
#FACE_DETECTOR_CASCADE_FILE = 'haarcascade_frontalface_alt.xml'

################################################################################

################################### Filters ####################################

## List of filters that thumbor will allow to be used in generated images. All of
## them must be full names of python modules (python must be able to import
## it)
## Defaults to: ['thumbor.filters.brightness', 'thumbor.filters.contrast', 'thumbor.filters.rgb', 'thumbor.filters.round_corner', 'thumbor.filters.quality', 'thumbor.filters.noise', 'thumbor.filters.watermark', 'thumbor.filters.equalize', 'thumbor.filters.fill', 'thumbor.filters.sharpen', 'thumbor.filters.strip_icc', 'thumbor.filters.frame', 'thumbor.filters.grayscale', 'thumbor.filters.format', 'thumbor.filters.max_bytes', 'thumbor.filters.convolution', 'thumbor.filters.blur', 'thumbor.filters.extract_focal']
#FILTERS = #    [
#        'thumbor.filters.brightness',
#        'thumbor.filters.contrast',
#        'thumbor.filters.rgb',
#        'thumbor.filters.round_corner',
#        'thumbor.filters.quality',
#        'thumbor.filters.noise',
#        'thumbor.filters.watermark',
#        'thumbor.filters.equalize',
#        'thumbor.filters.fill',
#        'thumbor.filters.sharpen',
#        'thumbor.filters.strip_icc',
#        'thumbor.filters.frame',
#        'thumbor.filters.grayscale',
#        'thumbor.filters.format',
#        'thumbor.filters.max_bytes',
#        'thumbor.filters.convolution',
#        'thumbor.filters.blur',
#        'thumbor.filters.extract_focal',
#    ]

################################################################################

################################ Result Storage ################################

## Expiration in seconds of generated images in the result storage
## Defaults to: 0
#RESULT_STORAGE_EXPIRATION_SECONDS = 0

## Path where the Result storage will store generated images
## Defaults to: /tmp/thumbor/result_storage
#RESULT_STORAGE_FILE_STORAGE_ROOT_PATH = '/tmp/thumbor/result_storage'

## Indicates whether unsafe requests should also be stored in the Result Storage
## Defaults to: False
#RESULT_STORAGE_STORES_UNSAFE = False

################################################################################

############################ Queued Redis Detector #############################

## Server host for the queued redis detector
## Defaults to: localhost
#REDIS_QUEUE_SERVER_HOST = 'localhost'

## Server port for the queued redis detector
## Defaults to: 6379
#REDIS_QUEUE_SERVER_PORT = 6379

## Server database index for the queued redis detector
## Defaults to: 0
#REDIS_QUEUE_SERVER_DB = 0

## Server password for the queued redis detector
## Defaults to: None
#REDIS_QUEUE_SERVER_PASSWORD = None

################################################################################

############################# Queued SQS Detector ##############################

## AWS key id
## Defaults to: None
#SQS_QUEUE_KEY_ID = None

## AWS key secret
## Defaults to: None
#SQS_QUEUE_KEY_SECRET = None

## AWS SQS region
## Defaults to: us-east-1
#SQS_QUEUE_REGION = 'us-east-1'

################################################################################

#################################### Errors ####################################

## This configuration indicates whether thumbor should use a custom error
## handler.
## Defaults to: False
#USE_CUSTOM_ERROR_HANDLING = False

## Error reporting module. Needs to contain a class called ErrorHandler with a
## handle_error(context, handler, exception) method.
## Defaults to: thumbor.error_handlers.sentry
#ERROR_HANDLER_MODULE = 'thumbor.error_handlers.sentry'

## File of error log as json
## Defaults to: None
#ERROR_FILE_LOGGER = None

################################################################################

############################### Errors - Sentry ################################

## Sentry thumbor project dsn. i.e.: http://5a63d58ae7b94f1dab3dee740b301d6a:73ee
## a45d3e8649239a973087e8f21f98@localhost:9000/2
## Defaults to: 
#SENTRY_DSN_URL = ''

################################################################################
heynemann commented 10 years ago

Sorry for that. We had it fixed a couple weeks ago and never created a new release. Can you please upgrade your version of graphicsmagick_engine and try again?

cosmicvibes commented 10 years ago

Ah ok. Indeed I have just upgraded with PIP and it now works as expected. Many thanks for the fast response! Note for your reference it throws this warning now (just in case your are not aware):

2014-04-30 19:50:05 thumbor:WARNING Deprecated function get_image_data: Use image_data_as_rgb instead.

..but I'll close this thread as the issue it refers to is now sorted. Thanks again.