text: from __future__ import unicode_literals
  
  from .common import InfoExtractor
  from ..utils import (
      float_or_none,
      parse_iso8601,
  )
  
  
  class ClypIE(InfoExtractor):
      _VALID_URL = r'https?://(?:www\.)?clyp\.it/(?P<id>[a-z0-9]+)'
      _TEST = {
          'url': 'https://clyp.it/ojz2wfah',
          'md5': '1d4961036c41247ecfdcc439c0cddcbb',
          'info_dict': {
              'id': 'ojz2wfah',
              'ext': 'mp3',
              'title': 'Krisson80 - bits wip wip',
              'description': '#Krisson80BitsWipWip #chiptune\n#wip',
              'duration': 263.21,
              'timestamp': 1443515251,
              'upload_date': '20150929',
          },
      }
  
      def _real_extract(self, url):
          audio_id = self._match_id(url)
  
          metadata = self._download_json(
              'https://api.clyp.it/%s' % audio_id, audio_id)
  
          formats = []
          for secure in ('', 'Secure'):
              for ext in ('Ogg', 'Mp3'):
                  format_id = '%s%s' % (secure, ext)
                  format_url = metadata.get('%sUrl' % format_id)
                  if format_url:
                      formats.append({
                          'url': format_url,
                          'format_id': format_id,
                          'vcodec': 'none',
                      })
          self._sort_formats(formats)
  
          title = metadata['Title']
          description = metadata.get('Description')
          duration = float_or_none(metadata.get('Duration'))
          timestamp = parse_iso8601(metadata.get('DateCreated'))
  
          return {
              'id': audio_id,
              'title': title,
              'description': description,
              'duration': duration,
              'timestamp': timestamp,
              'formats': formats,
          }
  