From 3ae74f711947d73bf6627bf312edeec41cec85c3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rog=C3=A9rio=20Brito?= Date: Thu, 29 Aug 2013 19:09:34 -0300 Subject: [PATCH 1/1] Imported Upstream version 2013.08.29 --- README.md | 16 +- README.txt | 18 +- devscripts/gh-pages/add-version.py | 26 +-- devscripts/gh-pages/update-feed.py | 3 +- devscripts/release.sh | 2 +- devscripts/youtube_genalgo.py | 34 ++-- test/test_all_urls.py | 1 + test/test_download.py | 7 +- test/test_youtube_subtitles.py | 39 +++-- youtube-dl | Bin 173107 -> 197994 bytes youtube-dl.1 | 20 ++- youtube-dl.bash-completion | 2 +- youtube_dl/FileDownloader.py | 24 ++- youtube_dl/PostProcessor.py | 240 +++++++++++++++++++++++++- youtube_dl/YoutubeDL.py | 60 +++---- youtube_dl/__init__.py | 65 +++++-- youtube_dl/aes.py | 202 ++++++++++++++++++++++ youtube_dl/extractor/__init__.py | 20 ++- youtube_dl/extractor/addanime.py | 75 ++++++++ youtube_dl/extractor/appletrailers.py | 166 ++++++++++++++++++ youtube_dl/extractor/c56.py | 4 +- youtube_dl/extractor/canalc2.py | 35 ++++ youtube_dl/extractor/canalplus.py | 2 +- youtube_dl/extractor/cnn.py | 58 +++++++ youtube_dl/extractor/collegehumor.py | 52 ++++-- youtube_dl/extractor/common.py | 27 ++- youtube_dl/extractor/dailymotion.py | 2 +- youtube_dl/extractor/funnyordie.py | 7 +- youtube_dl/extractor/generic.py | 19 +- youtube_dl/extractor/googleplus.py | 4 +- youtube_dl/extractor/hark.py | 37 ++++ youtube_dl/extractor/ign.py | 8 +- youtube_dl/extractor/jeuxvideo.py | 47 +++++ youtube_dl/extractor/kankan.py | 6 +- youtube_dl/extractor/mit.py | 74 ++++++++ youtube_dl/extractor/nbc.py | 33 ++++ youtube_dl/extractor/orf.py | 67 +++++++ youtube_dl/extractor/pbs.py | 34 ++++ youtube_dl/extractor/ro220.py | 42 +++++ youtube_dl/extractor/rtlnow.py | 126 ++++++++++++++ youtube_dl/extractor/slashdot.py | 23 +++ youtube_dl/extractor/sohu.py | 90 ++++++++++ youtube_dl/extractor/soundcloud.py | 5 + youtube_dl/extractor/statigram.py | 12 +- youtube_dl/extractor/trilulilu.py | 73 ++++++++ youtube_dl/extractor/unistra.py | 32 ++++ youtube_dl/extractor/vevo.py | 6 +- youtube_dl/extractor/videofyme.py | 7 +- youtube_dl/extractor/vimeo.py | 41 +++-- youtube_dl/extractor/wat.py | 1 - youtube_dl/extractor/xhamster.py | 18 +- youtube_dl/extractor/youporn.py | 18 +- youtube_dl/extractor/youtube.py | 220 ++++++++++++++++------- youtube_dl/utils.py | 67 ++++++- youtube_dl/version.py | 2 +- 55 files changed, 2035 insertions(+), 284 deletions(-) create mode 100644 youtube_dl/aes.py create mode 100644 youtube_dl/extractor/addanime.py create mode 100644 youtube_dl/extractor/appletrailers.py create mode 100644 youtube_dl/extractor/canalc2.py create mode 100644 youtube_dl/extractor/cnn.py create mode 100644 youtube_dl/extractor/hark.py create mode 100644 youtube_dl/extractor/jeuxvideo.py create mode 100644 youtube_dl/extractor/mit.py create mode 100644 youtube_dl/extractor/nbc.py create mode 100644 youtube_dl/extractor/orf.py create mode 100644 youtube_dl/extractor/pbs.py create mode 100644 youtube_dl/extractor/ro220.py create mode 100644 youtube_dl/extractor/rtlnow.py create mode 100644 youtube_dl/extractor/slashdot.py create mode 100644 youtube_dl/extractor/sohu.py create mode 100644 youtube_dl/extractor/trilulilu.py create mode 100644 youtube_dl/extractor/unistra.py diff --git a/README.md b/README.md index 560bcdc..75068fe 100644 --- a/README.md +++ b/README.md @@ -120,18 +120,20 @@ which means you can modify it, redistribute it or use it however you like. --max-quality FORMAT highest quality format to download -F, --list-formats list all available formats (currently youtube only) + +## Subtitle Options: --write-sub write subtitle file (currently youtube only) --write-auto-sub write automatic subtitle file (currently youtube only) --only-sub [deprecated] alias of --skip-download --all-subs downloads all the available subtitles of the - video (currently youtube only) + video --list-subs lists all available subtitles for the video - (currently youtube only) - --sub-format FORMAT subtitle format [srt/sbv/vtt] (default=srt) - (currently youtube only) - --sub-lang LANG language of the subtitles to download (optional) - use IETF language tags like 'en' + --sub-format FORMAT subtitle format (default=srt) ([sbv/vtt] youtube + only) + --sub-lang LANGS languages of the subtitles to download (optional) + separated by commas, use IETF language tags like + 'en,pt' ## Authentication Options: -u, --username USERNAME account username @@ -153,6 +155,8 @@ which means you can modify it, redistribute it or use it however you like. processing; the video is erased by default --no-post-overwrites do not overwrite post-processed files; the post- processed files are overwritten by default + --embed-subs embed subtitles in the video (only for mp4 + videos) # CONFIGURATION diff --git a/README.txt b/README.txt index b13711a..3baa062 100644 --- a/README.txt +++ b/README.txt @@ -137,18 +137,22 @@ Video Format Options: --max-quality FORMAT highest quality format to download -F, --list-formats list all available formats (currently youtube only) + +Subtitle Options: +----------------- + --write-sub write subtitle file (currently youtube only) --write-auto-sub write automatic subtitle file (currently youtube only) --only-sub [deprecated] alias of --skip-download --all-subs downloads all the available subtitles of the - video (currently youtube only) + video --list-subs lists all available subtitles for the video - (currently youtube only) - --sub-format FORMAT subtitle format [srt/sbv/vtt] (default=srt) - (currently youtube only) - --sub-lang LANG language of the subtitles to download (optional) - use IETF language tags like 'en' + --sub-format FORMAT subtitle format (default=srt) ([sbv/vtt] youtube + only) + --sub-lang LANGS languages of the subtitles to download (optional) + separated by commas, use IETF language tags like + 'en,pt' Authentication Options: ----------------------- @@ -174,6 +178,8 @@ Post-processing Options: processing; the video is erased by default --no-post-overwrites do not overwrite post-processed files; the post- processed files are overwritten by default + --embed-subs embed subtitles in the video (only for mp4 + videos) CONFIGURATION ============= diff --git a/devscripts/gh-pages/add-version.py b/devscripts/gh-pages/add-version.py index 6af8bb9..116420e 100755 --- a/devscripts/gh-pages/add-version.py +++ b/devscripts/gh-pages/add-version.py @@ -6,28 +6,32 @@ import hashlib import urllib.request if len(sys.argv) <= 1: - print('Specify the version number as parameter') - sys.exit() + print('Specify the version number as parameter') + sys.exit() version = sys.argv[1] with open('update/LATEST_VERSION', 'w') as f: - f.write(version) + f.write(version) versions_info = json.load(open('update/versions.json')) if 'signature' in versions_info: - del versions_info['signature'] + del versions_info['signature'] new_version = {} -filenames = {'bin': 'youtube-dl', 'exe': 'youtube-dl.exe', 'tar': 'youtube-dl-%s.tar.gz' % version} +filenames = { + 'bin': 'youtube-dl', + 'exe': 'youtube-dl.exe', + 'tar': 'youtube-dl-%s.tar.gz' % version} for key, filename in filenames.items(): - print('Downloading and checksumming %s...' %filename) - url = 'http://youtube-dl.org/downloads/%s/%s' % (version, filename) - data = urllib.request.urlopen(url).read() - sha256sum = hashlib.sha256(data).hexdigest() - new_version[key] = (url, sha256sum) + print('Downloading and checksumming %s...' % filename) + url = 'https://yt-dl.org/downloads/%s/%s' % (version, filename) + data = urllib.request.urlopen(url).read() + sha256sum = hashlib.sha256(data).hexdigest() + new_version[key] = (url, sha256sum) versions_info['versions'][version] = new_version versions_info['latest'] = version -json.dump(versions_info, open('update/versions.json', 'w'), indent=4, sort_keys=True) \ No newline at end of file +with open('update/versions.json', 'w') as jsonf: + json.dump(versions_info, jsonf, indent=4, sort_keys=True) diff --git a/devscripts/gh-pages/update-feed.py b/devscripts/gh-pages/update-feed.py index cfff05f..16571a9 100755 --- a/devscripts/gh-pages/update-feed.py +++ b/devscripts/gh-pages/update-feed.py @@ -22,7 +22,7 @@ entry_template=textwrap.dedent("""
- Downloads available at http://youtube-dl.org/downloads/@VERSION@/ + Downloads available at https://yt-dl.org/downloads/@VERSION@/
@@ -54,4 +54,3 @@ atom_template = atom_template.replace('@ENTRIES@', entries_str) with open('update/releases.atom','w',encoding='utf-8') as atom_file: atom_file.write(atom_template) - diff --git a/devscripts/release.sh b/devscripts/release.sh index 46c31e4..24c9ad8 100755 --- a/devscripts/release.sh +++ b/devscripts/release.sh @@ -67,7 +67,7 @@ RELEASE_FILES="youtube-dl youtube-dl.exe youtube-dl-$version.tar.gz" (cd build/$version/ && sha512sum $RELEASE_FILES > SHA2-512SUMS) git checkout HEAD -- youtube-dl youtube-dl.exe -/bin/echo -e "\n### Signing and uploading the new binaries to youtube-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 scp -r "build/$version" ytdl@yt-dl.org:html/tmp/ ssh ytdl@yt-dl.org "mv html/tmp/$version html/downloads/" diff --git a/devscripts/youtube_genalgo.py b/devscripts/youtube_genalgo.py index 31d6ec9..13df535 100644 --- a/devscripts/youtube_genalgo.py +++ b/devscripts/youtube_genalgo.py @@ -11,30 +11,36 @@ tests = [ # 90 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`", "mrtyuioplkjhgfdsazxcvbne1234567890QWER[YUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={`]}|"), - # 88 + # 89 + ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'", + "/?;:|}<[{=+-_)(*&^%$#@!MqBVCXZASDFGHJKLPOIUYTREWQ0987654321mnbvcxzasdfghjklpoiuyt"), + # 88 - vflapUV9V 2013/08/28 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<", - "J:|}][{=+-_)(*&;%$#@>MNBVCXZASDFGH^KLPOIUYTREWQ0987654321mnbvcxzasdfghrklpoiuytej"), - # 87 - vflART1Nf 2013/07/24 + "ioplkjhgfdsazxcvbnm12<4567890QWERTYUIOZLKJHGFDSAeXCVBNM!@#$%^&*()_-+={[]}|:;?/>.3"), + # 87 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$^&*()_-+={[]}|:;?/>.<", - "tyuioplkjhgfdsazxcv"), - # 86 - vflm_D8eE 2013/07/31 + "uioplkjhgfdsazxcvbnm1t34567890QWE2TYUIOPLKJHGFDSAZXCVeNM!@#$^&*()_-+={[]}|:;?/>.<"), + # 86 - vflg0g8PQ 2013/08/29 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[|};?/>.<", - ">.1}|[{=+-_)(*&^%$#@!MNBVCXZASDFGHJK/?;}|[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWq0987654321mnbvcxzasdfghjklpoiuytr"), + # 85 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[};?/>.<", - "ertyuiqplkjhgfdsazx$vbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#<%^&*()_-+={[};?/c"), - # 84 + ".>/?;}[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWQ0q876543r1mnbvcx9asdfghjklpoiuyt2"), + # 84 - vflg0g8PQ 2013/08/29 (sporadic) ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[};?>.<", - "<.>?;}[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWe098765432rmnbvcxzasdfghjklpoiuyt1"), - # 83 - vflTWC9KW 2013/08/01 + ">?;}[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWq0987654321mnbvcxzasdfghjklpoiuytr"), + # 83 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!#$%^&*()_+={[};?/>.<", - "qwertyuioplkjhg>dsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!#$%^&*()_+={[};?/f"), - # 82 + ".>/?;}[{=+_)(*&^%<#!MNBVCXZASPFGHJKLwOIUYTREWQ0987654321mnbvcxzasdfghjklpoiuytreq"), + # 82 - vflZK4ZYR 2013/08/23 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>.<", - "Q>/?;}[{=+-(*<^%$#@!MNBVCXZASDFGHKLPOIUY8REWT0q&7654321mnbvcxzasdfghjklpoiuytrew9"), + "wertyuioplkjhgfdsaqxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&z(-+={[};?/>.<"), # 81 - vflLC8JvQ 2013/07/25 ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>.", "C>/?;}[{=+-(*&^%$#@!MNBVYXZASDFGHKLPOIU.TREWQ0q87659321mnbvcxzasdfghjkl4oiuytrewp"), + # 80 - vflZK4ZYR 2013/08/23 (sporadic) + ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>", + "wertyuioplkjhgfdsaqxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&z(-+={[};?/>"), # 79 - vflLC8JvQ 2013/07/25 (sporadic) ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/", "Z?;}[{=+-(*&^%$#@!MNBVCXRASDFGHKLPOIUYT/EWQ0q87659321mnbvcxzasdfghjkl4oiuytrewp"), diff --git a/test/test_all_urls.py b/test/test_all_urls.py index c73d0e4..c54faa3 100644 --- a/test/test_all_urls.py +++ b/test/test_all_urls.py @@ -50,6 +50,7 @@ class TestAllURLsMatching(unittest.TestCase): self.assertEqual(YoutubeIE()._extract_id('http://www.youtube.com/watch?&v=BaW_jenozKc'), 'BaW_jenozKc') self.assertEqual(YoutubeIE()._extract_id('https://www.youtube.com/watch?&v=BaW_jenozKc'), 'BaW_jenozKc') self.assertEqual(YoutubeIE()._extract_id('https://www.youtube.com/watch?feature=player_embedded&v=BaW_jenozKc'), 'BaW_jenozKc') + self.assertEqual(YoutubeIE()._extract_id('https://www.youtube.com/watch_popup?v=BaW_jenozKc'), 'BaW_jenozKc') def test_no_duplicates(self): ies = gen_extractors() diff --git a/test/test_download.py b/test/test_download.py index 21cb2e6..23a6625 100644 --- a/test/test_download.py +++ b/test/test_download.py @@ -127,12 +127,11 @@ def generator(test_case): info_dict = json.load(infof) for (info_field, expected) in tc.get('info_dict', {}).items(): if isinstance(expected, compat_str) and expected.startswith('md5:'): - self.assertEqual(expected, 'md5:' + md5(info_dict.get(info_field))) + got = 'md5:' + md5(info_dict.get(info_field)) else: got = info_dict.get(info_field) - self.assertEqual( - expected, got, - u'invalid value for field %s, expected %r, got %r' % (info_field, expected, got)) + self.assertEqual(expected, got, + u'invalid value for field %s, expected %r, got %r' % (info_field, expected, got)) # If checkable fields are missing from the test case, print the info_dict test_info_dict = dict((key, value if not isinstance(value, compat_str) or len(value) < 250 else 'md5:' + md5(value)) diff --git a/test/test_youtube_subtitles.py b/test/test_youtube_subtitles.py index 86e09c9..6412062 100644 --- a/test/test_youtube_subtitles.py +++ b/test/test_youtube_subtitles.py @@ -35,47 +35,47 @@ class TestYoutubeSubtitles(unittest.TestCase): DL.params['writesubtitles'] = True IE = YoutubeIE(DL) info_dict = IE.extract('QRS8MkLhQmM') - sub = info_dict[0]['subtitles'][0] - self.assertEqual(md5(sub[2]), '4cd9278a35ba2305f47354ee13472260') + sub = info_dict[0]['subtitles']['en'] + self.assertEqual(md5(sub), '4cd9278a35ba2305f47354ee13472260') def test_youtube_subtitles_it(self): DL = FakeYDL() DL.params['writesubtitles'] = True - DL.params['subtitleslang'] = 'it' + DL.params['subtitleslangs'] = ['it'] IE = YoutubeIE(DL) info_dict = IE.extract('QRS8MkLhQmM') - sub = info_dict[0]['subtitles'][0] - self.assertEqual(md5(sub[2]), '164a51f16f260476a05b50fe4c2f161d') + sub = info_dict[0]['subtitles']['it'] + self.assertEqual(md5(sub), '164a51f16f260476a05b50fe4c2f161d') def test_youtube_onlysubtitles(self): DL = FakeYDL() DL.params['writesubtitles'] = True DL.params['onlysubtitles'] = True IE = YoutubeIE(DL) info_dict = IE.extract('QRS8MkLhQmM') - sub = info_dict[0]['subtitles'][0] - self.assertEqual(md5(sub[2]), '4cd9278a35ba2305f47354ee13472260') + sub = info_dict[0]['subtitles']['en'] + self.assertEqual(md5(sub), '4cd9278a35ba2305f47354ee13472260') def test_youtube_allsubtitles(self): DL = FakeYDL() DL.params['allsubtitles'] = True IE = YoutubeIE(DL) info_dict = IE.extract('QRS8MkLhQmM') subtitles = info_dict[0]['subtitles'] - self.assertEqual(len(subtitles), 13) + self.assertEqual(len(subtitles.keys()), 13) def test_youtube_subtitles_sbv_format(self): DL = FakeYDL() DL.params['writesubtitles'] = True DL.params['subtitlesformat'] = 'sbv' IE = YoutubeIE(DL) info_dict = IE.extract('QRS8MkLhQmM') - sub = info_dict[0]['subtitles'][0] - self.assertEqual(md5(sub[2]), '13aeaa0c245a8bed9a451cb643e3ad8b') + sub = info_dict[0]['subtitles']['en'] + self.assertEqual(md5(sub), '13aeaa0c245a8bed9a451cb643e3ad8b') def test_youtube_subtitles_vtt_format(self): DL = FakeYDL() DL.params['writesubtitles'] = True DL.params['subtitlesformat'] = 'vtt' IE = YoutubeIE(DL) info_dict = IE.extract('QRS8MkLhQmM') - sub = info_dict[0]['subtitles'][0] - self.assertEqual(md5(sub[2]), '356cdc577fde0c6783b9b822e7206ff7') + sub = info_dict[0]['subtitles']['en'] + self.assertEqual(md5(sub), '356cdc577fde0c6783b9b822e7206ff7') def test_youtube_list_subtitles(self): DL = FakeYDL() DL.params['listsubtitles'] = True @@ -85,11 +85,20 @@ class TestYoutubeSubtitles(unittest.TestCase): def test_youtube_automatic_captions(self): DL = FakeYDL() DL.params['writeautomaticsub'] = True - DL.params['subtitleslang'] = 'it' + DL.params['subtitleslangs'] = ['it'] IE = YoutubeIE(DL) info_dict = IE.extract('8YoUxe5ncPo') - sub = info_dict[0]['subtitles'][0] - self.assertTrue(sub[2] is not None) + sub = info_dict[0]['subtitles']['it'] + self.assertTrue(sub is not None) + def test_youtube_multiple_langs(self): + DL = FakeYDL() + DL.params['writesubtitles'] = True + langs = ['it', 'fr', 'de'] + DL.params['subtitleslangs'] = langs + IE = YoutubeIE(DL) + subtitles = IE.extract('QRS8MkLhQmM')[0]['subtitles'] + for lang in langs: + self.assertTrue(subtitles.get(lang) is not None, u'Subtitles for \'%s\' not extracted' % lang) if __name__ == '__main__': unittest.main() diff --git a/youtube-dl b/youtube-dl index 1b01c0bbc4ad4e443341ab0f51e2b0dc7d0a28df..4b283a55d901e35f47b09152573debe76b153c31 100755 GIT binary patch delta 99883 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

