aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/extractor
diff options
context:
space:
mode:
Diffstat (limited to 'youtube_dl/extractor')
-rw-r--r--youtube_dl/extractor/arte.py21
-rw-r--r--youtube_dl/extractor/common.py5
-rw-r--r--youtube_dl/extractor/googleplus.py4
-rw-r--r--youtube_dl/extractor/internetvideoarchive.py7
-rw-r--r--youtube_dl/extractor/nhl.py4
-rw-r--r--youtube_dl/extractor/redtube.py3
-rw-r--r--youtube_dl/extractor/videodetective.py2
-rw-r--r--youtube_dl/extractor/vimeo.py51
-rw-r--r--youtube_dl/extractor/xhamster.py15
-rw-r--r--youtube_dl/extractor/xnxx.py4
-rw-r--r--youtube_dl/extractor/xvideos.py4
-rw-r--r--youtube_dl/extractor/youporn.py3
-rw-r--r--youtube_dl/extractor/youtube.py2
13 files changed, 74 insertions, 51 deletions
diff --git a/youtube_dl/extractor/arte.py b/youtube_dl/extractor/arte.py
index 5ee8a67b1..d39b48951 100644
--- a/youtube_dl/extractor/arte.py
+++ b/youtube_dl/extractor/arte.py
@@ -174,12 +174,27 @@ class ArteTVPlus7IE(InfoExtractor):
# Some formats use the m3u8 protocol
formats = filter(lambda f: f.get('videoFormat') != 'M3U8', formats)
# We order the formats by quality
- formats = sorted(formats, key=lambda f: int(f.get('height',-1)))
+ formats = list(formats) # in python3 filter returns an iterator
+ if re.match(r'[A-Z]Q', formats[0]['quality']) is not None:
+ sort_key = lambda f: ['HQ', 'MQ', 'EQ', 'SQ'].index(f['quality'])
+ else:
+ sort_key = lambda f: int(f.get('height',-1))
+ formats = sorted(formats, key=sort_key)
# Prefer videos without subtitles in the same language
formats = sorted(formats, key=lambda f: re.match(r'VO(F|A)-STM\1', f.get('versionCode', '')) is None)
# Pick the best quality
def _format(format_info):
+ quality = format_info['quality']
+ m_quality = re.match(r'\w*? - (\d*)p', quality)
+ if m_quality is not None:
+ quality = m_quality.group(1)
+ if format_info.get('versionCode') is not None:
+ format_id = u'%s-%s' % (quality, format_info['versionCode'])
+ else:
+ format_id = quality
info = {
+ 'format_id': format_id,
+ 'format_note': format_info.get('versionLibelle'),
'width': format_info.get('width'),
'height': format_info.get('height'),
}
@@ -192,8 +207,6 @@ class ArteTVPlus7IE(InfoExtractor):
info['ext'] = determine_ext(info['url'])
return info
info_dict['formats'] = [_format(f) for f in formats]
- # TODO: Remove when #980 has been merged
- info_dict.update(info_dict['formats'][-1])
return info_dict
@@ -207,7 +220,7 @@ class ArteTVCreativeIE(ArteTVPlus7IE):
u'url': u'http://creative.arte.tv/de/magazin/agentur-amateur-corporate-design',
u'file': u'050489-002.mp4',
u'info_dict': {
- u'title': u'Agentur Amateur #2 - Corporate Design',
+ u'title': u'Agentur Amateur / Agence Amateur #2 : Corporate Design',
},
}
diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py
index d4af3b5eb..7d7ce5d98 100644
--- a/youtube_dl/extractor/common.py
+++ b/youtube_dl/extractor/common.py
@@ -61,9 +61,12 @@ class InfoExtractor(object):
* ext Will be calculated from url if missing
* format A human-readable description of the format
("mp4 container with h264/opus").
- Calculated from width and height if missing.
+ Calculated from the format_id, width, height
+ and format_note fields if missing.
* format_id A short description of the format
("mp4_h264_opus" or "19")
+ * format_note Additional info about the format
+ ("3D" or "DASH video")
* width Width of the video, if known
* height Height of the video, if known
diff --git a/youtube_dl/extractor/googleplus.py b/youtube_dl/extractor/googleplus.py
index ab12d7e93..2570746b2 100644
--- a/youtube_dl/extractor/googleplus.py
+++ b/youtube_dl/extractor/googleplus.py
@@ -41,9 +41,9 @@ class GooglePlusIE(InfoExtractor):
# Extract update date
upload_date = self._html_search_regex(
- r'''(?x)<a.+?class="o-T-s\s[^"]+"\s+style="display:\s*none"\s*>
+ r'''(?x)<a.+?class="o-U-s\s[^"]+"\s+style="display:\s*none"\s*>
([0-9]{4}-[0-9]{2}-[0-9]{2})</a>''',
- webpage, u'upload date', fatal=False)
+ webpage, u'upload date', fatal=False, flags=re.VERBOSE)
if upload_date:
# Convert timestring to a format suitable for filename
upload_date = datetime.datetime.strptime(upload_date, "%Y-%m-%d")
diff --git a/youtube_dl/extractor/internetvideoarchive.py b/youtube_dl/extractor/internetvideoarchive.py
index 5986459d6..be8e05f53 100644
--- a/youtube_dl/extractor/internetvideoarchive.py
+++ b/youtube_dl/extractor/internetvideoarchive.py
@@ -19,7 +19,7 @@ class InternetVideoArchiveIE(InfoExtractor):
u'info_dict': {
u'title': u'SKYFALL',
u'description': u'In SKYFALL, Bond\'s loyalty to M is tested as her past comes back to haunt her. As MI6 comes under attack, 007 must track down and destroy the threat, no matter how personal the cost.',
- u'duration': 156,
+ u'duration': 153,
},
}
@@ -74,7 +74,7 @@ class InternetVideoArchiveIE(InfoExtractor):
})
formats = sorted(formats, key=lambda f: f['bitrate'])
- info = {
+ return {
'id': video_id,
'title': item.find('title').text,
'formats': formats,
@@ -82,6 +82,3 @@ class InternetVideoArchiveIE(InfoExtractor):
'description': item.find('description').text,
'duration': int(attr['duration']),
}
- # TODO: Remove when #980 has been merged
- info.update(formats[-1])
- return info
diff --git a/youtube_dl/extractor/nhl.py b/youtube_dl/extractor/nhl.py
index e8d43dd13..224f56ac8 100644
--- a/youtube_dl/extractor/nhl.py
+++ b/youtube_dl/extractor/nhl.py
@@ -90,8 +90,8 @@ class NHLVideocenterIE(NHLBaseInfoExtractor):
r'{statusIndex:0,index:0,.*?id:(.*?),'],
webpage, u'category id')
playlist_title = self._html_search_regex(
- r'\?catid=%s">(.*?)</a>' % cat_id,
- webpage, u'playlist title', flags=re.DOTALL)
+ r'tab0"[^>]*?>(.*?)</td>',
+ webpage, u'playlist title', flags=re.DOTALL).lower().capitalize()
data = compat_urllib_parse.urlencode({
'cid': cat_id,
diff --git a/youtube_dl/extractor/redtube.py b/youtube_dl/extractor/redtube.py
index 365aade56..994778e16 100644
--- a/youtube_dl/extractor/redtube.py
+++ b/youtube_dl/extractor/redtube.py
@@ -10,7 +10,8 @@ class RedTubeIE(InfoExtractor):
u'file': u'66418.mp4',
u'md5': u'7b8c22b5e7098a3e1c09709df1126d2d',
u'info_dict': {
- u"title": u"Sucked on a toilet"
+ u"title": u"Sucked on a toilet",
+ u"age_limit": 18,
}
}
diff --git a/youtube_dl/extractor/videodetective.py b/youtube_dl/extractor/videodetective.py
index d89f84094..265dd5b91 100644
--- a/youtube_dl/extractor/videodetective.py
+++ b/youtube_dl/extractor/videodetective.py
@@ -16,7 +16,7 @@ class VideoDetectiveIE(InfoExtractor):
u'info_dict': {
u'title': u'KICK-ASS 2',
u'description': u'md5:65ba37ad619165afac7d432eaded6013',
- u'duration': 138,
+ u'duration': 135,
},
}
diff --git a/youtube_dl/extractor/vimeo.py b/youtube_dl/extractor/vimeo.py
index 2de56ac81..1125513c7 100644
--- a/youtube_dl/extractor/vimeo.py
+++ b/youtube_dl/extractor/vimeo.py
@@ -179,46 +179,45 @@ class VimeoIE(InfoExtractor):
# Vimeo specific: extract video codec and quality information
# First consider quality, then codecs, then take everything
- # TODO bind to format param
- codecs = [('h264', 'mp4'), ('vp8', 'flv'), ('vp6', 'flv')]
+ codecs = [('vp6', 'flv'), ('vp8', 'flv'), ('h264', 'mp4')]
files = { 'hd': [], 'sd': [], 'other': []}
config_files = config["video"].get("files") or config["request"].get("files")
for codec_name, codec_extension in codecs:
- if codec_name in config_files:
- if 'hd' in config_files[codec_name]:
- files['hd'].append((codec_name, codec_extension, 'hd'))
- elif 'sd' in config_files[codec_name]:
- files['sd'].append((codec_name, codec_extension, 'sd'))
+ for quality in config_files.get(codec_name, []):
+ format_id = '-'.join((codec_name, quality)).lower()
+ key = quality if quality in files else 'other'
+ video_url = None
+ if isinstance(config_files[codec_name], dict):
+ file_info = config_files[codec_name][quality]
+ video_url = file_info.get('url')
else:
- files['other'].append((codec_name, codec_extension, config_files[codec_name][0]))
-
- for quality in ('hd', 'sd', 'other'):
- if len(files[quality]) > 0:
- video_quality = files[quality][0][2]
- video_codec = files[quality][0][0]
- video_extension = files[quality][0][1]
- self.to_screen(u'%s: Downloading %s file at %s quality' % (video_id, video_codec.upper(), video_quality))
- break
- else:
+ file_info = {}
+ if video_url is None:
+ video_url = "http://player.vimeo.com/play_redirect?clip_id=%s&sig=%s&time=%s&quality=%s&codecs=%s&type=moogaloop_local&embed_location=" \
+ %(video_id, sig, timestamp, quality, codec_name.upper())
+
+ files[key].append({
+ 'ext': codec_extension,
+ 'url': video_url,
+ 'format_id': format_id,
+ 'width': file_info.get('width'),
+ 'height': file_info.get('height'),
+ })
+ formats = []
+ for key in ('other', 'sd', 'hd'):
+ formats += files[key]
+ if len(formats) == 0:
raise ExtractorError(u'No known codec found')
- video_url = None
- if isinstance(config_files[video_codec], dict):
- video_url = config_files[video_codec][video_quality].get("url")
- if video_url is None:
- video_url = "http://player.vimeo.com/play_redirect?clip_id=%s&sig=%s&time=%s&quality=%s&codecs=%s&type=moogaloop_local&embed_location=" \
- %(video_id, sig, timestamp, video_quality, video_codec.upper())
-
return [{
'id': video_id,
- 'url': video_url,
'uploader': video_uploader,
'uploader_id': video_uploader_id,
'upload_date': video_upload_date,
'title': video_title,
- 'ext': video_extension,
'thumbnail': video_thumbnail,
'description': video_description,
+ 'formats': formats,
}]
diff --git a/youtube_dl/extractor/xhamster.py b/youtube_dl/extractor/xhamster.py
index 361619694..81c4be326 100644
--- a/youtube_dl/extractor/xhamster.py
+++ b/youtube_dl/extractor/xhamster.py
@@ -19,7 +19,8 @@ class XHamsterIE(InfoExtractor):
u'info_dict': {
u"upload_date": u"20121014",
u"uploader_id": u"Ruseful2011",
- u"title": u"FemaleAgent Shy beauty takes the bait"
+ u"title": u"FemaleAgent Shy beauty takes the bait",
+ u"age_limit": 18,
}
},
{
@@ -27,9 +28,10 @@ class XHamsterIE(InfoExtractor):
u'file': u'2221348.flv',
u'md5': u'e767b9475de189320f691f49c679c4c7',
u'info_dict': {
- u"upload_date": u"20130914",
- u"uploader_id": u"jojo747400",
- u"title": u"Britney Spears Sexy Booty"
+ u"upload_date": u"20130914",
+ u"uploader_id": u"jojo747400",
+ u"title": u"Britney Spears Sexy Booty",
+ u"age_limit": 18,
}
}]
@@ -72,6 +74,8 @@ class XHamsterIE(InfoExtractor):
video_thumbnail = self._search_regex(r'\'image\':\'(?P<thumbnail>[^\']+)\'',
webpage, u'thumbnail', fatal=False)
+ age_limit = self._rta_search(webpage)
+
return [{
'id': video_id,
'url': video_url,
@@ -80,5 +84,6 @@ class XHamsterIE(InfoExtractor):
'description': video_description,
'upload_date': video_upload_date,
'uploader_id': video_uploader_id,
- 'thumbnail': video_thumbnail
+ 'thumbnail': video_thumbnail,
+ 'age_limit': age_limit,
}]
diff --git a/youtube_dl/extractor/xnxx.py b/youtube_dl/extractor/xnxx.py
index 40d848900..8a0eb1afd 100644
--- a/youtube_dl/extractor/xnxx.py
+++ b/youtube_dl/extractor/xnxx.py
@@ -18,7 +18,8 @@ class XNXXIE(InfoExtractor):
u'file': u'1135332.flv',
u'md5': u'0831677e2b4761795f68d417e0b7b445',
u'info_dict': {
- u"title": u"lida \u00bb Naked Funny Actress (5)"
+ u"title": u"lida \u00bb Naked Funny Actress (5)",
+ u"age_limit": 18,
}
}
@@ -50,4 +51,5 @@ class XNXXIE(InfoExtractor):
'ext': 'flv',
'thumbnail': video_thumbnail,
'description': None,
+ 'age_limit': 18,
}]
diff --git a/youtube_dl/extractor/xvideos.py b/youtube_dl/extractor/xvideos.py
index c3b9736d7..90138d7e5 100644
--- a/youtube_dl/extractor/xvideos.py
+++ b/youtube_dl/extractor/xvideos.py
@@ -13,7 +13,8 @@ class XVideosIE(InfoExtractor):
u'file': u'939581.flv',
u'md5': u'1d0c835822f0a71a7bf011855db929d0',
u'info_dict': {
- u"title": u"Funny Porns By >>>>S<<<<<< -1"
+ u"title": u"Funny Porns By >>>>S<<<<<< -1",
+ u"age_limit": 18,
}
}
@@ -46,6 +47,7 @@ class XVideosIE(InfoExtractor):
'ext': 'flv',
'thumbnail': video_thumbnail,
'description': None,
+ 'age_limit': 18,
}
return [info]
diff --git a/youtube_dl/extractor/youporn.py b/youtube_dl/extractor/youporn.py
index b1f93dd1b..e3b56cece 100644
--- a/youtube_dl/extractor/youporn.py
+++ b/youtube_dl/extractor/youporn.py
@@ -26,7 +26,8 @@ class YouPornIE(InfoExtractor):
u"upload_date": u"20101221",
u"description": u"Love & Sex Answers: http://bit.ly/DanAndJenn -- Is It Unhealthy To Masturbate Daily?",
u"uploader": u"Ask Dan And Jennifer",
- u"title": u"Sex Ed: Is It Safe To Masturbate Daily?"
+ u"title": u"Sex Ed: Is It Safe To Masturbate Daily?",
+ u"age_limit": 18,
}
}
diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py
index 96ead3310..7a7bbe265 100644
--- a/youtube_dl/extractor/youtube.py
+++ b/youtube_dl/extractor/youtube.py
@@ -1152,7 +1152,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
list_page = self._download_webpage(list_url, video_id)
caption_list = xml.etree.ElementTree.fromstring(list_page.encode('utf-8'))
original_lang_node = caption_list.find('track')
- if not original_lang_node or original_lang_node.attrib.get('kind') != 'asr' :
+ if original_lang_node is None or original_lang_node.attrib.get('kind') != 'asr' :
self._downloader.report_warning(u'Video doesn\'t have automatic captions')
return {}
original_lang = original_lang_node.attrib['lang_code']