diff -r 000000000000 -r fd39db613f8b src/pyams_media/interfaces/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_media/interfaces/__init__.py Wed Sep 02 15:31:55 2015 +0200 @@ -0,0 +1,198 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# + +__docformat__ = 'restructuredtext' + + +# import standard library +from collections import OrderedDict + +# import interfaces + +# import packages +from zope.interface import Interface, Attribute +from zope.schema import List, Choice, Int +from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm + +from pyams_media import _ + + +# +# Medias interfaces +# + +CONVERTER_NAME = 'Medias converter' +CONVERTER_HANDLER_KEY = 'pyams_media.tcp_handler' + +CUSTOM_AUDIO_TYPES = (b'application/ogg',) +CUSTOM_VIDEO_TYPES = () + + +class IMediaInfo(Interface): + """Media file info interface""" + + infos = Attribute("Complete media info dictionary") + + +# +# Media converter utility interfaces +# + +class IMediaConverter(Interface): + """Media converter interface""" + + label = Attribute("Media converter label") + + format = Attribute("Media converter target format") + + def convert(self, media): + """Convert media to format handled by given converter""" + + +class IMediaVideoConverter(IMediaConverter): + """Media video converter""" + + +class IMediaAudioConverter(IMediaConverter): + """Media audio converter""" + + +# +# Media conversions adapter interfaces +# + +class IMediaConversions(Interface): + """Media conversions interface""" + + def add_conversion(self, conversion, format, extension=None, width=None): + """Add given conversion to media""" + + def has_conversion(self, formats): + """Check if one of given formats is available in conversions""" + + def get_conversion(self, format): + """Get converted media for given format and width""" + + def get_conversions(self): + """Get current list of media conversions""" + + +class IMediaConversion(Interface): + """Marker interface for already converted media files""" + + +# +# Media conversion utility configuration interface +# + +VIDEO_FRAME_SIZE = {'sqcif': (128, 96), + 'qqvga': (160, 120), + 'qcif': (176, 144), + 'cga': (320, 200), + 'qvga': (320, 240), + 'cif': (352, 288), + 'vga': (640, 480), + '4cif': (704, 576), + 'svga': (800, 600), + 'wvga': (852, 480), + 'hd480': (852, 480), + 'hd720': (1280, 720), + 'xga': (1024, 768), + 'sxga': (1280, 1024), + 'wxga': (1366, 768), + 'uxga': (1600, 1200), + 'wsxga': (1600, 1024), + 'hd1080': (1920, 1080), + 'wuxga': (1920, 1200), + 'qxga': (2048, 1536), + 'wqxga': (2560, 1600), + 'qsxga': (2560, 2048), + 'wqsxga': (3200, 2048), + 'wquxga': (3840, 2400), + 'hsxga': (5120, 4096), + 'whsxga': (6400, 4096), + 'whuxga': (7680, 4800)} + + +VIDEO_FRAME_SIZE_NAMES = OrderedDict((('sqcif', "sqcif (128x96)"), + ('qqvga', "qqvga (160x120)"), + ('qcif', "qcif (176x144)"), + ('cga', "cga (320x200)"), + ('qvga', "qvga (320x240)"), + ('cif', "cif (352x288)"), + ('vga', "vga (640x480)"), + ('4cif', "4cif (704x576)"), + ('svga', "svga (800x600)"), + ('wvga', "wvga (852x480)"), + ('hd480', "hd480 (852x480)"), + ('hd720', "hd720 (1280x720)"), + ('xga', "xga (1024x768)"), + ('sxga', "sxga (1280x1024)"), + ('wxga', "wxga (1366x768)"), + ('uxga', "uxga (1600x1200)"), + ('wsxga', "wsxga (1600x1024)"), + ('hd1080', "hd1080 (1920x1080)"), + ('wuxga', "wuxga (1920x1200)"), + ('qxga', "qxga (2048x1536)"), + ('wqxga', "wqxga (2560x1600)"), + ('qsxga', "qsxga (2560x2048)"), + ('wqsxga', "wqsxga (3200x2048)"), + ('wquxga', "wquxga (3840x2400)"), + ('hsxga', "hsxga (5120x4096)"), + ('whsxga', "whsxga (6400x4096)"), + ('whuxga', "whuxga (7680x4800)"))) + + +VIDEO_FRAME_SIZE_VOCABULARY = SimpleVocabulary([SimpleTerm(v, title=t) for v, t in VIDEO_FRAME_SIZE_NAMES.items()]) + + +class IMediaConversionUtility(Interface): + """Media conversion client interface""" + + zeo_connection = Choice(title=_("ZEO connection name"), + description=_("Name of ZEO connection utility defining converter connection"), + required=False, + vocabulary="PyAMS ZEO connections") + + video_formats = List(title=_("Video formats conversions"), + description=_("Published video files will be automatically converted to this format"), + value_type=Choice(vocabulary="PyAMS media video converters"), + required=False) + + video_frame_size = List(title=_("Video frames size"), + description=_("Leave empty to keep original frame size..."), + required=True, + value_type=Choice(vocabulary=VIDEO_FRAME_SIZE_VOCABULARY)) + + video_audio_sampling = Int(title=_("Video audio frequency"), + description=_("A common value is 22050. Leave empty to keep original value."), + required=False) + + video_audio_bitrate = Int(title=_("Video audio bitrate"), + description=_("In kilo-bytes per second. Leave empty to keep original value."), + required=False) + + video_quantisation = Int(title=_("Video quantisation scale"), + description=_("Lower value indicates higher quality"), + required=False, + default=1) + + audio_formats = List(title=_("Audio formats conversions"), + description=_("Published audio files will be automatically converted to this format"), + value_type=Choice(vocabulary="PyAMS media audio converters"), + required=False) + + def check_media_conversion(self, media): + """Check if conversion is needed for given media""" + + def convert(self, media, format): + """Convert given media to requested format"""