xstream.py (3981B)
- # coding: utf-8
- from __future__ import unicode_literals
- import re
- from .common import InfoExtractor
- from ..utils import (
- int_or_none,
- parse_iso8601,
- xpath_with_ns,
- xpath_text,
- find_xpath_attr,
- )
- class XstreamIE(InfoExtractor):
- _VALID_URL = r'''(?x)
- (?:
- xstream:|
- https?://frontend\.xstream\.(?:dk|net)/
- )
- (?P<partner_id>[^/]+)
- (?:
- :|
- /feed/video/\?.*?\bid=
- )
- (?P<id>\d+)
- '''
- _TESTS = [{
- 'url': 'http://frontend.xstream.dk/btno/feed/video/?platform=web&id=86588',
- 'md5': 'd7d17e3337dc80de6d3a540aefbe441b',
- 'info_dict': {
- 'id': '86588',
- 'ext': 'mov',
- 'title': 'Otto Wollertsen',
- 'description': 'Vestlendingen Otto Fredrik Wollertsen',
- 'timestamp': 1430473209,
- 'upload_date': '20150501',
- },
- }, {
- 'url': 'http://frontend.xstream.dk/ap/feed/video/?platform=web&id=21039',
- 'only_matching': True,
- }]
- def _extract_video_info(self, partner_id, video_id):
- data = self._download_xml(
- 'http://frontend.xstream.dk/%s/feed/video/?platform=web&id=%s'
- % (partner_id, video_id),
- video_id)
- NS_MAP = {
- 'atom': 'http://www.w3.org/2005/Atom',
- 'xt': 'http://xstream.dk/',
- 'media': 'http://search.yahoo.com/mrss/',
- }
- entry = data.find(xpath_with_ns('./atom:entry', NS_MAP))
- title = xpath_text(
- entry, xpath_with_ns('./atom:title', NS_MAP), 'title')
- description = xpath_text(
- entry, xpath_with_ns('./atom:summary', NS_MAP), 'description')
- timestamp = parse_iso8601(xpath_text(
- entry, xpath_with_ns('./atom:published', NS_MAP), 'upload date'))
- formats = []
- media_group = entry.find(xpath_with_ns('./media:group', NS_MAP))
- for media_content in media_group.findall(xpath_with_ns('./media:content', NS_MAP)):
- media_url = media_content.get('url')
- if not media_url:
- continue
- tbr = int_or_none(media_content.get('bitrate'))
- mobj = re.search(r'^(?P<url>rtmp://[^/]+/(?P<app>[^/]+))/(?P<playpath>.+)$', media_url)
- if mobj:
- formats.append({
- 'url': mobj.group('url'),
- 'play_path': 'mp4:%s' % mobj.group('playpath'),
- 'app': mobj.group('app'),
- 'ext': 'flv',
- 'tbr': tbr,
- 'format_id': 'rtmp-%d' % tbr,
- })
- else:
- formats.append({
- 'url': media_url,
- 'tbr': tbr,
- })
- self._sort_formats(formats)
- link = find_xpath_attr(
- entry, xpath_with_ns('./atom:link', NS_MAP), 'rel', 'original')
- if link is not None:
- formats.append({
- 'url': link.get('href'),
- 'format_id': link.get('rel'),
- 'preference': 1,
- })
- thumbnails = [{
- 'url': splash.get('url'),
- 'width': int_or_none(splash.get('width')),
- 'height': int_or_none(splash.get('height')),
- } for splash in media_group.findall(xpath_with_ns('./xt:splash', NS_MAP))]
- return {
- 'id': video_id,
- 'title': title,
- 'description': description,
- 'timestamp': timestamp,
- 'formats': formats,
- 'thumbnails': thumbnails,
- }
- def _real_extract(self, url):
- mobj = re.match(self._VALID_URL, url)
- partner_id = mobj.group('partner_id')
- video_id = mobj.group('id')
- return self._extract_video_info(partner_id, video_id)