H;=jaBV1mXIs2Ag{XF27I|9aq)JDU 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

#D`7x->grbh6%w ziP^%;J?N?Z(b1aJom?zt9GI8$`T=q;LVHGtT%}v?u4mxC!@{SUF$mK)b|-g8axjDB zdQe$~5vZz>K6+m-K_BGN=BPc7Hti~70H%wwSeaGQLZdnQ{#vMzsbXM>KweT$f^LCq zL2irL{On#!W=*SuzmUwY3Y2GUFqCgy!#@^l7`3T$MmVf~Dj@Y2(dsUpBzscv3x64P z=-1<;c#^-uoc%Sqo$TCPkjAo!NxY%8x-?!DzPQTthSxuZ(gJ<RPrHAd zC299@B88%~+)AL7=2*8$dztO04~IAAPqWXmi8&C%KzuAt1wR}T(~<4!pk%VKcjdTq zt&!b3hYAH$`6rAL_xroI7=jdGJAs7(#L9&o3D3f|oK+fULZ&-2ID*n+S*%U^Mlmw_ z)I$op;YiDOKMwR1^0O2rk1~3~%7obhYLMY!&H zEpM?hLQ#XMcUoyQ&%o-a>=pryc+fwZeIe?rP@uy5nn@MvnoF+1k{;g!^WGjEXSHc8 zAdyjHr0$t@9DAUzt%Rj%Fs$ij;xGC-&wnIWWf?7}SL8h5NaJB`w7qZ0O(vzpMEDaZ z`3cnymnY#6V}4fib9qD4w%gsl{=7`Tj99^cKQss4&jtiv^G@i^f7Vq-?1SxUYse&a&h z6y?AV;V+oOl2xfrz3cgrEDYnMp_uiZVogtK-|3BZ1nEB+>KjlAxM9aJPO;dn^M2lB z(;1|fC=|N53azbk37D@PT@KEwKw+W!l}Re4kS{(LX*J{8`(E!MNf~Uxh!Z8oR19_{ z<9~D3esPq!*U98bx-NZ>Re*jf-RPmdS#^gAjXw*qGdf@NBaD975_Ww=uLtX@fsMxk z!z=eWhY-BZMKu+d8ru9*k?;8S@sjE~8!aR978E`W5lSaot zd83pny5@KrOJmm1`vE|@BQ-xVsc|BJMKc|}YOCWwYRNjv=-TgG?OVLeLD0qZvD(}+ zhJhEKaRbSfI#umB%-_T(_l1~h8J4gD}M z(;P(!P%hgVTjNih4+M;G7o*8E*8-lfJDSq;m6?3l9=g!IRE!>NJAWsG)E+KL=v;xc zw3s8EbA5ff+zuQ2Ub~Usm|vHJEpxC}-yF{AQ-71!2A7>3d^c~bYsz~0YYpyWt8$y6j3L%@!hF@4ciselyzM)pFu19o z5nrPwad=u>`?jHF7ykOU8jl8#Z1xDZO{Mppmf1=07grnDD(nDC*fL~-SH_g`XeoBf zw@@7Ah99`_+G}zZPnmKb;yY%S_4ncEe*w@Myo&l})BF%ZO@7}xLRFdPV(jkTjqmpp zOA)Hqf~W3{kdU-A;tWBCjTFnYufen03ZV`vAzwA>Y}INcupb%i@9(32n@IJ}G#k|< z5b_x0StkKttbCn=G#5kD`1AA{-l*o>6t%uY{`snN?pM>Jk`^L*dy9PnL)%q@t_r0$ zp=G*a4BWl_{PXye&~@sL_5q>9hGGhp-u<`^hN$tt>qWTBP@+W$H*^&(k#u}Lx_x<- zZdHO!v$W>8k^FP3n2}gdoVHkBMCo@S_3$u`CFl_>q_EMIfr#V^JO9}+QA~?jN4&Pg z*J3$;G#BmJ&fiL&Jk!aVGNei9v6(|i&!>CV%OSH8JC66j%jJ2i+w!UpA9D;R(2*?; z*+MmR(kq7w7UkBYZgMAxM&)XX?`sdrxZz}6Pl%TK;D`wMChCl9q+~Oi4xRmM4 z+7>ebs}FeCp^@e-(f9Jlvka{V(oDp(eD4K0aKij28*CZgKdFh$NZL1*El5KSkhGFx zhP$a6D@=5VUJxV-u21J>VA-j=rAg*q7EQNg0G!v1y-TGYInwM5scKk<1=2b5=9fL? zeyT}!wf(I=doin=)(i>o@{k&%n(S}u47iV6VCl|rUA1Vr&nOkA7WPSbEcB_1UivSX zW;28TXp{Yf1*~{iB1_i<3wY)v!!rZs$)_^-B0~9cZiVyZ6~jj!8$4)QAxu-2MqqL~ zT;C0)JAMu7qS;RJGQ5*&WX&*U|1iErEJlnCeq>oq=p3FFE!>r&&IM=a71#eY7HHU} z4@)_G*FD<6rw!#0&|bw&@OO8YAz_#~mkyBofNNDk(M+FyjB17}Oe}?!aLL9J_{D!{ zGf98h51=b~YT|cb#=44u5@%@L$s>>FlK-Ikkpns^ln1{gR*8pg@lCODf%{lU{k@2h zoyxaa4R~=atmG<33$Xd5mtmCI!o~E=c2f+{fhsTr67(g46jeCV^r05m zroG5JBLOH%m1kZL#IePLTydgb=^wqRC0#rV;v^rq>qCgaAEeGcPaEj4H*0-Q0y5S; zlA7LvK_wMQ!xc`A@xi{;C`Po$3OUHFcYD&iw$)ZWHxd0&e6^vF(U`r1Ur*#y0+_kj zqvyfBnqT?vi(;Hz{1S+2;3B9l`>f^BlHnoFQg47fxM}^y87rT`Dq7=myqC9QoIo5} z-wI0^_kR z);!J8Q^zq>>Wq4SeVF@BC~2@B#;p5o+G#LHKMvSd6R~5nAhkpjy2iF1!D^jkdi=3A zekvlt!_+ODW-mo};0 zmQop8XIpVY6rZeh)}R>{O5WgrD3P(eZ3wh=|C-USAujJG1|`xJi`<90i5`on@s5?);Hv1jK(m+QI)SA&|7e*JE;kZ2Jt4_N4t*@8kUaTGO1$ysMN3jk_I2vp zpbiywB-i9;Pc((^U{)7NTo|)dERlRI#}IkUwmjn$oTvVgqOB>#`@Q+sGt&VpmxUh> zxesS!xu5)aGVW`fj;YW8NkmxkM+9TK9&XU2`#rLbs+lgDdQM^7Pscf`u(#zO>80n^ zztrL2GuA`#%q?|$tB{+;tyz$~&jy;3mtA)ILW4y2>Y!ZB$}trT!-J%Z4cx;XREE5) zS@$~14}_)$S6RFP8rMQ`bgKhc0Ue%UTBp%o@Nm*ir55R^)qyJ?Z$Td*y?Zn1Y(Mb58l z=dts2t5x55*f+Jag=&6AQ_;4BlClt5F;mYf$I(fBe7WU4#TcWOL{o%^{MJclN{GVf zVmdzL4KB;>>uepF$4UzRgHLEyeg~w8DSQfa>{NRC_M4qL$91S_>@jJ0GxI z)IPp8ykr)`(n2yz4 zye7fERA)21G;SkbMBPY|Ee6#%_J>!xy7X&5&Wvob?2-Pdjgeu1EAqfKnG60inNY`k zU)1^Y+Ne!mEt=ppZ0)Itg3vN&wmNpAfpLYu|3G}WeP!r{klEU{*l+II zHkEZxtHJHnI@5xlNI1O|Y9&6O$z-WDBaPByui@1>+wvau$BxFPYI%o*Yb8sxbr14i zwKMd+9~KI&EV6@ze-#y1>gUxqc)ujxcf*p5nUB@#6GxhdYxsDJkb6NGPyESyr5`;W zCVH!P%GG1eab{z923J^)c$NZ1o_SfP@;a1h_g={3q$x>iZ0IO z(_#`+b-@Bv&tfu>wO7&=EFR3{gxOpe0!?|`?3GCc&Z^$0Iflwwd8OT{v66&?TaH+~ zEl5YK3DJs}7dwk-bYiwE`^gOia z(yH(5edyZnOH?T5@N0ixUEnMY>U+0wGv(kH#)t4>fcFlrz9XO@D!I(*P6mO5n!sDf z0byj_j4Qas3P7E#OiqYL4!M1hz`wm`J!Ft%BXT;p-UPtNaNF}9C*g!Jn1L#k4FaKp z{G}E?%O-~;b5qcw-hup29X-7Yx5|Dx`P64#YyB3gS98WTM;1s|}|4|rA!M1p*-<}o%d0+;C z5dC9P#2(%}1yCa2kfOmyCIM1hu-+>82q+RLJfE}v3jaL?kTUE={WC6asJn-qi}U{* zmMjI{ZC7gg+q89Ar7SgUU|p*uTnL2zA4`VOaDrKYELkE42c9$wFv6o}K*!9)-=Y-B zl$AK}p&399h)=l%%z&fxKMnAhSwIB{D!3KM;k&cIL!i0nRv=5h?!9 zpmK9Cj+p=93w9vJL$gbOa6{=L=!W_p1ZsW+-sfKgM_KXc=$@B9Bcll(1On%WKxqF_ zVl#%I<6mRl24lCu1|l&0mOx!ptB4U*Edd(9{T+m`O>|qHVHxxm_8tNWUIw`6Z{zXX z1X2bEDg<(j4}mcKV5F@R;~dYh}zlnYXBv1O$K9k4&DW)I0fk7vg@Gjcq#i{49zZJG25XOIIbjXOHf;G4C;FG_> zD0JTd)ycCU;I|uK#E5Vp1iVc^5V87y3lT#gbpPlp=SFbB(!|)e?q$UIUvW2h)h0j! z6p0}SV0|}2IBW_WKi(E-&|L-r^E^c&fE#RqoKyB~AQXRK0E!qLs0;Y=)211Z9 z;rQRdrLr|ZAa>sYzO-GCzhi^|=wrY+D(r$3Cldscy$kUE38BBWK>i!4lr{(|X!B2~ z{x5`h_dwMxPZ6!WnMfFLmpxE*o&&sk4-AJQ=i4_GoZ=N&YDsz@Y_W1jaMShy-rHIb zv;f2(f$Ucz;lS+=Ku!}3fwUihQwxqn2#!sla_&R0xi$uYL>z*C)Od*yq`JUqo!>UQ zWgrl(BY*=wdjwh_%RwN7#{js{Cm?zKehWW30ib~P zyW2N8-1QU;%{P?@Vf++aEU;1qEr4AMXZQh7z;k{8oN%r)5P4INFk*EEaMJ%+uOejXMVjksqNSrsgBl!`sfmebUu|XlWz?u;HYqVB|3U1a+hKAYkL40RNw@@i*7= ze-E<8K?D`d{)~%=z2jRA>ca?_{Q`IZWQ`+)*b8u<)J-9TckBQ<{PF^H!G{F|QpF1* zk1s*w+cE+f6abIYmRn?d4S|qf0YdQFE6@VgHUinX0xh`hAq4en(0dq12mwzSz<@Vi zgOifK0XuY@AYk7ca2a2pA%yuGuy@cULXi6fy7HeS!{E71{m;(j{e_@5=>ZtGXB(J* z`0rQjZ}QdudT9v>j&ucX9xxp%?w|AfPyGK)S_y&B{9^|74uTJ+vBdd%e!_o))5yd} zG=2RI4)*pS{+oj5zx!B{=noal%7gVkC8@^9w15RULdPdp05dfUSq{LVMles2?*nzT zh(=r=fEaF%gv?0)PmT@n)Aa8b+6z1!Z|4T)-N3nxAr|-<5;7%##)^R10Z=C)csSm2 zOhUmpg9D(&3odv*GBP>*=(c%6_*S5V>m!50u=uT@@W<-kYxn;>LVwC4x_}q)vHzU# z^#5Kq{4ZZm1;OWig;+T73gVxIgIAz{4jJ@9jBgzUSrusVgY(`&=Ek*y*g?qHA&^6V I@S6|$Kjy`55C8xG diff --git a/youtube-dl.1 b/youtube-dl.1 index e2ea5b8..00fb1c1 100644 --- a/youtube-dl.1 +++ b/youtube-dl.1 @@ -144,18 +144,24 @@ redistribute it or use it however you like. \-\-max\-quality\ FORMAT\ \ \ \ \ \ \ highest\ quality\ format\ to\ download \-F,\ \-\-list\-formats\ \ \ \ \ \ \ \ \ list\ all\ available\ formats\ (currently\ youtube \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ only) +\f[] +.fi +.SS Subtitle Options: +.IP +.nf +\f[C] \-\-write\-sub\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ write\ subtitle\ file\ (currently\ youtube\ only) \-\-write\-auto\-sub\ \ \ \ \ \ \ \ \ \ \ write\ automatic\ subtitle\ file\ (currently\ youtube \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ only) \-\-only\-sub\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ [deprecated]\ alias\ of\ \-\-skip\-download \-\-all\-subs\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ downloads\ all\ the\ available\ subtitles\ of\ the -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ video\ (currently\ youtube\ only) +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ video \-\-list\-subs\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lists\ all\ available\ subtitles\ for\ the\ video -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (currently\ youtube\ only) -\-\-sub\-format\ FORMAT\ \ \ \ \ \ \ \ subtitle\ format\ [srt/sbv/vtt]\ (default=srt) -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (currently\ youtube\ only) -\-\-sub\-lang\ LANG\ \ \ \ \ \ \ \ \ \ \ \ language\ of\ the\ subtitles\ to\ download\ (optional) -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ use\ IETF\ language\ tags\ like\ \[aq]en\[aq] +\-\-sub\-format\ FORMAT\ \ \ \ \ \ \ \ subtitle\ format\ (default=srt)\ ([sbv/vtt]\ youtube +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ only) +\-\-sub\-lang\ LANGS\ \ \ \ \ \ \ \ \ \ \ languages\ of\ the\ subtitles\ to\ download\ (optional) +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ separated\ by\ commas,\ use\ IETF\ language\ tags\ like +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \[aq]en,pt\[aq] \f[] .fi .SS Authentication Options: @@ -185,6 +191,8 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ processing;\ the\ video\ is\ erased\ by\ default \-\-no\-post\-overwrites\ \ \ \ \ \ \ do\ not\ overwrite\ post\-processed\ files;\ the\ post\- \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ processed\ files\ are\ overwritten\ by\ default +\-\-embed\-subs\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ embed\ subtitles\ in\ the\ video\ (only\ for\ mp4 +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ videos) \f[] .fi .SH CONFIGURATION diff --git a/youtube-dl.bash-completion b/youtube-dl.bash-completion index fd12ce8..25ee51a 100644 --- a/youtube-dl.bash-completion +++ b/youtube-dl.bash-completion @@ -3,7 +3,7 @@ __youtube-dl() local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" - opts="--help --version --update --ignore-errors --dump-user-agent --user-agent --referer --list-extractors --extractor-descriptions --proxy --no-check-certificate --playlist-start --playlist-end --match-title --reject-title --max-downloads --min-filesize --max-filesize --date --datebefore --dateafter --rate-limit --retries --buffer-size --no-resize-buffer --test --title --id --literal --auto-number --output --autonumber-size --restrict-filenames --batch-file --no-overwrites --continue --no-continue --cookies --no-part --no-mtime --write-description --write-info-json --write-thumbnail --quiet --simulate --skip-download --get-url --get-title --get-id --get-thumbnail --get-description --get-filename --get-format --newline --no-progress --console-title --verbose --dump-intermediate-pages --format --all-formats --prefer-free-formats --max-quality --list-formats --write-sub --write-auto-sub --only-sub --all-subs --list-subs --sub-format --sub-lang --username --password --netrc --video-password --extract-audio --audio-format --audio-quality --recode-video --keep-video --no-post-overwrites" + opts="--help --version --update --ignore-errors --dump-user-agent --user-agent --referer --list-extractors --extractor-descriptions --proxy --no-check-certificate --playlist-start --playlist-end --match-title --reject-title --max-downloads --min-filesize --max-filesize --date --datebefore --dateafter --rate-limit --retries --buffer-size --no-resize-buffer --test --title --id --literal --auto-number --output --autonumber-size --restrict-filenames --batch-file --no-overwrites --continue --no-continue --cookies --no-part --no-mtime --write-description --write-info-json --write-thumbnail --quiet --simulate --skip-download --get-url --get-title --get-id --get-thumbnail --get-description --get-filename --get-format --newline --no-progress --console-title --verbose --dump-intermediate-pages --format --all-formats --prefer-free-formats --max-quality --list-formats --write-sub --write-auto-sub --only-sub --all-subs --list-subs --sub-format --sub-lang --username --password --netrc --video-password --extract-audio --audio-format --audio-quality --recode-video --keep-video --no-post-overwrites --embed-subs" if [[ ${cur} == * ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) diff --git a/youtube_dl/FileDownloader.py b/youtube_dl/FileDownloader.py index ea6b9d6..7c5ac4b 100644 --- a/youtube_dl/FileDownloader.py +++ b/youtube_dl/FileDownloader.py @@ -63,6 +63,17 @@ class FileDownloader(object): converted = float(bytes) / float(1024 ** exponent) return '%.2f%s' % (converted, suffix) + @staticmethod + def format_seconds(seconds): + (mins, secs) = divmod(seconds, 60) + (hours, eta_mins) = divmod(mins, 60) + if hours > 99: + return '--:--:--' + if hours == 0: + return '%02d:%02d' % (mins, secs) + else: + return '%02d:%02d:%02d' % (hours, mins, secs) + @staticmethod def calc_percent(byte_counter, data_len): if data_len is None: @@ -78,10 +89,7 @@ class FileDownloader(object): return '--:--' rate = float(current) / dif eta = int((float(total) - float(current)) / rate) - (eta_mins, eta_secs) = divmod(eta, 60) - if eta_mins > 99: - return '--:--' - return '%02d:%02d' % (eta_mins, eta_secs) + return FileDownloader.format_seconds(eta) @staticmethod def calc_speed(start, now, bytes): @@ -230,12 +238,14 @@ class FileDownloader(object): """Report it was impossible to resume download.""" self.to_screen(u'[download] Unable to resume') - def report_finish(self): + def report_finish(self, data_len_str, tot_time): """Report download finished.""" if self.params.get('noprogress', False): self.to_screen(u'[download] Download completed') else: - self.to_screen(u'') + clear_line = (u'\x1b[K' if sys.stderr.isatty() and os.name != 'nt' else u'') + self.to_screen(u'\r%s[download] 100%% of %s in %s' % + (clear_line, data_len_str, self.format_seconds(tot_time))) def _download_with_rtmpdump(self, filename, url, player_url, page_url, play_path, tc_url): self.report_destination(filename) @@ -538,7 +548,7 @@ class FileDownloader(object): self.report_error(u'Did not get any data blocks') return False stream.close() - self.report_finish() + self.report_finish(data_len_str, (time.time() - start)) if data_len is not None and byte_counter != data_len: raise ContentTooShortError(byte_counter, int(data_len)) self.try_rename(tmpfilename, filename) diff --git a/youtube_dl/PostProcessor.py b/youtube_dl/PostProcessor.py index fddf586..ae56d20 100644 --- a/youtube_dl/PostProcessor.py +++ b/youtube_dl/PostProcessor.py @@ -71,12 +71,17 @@ class FFmpegPostProcessor(PostProcessor): programs = ['avprobe', 'avconv', 'ffmpeg', 'ffprobe'] return dict((program, executable(program)) for program in programs) - def run_ffmpeg(self, path, out_path, opts): + def run_ffmpeg_multiple_files(self, input_paths, out_path, opts): if not self._exes['ffmpeg'] and not self._exes['avconv']: raise FFmpegPostProcessorError(u'ffmpeg or avconv not found. Please install one.') - cmd = ([self._exes['avconv'] or self._exes['ffmpeg'], '-y', '-i', encodeFilename(path)] + + files_cmd = [] + for path in input_paths: + files_cmd.extend(['-i', encodeFilename(path)]) + cmd = ([self._exes['avconv'] or self._exes['ffmpeg'], '-y'] + files_cmd + opts + [encodeFilename(self._ffmpeg_filename_argument(out_path))]) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout,stderr = p.communicate() if p.returncode != 0: @@ -84,6 +89,9 @@ class FFmpegPostProcessor(PostProcessor): msg = stderr.strip().split('\n')[-1] raise FFmpegPostProcessorError(msg) + def run_ffmpeg(self, path, out_path, opts): + self.run_ffmpeg_multiple_files([path], out_path, opts) + def _ffmpeg_filename_argument(self, fn): # ffmpeg broke --, see https://ffmpeg.org/trac/ffmpeg/ticket/2127 for details if fn.startswith(u'-'): @@ -129,7 +137,7 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor): try: FFmpegPostProcessor.run_ffmpeg(self, path, out_path, opts) except FFmpegPostProcessorError as err: - raise AudioConversionError(err.message) + raise AudioConversionError(err.msg) def run(self, information): path = information['filepath'] @@ -199,7 +207,7 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor): except: etype,e,tb = sys.exc_info() if isinstance(e, AudioConversionError): - msg = u'audio conversion failed: ' + e.message + msg = u'audio conversion failed: ' + e.msg else: msg = u'error running ' + (self._exes['avconv'] and 'avconv' or 'ffmpeg') raise PostProcessingError(msg) @@ -232,3 +240,227 @@ class FFmpegVideoConvertor(FFmpegPostProcessor): information['format'] = self._preferedformat information['ext'] = self._preferedformat return False,information + + +class FFmpegEmbedSubtitlePP(FFmpegPostProcessor): + # See http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt + _lang_map = { + 'aa': 'aar', + 'ab': 'abk', + 'ae': 'ave', + 'af': 'afr', + 'ak': 'aka', + 'am': 'amh', + 'an': 'arg', + 'ar': 'ara', + 'as': 'asm', + 'av': 'ava', + 'ay': 'aym', + 'az': 'aze', + 'ba': 'bak', + 'be': 'bel', + 'bg': 'bul', + 'bh': 'bih', + 'bi': 'bis', + 'bm': 'bam', + 'bn': 'ben', + 'bo': 'bod', + 'br': 'bre', + 'bs': 'bos', + 'ca': 'cat', + 'ce': 'che', + 'ch': 'cha', + 'co': 'cos', + 'cr': 'cre', + 'cs': 'ces', + 'cu': 'chu', + 'cv': 'chv', + 'cy': 'cym', + 'da': 'dan', + 'de': 'deu', + 'dv': 'div', + 'dz': 'dzo', + 'ee': 'ewe', + 'el': 'ell', + 'en': 'eng', + 'eo': 'epo', + 'es': 'spa', + 'et': 'est', + 'eu': 'eus', + 'fa': 'fas', + 'ff': 'ful', + 'fi': 'fin', + 'fj': 'fij', + 'fo': 'fao', + 'fr': 'fra', + 'fy': 'fry', + 'ga': 'gle', + 'gd': 'gla', + 'gl': 'glg', + 'gn': 'grn', + 'gu': 'guj', + 'gv': 'glv', + 'ha': 'hau', + 'he': 'heb', + 'hi': 'hin', + 'ho': 'hmo', + 'hr': 'hrv', + 'ht': 'hat', + 'hu': 'hun', + 'hy': 'hye', + 'hz': 'her', + 'ia': 'ina', + 'id': 'ind', + 'ie': 'ile', + 'ig': 'ibo', + 'ii': 'iii', + 'ik': 'ipk', + 'io': 'ido', + 'is': 'isl', + 'it': 'ita', + 'iu': 'iku', + 'ja': 'jpn', + 'jv': 'jav', + 'ka': 'kat', + 'kg': 'kon', + 'ki': 'kik', + 'kj': 'kua', + 'kk': 'kaz', + 'kl': 'kal', + 'km': 'khm', + 'kn': 'kan', + 'ko': 'kor', + 'kr': 'kau', + 'ks': 'kas', + 'ku': 'kur', + 'kv': 'kom', + 'kw': 'cor', + 'ky': 'kir', + 'la': 'lat', + 'lb': 'ltz', + 'lg': 'lug', + 'li': 'lim', + 'ln': 'lin', + 'lo': 'lao', + 'lt': 'lit', + 'lu': 'lub', + 'lv': 'lav', + 'mg': 'mlg', + 'mh': 'mah', + 'mi': 'mri', + 'mk': 'mkd', + 'ml': 'mal', + 'mn': 'mon', + 'mr': 'mar', + 'ms': 'msa', + 'mt': 'mlt', + 'my': 'mya', + 'na': 'nau', + 'nb': 'nob', + 'nd': 'nde', + 'ne': 'nep', + 'ng': 'ndo', + 'nl': 'nld', + 'nn': 'nno', + 'no': 'nor', + 'nr': 'nbl', + 'nv': 'nav', + 'ny': 'nya', + 'oc': 'oci', + 'oj': 'oji', + 'om': 'orm', + 'or': 'ori', + 'os': 'oss', + 'pa': 'pan', + 'pi': 'pli', + 'pl': 'pol', + 'ps': 'pus', + 'pt': 'por', + 'qu': 'que', + 'rm': 'roh', + 'rn': 'run', + 'ro': 'ron', + 'ru': 'rus', + 'rw': 'kin', + 'sa': 'san', + 'sc': 'srd', + 'sd': 'snd', + 'se': 'sme', + 'sg': 'sag', + 'si': 'sin', + 'sk': 'slk', + 'sl': 'slv', + 'sm': 'smo', + 'sn': 'sna', + 'so': 'som', + 'sq': 'sqi', + 'sr': 'srp', + 'ss': 'ssw', + 'st': 'sot', + 'su': 'sun', + 'sv': 'swe', + 'sw': 'swa', + 'ta': 'tam', + 'te': 'tel', + 'tg': 'tgk', + 'th': 'tha', + 'ti': 'tir', + 'tk': 'tuk', + 'tl': 'tgl', + 'tn': 'tsn', + 'to': 'ton', + 'tr': 'tur', + 'ts': 'tso', + 'tt': 'tat', + 'tw': 'twi', + 'ty': 'tah', + 'ug': 'uig', + 'uk': 'ukr', + 'ur': 'urd', + 'uz': 'uzb', + 've': 'ven', + 'vi': 'vie', + 'vo': 'vol', + 'wa': 'wln', + 'wo': 'wol', + 'xh': 'xho', + 'yi': 'yid', + 'yo': 'yor', + 'za': 'zha', + 'zh': 'zho', + 'zu': 'zul', + } + + def __init__(self, downloader=None, subtitlesformat='srt'): + super(FFmpegEmbedSubtitlePP, self).__init__(downloader) + self._subformat = subtitlesformat + + @classmethod + def _conver_lang_code(cls, code): + """Convert language code from ISO 639-1 to ISO 639-2/T""" + return cls._lang_map.get(code[:2]) + + def run(self, information): + if information['ext'] != u'mp4': + self._downloader.to_screen(u'[ffmpeg] Subtitles can only be embedded in mp4 files') + return True, information + sub_langs = [key for key in information['subtitles']] + + filename = information['filepath'] + input_files = [filename] + [subtitles_filename(filename, lang, self._subformat) for lang in sub_langs] + + opts = ['-map', '0:0', '-map', '0:1', '-c:v', 'copy', '-c:a', 'copy'] + for (i, lang) in enumerate(sub_langs): + opts.extend(['-map', '%d:0' % (i+1), '-c:s:%d' % i, 'mov_text']) + lang_code = self._conver_lang_code(lang) + if lang_code is not None: + opts.extend(['-metadata:s:s:%d' % i, 'language=%s' % lang_code]) + opts.extend(['-f', 'mp4']) + + temp_filename = filename + u'.temp' + self._downloader.to_screen(u'[ffmpeg] Embedding subtitles in \'%s\'' % filename) + self.run_ffmpeg_multiple_files(input_files, temp_filename, opts) + os.remove(encodeFilename(filename)) + os.rename(encodeFilename(temp_filename), encodeFilename(filename)) + + return True, information diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index d1618da..b289bd9 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -76,7 +76,7 @@ class YoutubeDL(object): allsubtitles: Downloads all the subtitles of the video listsubtitles: Lists all available subtitles for the video subtitlesformat: Subtitle format [srt/sbv/vtt] (default=srt) - subtitleslang: Language of the subtitles to download + subtitleslangs: List of languages of the subtitles to download keepvideo: Keep the video file after post-processing daterange: A DateRange object, download only if the upload_date is in the range. skip_download: Skip the actual download of the video file @@ -97,6 +97,7 @@ class YoutubeDL(object): def __init__(self, params): """Create a FileDownloader object with the given options.""" self._ies = [] + self._ies_instances = {} self._pps = [] self._progress_hooks = [] self._download_retcode = 0 @@ -111,8 +112,21 @@ class YoutubeDL(object): def add_info_extractor(self, ie): """Add an InfoExtractor object to the end of the list.""" self._ies.append(ie) + self._ies_instances[ie.ie_key()] = ie ie.set_downloader(self) + def get_info_extractor(self, ie_key): + """ + Get an instance of an IE with name ie_key, it will try to get one from + the _ies list, if there's no instance it will create a new one and add + it to the extractor list. + """ + ie = self._ies_instances.get(ie_key) + if ie is None: + ie = get_info_extractor(ie_key)() + self.add_info_extractor(ie) + return ie + def add_default_info_extractors(self): """ Add the InfoExtractors returned by gen_extractors to the end of the list @@ -294,9 +308,7 @@ class YoutubeDL(object): ''' if ie_key: - ie = get_info_extractor(ie_key)() - ie.set_downloader(self) - ies = [ie] + ies = [self.get_info_extractor(ie_key)] else: ies = self._ies @@ -448,7 +460,8 @@ class YoutubeDL(object): if self.params.get('forceid', False): compat_print(info_dict['id']) if self.params.get('forceurl', False): - compat_print(info_dict['url']) + # For RTMP URLs, also include the playpath + compat_print(info_dict['url'] + info_dict.get('play_path', u'')) if self.params.get('forcethumbnail', False) and 'thumbnail' in info_dict: compat_print(info_dict['thumbnail']) if self.params.get('forcedescription', False) and 'description' in info_dict: @@ -483,41 +496,28 @@ class YoutubeDL(object): self.report_error(u'Cannot write description file ' + descfn) return - if (self.params.get('writesubtitles', False) or self.params.get('writeautomaticsub')) and 'subtitles' in info_dict and info_dict['subtitles']: + subtitles_are_requested = any([self.params.get('writesubtitles', False), + self.params.get('writeautomaticsub'), + self.params.get('allsubtitles', False)]) + + if subtitles_are_requested and 'subtitles' in info_dict and info_dict['subtitles']: # subtitles download errors are already managed as troubles in relevant IE # that way it will silently go on when used with unsupporting IE - subtitle = info_dict['subtitles'][0] - (sub_error, sub_lang, sub) = subtitle + subtitles = info_dict['subtitles'] sub_format = self.params.get('subtitlesformat') - if sub_error: - self.report_warning("Some error while getting the subtitles") - else: + for sub_lang in subtitles.keys(): + sub = subtitles[sub_lang] + if sub is None: + continue try: - sub_filename = filename.rsplit('.', 1)[0] + u'.' + sub_lang + u'.' + sub_format + sub_filename = subtitles_filename(filename, sub_lang, sub_format) self.report_writesubtitles(sub_filename) with io.open(encodeFilename(sub_filename), 'w', encoding='utf-8') as subfile: - subfile.write(sub) + subfile.write(sub) except (OSError, IOError): self.report_error(u'Cannot write subtitles file ' + descfn) return - if self.params.get('allsubtitles', False) and 'subtitles' in info_dict and info_dict['subtitles']: - subtitles = info_dict['subtitles'] - sub_format = self.params.get('subtitlesformat') - for subtitle in subtitles: - (sub_error, sub_lang, sub) = subtitle - if sub_error: - self.report_warning("Some error while getting the subtitles") - else: - try: - sub_filename = filename.rsplit('.', 1)[0] + u'.' + sub_lang + u'.' + sub_format - self.report_writesubtitles(sub_filename) - with io.open(encodeFilename(sub_filename), 'w', encoding='utf-8') as subfile: - subfile.write(sub) - except (OSError, IOError): - self.report_error(u'Cannot write subtitles file ' + descfn) - return - if self.params.get('writeinfojson', False): infofn = filename + u'.info.json' self.report_writeinfojson(infofn) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index bf040aa..431460c 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -27,6 +27,7 @@ __authors__ = ( 'Johny Mo Swag', 'Axel Noack', 'Albert Kim', + 'Pierre Rudloff', ) __license__ = 'Public Domain' @@ -44,6 +45,7 @@ import sys import warnings import platform + from .utils import * from .update import update_self from .version import __version__ @@ -82,6 +84,9 @@ def parseOpts(overrideArguments=None): return "".join(opts) + def _comma_separated_values_options_callback(option, opt_str, value, parser): + setattr(parser.values, option.dest, value.split(',')) + def _find_term_columns(): columns = os.environ.get('COLUMNS', None) if columns: @@ -95,6 +100,16 @@ def parseOpts(overrideArguments=None): pass return None + def _hide_login_info(opts): + opts = list(opts) + for private_opt in ['-p', '--password', '-u', '--username']: + try: + i = opts.index(private_opt) + opts[i+1] = '' + except ValueError: + pass + return opts + max_width = 80 max_help_position = 80 @@ -119,6 +134,7 @@ def parseOpts(overrideArguments=None): selection = optparse.OptionGroup(parser, 'Video Selection') authentication = optparse.OptionGroup(parser, 'Authentication Options') video_format = optparse.OptionGroup(parser, 'Video Format Options') + subtitles = optparse.OptionGroup(parser, 'Subtitle Options') downloader = optparse.OptionGroup(parser, 'Download Options') postproc = optparse.OptionGroup(parser, 'Post-processing Options') filesystem = optparse.OptionGroup(parser, 'Filesystem Options') @@ -185,27 +201,29 @@ def parseOpts(overrideArguments=None): action='store', dest='format_limit', metavar='FORMAT', help='highest quality format to download') video_format.add_option('-F', '--list-formats', action='store_true', dest='listformats', help='list all available formats (currently youtube only)') - video_format.add_option('--write-sub', '--write-srt', + + subtitles.add_option('--write-sub', '--write-srt', action='store_true', dest='writesubtitles', help='write subtitle file (currently youtube only)', default=False) - video_format.add_option('--write-auto-sub', '--write-automatic-sub', + subtitles.add_option('--write-auto-sub', '--write-automatic-sub', action='store_true', dest='writeautomaticsub', help='write automatic subtitle file (currently youtube only)', default=False) - video_format.add_option('--only-sub', + subtitles.add_option('--only-sub', action='store_true', dest='skip_download', help='[deprecated] alias of --skip-download', default=False) - video_format.add_option('--all-subs', + subtitles.add_option('--all-subs', action='store_true', dest='allsubtitles', - help='downloads all the available subtitles of the video (currently youtube only)', default=False) - video_format.add_option('--list-subs', + help='downloads all the available subtitles of the video', default=False) + subtitles.add_option('--list-subs', action='store_true', dest='listsubtitles', - help='lists all available subtitles for the video (currently youtube only)', default=False) - video_format.add_option('--sub-format', + help='lists all available subtitles for the video', default=False) + subtitles.add_option('--sub-format', action='store', dest='subtitlesformat', metavar='FORMAT', - help='subtitle format [srt/sbv/vtt] (default=srt) (currently youtube only)', default='srt') - video_format.add_option('--sub-lang', '--srt-lang', - action='store', dest='subtitleslang', metavar='LANG', - help='language of the subtitles to download (optional) use IETF language tags like \'en\'') + help='subtitle format (default=srt) ([sbv/vtt] youtube only)', default='srt') + subtitles.add_option('--sub-lang', '--sub-langs', '--srt-lang', + action='callback', dest='subtitleslang', metavar='LANGS', type='str', + default=[], callback=_comma_separated_values_options_callback, + help='languages of the subtitles to download (optional) separated by commas, use IETF language tags like \'en,pt\'') downloader.add_option('-r', '--rate-limit', dest='ratelimit', metavar='LIMIT', help='maximum download rate (e.g. 50k or 44.6m)') @@ -320,6 +338,8 @@ def parseOpts(overrideArguments=None): help='keeps the video file on disk after the post-processing; the video is erased by default') postproc.add_option('--no-post-overwrites', action='store_true', dest='nopostoverwrites', default=False, help='do not overwrite post-processed files; the post-processed files are overwritten by default') + postproc.add_option('--embed-subs', action='store_true', dest='embedsubtitles', default=False, + help='embed subtitles in the video (only for mp4 videos)') parser.add_option_group(general) @@ -328,6 +348,7 @@ def parseOpts(overrideArguments=None): parser.add_option_group(filesystem) parser.add_option_group(verbosity) parser.add_option_group(video_format) + parser.add_option_group(subtitles) parser.add_option_group(authentication) parser.add_option_group(postproc) @@ -343,13 +364,13 @@ def parseOpts(overrideArguments=None): userConfFile = os.path.join(os.path.expanduser('~'), '.config', 'youtube-dl.conf') systemConf = _readOptions('/etc/youtube-dl.conf') userConf = _readOptions(userConfFile) - commandLineConf = sys.argv[1:] + commandLineConf = sys.argv[1:] argv = systemConf + userConf + commandLineConf opts, args = parser.parse_args(argv) if opts.verbose: - sys.stderr.write(u'[debug] System config: ' + repr(systemConf) + '\n') - sys.stderr.write(u'[debug] User config: ' + repr(userConf) + '\n') - sys.stderr.write(u'[debug] Command-line args: ' + repr(commandLineConf) + '\n') + sys.stderr.write(u'[debug] System config: ' + repr(_hide_login_info(systemConf)) + '\n') + sys.stderr.write(u'[debug] User config: ' + repr(_hide_login_info(userConf)) + '\n') + sys.stderr.write(u'[debug] Command-line args: ' + repr(_hide_login_info(commandLineConf)) + '\n') return parser, opts, args @@ -377,7 +398,7 @@ def _real_main(argv=None): # Set user agent if opts.user_agent is not None: std_headers['User-Agent'] = opts.user_agent - + # Set referer if opts.referer is not None: std_headers['Referer'] = opts.referer @@ -420,6 +441,10 @@ def _real_main(argv=None): proxy_handler = compat_urllib_request.ProxyHandler(proxies) https_handler = make_HTTPS_handler(opts) opener = compat_urllib_request.build_opener(https_handler, proxy_handler, cookie_processor, YoutubeDLHandler()) + # Delete the default user-agent header, which would otherwise apply in + # cases where our custom HTTP handler doesn't come into play + # (See https://github.com/rg3/youtube-dl/issues/1309 for details) + opener.addheaders =[] compat_urllib_request.install_opener(opener) socket.setdefaulttimeout(300) # 5 minutes should be enough (famous last words) @@ -567,7 +592,7 @@ def _real_main(argv=None): 'allsubtitles': opts.allsubtitles, 'listsubtitles': opts.listsubtitles, 'subtitlesformat': opts.subtitlesformat, - 'subtitleslang': opts.subtitleslang, + 'subtitleslangs': opts.subtitleslang, 'matchtitle': decodeOption(opts.matchtitle), 'rejecttitle': decodeOption(opts.rejecttitle), 'max_downloads': opts.max_downloads, @@ -597,7 +622,7 @@ def _real_main(argv=None): sys.exc_clear() except: pass - sys.stderr.write(u'[debug] Python version %s - %s' %(platform.python_version(), platform.platform()) + u'\n') + sys.stderr.write(u'[debug] Python version %s - %s' %(platform.python_version(), platform_name()) + u'\n') sys.stderr.write(u'[debug] Proxy map: ' + str(proxy_handler.proxies) + u'\n') ydl.add_default_info_extractors() @@ -607,6 +632,8 @@ def _real_main(argv=None): ydl.add_post_processor(FFmpegExtractAudioPP(preferredcodec=opts.audioformat, preferredquality=opts.audioquality, nopostoverwrites=opts.nopostoverwrites)) if opts.recodevideo: ydl.add_post_processor(FFmpegVideoConvertor(preferedformat=opts.recodevideo)) + if opts.embedsubtitles: + ydl.add_post_processor(FFmpegEmbedSubtitlePP(subtitlesformat=opts.subtitlesformat)) # Update version if opts.update_self: diff --git a/youtube_dl/aes.py b/youtube_dl/aes.py new file mode 100644 index 0000000..9a0c93f --- /dev/null +++ b/youtube_dl/aes.py @@ -0,0 +1,202 @@ +__all__ = ['aes_encrypt', 'key_expansion', 'aes_ctr_decrypt', 'aes_decrypt_text'] + +import base64 +from math import ceil + +from .utils import bytes_to_intlist, intlist_to_bytes + +BLOCK_SIZE_BYTES = 16 + +def aes_ctr_decrypt(data, key, counter): + """ + Decrypt with aes in counter mode + + @param {int[]} data cipher + @param {int[]} key 16/24/32-Byte cipher key + @param {instance} counter Instance whose next_value function (@returns {int[]} 16-Byte block) + returns the next counter block + @returns {int[]} decrypted data + """ + expanded_key = key_expansion(key) + block_count = int(ceil(float(len(data)) / BLOCK_SIZE_BYTES)) + + decrypted_data=[] + for i in range(block_count): + counter_block = counter.next_value() + block = data[i*BLOCK_SIZE_BYTES : (i+1)*BLOCK_SIZE_BYTES] + block += [0]*(BLOCK_SIZE_BYTES - len(block)) + + cipher_counter_block = aes_encrypt(counter_block, expanded_key) + decrypted_data += xor(block, cipher_counter_block) + decrypted_data = decrypted_data[:len(data)] + + return decrypted_data + +def key_expansion(data): + """ + Generate key schedule + + @param {int[]} data 16/24/32-Byte cipher key + @returns {int[]} 176/208/240-Byte expanded key + """ + data = data[:] # copy + rcon_iteration = 1 + key_size_bytes = len(data) + expanded_key_size_bytes = (key_size_bytes // 4 + 7) * BLOCK_SIZE_BYTES + + while len(data) < expanded_key_size_bytes: + temp = data[-4:] + temp = key_schedule_core(temp, rcon_iteration) + rcon_iteration += 1 + data += xor(temp, data[-key_size_bytes : 4-key_size_bytes]) + + for _ in range(3): + temp = data[-4:] + data += xor(temp, data[-key_size_bytes : 4-key_size_bytes]) + + if key_size_bytes == 32: + temp = data[-4:] + temp = sub_bytes(temp) + data += xor(temp, data[-key_size_bytes : 4-key_size_bytes]) + + for _ in range(3 if key_size_bytes == 32 else 2 if key_size_bytes == 24 else 0): + temp = data[-4:] + data += xor(temp, data[-key_size_bytes : 4-key_size_bytes]) + data = data[:expanded_key_size_bytes] + + return data + +def aes_encrypt(data, expanded_key): + """ + Encrypt one block with aes + + @param {int[]} data 16-Byte state + @param {int[]} expanded_key 176/208/240-Byte expanded key + @returns {int[]} 16-Byte cipher + """ + rounds = len(expanded_key) // BLOCK_SIZE_BYTES - 1 + + data = xor(data, expanded_key[:BLOCK_SIZE_BYTES]) + for i in range(1, rounds+1): + data = sub_bytes(data) + data = shift_rows(data) + if i != rounds: + data = mix_columns(data) + data = xor(data, expanded_key[i*BLOCK_SIZE_BYTES : (i+1)*BLOCK_SIZE_BYTES]) + + return data + +def aes_decrypt_text(data, password, key_size_bytes): + """ + Decrypt text + - The first 8 Bytes of decoded 'data' are the 8 high Bytes of the counter + - The cipher key is retrieved by encrypting the first 16 Byte of 'password' + with the first 'key_size_bytes' Bytes from 'password' (if necessary filled with 0's) + - Mode of operation is 'counter' + + @param {str} data Base64 encoded string + @param {str,unicode} password Password (will be encoded with utf-8) + @param {int} key_size_bytes Possible values: 16 for 128-Bit, 24 for 192-Bit or 32 for 256-Bit + @returns {str} Decrypted data + """ + NONCE_LENGTH_BYTES = 8 + + data = bytes_to_intlist(base64.b64decode(data)) + password = bytes_to_intlist(password.encode('utf-8')) + + key = password[:key_size_bytes] + [0]*(key_size_bytes - len(password)) + key = aes_encrypt(key[:BLOCK_SIZE_BYTES], key_expansion(key)) * (key_size_bytes // BLOCK_SIZE_BYTES) + + nonce = data[:NONCE_LENGTH_BYTES] + cipher = data[NONCE_LENGTH_BYTES:] + + class Counter: + __value = nonce + [0]*(BLOCK_SIZE_BYTES - NONCE_LENGTH_BYTES) + def next_value(self): + temp = self.__value + self.__value = inc(self.__value) + return temp + + decrypted_data = aes_ctr_decrypt(cipher, key, Counter()) + plaintext = intlist_to_bytes(decrypted_data) + + return plaintext + +RCON = (0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36) +SBOX = (0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16) +MIX_COLUMN_MATRIX = ((2,3,1,1), + (1,2,3,1), + (1,1,2,3), + (3,1,1,2)) + +def sub_bytes(data): + return [SBOX[x] for x in data] + +def rotate(data): + return data[1:] + [data[0]] + +def key_schedule_core(data, rcon_iteration): + data = rotate(data) + data = sub_bytes(data) + data[0] = data[0] ^ RCON[rcon_iteration] + + return data + +def xor(data1, data2): + return [x^y for x, y in zip(data1, data2)] + +def mix_column(data): + data_mixed = [] + for row in range(4): + mixed = 0 + for column in range(4): + addend = data[column] + if MIX_COLUMN_MATRIX[row][column] in (2,3): + addend <<= 1 + if addend > 0xff: + addend &= 0xff + addend ^= 0x1b + if MIX_COLUMN_MATRIX[row][column] == 3: + addend ^= data[column] + mixed ^= addend & 0xff + data_mixed.append(mixed) + return data_mixed + +def mix_columns(data): + data_mixed = [] + for i in range(4): + column = data[i*4 : (i+1)*4] + data_mixed += mix_column(column) + return data_mixed + +def shift_rows(data): + data_shifted = [] + for column in range(4): + for row in range(4): + data_shifted.append( data[((column + row) & 0b11) * 4 + row] ) + return data_shifted + +def inc(data): + data = data[:] # copy + for i in range(len(data)-1,-1,-1): + if data[i] == 255: + data[i] = 0 + else: + data[i] = data[i] + 1 + break + return data diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index 84c02c2..90f1a44 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -1,3 +1,5 @@ +from .appletrailers import AppleTrailersIE +from .addanime import AddAnimeIE from .archiveorg import ArchiveOrgIE from .ard import ARDIE from .arte import ArteTvIE @@ -6,7 +8,10 @@ from .bandcamp import BandcampIE from .bliptv import BlipTVIE, BlipTVUserIE from .breakcom import BreakIE from .brightcove import BrightcoveIE +from .c56 import C56IE from .canalplus import CanalplusIE +from .canalc2 import Canalc2IE +from .cnn import CNNIE from .collegehumor import CollegeHumorIE from .comedycentral import ComedyCentralIE from .condenast import CondeNastIE @@ -29,6 +34,7 @@ from .gametrailers import GametrailersIE from .generic import GenericIE from .googleplus import GooglePlusIE from .googlesearch import GoogleSearchIE +from .hark import HarkIE from .hotnewhiphop import HotNewHipHopIE from .howcast import HowcastIE from .hypem import HypemIE @@ -36,6 +42,7 @@ from .ign import IGNIE, OneUPIE from .ina import InaIE from .infoq import InfoQIE from .instagram import InstagramIE +from .jeuxvideo import JeuxVideoIE from .jukebox import JukeboxIE from .justintv import JustinTVIE from .kankan import KankanIE @@ -43,20 +50,28 @@ from .keek import KeekIE from .liveleak import LiveLeakIE from .livestream import LivestreamIE from .metacafe import MetacafeIE +from .mit import TechTVMITIE, MITIE from .mixcloud import MixcloudIE from .mtv import MTVIE from .muzu import MuzuTVIE from .myspass import MySpassIE from .myvideo import MyVideoIE from .nba import NBAIE +from .nbc import NBCNewsIE from .ooyala import OoyalaIE +from .orf import ORFIE +from .pbs import PBSIE from .photobucket import PhotobucketIE from .pornotube import PornotubeIE from .rbmaradio import RBMARadioIE from .redtube import RedTubeIE from .ringtv import RingTVIE +from .ro220 import Ro220IE from .roxwel import RoxwelIE +from .rtlnow import RTLnowIE from .sina import SinaIE +from .slashdot import SlashdotIE +from .sohu import SohuIE from .soundcloud import SoundcloudIE, SoundcloudSetIE from .spiegel import SpiegelIE from .stanfordoc import StanfordOpenClassroomIE @@ -67,9 +82,11 @@ from .ted import TEDIE from .tf1 import TF1IE from .thisav import ThisAVIE from .traileraddict import TrailerAddictIE +from .trilulilu import TriluliluIE from .tudou import TudouIE from .tumblr import TumblrIE from .tutv import TutvIE +from .unistra import UnistraIE from .ustream import UstreamIE from .vbox7 import Vbox7IE from .veoh import VeohIE @@ -77,7 +94,6 @@ from .vevo import VevoIE from .videofyme import VideofyMeIE from .vimeo import VimeoIE, VimeoChannelIE from .vine import VineIE -from .c56 import C56IE from .wat import WatIE from .weibo import WeiboIE from .wimp import WimpIE @@ -111,12 +127,14 @@ _ALL_CLASSES = [ ] _ALL_CLASSES.append(GenericIE) + def gen_extractors(): """ Return a list of an instance of every supported extractor. The order does matter; the first extractor matched is the one handling the URL. """ return [klass() for klass in _ALL_CLASSES] + def get_info_extractor(ie_name): """Returns the info extractor class with the given ie_name""" return globals()[ie_name+'IE'] diff --git a/youtube_dl/extractor/addanime.py b/youtube_dl/extractor/addanime.py new file mode 100644 index 0000000..82a785a --- /dev/null +++ b/youtube_dl/extractor/addanime.py @@ -0,0 +1,75 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + compat_HTTPError, + compat_str, + compat_urllib_parse, + compat_urllib_parse_urlparse, + + ExtractorError, +) + + +class AddAnimeIE(InfoExtractor): + + _VALID_URL = r'^http://(?:\w+\.)?add-anime\.net/watch_video.php\?(?:.*?)v=(?P[\w_]+)(?:.*)' + IE_NAME = u'AddAnime' + _TEST = { + u'url': u'http://www.add-anime.net/watch_video.php?v=24MR3YO5SAS9', + u'file': u'24MR3YO5SAS9.flv', + u'md5': u'1036a0e0cd307b95bd8a8c3a5c8cfaf1', + u'info_dict': { + u"description": u"One Piece 606", + u"title": u"One Piece 606" + } + } + + def _real_extract(self, url): + try: + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('video_id') + webpage = self._download_webpage(url, video_id) + except ExtractorError as ee: + if not isinstance(ee.cause, compat_HTTPError): + raise + + redir_webpage = ee.cause.read().decode('utf-8') + action = self._search_regex( + r'

