AudioField.py 5.43 KB
Newer Older
1
from Products.Formulator.Field import ZMIField
2
from Products.Formulator import Widget
3 4 5 6
from Products.Formulator.DummyField import fields
from Products.Formulator import Validator

class AudioWidget(Widget.TextWidget):
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
  """
  A widget that displays a Audio HTML element.
  This widget is intended to be used in
  conjunction with WebSite.
  """
  property_names = Widget.TextWidget.property_names + \
          ['audio_controls', 'audio_error_message', 'audio_loop', \
              'audio_preload', 'audio_autoplay', 'js_enabled', 'audio_player']

  audio_controls = fields.StringField('audio_controls',
                         title='Audio Controls',
                         description=("Controls to be used in Audio Player."),
                         default='controls',
                         required=0)

  audio_error_message = fields.StringField('audio_error_message',
                         title='Audio Error Message',
                         description=("Error message to be showed when \
          user's browser does not support the audio tag."),
                         default='Your browser does not support audio tag.',
                         required=0)

  audio_loop = fields.StringField('audio_loop',
                         title='Audio Loop',
                         description=("Specifies that the audio file \
          will start over again, every time it is finished."),
                         default='none',
                         required=0)

  audio_preload = fields.StringField('audio_preload',
                         title='Audio Preload',
                         description=("Configure that you would like to \
      start downloading the audio file as soon as possible."),
                         default='preload',
                         required=0)

  audio_autoplay = fields.StringField('audio_autoplay',
                         title='Audio Autoplay',
                         description=("Configure that you would like to \
      start downloading and playing the audio file as soon as possible."),
                         default='',
                         required=0)

  js_enabled = fields.CheckBoxField('js_enabled',
      title='Enable on the fly video player change (based on java script)',
      description='Define if javascript is enabled or not on the current Video',
      default=1,
      required=1)

  audio_player = fields.ListField('audio_player',
                                 title='Audio Player',
                                 description=(
      "The video player to be used to show video."),
                                 default="html5_audio",
                                 required=1,
                                 size=1,
                                 items=[('HTML5 Audio', 'html5_audio'),
                                        ('Flowplayer', 'flowplayer'),])

  def render(self, field, key, value, REQUEST, render_prefix=None):
    return self.render_view(field, value, REQUEST, render_prefix)

  def render_view(self, field, value, REQUEST=None, render_prefix=None):
    if value is None:
      return ''
    audio_player = field.get_value('audio_player')
    if audio_player == 'html5_audio':
      return Widget.render_element("audio",
75
                              src=value,
76
                              extra=field.get_value('extra'),
77 78 79 80 81
                              controls=field.get_value('audio_controls'),
                              loop=field.get_value('audio_loop'),
                              preload=field.get_value('audio_preload'),
                              autoplay=field.get_value('audio_autoplay'),
                              contents=field.get_value('audio_error_message'))
82 83 84 85 86 87 88 89 90 91 92
    elif audio_player == 'flowplayer':
      a_element = Widget.render_element("a",
                        href="%s" % value,
                        style="display:block;width:%spx;height:%spx;" % \
                                        (field.get_value('video_width'),
                                         field.get_value('video_height'),),
                        id="player")

      script_element = """<script language="JavaScript">
                             flowplayer("player", "%s/flowplayer.swf");
                         </script>""" % self.getContext(field, REQUEST).getPortalObject().portal_url()
Rafael Monnerat's avatar
Rafael Monnerat committed
93
      return ' '.join([a_element,script_element])
94

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

  def get_javascript_list(self, field, REQUEST=None):
    """
    Returns list of javascript needed by the widget
    """
    if field.get_value('js_enabled'):
      audio_player = field.get_value('audio_player')
      context = self.getContext(field, REQUEST)
      if audio_player == 'html5_audio':
        # XXX Instead of harcoding library name
        # it should be better to call a python script, as
        # it is done on type base method.
        return ['%s/html5media.min.js' % context.portal_url()]
      elif audio_player == 'flowplayer':
        return ['%s/flowplayer.min.js' % context.portal_url()]
    else:
      return []

113 114
  def getContext(self, field, REQUEST):
    """Return the context of rendering this Field.
115
    """
116
    value = REQUEST.get('here')
117
    if value is None:
118
      value = self.getForm(field).aq_parent
119 120
    return value

121

122
  def getForm(self, field):
123
    """Return the form which contains the Field.
124
    """
125
    return field.aq_parent
126

127 128 129 130 131 132
AudioWidgetInstance = AudioWidget()

class AudioField(ZMIField):
  """ Audio field
  """
  meta_type = "AudioField"
133

134 135
  widget = AudioWidgetInstance
  validator = Validator.SuppressValidatorInstance