|
@ -14,6 +14,8 @@ from ..utils import ( |
|
|
int_or_none, |
|
|
int_or_none, |
|
|
parse_iso8601, |
|
|
parse_iso8601, |
|
|
unescapeHTML, |
|
|
unescapeHTML, |
|
|
|
|
|
xpath_text, |
|
|
|
|
|
xpath_with_ns, |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -23,10 +25,10 @@ class BlipTVIE(InfoExtractor): |
|
|
_TESTS = [ |
|
|
_TESTS = [ |
|
|
{ |
|
|
{ |
|
|
'url': 'http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352', |
|
|
'url': 'http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352', |
|
|
'md5': 'c6934ad0b6acf2bd920720ec888eb812', |
|
|
|
|
|
|
|
|
'md5': '80baf1ec5c3d2019037c1c707d676b9f', |
|
|
'info_dict': { |
|
|
'info_dict': { |
|
|
'id': '5779306', |
|
|
'id': '5779306', |
|
|
'ext': 'mov', |
|
|
|
|
|
|
|
|
'ext': 'm4v', |
|
|
'title': 'CBR EXCLUSIVE: "Gotham City Imposters" Bats VS Jokerz Short 3', |
|
|
'title': 'CBR EXCLUSIVE: "Gotham City Imposters" Bats VS Jokerz Short 3', |
|
|
'description': 'md5:9bc31f227219cde65e47eeec8d2dc596', |
|
|
'description': 'md5:9bc31f227219cde65e47eeec8d2dc596', |
|
|
'timestamp': 1323138843, |
|
|
'timestamp': 1323138843, |
|
@ -128,35 +130,34 @@ class BlipTVIE(InfoExtractor): |
|
|
|
|
|
|
|
|
rss = self._download_xml('http://blip.tv/rss/flash/%s' % video_id, video_id, 'Downloading video RSS') |
|
|
rss = self._download_xml('http://blip.tv/rss/flash/%s' % video_id, video_id, 'Downloading video RSS') |
|
|
|
|
|
|
|
|
def blip(s): |
|
|
|
|
|
return '{http://blip.tv/dtd/blip/1.0}%s' % s |
|
|
|
|
|
|
|
|
|
|
|
def media(s): |
|
|
|
|
|
return '{http://search.yahoo.com/mrss/}%s' % s |
|
|
|
|
|
|
|
|
|
|
|
def itunes(s): |
|
|
|
|
|
return '{http://www.itunes.com/dtds/podcast-1.0.dtd}%s' % s |
|
|
|
|
|
|
|
|
def _x(p): |
|
|
|
|
|
return xpath_with_ns(p, { |
|
|
|
|
|
'blip': 'http://blip.tv/dtd/blip/1.0', |
|
|
|
|
|
'media': 'http://search.yahoo.com/mrss/', |
|
|
|
|
|
'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd', |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
item = rss.find('channel/item') |
|
|
item = rss.find('channel/item') |
|
|
|
|
|
|
|
|
video_id = item.find(blip('item_id')).text |
|
|
|
|
|
title = item.find('./title').text |
|
|
|
|
|
description = clean_html(compat_str(item.find(blip('puredescription')).text)) |
|
|
|
|
|
timestamp = parse_iso8601(item.find(blip('datestamp')).text) |
|
|
|
|
|
uploader = item.find(blip('user')).text |
|
|
|
|
|
uploader_id = item.find(blip('userid')).text |
|
|
|
|
|
duration = int(item.find(blip('runtime')).text) |
|
|
|
|
|
media_thumbnail = item.find(media('thumbnail')) |
|
|
|
|
|
thumbnail = media_thumbnail.get('url') if media_thumbnail is not None else item.find(itunes('image')).text |
|
|
|
|
|
categories = [category.text for category in item.findall('category')] |
|
|
|
|
|
|
|
|
video_id = xpath_text(item, _x('blip:item_id'), 'video id') or lookup_id |
|
|
|
|
|
title = xpath_text(item, 'title', 'title', fatal=True) |
|
|
|
|
|
description = clean_html(xpath_text(item, _x('blip:puredescription'), 'description')) |
|
|
|
|
|
timestamp = parse_iso8601(xpath_text(item, _x('blip:datestamp'), 'timestamp')) |
|
|
|
|
|
uploader = xpath_text(item, _x('blip:user'), 'uploader') |
|
|
|
|
|
uploader_id = xpath_text(item, _x('blip:userid'), 'uploader id') |
|
|
|
|
|
duration = int_or_none(xpath_text(item, _x('blip:runtime'), 'duration')) |
|
|
|
|
|
media_thumbnail = item.find(_x('media:thumbnail')) |
|
|
|
|
|
thumbnail = (media_thumbnail.get('url') if media_thumbnail is not None |
|
|
|
|
|
else xpath_text(item, 'image', 'thumbnail')) |
|
|
|
|
|
categories = [category.text for category in item.findall('category') if category is not None] |
|
|
|
|
|
|
|
|
formats = [] |
|
|
formats = [] |
|
|
subtitles_urls = {} |
|
|
subtitles_urls = {} |
|
|
|
|
|
|
|
|
media_group = item.find(media('group')) |
|
|
|
|
|
for media_content in media_group.findall(media('content')): |
|
|
|
|
|
|
|
|
media_group = item.find(_x('media:group')) |
|
|
|
|
|
for media_content in media_group.findall(_x('media:content')): |
|
|
url = media_content.get('url') |
|
|
url = media_content.get('url') |
|
|
role = media_content.get(blip('role')) |
|
|
|
|
|
|
|
|
role = media_content.get(_x('blip:role')) |
|
|
msg = self._download_webpage( |
|
|
msg = self._download_webpage( |
|
|
url + '?showplayer=20140425131715&referrer=http://blip.tv&mask=7&skin=flashvars&view=url', |
|
|
url + '?showplayer=20140425131715&referrer=http://blip.tv&mask=7&skin=flashvars&view=url', |
|
|
video_id, 'Resolving URL for %s' % role) |
|
|
video_id, 'Resolving URL for %s' % role) |
|
@ -175,8 +176,8 @@ class BlipTVIE(InfoExtractor): |
|
|
'url': real_url, |
|
|
'url': real_url, |
|
|
'format_id': role, |
|
|
'format_id': role, |
|
|
'format_note': media_type, |
|
|
'format_note': media_type, |
|
|
'vcodec': media_content.get(blip('vcodec')) or 'none', |
|
|
|
|
|
'acodec': media_content.get(blip('acodec')), |
|
|
|
|
|
|
|
|
'vcodec': media_content.get(_x('blip:vcodec')) or 'none', |
|
|
|
|
|
'acodec': media_content.get(_x('blip:acodec')), |
|
|
'filesize': media_content.get('filesize'), |
|
|
'filesize': media_content.get('filesize'), |
|
|
'width': int_or_none(media_content.get('width')), |
|
|
'width': int_or_none(media_content.get('width')), |
|
|
'height': int_or_none(media_content.get('height')), |
|
|
'height': int_or_none(media_content.get('height')), |
|
|