', + redir_webpage, u'redirect vc value') + av = re.search( + r'a\.value = ([0-9]+)[+]([0-9]+)[*]([0-9]+);', + redir_webpage) + if av is None: + raise ExtractorError(u'Cannot find redirect math task') + av_res = int(av.group(1)) + int(av.group(2)) * int(av.group(3)) + + parsed_url = compat_urllib_parse_urlparse(url) + av_val = av_res + len(parsed_url.netloc) + confirm_url = ( + parsed_url.scheme + u'://' + parsed_url.netloc + + action + '?' + + compat_urllib_parse.urlencode({ + 'jschl_vc': vc, 'jschl_answer': compat_str(av_val)})) + self._download_webpage( + confirm_url, video_id, + note=u'Confirming after redirect') + webpage = self._download_webpage(url, video_id) + + video_url = self._search_regex(r"var normal_video_file = '(.*?)';", + webpage, u'video file URL') + video_title = self._og_search_title(webpage) + video_description = self._og_search_description(webpage) + + return { + '_type': 'video', + 'id': video_id, + 'url': video_url, + 'ext': 'flv', + 'title': video_title, + 'description': video_description + } diff --git a/youtube_dl/extractor/appletrailers.py b/youtube_dl/extractor/appletrailers.py new file mode 100644 index 0000000..8b191c1 --- /dev/null +++ b/youtube_dl/extractor/appletrailers.py @@ -0,0 +1,166 @@ +import re +import xml.etree.ElementTree + +from .common import InfoExtractor +from ..utils import ( + determine_ext, +) + + +class AppleTrailersIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?trailers.apple.com/trailers/(?P[^/]+)/(?P[^/]+)' + _TEST = { + u"url": u"http://trailers.apple.com/trailers/wb/manofsteel/", + u"playlist": [ + { + u"file": u"manofsteel-trailer4.mov", + u"md5": u"11874af099d480cc09e103b189805d5f", + u"info_dict": { + u"duration": 111, + u"thumbnail": u"http://trailers.apple.com/trailers/wb/manofsteel/images/thumbnail_11624.jpg", + u"title": u"Trailer 4", + u"upload_date": u"20130523", + u"uploader_id": u"wb", + }, + }, + { + u"file": u"manofsteel-trailer3.mov", + u"md5": u"07a0a262aae5afe68120eed61137ab34", + u"info_dict": { + u"duration": 182, + u"thumbnail": u"http://trailers.apple.com/trailers/wb/manofsteel/images/thumbnail_10793.jpg", + u"title": u"Trailer 3", + u"upload_date": u"20130417", + u"uploader_id": u"wb", + }, + }, + { + u"file": u"manofsteel-trailer.mov", + u"md5": u"e401fde0813008e3307e54b6f384cff1", + u"info_dict": { + u"duration": 148, + u"thumbnail": u"http://trailers.apple.com/trailers/wb/manofsteel/images/thumbnail_8703.jpg", + u"title": u"Trailer", + u"upload_date": u"20121212", + u"uploader_id": u"wb", + }, + }, + { + u"file": u"manofsteel-teaser.mov", + u"md5": u"76b392f2ae9e7c98b22913c10a639c97", + u"info_dict": { + u"duration": 93, + u"thumbnail": u"http://trailers.apple.com/trailers/wb/manofsteel/images/thumbnail_6899.jpg", + u"title": u"Teaser", + u"upload_date": u"20120721", + u"uploader_id": u"wb", + }, + } + ] + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + movie = mobj.group('movie') + uploader_id = mobj.group('company') + + playlist_url = url.partition(u'?')[0] + u'/includes/playlists/web.inc' + playlist_snippet = self._download_webpage(playlist_url, movie) + playlist_cleaned = re.sub(r'(?s)', u'', playlist_snippet) + playlist_html = u'' + playlist_cleaned + u'' + + size_cache = {} + + doc = xml.etree.ElementTree.fromstring(playlist_html) + playlist = [] + for li in doc.findall('./div/ul/li'): + title = li.find('.//h3').text + video_id = movie + '-' + re.sub(r'[^a-zA-Z0-9]', '', title).lower() + thumbnail = li.find('.//img').attrib['src'] + + date_el = li.find('.//p') + upload_date = None + m = re.search(r':\s?(?P[0-9]{2})/(?P[0-9]{2})/(?P[0-9]{2})', date_el.text) + if m: + upload_date = u'20' + m.group('year') + m.group('month') + m.group('day') + runtime_el = date_el.find('./br') + m = re.search(r':\s?(?P[0-9]+):(?P[0-9]{1,2})', runtime_el.tail) + duration = None + if m: + duration = 60 * int(m.group('minutes')) + int(m.group('seconds')) + + formats = [] + for formats_el in li.findall('.//a'): + if formats_el.attrib['class'] != 'OverlayPanel': + continue + target = formats_el.attrib['target'] + + format_code = formats_el.text + if 'Automatic' in format_code: + continue + + size_q = formats_el.attrib['href'] + size_id = size_q.rpartition('#videos-')[2] + if size_id not in size_cache: + size_url = url + size_q + sizepage_html = self._download_webpage( + size_url, movie, + note=u'Downloading size info %s' % size_id, + errnote=u'Error while downloading size info %s' % size_id, + ) + _doc = xml.etree.ElementTree.fromstring(sizepage_html) + size_cache[size_id] = _doc + + sizepage_doc = size_cache[size_id] + links = sizepage_doc.findall('.//{http://www.w3.org/1999/xhtml}ul/{http://www.w3.org/1999/xhtml}li/{http://www.w3.org/1999/xhtml}a') + for vid_a in links: + href = vid_a.get('href') + if not href.endswith(target): + continue + detail_q = href.partition('#')[0] + detail_url = url + '/' + detail_q + + m = re.match(r'includes/(?P[^/]+)/', detail_q) + detail_id = m.group('detail_id') + + detail_html = self._download_webpage( + detail_url, movie, + note=u'Downloading detail %s %s' % (detail_id, size_id), + errnote=u'Error while downloading detail %s %s' % (detail_id, size_id) + ) + detail_doc = xml.etree.ElementTree.fromstring(detail_html) + movie_link_el = detail_doc.find('.//{http://www.w3.org/1999/xhtml}a') + assert movie_link_el.get('class') == 'movieLink' + movie_link = movie_link_el.get('href').partition('?')[0].replace('_', '_h') + ext = determine_ext(movie_link) + assert ext == 'mov' + + formats.append({ + 'format': format_code, + 'ext': ext, + 'url': movie_link, + }) + + info = { + '_type': 'video', + 'id': video_id, + 'title': title, + 'formats': formats, + 'title': title, + 'duration': duration, + 'thumbnail': thumbnail, + 'upload_date': upload_date, + 'uploader_id': uploader_id, + 'user_agent': 'QuickTime compatible (youtube-dl)', + } + # TODO: Remove when #980 has been merged + info['url'] = formats[-1]['url'] + info['ext'] = formats[-1]['ext'] + + playlist.append(info) + + return { + '_type': 'playlist', + 'id': movie, + 'entries': playlist, + } diff --git a/youtube_dl/extractor/c56.py b/youtube_dl/extractor/c56.py index 4c8a8af..dc3a8d4 100644 --- a/youtube_dl/extractor/c56.py +++ b/youtube_dl/extractor/c56.py @@ -12,8 +12,8 @@ class C56IE(InfoExtractor): _TEST ={ u'url': u'http://www.56.com/u39/v_OTM0NDA3MTY.html', - u'file': u'93440716.mp4', - u'md5': u'9dc07b5c8e978112a6441f9e75d2b59e', + u'file': u'93440716.flv', + u'md5': u'e59995ac63d0457783ea05f93f12a866', u'info_dict': { u'title': u'网事知多少 第32期:车怒', }, diff --git a/youtube_dl/extractor/canalc2.py b/youtube_dl/extractor/canalc2.py new file mode 100644 index 0000000..5083221 --- /dev/null +++ b/youtube_dl/extractor/canalc2.py @@ -0,0 +1,35 @@ +# coding: utf-8 +import re + +from .common import InfoExtractor + + +class Canalc2IE(InfoExtractor): + _IE_NAME = 'canalc2.tv' + _VALID_URL = r'http://.*?\.canalc2\.tv/video\.asp\?idVideo=(\d+)&voir=oui' + + _TEST = { + u'url': u'http://www.canalc2.tv/video.asp?idVideo=12163&voir=oui', + u'file': u'12163.mp4', + u'md5': u'060158428b650f896c542dfbb3d6487f', + u'info_dict': { + u'title': u'Terrasses du Numérique' + } + } + + def _real_extract(self, url): + video_id = re.match(self._VALID_URL, url).group(1) + webpage = self._download_webpage(url, video_id) + file_name = self._search_regex( + r"so\.addVariable\('file','(.*?)'\);", + webpage, 'file name') + video_url = 'http://vod-flash.u-strasbg.fr:8080/' + file_name + + title = self._html_search_regex( + r'class="evenement8">(.*?)', webpage, u'title') + + return {'id': video_id, + 'ext': 'mp4', + 'url': video_url, + 'title': title, + } diff --git a/youtube_dl/extractor/canalplus.py b/youtube_dl/extractor/canalplus.py index 3b1c888..1f02519 100644 --- a/youtube_dl/extractor/canalplus.py +++ b/youtube_dl/extractor/canalplus.py @@ -5,7 +5,7 @@ from .common import InfoExtractor from ..utils import unified_strdate class CanalplusIE(InfoExtractor): - _VALID_URL = r'https?://www\.canalplus\.fr/.*?\?vid=(?P\d+)' + _VALID_URL = r'https?://(www\.canalplus\.fr/.*?\?vid=|player\.canalplus\.fr/#/)(?P\d+)' _VIDEO_INFO_TEMPLATE = 'http://service.canal-plus.com/video/rest/getVideosLiees/cplus/%s' IE_NAME = u'canalplus.fr' diff --git a/youtube_dl/extractor/cnn.py b/youtube_dl/extractor/cnn.py new file mode 100644 index 0000000..a79f881 --- /dev/null +++ b/youtube_dl/extractor/cnn.py @@ -0,0 +1,58 @@ +import re +import xml.etree.ElementTree + +from .common import InfoExtractor +from ..utils import determine_ext + + +class CNNIE(InfoExtractor): + _VALID_URL = r'''(?x)https?://(edition\.)?cnn\.com/video/(data/.+?|\?)/ + (?P.+?/(?P[^/]+?)(?:\.cnn|(?=&)))''' + + _TESTS = [{ + u'url': u'http://edition.cnn.com/video/?/video/sports/2013/06/09/nadal-1-on-1.cnn', + u'file': u'sports_2013_06_09_nadal-1-on-1.cnn.mp4', + u'md5': u'3e6121ea48df7e2259fe73a0628605c4', + u'info_dict': { + u'title': u'Nadal wins 8th French Open title', + u'description': u'World Sport\'s Amanda Davies chats with 2013 French Open champion Rafael Nadal.', + }, + }, + { + u"url": u"http://edition.cnn.com/video/?/video/us/2013/08/21/sot-student-gives-epic-speech.georgia-institute-of-technology&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+rss%2Fcnn_topstories+%28RSS%3A+Top+Stories%29", + u"file": u"us_2013_08_21_sot-student-gives-epic-speech.georgia-institute-of-technology.mp4", + u"md5": u"b5cc60c60a3477d185af8f19a2a26f4e", + u"info_dict": { + u"title": "Student's epic speech stuns new freshmen", + u"description": "A Georgia Tech student welcomes the incoming freshmen with an epic speech backed by music from \"2001: A Space Odyssey.\"" + } + }] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + path = mobj.group('path') + page_title = mobj.group('title') + info_url = u'http://cnn.com/video/data/3.0/%s/index.xml' % path + info_xml = self._download_webpage(info_url, page_title) + info = xml.etree.ElementTree.fromstring(info_xml.encode('utf-8')) + + formats = [] + for f in info.findall('files/file'): + mf = re.match(r'(\d+)x(\d+)(?:_(.*)k)?',f.attrib['bitrate']) + if mf is not None: + formats.append((int(mf.group(1)), int(mf.group(2)), int(mf.group(3) or 0), f.text)) + formats = sorted(formats) + (_,_,_, video_path) = formats[-1] + video_url = 'http://ht.cdn.turner.com/cnn/big%s' % video_path + + thumbnails = sorted([((int(t.attrib['height']),int(t.attrib['width'])), t.text) for t in info.findall('images/image')]) + thumbs_dict = [{'resolution': res, 'url': t_url} for (res, t_url) in thumbnails] + + return {'id': info.attrib['id'], + 'title': info.find('headline').text, + 'url': video_url, + 'ext': determine_ext(video_url), + 'thumbnail': thumbnails[-1][1], + 'thumbnails': thumbs_dict, + 'description': info.find('description').text, + } diff --git a/youtube_dl/extractor/collegehumor.py b/youtube_dl/extractor/collegehumor.py index 30b9c75..8d4c93d 100644 --- a/youtube_dl/extractor/collegehumor.py +++ b/youtube_dl/extractor/collegehumor.py @@ -4,6 +4,7 @@ import xml.etree.ElementTree from .common import InfoExtractor from ..utils import ( compat_urllib_parse_urlparse, + determine_ext, ExtractorError, ) @@ -12,7 +13,7 @@ from ..utils import ( class CollegeHumorIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:www\.)?collegehumor\.com/(video|embed|e)/(?P<videoid>[0-9]+)/?(?P<shorttitle>.*)$' - _TEST = { + _TESTS = [{ u'url': u'http://www.collegehumor.com/video/6902724/comic-con-cosplay-catastrophe', u'file': u'6902724.mp4', u'md5': u'1264c12ad95dca142a9f0bf7968105a0', @@ -20,7 +21,16 @@ class CollegeHumorIE(InfoExtractor): u'title': u'Comic-Con Cosplay Catastrophe', u'description': u'Fans get creative this year at San Diego. Too creative. And yes, that\'s really Joss Whedon.', }, - } + }, + { + u'url': u'http://www.collegehumor.com/video/3505939/font-conference', + u'file': u'3505939.mp4', + u'md5': u'c51ca16b82bb456a4397987791a835f5', + u'info_dict': { + u'title': u'Font Conference', + u'description': u'This video wasn\'t long enough, so we made it double-spaced.', + }, + }] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) @@ -49,25 +59,29 @@ class CollegeHumorIE(InfoExtractor): info['description'] = videoNode.findall('./description')[0].text info['title'] = videoNode.findall('./caption')[0].text info['thumbnail'] = videoNode.findall('./thumbnail')[0].text - manifest_url = videoNode.findall('./file')[0].text + next_url = videoNode.findall('./file')[0].text except IndexError: raise ExtractorError(u'Invalid metadata XML file') - manifest_url += '?hdcore=2.10.3' - manifestXml = self._download_webpage(manifest_url, video_id, - u'Downloading XML manifest', - u'Unable to download video info XML') - - adoc = xml.etree.ElementTree.fromstring(manifestXml) - try: - media_node = adoc.findall('./{http://ns.adobe.com/f4m/1.0}media')[0] - node_id = media_node.attrib['url'] - video_id = adoc.findall('./{http://ns.adobe.com/f4m/1.0}id')[0].text - except IndexError as err: - raise ExtractorError(u'Invalid manifest file') + if next_url.endswith(u'manifest.f4m'): + manifest_url = next_url + '?hdcore=2.10.3' + manifestXml = self._download_webpage(manifest_url, video_id, + u'Downloading XML manifest', + u'Unable to download video info XML') - url_pr = compat_urllib_parse_urlparse(info['thumbnail']) + adoc = xml.etree.ElementTree.fromstring(manifestXml) + try: + media_node = adoc.findall('./{http://ns.adobe.com/f4m/1.0}media')[0] + node_id = media_node.attrib['url'] + video_id = adoc.findall('./{http://ns.adobe.com/f4m/1.0}id')[0].text + except IndexError as err: + raise ExtractorError(u'Invalid manifest file') + url_pr = compat_urllib_parse_urlparse(info['thumbnail']) + info['url'] = url_pr.scheme + '://' + url_pr.netloc + video_id[:-2].replace('.csmil','').replace(',','') + info['ext'] = 'mp4' + else: + # Old-style direct links + info['url'] = next_url + info['ext'] = determine_ext(info['url']) - info['url'] = url_pr.scheme + '://' + url_pr.netloc + video_id[:-2].replace('.csmil','').replace(',','') - info['ext'] = 'mp4' - return [info] + return info diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index da50abf..77726ee 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -47,7 +47,8 @@ class InfoExtractor(object): uploader_id: Nickname or id of the video uploader. location: Physical location of the video. player_url: SWF Player URL (used for rtmpdump). - subtitles: The subtitle file contents. + subtitles: The subtitle file contents as a dictionary in the format + {language: subtitles}. view_count: How many users have watched the video on the platform. urlhandle: [internal] The urlHandle to be used to download the file, like returned by urllib.request.urlopen @@ -77,7 +78,13 @@ class InfoExtractor(object): @classmethod def suitable(cls, url): """Receives a URL and returns True if suitable for this IE.""" - return re.match(cls._VALID_URL, url) is not None + + # This does not use has/getattr intentionally - we want to know whether + # we have cached the regexp for *this* class, whereas getattr would also + # match the superclass + if '_VALID_URL_RE' not in cls.__dict__: + cls._VALID_URL_RE = re.compile(cls._VALID_URL) + return cls._VALID_URL_RE.match(url) is not None @classmethod def working(cls): @@ -107,6 +114,11 @@ class InfoExtractor(object): """Real extraction process. Redefine in subclasses.""" pass + @classmethod + def ie_key(cls): + """A string for getting the InfoExtractor with get_info_extractor""" + return cls.__name__[:-2] + @property def IE_NAME(self): return type(self).__name__[:-2] @@ -122,7 +134,7 @@ class InfoExtractor(object): except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: if errnote is None: errnote = u'Unable to download webpage' - raise ExtractorError(u'%s: %s' % (errnote, compat_str(err)), sys.exc_info()[2]) + raise ExtractorError(u'%s: %s' % (errnote, compat_str(err)), sys.exc_info()[2], cause=err) def _download_webpage_handle(self, url_or_request, video_id, note=None, errnote=None): """ Returns a tuple (page content as string, URL handle) """ @@ -133,12 +145,17 @@ class InfoExtractor(object): urlh = self._request_webpage(url_or_request, video_id, note, errnote) content_type = urlh.headers.get('Content-Type', '') + webpage_bytes = urlh.read() m = re.match(r'[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+\s*;\s*charset=(.+)', content_type) if m: encoding = m.group(1) else: - encoding = 'utf-8' - webpage_bytes = urlh.read() + m = re.search(br'<meta[^>]+charset=[\'"]?([^\'")]+)[ /\'">]', + webpage_bytes[:1024]) + if m: + encoding = m.group(1).decode('ascii') + else: + encoding = 'utf-8' if self._downloader.params.get('dump_intermediate_pages', False): try: url = url_or_request.get_full_url() diff --git a/youtube_dl/extractor/dailymotion.py b/youtube_dl/extractor/dailymotion.py index fa8c630..1ea449c 100644 --- a/youtube_dl/extractor/dailymotion.py +++ b/youtube_dl/extractor/dailymotion.py @@ -21,7 +21,7 @@ class DailymotionIE(InfoExtractor): u'file': u'x33vw9.mp4', u'md5': u'392c4b85a60a90dc4792da41ce3144eb', u'info_dict': { - u"uploader": u"Alex and Van .", + u"uploader": u"Amphora Alex and Van .", u"title": u"Tutoriel de Youtubeur\"DL DES VIDEO DE YOUTUBE\"" } } diff --git a/youtube_dl/extractor/funnyordie.py b/youtube_dl/extractor/funnyordie.py index 67a7e5f..4508f0d 100644 --- a/youtube_dl/extractor/funnyordie.py +++ b/youtube_dl/extractor/funnyordie.py @@ -21,17 +21,14 @@ class FunnyOrDieIE(InfoExtractor): video_id = mobj.group('id') webpage = self._download_webpage(url, video_id) - video_url = self._html_search_regex(r'<video[^>]*>\s*<source[^>]*>\s*<source src="(?P<url>[^"]+)"', + video_url = self._search_regex(r'type: "video/mp4", src: "(.*?)"', webpage, u'video URL', flags=re.DOTALL) - title = self._html_search_regex((r"<h1 class='player_page_h1'.*?>(?P<title>.*?)</h1>", - r'<title>(?P<title>[^<]+?)'), webpage, 'title', flags=re.DOTALL) - info = { 'id': video_id, 'url': video_url, 'ext': 'mp4', - 'title': title, + 'title': self._og_search_title(webpage), 'description': self._og_search_description(webpage), } return [info] diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index b633e89..dc4dea4 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -8,11 +8,13 @@ from ..utils import ( compat_urllib_error, compat_urllib_parse, compat_urllib_request, + compat_urlparse, ExtractorError, ) from .brightcove import BrightcoveIE + class GenericIE(InfoExtractor): IE_DESC = u'Generic downloader that works on some sites' _VALID_URL = r'.*' @@ -23,7 +25,7 @@ class GenericIE(InfoExtractor): u'file': u'13601338388002.mp4', u'md5': u'85b90ccc9d73b4acd9138d3af4c27f89', u'info_dict': { - u"uploader": u"www.hodiho.fr", + u"uploader": u"www.hodiho.fr", u"title": u"R\u00e9gis plante sa Jeep" } }, @@ -107,8 +109,13 @@ class GenericIE(InfoExtractor): return new_url def _real_extract(self, url): - new_url = self._test_redirect(url) - if new_url: return [self.url_result(new_url)] + try: + new_url = self._test_redirect(url) + if new_url: + return [self.url_result(new_url)] + except compat_urllib_error.HTTPError: + # This may be a stupid server that doesn't like HEAD, our UA, or so + pass video_id = url.split('/')[-1] try: @@ -119,7 +126,7 @@ class GenericIE(InfoExtractor): raise ExtractorError(u'Invalid URL: %s' % url) self.report_extraction(video_id) - # Look for BrigthCove: + # Look for BrightCove: m_brightcove = re.search(r'', webpage, re.DOTALL) if m_brightcove is not None: self.to_screen(u'Brightcove video detected.') @@ -144,6 +151,9 @@ class GenericIE(InfoExtractor): # We only look in og:video if the MIME type is a video, don't try if it's a Flash player: if m_video_type is not None: mobj = re.search(r'.*?.+)' + _VALID_URL = r'https?://.+?\.ign\.com/(?Pvideos|show_videos|articles)(/.+)?/(?P.+)' IE_NAME = u'ign.com' _CONFIG_URL_TEMPLATE = 'http://www.ign.com/videos/configs/id/%s.config' @@ -41,7 +41,11 @@ class IGNIE(InfoExtractor): def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) name_or_id = mobj.group('name_or_id') + page_type = mobj.group('type') webpage = self._download_webpage(url, name_or_id) + if page_type == 'articles': + video_url = self._search_regex(r'var videoUrl = "(.+?)"', webpage, u'video url') + return self.url_result(video_url, ie='IGN') video_id = self._find_video_id(webpage) result = self._get_video_info(video_id) description = self._html_search_regex(self._DESCRIPTION_RE, @@ -68,7 +72,7 @@ class IGNIE(InfoExtractor): class OneUPIE(IGNIE): """Extractor for 1up.com, it uses the ign videos system.""" - _VALID_URL = r'https?://gamevideos.1up.com/video/id/(?P.+)' + _VALID_URL = r'https?://gamevideos.1up.com/(?Pvideo)/id/(?P.+)' IE_NAME = '1up.com' _DESCRIPTION_RE = r'
(.+?)
' diff --git a/youtube_dl/extractor/jeuxvideo.py b/youtube_dl/extractor/jeuxvideo.py new file mode 100644 index 0000000..4327bc1 --- /dev/null +++ b/youtube_dl/extractor/jeuxvideo.py @@ -0,0 +1,47 @@ +# coding: utf-8 + +import json +import re +import xml.etree.ElementTree + +from .common import InfoExtractor + +class JeuxVideoIE(InfoExtractor): + _VALID_URL = r'http://.*?\.jeuxvideo\.com/.*/(.*?)-\d+\.htm' + + _TEST = { + u'url': u'http://www.jeuxvideo.com/reportages-videos-jeux/0004/00046170/tearaway-playstation-vita-gc-2013-tearaway-nous-presente-ses-papiers-d-identite-00115182.htm', + u'file': u'5182.mp4', + u'md5': u'e0fdb0cd3ce98713ef9c1e1e025779d0', + u'info_dict': { + u'title': u'GC 2013 : Tearaway nous présente ses papiers d\'identité', + u'description': u'Lorsque les développeurs de LittleBigPlanet proposent un nouveau titre, on ne peut que s\'attendre à un résultat original et fort attrayant.\n', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + title = re.match(self._VALID_URL, url).group(1) + webpage = self._download_webpage(url, title) + m_download = re.search(r'', webpage) + + xml_link = m_download.group(1) + + id = re.search(r'http://www.jeuxvideo.com/config/\w+/0011/(.*?)/\d+_player\.xml', xml_link).group(1) + + xml_config = self._download_webpage(xml_link, title, + 'Downloading XML config') + config = xml.etree.ElementTree.fromstring(xml_config.encode('utf-8')) + info = re.search(r'(.*?)', + xml_config, re.MULTILINE|re.DOTALL).group(1) + info = json.loads(info)['versions'][0] + + video_url = 'http://video720.jeuxvideo.com/' + info['file'] + + return {'id': id, + 'title' : config.find('titre_video').text, + 'ext' : 'mp4', + 'url' : video_url, + 'description': self._og_search_description(webpage), + 'thumbnail': config.find('image').text, + } diff --git a/youtube_dl/extractor/kankan.py b/youtube_dl/extractor/kankan.py index 8537ba5..445d465 100644 --- a/youtube_dl/extractor/kankan.py +++ b/youtube_dl/extractor/kankan.py @@ -21,8 +21,10 @@ class KankanIE(InfoExtractor): video_id = mobj.group('id') webpage = self._download_webpage(url, video_id) - title = self._search_regex(r'G_TITLE=[\'"](.+?)[\'"]', webpage, u'video title') - gcid = self._search_regex(r'lurl:[\'"]http://.+?/.+?/(.+?)/', webpage, u'gcid') + title = self._search_regex(r'(?:G_TITLE=|G_MOVIE_TITLE = )[\'"](.+?)[\'"]', webpage, u'video title') + surls = re.search(r'surls:\[\'.+?\'\]|lurl:\'.+?\.flv\'', webpage).group(0) + gcids = re.findall(r"http://.+?/.+?/(.+?)/", surls) + gcid = gcids[-1] video_info_page = self._download_webpage('http://p2s.cl.kankan.com/getCdnresource_flv?gcid=%s' % gcid, video_id, u'Downloading video url info') diff --git a/youtube_dl/extractor/mit.py b/youtube_dl/extractor/mit.py new file mode 100644 index 0000000..52be923 --- /dev/null +++ b/youtube_dl/extractor/mit.py @@ -0,0 +1,74 @@ +import re +import json + +from .common import InfoExtractor +from ..utils import ( + clean_html, + get_element_by_id, +) + + +class TechTVMITIE(InfoExtractor): + IE_NAME = u'techtv.mit.edu' + _VALID_URL = r'https?://techtv\.mit\.edu/(videos|embeds)/(?P\d+)' + + _TEST = { + u'url': u'http://techtv.mit.edu/videos/25418-mit-dna-learning-center-set', + u'file': u'25418.mp4', + u'md5': u'1f8cb3e170d41fd74add04d3c9330e5f', + u'info_dict': { + u'title': u'MIT DNA Learning Center Set', + u'description': u'md5:82313335e8a8a3f243351ba55bc1b474', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + raw_page = self._download_webpage( + 'http://techtv.mit.edu/videos/%s' % video_id, video_id) + clean_page = re.compile(u'', re.S).sub(u'', raw_page) + + base_url = self._search_regex(r'ipadUrl: \'(.+?cloudfront.net/)', + raw_page, u'base url') + formats_json = self._search_regex(r'bitrates: (\[.+?\])', raw_page, + u'video formats') + formats = json.loads(formats_json) + formats = sorted(formats, key=lambda f: f['bitrate']) + + title = get_element_by_id('edit-title', clean_page) + description = clean_html(get_element_by_id('edit-description', clean_page)) + thumbnail = self._search_regex(r'playlist:.*?url: \'(.+?)\'', + raw_page, u'thumbnail', flags=re.DOTALL) + + return {'id': video_id, + 'title': title, + 'url': base_url + formats[-1]['url'].replace('mp4:', ''), + 'ext': 'mp4', + 'description': description, + 'thumbnail': thumbnail, + } + + +class MITIE(TechTVMITIE): + IE_NAME = u'video.mit.edu' + _VALID_URL = r'https?://video\.mit\.edu/watch/(?P[^/]+)' + + _TEST = { + u'url': u'http://video.mit.edu/watch/the-government-is-profiling-you-13222/', + u'file': u'21783.mp4', + u'md5': u'7db01d5ccc1895fc5010e9c9e13648da', + u'info_dict': { + u'title': u'The Government is Profiling You', + u'description': u'md5:ad5795fe1e1623b73620dbfd47df9afd', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + page_title = mobj.group('title') + webpage = self._download_webpage(url, page_title) + self.to_screen('%s: Extracting %s url' % (page_title, TechTVMITIE.IE_NAME)) + embed_url = self._search_regex(r'<iframe .*?src="(.+?)"', webpage, + u'embed url') + return self.url_result(embed_url, ie='TechTVMIT') diff --git a/youtube_dl/extractor/nbc.py b/youtube_dl/extractor/nbc.py new file mode 100644 index 0000000..3bc9dae --- /dev/null +++ b/youtube_dl/extractor/nbc.py @@ -0,0 +1,33 @@ +import re +import xml.etree.ElementTree + +from .common import InfoExtractor +from ..utils import find_xpath_attr, compat_str + + +class NBCNewsIE(InfoExtractor): + _VALID_URL = r'https?://www\.nbcnews\.com/video/.+?/(?P<id>\d+)' + + _TEST = { + u'url': u'http://www.nbcnews.com/video/nbc-news/52753292', + u'file': u'52753292.flv', + u'md5': u'47abaac93c6eaf9ad37ee6c4463a5179', + u'info_dict': { + u'title': u'Crew emerges after four-month Mars food study', + u'description': u'md5:24e632ffac72b35f8b67a12d1b6ddfc1', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + info_xml = self._download_webpage('http://www.nbcnews.com/id/%s/displaymode/1219' % video_id, video_id) + info = xml.etree.ElementTree.fromstring(info_xml.encode('utf-8')).find('video') + + return {'id': video_id, + 'title': info.find('headline').text, + 'ext': 'flv', + 'url': find_xpath_attr(info, 'media', 'type', 'flashVideo').text, + 'description': compat_str(info.find('caption').text), + 'thumbnail': find_xpath_attr(info, 'media', 'type', 'thumbnail').text, + } diff --git a/youtube_dl/extractor/orf.py b/youtube_dl/extractor/orf.py new file mode 100644 index 0000000..41ef8e9 --- /dev/null +++ b/youtube_dl/extractor/orf.py @@ -0,0 +1,67 @@ +# coding: utf-8 + +import re +import xml.etree.ElementTree +import json + +from .common import InfoExtractor +from ..utils import ( + compat_urlparse, + ExtractorError, + find_xpath_attr, +) + +class ORFIE(InfoExtractor): + _VALID_URL = r'https?://tvthek.orf.at/(programs/.+?/episodes|topics/.+?)/(?P<id>\d+)' + + _TEST = { + u'url': u'http://tvthek.orf.at/programs/1171769-Wetter-ZIB/episodes/6557323-Wetter', + u'file': u'6566957.flv', + u'info_dict': { + u'title': u'Wetter', + u'description': u'Christa Kummer, Marcus Wadsak und Kollegen präsentieren abwechselnd ihre täglichen Wetterprognosen für Österreich.\r \r Mehr Wetter unter wetter.ORF.at', + }, + u'params': { + # It uses rtmp + u'skip_download': True, + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + playlist_id = mobj.group('id') + webpage = self._download_webpage(url, playlist_id) + + flash_xml = self._search_regex('ORF.flashXML = \'(.+?)\'', webpage, u'flash xml') + flash_xml = compat_urlparse.parse_qs('xml='+flash_xml)['xml'][0] + flash_config = xml.etree.ElementTree.fromstring(flash_xml.encode('utf-8')) + playlist_json = self._search_regex(r'playlist\': \'(\[.*?\])\'', webpage, u'playlist').replace(r'\"','"') + playlist = json.loads(playlist_json) + + videos = [] + ns = '{http://tempuri.org/XMLSchema.xsd}' + xpath = '%(ns)sPlaylist/%(ns)sItems/%(ns)sItem' % {'ns': ns} + webpage_description = self._og_search_description(webpage) + for (i, (item, info)) in enumerate(zip(flash_config.findall(xpath), playlist), 1): + # Get best quality url + rtmp_url = None + for q in ['Q6A', 'Q4A', 'Q1A']: + video_url = find_xpath_attr(item, '%sVideoUrl' % ns, 'quality', q) + if video_url is not None: + rtmp_url = video_url.text + break + if rtmp_url is None: + raise ExtractorError(u'Couldn\'t get video url: %s' % info['id']) + description = self._html_search_regex( + r'id="playlist_entry_%s".*?<p>(.*?)</p>' % i, webpage, + u'description', default=webpage_description, flags=re.DOTALL) + videos.append({ + '_type': 'video', + 'id': info['id'], + 'title': info['title'], + 'url': rtmp_url, + 'ext': 'flv', + 'description': description, + }) + + return videos diff --git a/youtube_dl/extractor/pbs.py b/youtube_dl/extractor/pbs.py new file mode 100644 index 0000000..65462d8 --- /dev/null +++ b/youtube_dl/extractor/pbs.py @@ -0,0 +1,34 @@ +import re +import json + +from .common import InfoExtractor + + +class PBSIE(InfoExtractor): + _VALID_URL = r'https?://video.pbs.org/video/(?P<id>\d+)/?' + + _TEST = { + u'url': u'http://video.pbs.org/video/2365006249/', + u'file': u'2365006249.mp4', + u'md5': 'ce1888486f0908d555a8093cac9a7362', + u'info_dict': { + u'title': u'A More Perfect Union', + u'description': u'md5:ba0c207295339c8d6eced00b7c363c6a', + u'duration': 3190, + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + info_url = 'http://video.pbs.org/videoInfo/%s?format=json' % video_id + info_page = self._download_webpage(info_url, video_id) + info =json.loads(info_page) + return {'id': video_id, + 'title': info['title'], + 'url': info['alternate_encoding']['url'], + 'ext': 'mp4', + 'description': info['program'].get('description'), + 'thumbnail': info.get('image_url'), + 'duration': info.get('duration'), + } diff --git a/youtube_dl/extractor/ro220.py b/youtube_dl/extractor/ro220.py new file mode 100644 index 0000000..c32f64d --- /dev/null +++ b/youtube_dl/extractor/ro220.py @@ -0,0 +1,42 @@ +import re + +from .common import InfoExtractor +from ..utils import ( + clean_html, + compat_parse_qs, +) + + +class Ro220IE(InfoExtractor): + IE_NAME = '220.ro' + _VALID_URL = r'(?x)(?:https?://)?(?:www\.)?220\.ro/(?P<category>[^/]+)/(?P<shorttitle>[^/]+)/(?P<video_id>[^/]+)' + _TEST = { + u"url": u"http://www.220.ro/sport/Luati-Le-Banii-Sez-4-Ep-1/LYV6doKo7f/", + u'file': u'LYV6doKo7f.mp4', + u'md5': u'03af18b73a07b4088753930db7a34add', + u'info_dict': { + u"title": u"Luati-le Banii sez 4 ep 1", + u"description": u"Iata-ne reveniti dupa o binemeritata vacanta. Va astept si pe Facebook cu pareri si comentarii.", + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('video_id') + + webpage = self._download_webpage(url, video_id) + flashVars_str = self._search_regex( + r'<param name="flashVars" value="([^"]+)"', + webpage, u'flashVars') + flashVars = compat_parse_qs(flashVars_str) + + info = { + '_type': 'video', + 'id': video_id, + 'ext': 'mp4', + 'url': flashVars['videoURL'][0], + 'title': flashVars['title'][0], + 'description': clean_html(flashVars['desc'][0]), + 'thumbnail': flashVars['preview'][0], + } + return info diff --git a/youtube_dl/extractor/rtlnow.py b/youtube_dl/extractor/rtlnow.py new file mode 100644 index 0000000..7bb236c --- /dev/null +++ b/youtube_dl/extractor/rtlnow.py @@ -0,0 +1,126 @@ +# encoding: utf-8 +import re + +from .common import InfoExtractor +from ..utils import ( + clean_html, + ExtractorError, +) + +class RTLnowIE(InfoExtractor): + """Information Extractor for RTL NOW, RTL2 NOW, SUPER RTL NOW and VOX NOW""" + _VALID_URL = r'(?:http://)?(?P<url>(?P<base_url>rtl-now\.rtl\.de/|rtl2now\.rtl2\.de/|(?:www\.)?voxnow\.de/|(?:www\.)?superrtlnow\.de/)[a-zA-Z0-9-]+/[a-zA-Z0-9-]+\.php\?(?:container_id|film_id)=(?P<video_id>[0-9]+)&player=1(?:&season=[0-9]+)?(?:&.*)?)' + _TESTS = [{ + u'url': u'http://rtl-now.rtl.de/ahornallee/folge-1.php?film_id=90419&player=1&season=1', + u'file': u'90419.flv', + u'info_dict': { + u'upload_date': u'20070416', + u'title': u'Ahornallee - Folge 1 - Der Einzug', + u'description': u'Folge 1 - Der Einzug', + }, + u'params': { + u'skip_download': True, + }, + u'skip': u'Only works from Germany', + }, + { + u'url': u'http://rtl2now.rtl2.de/aerger-im-revier/episode-15-teil-1.php?film_id=69756&player=1&season=2&index=5', + u'file': u'69756.flv', + u'info_dict': { + u'upload_date': u'20120519', + u'title': u'Ärger im Revier - Ein junger Ladendieb, ein handfester Streit...', + u'description': u'Ärger im Revier - Ein junger Ladendieb, ein handfester Streit u.a.', + u'thumbnail': u'http://autoimg.static-fra.de/rtl2now/219850/1500x1500/image2.jpg', + }, + u'params': { + u'skip_download': True, + }, + u'skip': u'Only works from Germany', + }, + { + u'url': u'www.voxnow.de/voxtours/suedafrika-reporter-ii.php?film_id=13883&player=1&season=17', + u'file': u'13883.flv', + u'info_dict': { + u'upload_date': u'20090627', + u'title': u'Voxtours - Südafrika-Reporter II', + u'description': u'Südafrika-Reporter II', + }, + u'params': { + u'skip_download': True, + }, + }, + { + u'url': u'http://superrtlnow.de/medicopter-117/angst.php?film_id=99205&player=1', + u'file': u'99205.flv', + u'info_dict': { + u'upload_date': u'20080928', + u'title': u'Medicopter 117 - Angst!', + u'description': u'Angst!', + u'thumbnail': u'http://autoimg.static-fra.de/superrtlnow/287529/1500x1500/image2.jpg' + }, + u'params': { + u'skip_download': True, + }, + }] + + def _real_extract(self,url): + mobj = re.match(self._VALID_URL, url) + + webpage_url = u'http://' + mobj.group('url') + video_page_url = u'http://' + mobj.group('base_url') + video_id = mobj.group(u'video_id') + + webpage = self._download_webpage(webpage_url, video_id) + + note_m = re.search(r'''(?sx) + <div[ ]style="margin-left:[ ]20px;[ ]font-size:[ ]13px;">(.*?) + <div[ ]id="playerteaser">''', webpage) + if note_m: + msg = clean_html(note_m.group(1)) + raise ExtractorError(msg) + + video_title = self._html_search_regex(r'<title>(?P<title>[^<]+)', + webpage, u'title') + playerdata_url = self._html_search_regex(r'\'playerdata\': \'(?P[^\']+)\'', + webpage, u'playerdata_url') + + playerdata = self._download_webpage(playerdata_url, video_id) + mobj = re.search(r'<!\[CDATA\[(?P<description>.+?)\s+- (?:Sendung )?vom (?P<upload_date_d>[0-9]{2})\.(?P<upload_date_m>[0-9]{2})\.(?:(?P<upload_date_Y>[0-9]{4})|(?P<upload_date_y>[0-9]{2})) [0-9]{2}:[0-9]{2} Uhr\]\]>', playerdata) + if mobj: + video_description = mobj.group(u'description') + if mobj.group('upload_date_Y'): + video_upload_date = mobj.group('upload_date_Y') + else: + video_upload_date = u'20' + mobj.group('upload_date_y') + video_upload_date += mobj.group('upload_date_m')+mobj.group('upload_date_d') + else: + video_description = None + video_upload_date = None + self._downloader.report_warning(u'Unable to extract description and upload date') + + # Thumbnail: not every video has an thumbnail + mobj = re.search(r'', webpage) + if mobj: + video_thumbnail = mobj.group(u'thumbnail') + else: + video_thumbnail = None + + mobj = re.search(r']+>rtmpe://(?:[^/]+/){2})(?P[^\]]+)\]\]>', playerdata) + if mobj is None: + raise ExtractorError(u'Unable to extract media URL') + video_url = mobj.group(u'url') + video_play_path = u'mp4:' + mobj.group(u'play_path') + video_player_url = video_page_url + u'includes/vodplayer.swf' + + return [{ + 'id': video_id, + 'url': video_url, + 'play_path': video_play_path, + 'page_url': video_page_url, + 'player_url': video_player_url, + 'ext': 'flv', + 'title': video_title, + 'description': video_description, + 'upload_date': video_upload_date, + 'thumbnail': video_thumbnail, + }] diff --git a/youtube_dl/extractor/slashdot.py b/youtube_dl/extractor/slashdot.py new file mode 100644 index 0000000..2cba530 --- /dev/null +++ b/youtube_dl/extractor/slashdot.py @@ -0,0 +1,23 @@ +import re + +from .common import InfoExtractor + + +class SlashdotIE(InfoExtractor): + _VALID_URL = r'https?://tv.slashdot.org/video/\?embed=(?P.*?)(&|$)' + + _TEST = { + u'url': u'http://tv.slashdot.org/video/?embed=JscHMzZDplD0p-yNLOzTfzC3Q3xzJaUz', + u'file': u'JscHMzZDplD0p-yNLOzTfzC3Q3xzJaUz.mp4', + u'md5': u'd2222e7a4a4c1541b3e0cf732fb26735', + u'info_dict': { + u'title': u' Meet the Stampede Supercomputing Cluster\'s Administrator', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + webpage = self._download_webpage(url, video_id) + ooyala_url = self._search_regex(r'

fY??VzY?|%eW#+%r;jIHf^M+G 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