Compare commits
10 Commits
2014.03.18
...
2014.03.20
Author | SHA1 | Date | |
---|---|---|---|
![]() |
627a209f74 | ||
![]() |
1a4895453a | ||
![]() |
aab74fa106 | ||
![]() |
2bd9efd4c2 | ||
![]() |
39a743fb9b | ||
![]() |
4966a0b22d | ||
![]() |
fc26023120 | ||
![]() |
8d7c0cca13 | ||
![]() |
f66ede4328 | ||
![]() |
cc88b90ec8 |
@@ -70,7 +70,7 @@ RELEASE_FILES="youtube-dl youtube-dl.exe youtube-dl-$version.tar.gz"
|
|||||||
git checkout HEAD -- youtube-dl youtube-dl.exe
|
git checkout HEAD -- youtube-dl youtube-dl.exe
|
||||||
|
|
||||||
/bin/echo -e "\n### Signing and uploading the new binaries to yt-dl.org ..."
|
/bin/echo -e "\n### Signing and uploading the new binaries to yt-dl.org ..."
|
||||||
for f in $RELEASE_FILES; do gpg --detach-sig "build/$version/$f"; done
|
for f in $RELEASE_FILES; do gpg --passphrase-repeat 5 --detach-sig "build/$version/$f"; done
|
||||||
scp -r "build/$version" ytdl@yt-dl.org:html/tmp/
|
scp -r "build/$version" ytdl@yt-dl.org:html/tmp/
|
||||||
ssh ytdl@yt-dl.org "mv html/tmp/$version html/downloads/"
|
ssh ytdl@yt-dl.org "mv html/tmp/$version html/downloads/"
|
||||||
ssh ytdl@yt-dl.org "sh html/update_latest.sh $version"
|
ssh ytdl@yt-dl.org "sh html/update_latest.sh $version"
|
||||||
|
@@ -533,7 +533,7 @@ class YoutubeDL(object):
|
|||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
else:
|
else:
|
||||||
self.report_error('no suitable InfoExtractor: %s' % url)
|
self.report_error('no suitable InfoExtractor for URL %s' % url)
|
||||||
|
|
||||||
def process_ie_result(self, ie_result, download=True, extra_info={}):
|
def process_ie_result(self, ie_result, download=True, extra_info={}):
|
||||||
"""
|
"""
|
||||||
|
@@ -10,6 +10,7 @@ from .arte import (
|
|||||||
ArteTvIE,
|
ArteTvIE,
|
||||||
ArteTVPlus7IE,
|
ArteTVPlus7IE,
|
||||||
ArteTVCreativeIE,
|
ArteTVCreativeIE,
|
||||||
|
ArteTVConcertIE,
|
||||||
ArteTVFutureIE,
|
ArteTVFutureIE,
|
||||||
ArteTVDDCIE,
|
ArteTVDDCIE,
|
||||||
)
|
)
|
||||||
|
@@ -131,7 +131,7 @@ class ArteTvIE(InfoExtractor):
|
|||||||
|
|
||||||
class ArteTVPlus7IE(InfoExtractor):
|
class ArteTVPlus7IE(InfoExtractor):
|
||||||
IE_NAME = 'arte.tv:+7'
|
IE_NAME = 'arte.tv:+7'
|
||||||
_VALID_URL = r'https?://www\.arte.tv/guide/(?P<lang>fr|de)/(?:(?:sendungen|emissions)/)?(?P<id>.*?)/(?P<name>.*?)(\?.*)?'
|
_VALID_URL = r'https?://(?:www\.)?arte\.tv/guide/(?P<lang>fr|de)/(?:(?:sendungen|emissions)/)?(?P<id>.*?)/(?P<name>.*?)(\?.*)?'
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _extract_url_info(cls, url):
|
def _extract_url_info(cls, url):
|
||||||
@@ -202,6 +202,8 @@ class ArteTVPlus7IE(InfoExtractor):
|
|||||||
re.match(r'VO-ST(F|A)', f.get('versionCode', '')) is None,
|
re.match(r'VO-ST(F|A)', f.get('versionCode', '')) is None,
|
||||||
# The version with sourds/mal subtitles has also lower relevance
|
# The version with sourds/mal subtitles has also lower relevance
|
||||||
re.match(r'VO?(F|A)-STM\1', f.get('versionCode', '')) is None,
|
re.match(r'VO?(F|A)-STM\1', f.get('versionCode', '')) is None,
|
||||||
|
# Prefer http downloads over m3u8
|
||||||
|
0 if f['url'].endswith('m3u8') else 1,
|
||||||
)
|
)
|
||||||
formats = sorted(formats, key=sort_key)
|
formats = sorted(formats, key=sort_key)
|
||||||
def _format(format_info):
|
def _format(format_info):
|
||||||
@@ -242,8 +244,9 @@ class ArteTVCreativeIE(ArteTVPlus7IE):
|
|||||||
|
|
||||||
_TEST = {
|
_TEST = {
|
||||||
'url': 'http://creative.arte.tv/de/magazin/agentur-amateur-corporate-design',
|
'url': 'http://creative.arte.tv/de/magazin/agentur-amateur-corporate-design',
|
||||||
'file': '050489-002.mp4',
|
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
|
'id': '050489-002',
|
||||||
|
'ext': 'mp4',
|
||||||
'title': 'Agentur Amateur / Agence Amateur #2 : Corporate Design',
|
'title': 'Agentur Amateur / Agence Amateur #2 : Corporate Design',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -255,8 +258,9 @@ class ArteTVFutureIE(ArteTVPlus7IE):
|
|||||||
|
|
||||||
_TEST = {
|
_TEST = {
|
||||||
'url': 'http://future.arte.tv/fr/sujet/info-sciences#article-anchor-7081',
|
'url': 'http://future.arte.tv/fr/sujet/info-sciences#article-anchor-7081',
|
||||||
'file': '050940-003.mp4',
|
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
|
'id': '050940-003',
|
||||||
|
'ext': 'mp4',
|
||||||
'title': 'Les champignons au secours de la planète',
|
'title': 'Les champignons au secours de la planète',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -270,7 +274,7 @@ class ArteTVFutureIE(ArteTVPlus7IE):
|
|||||||
|
|
||||||
class ArteTVDDCIE(ArteTVPlus7IE):
|
class ArteTVDDCIE(ArteTVPlus7IE):
|
||||||
IE_NAME = 'arte.tv:ddc'
|
IE_NAME = 'arte.tv:ddc'
|
||||||
_VALID_URL = r'http?://ddc\.arte\.tv/(?P<lang>emission|folge)/(?P<id>.+)'
|
_VALID_URL = r'https?://ddc\.arte\.tv/(?P<lang>emission|folge)/(?P<id>.+)'
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
video_id, lang = self._extract_url_info(url)
|
video_id, lang = self._extract_url_info(url)
|
||||||
@@ -284,3 +288,19 @@ class ArteTVDDCIE(ArteTVPlus7IE):
|
|||||||
javascriptPlayerGenerator = self._download_webpage(script_url, video_id, 'Download javascript player generator')
|
javascriptPlayerGenerator = self._download_webpage(script_url, video_id, 'Download javascript player generator')
|
||||||
json_url = self._search_regex(r"json_url=(.*)&rendering_place.*", javascriptPlayerGenerator, 'json url')
|
json_url = self._search_regex(r"json_url=(.*)&rendering_place.*", javascriptPlayerGenerator, 'json url')
|
||||||
return self._extract_from_json_url(json_url, video_id, lang)
|
return self._extract_from_json_url(json_url, video_id, lang)
|
||||||
|
|
||||||
|
|
||||||
|
class ArteTVConcertIE(ArteTVPlus7IE):
|
||||||
|
IE_NAME = 'arte.tv:concert'
|
||||||
|
_VALID_URL = r'https?://concert\.arte\.tv/(?P<lang>de|fr)/(?P<id>.+)'
|
||||||
|
|
||||||
|
_TEST = {
|
||||||
|
'url': 'http://concert.arte.tv/de/notwist-im-pariser-konzertclub-divan-du-monde',
|
||||||
|
'md5': '9ea035b7bd69696b67aa2ccaaa218161',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '186',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'The Notwist im Pariser Konzertclub "Divan du Monde"',
|
||||||
|
'upload_date': '20140128',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
@@ -159,6 +159,18 @@ class GenericIE(InfoExtractor):
|
|||||||
# m3u8 download
|
# m3u8 download
|
||||||
'skip_download': True,
|
'skip_download': True,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
# Embedded TED video
|
||||||
|
{
|
||||||
|
'url': 'http://en.support.wordpress.com/videos/ted-talks/',
|
||||||
|
'md5': 'deeeabcc1085eb2ba205474e7235a3d5',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '981',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'My web playroom',
|
||||||
|
'uploader': 'Ze Frank',
|
||||||
|
'description': 'md5:ddb2a40ecd6b6a147e400e535874947b',
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -487,6 +499,13 @@ class GenericIE(InfoExtractor):
|
|||||||
if mobj is None:
|
if mobj is None:
|
||||||
# Broaden the search a little bit: JWPlayer JS loader
|
# Broaden the search a little bit: JWPlayer JS loader
|
||||||
mobj = re.search(r'[^A-Za-z0-9]?file["\']?:\s*["\'](http(?![^\'"]+\.[0-9]+[\'"])[^\'"]+)["\']', webpage)
|
mobj = re.search(r'[^A-Za-z0-9]?file["\']?:\s*["\'](http(?![^\'"]+\.[0-9]+[\'"])[^\'"]+)["\']', webpage)
|
||||||
|
|
||||||
|
# Look for embedded TED player
|
||||||
|
mobj = re.search(
|
||||||
|
r'<iframe[^>]+?src=(["\'])(?P<url>http://embed\.ted\.com/.+?)\1', webpage)
|
||||||
|
if mobj is not None:
|
||||||
|
return self.url_result(mobj.group('url'), 'TED')
|
||||||
|
|
||||||
if mobj is None:
|
if mobj is None:
|
||||||
# Try to find twitter cards info
|
# Try to find twitter cards info
|
||||||
mobj = re.search(r'<meta (?:property|name)="twitter:player:stream" (?:content|value)="(.+?)"', webpage)
|
mobj = re.search(r'<meta (?:property|name)="twitter:player:stream" (?:content|value)="(.+?)"', webpage)
|
||||||
|
@@ -11,7 +11,9 @@ from ..utils import (
|
|||||||
|
|
||||||
|
|
||||||
class TEDIE(SubtitlesInfoExtractor):
|
class TEDIE(SubtitlesInfoExtractor):
|
||||||
_VALID_URL = r'''(?x)http://www\.ted\.com/
|
_VALID_URL = r'''(?x)
|
||||||
|
(?P<proto>https?://)
|
||||||
|
(?P<type>www|embed)(?P<urlmain>\.ted\.com/
|
||||||
(
|
(
|
||||||
(?P<type_playlist>playlists(?:/\d+)?) # We have a playlist
|
(?P<type_playlist>playlists(?:/\d+)?) # We have a playlist
|
||||||
|
|
|
|
||||||
@@ -19,6 +21,7 @@ class TEDIE(SubtitlesInfoExtractor):
|
|||||||
)
|
)
|
||||||
(/lang/(.*?))? # The url may contain the language
|
(/lang/(.*?))? # The url may contain the language
|
||||||
/(?P<name>\w+) # Here goes the name and then ".html"
|
/(?P<name>\w+) # Here goes the name and then ".html"
|
||||||
|
.*)$
|
||||||
'''
|
'''
|
||||||
_TEST = {
|
_TEST = {
|
||||||
'url': 'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html',
|
'url': 'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html',
|
||||||
@@ -48,6 +51,9 @@ class TEDIE(SubtitlesInfoExtractor):
|
|||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
m = re.match(self._VALID_URL, url, re.VERBOSE)
|
m = re.match(self._VALID_URL, url, re.VERBOSE)
|
||||||
|
if m.group('type') == 'embed':
|
||||||
|
desktop_url = m.group('proto') + 'www' + m.group('urlmain')
|
||||||
|
return self.url_result(desktop_url, 'TED')
|
||||||
name = m.group('name')
|
name = m.group('name')
|
||||||
if m.group('type_talk'):
|
if m.group('type_talk'):
|
||||||
return self._talk_info(url, name)
|
return self._talk_info(url, name)
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
|
|
||||||
__version__ = '2014.03.18.1'
|
__version__ = '2014.03.20'
|
||||||
|
Reference in New Issue
Block a user