101 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
# -*- coding: utf-8 -*-
 | 
						|
# Copyright 2014, 2015 matrix.org
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
from ._base import Config
 | 
						|
from collections import namedtuple
 | 
						|
 | 
						|
ThumbnailRequirement = namedtuple(
 | 
						|
    "ThumbnailRequirement", ["width", "height", "method", "media_type"]
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
def parse_thumbnail_requirements(thumbnail_sizes):
 | 
						|
    """ Takes a list of dictionaries with "width", "height", and "method" keys
 | 
						|
    and creates a map from image media types to the thumbnail size, thumnailing
 | 
						|
    method, and thumbnail media type to precalculate
 | 
						|
 | 
						|
    Args:
 | 
						|
        thumbnail_sizes(list): List of dicts with "width", "height", and
 | 
						|
            "method" keys
 | 
						|
    Returns:
 | 
						|
        Dictionary mapping from media type string to list of
 | 
						|
        ThumbnailRequirement tuples.
 | 
						|
    """
 | 
						|
    requirements = {}
 | 
						|
    for size in thumbnail_sizes:
 | 
						|
        width = size["width"]
 | 
						|
        height = size["height"]
 | 
						|
        method = size["method"]
 | 
						|
        jpeg_thumbnail = ThumbnailRequirement(width, height, method, "image/jpeg")
 | 
						|
        png_thumbnail = ThumbnailRequirement(width, height, method, "image/png")
 | 
						|
        requirements.setdefault("image/jpeg", []).append(jpeg_thumbnail)
 | 
						|
        requirements.setdefault("image/gif", []).append(png_thumbnail)
 | 
						|
        requirements.setdefault("image/png", []).append(png_thumbnail)
 | 
						|
    return {
 | 
						|
        media_type: tuple(thumbnails)
 | 
						|
        for media_type, thumbnails in requirements.items()
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
class ContentRepositoryConfig(Config):
 | 
						|
    def read_config(self, config):
 | 
						|
        self.max_upload_size = self.parse_size(config["max_upload_size"])
 | 
						|
        self.max_image_pixels = self.parse_size(config["max_image_pixels"])
 | 
						|
        self.media_store_path = self.ensure_directory(config["media_store_path"])
 | 
						|
        self.uploads_path = self.ensure_directory(config["uploads_path"])
 | 
						|
        self.dynamic_thumbnails = config["dynamic_thumbnails"]
 | 
						|
        self.thumbnail_requirements = parse_thumbnail_requirements(
 | 
						|
            config["thumbnail_sizes"]
 | 
						|
        )
 | 
						|
 | 
						|
    def default_config(self, config_dir_path, server_name):
 | 
						|
        media_store = self.default_path("media_store")
 | 
						|
        uploads_path = self.default_path("uploads")
 | 
						|
        return """
 | 
						|
        # Directory where uploaded images and attachments are stored.
 | 
						|
        media_store_path: "%(media_store)s"
 | 
						|
 | 
						|
        # Directory where in-progress uploads are stored.
 | 
						|
        uploads_path: "%(uploads_path)s"
 | 
						|
 | 
						|
        # The largest allowed upload size in bytes
 | 
						|
        max_upload_size: "10M"
 | 
						|
 | 
						|
        # Maximum number of pixels that will be thumbnailed
 | 
						|
        max_image_pixels: "32M"
 | 
						|
 | 
						|
        # Whether to generate new thumbnails on the fly to precisely match
 | 
						|
        # the resolution requested by the client. If true then whenever
 | 
						|
        # a new resolution is requested by the client the server will
 | 
						|
        # generate a new thumbnail. If false the server will pick a thumbnail
 | 
						|
        # from a precalcualted list.
 | 
						|
        dynamic_thumbnails: false
 | 
						|
 | 
						|
        # List of thumbnail to precalculate when an image is uploaded.
 | 
						|
        thumbnail_sizes:
 | 
						|
        - width: 32
 | 
						|
          height: 32
 | 
						|
          method: crop
 | 
						|
        - width: 96
 | 
						|
          height: 96
 | 
						|
          method: crop
 | 
						|
        - width: 320
 | 
						|
          height: 240
 | 
						|
          method: scale
 | 
						|
        - width: 640
 | 
						|
          height: 480
 | 
						|
          method: scale
 | 
						|
        """ % locals()
 |