Hello community,

here is the log from the commit of package youtube-dl for openSUSE:Factory 
checked in at 2016-11-21 14:26:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/youtube-dl (Old)
 and      /work/SRC/openSUSE:Factory/.youtube-dl.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "youtube-dl"

Changes:
--------
--- /work/SRC/openSUSE:Factory/youtube-dl/youtube-dl.changes    2016-11-14 
20:17:09.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.youtube-dl.new/youtube-dl.changes       
2016-11-21 14:26:58.000000000 +0100
@@ -1,0 +2,6 @@
+Thu Nov 17 20:10:03 UTC 2016 - [email protected]
+
+- Update to new upstream release 2016.11.18
+* fix openload extraction
+
+-------------------------------------------------------------------

Old:
----
  youtube-dl-2016.11.14.1.tar.gz
  youtube-dl-2016.11.14.1.tar.gz.sig

New:
----
  youtube-dl-2016.11.18.tar.gz
  youtube-dl-2016.11.18.tar.gz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ youtube-dl.spec ++++++
--- /var/tmp/diff_new_pack.ZWu4Cc/_old  2016-11-21 14:26:59.000000000 +0100
+++ /var/tmp/diff_new_pack.ZWu4Cc/_new  2016-11-21 14:26:59.000000000 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           youtube-dl
-Version:        2016.11.14.1
+Version:        2016.11.18
 Release:        0
 Summary:        A tool for downloading from video sites for offline watching
 License:        SUSE-Public-Domain and CC-BY-SA-3.0

++++++ youtube-dl-2016.11.14.1.tar.gz -> youtube-dl-2016.11.18.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/ChangeLog new/youtube-dl/ChangeLog
--- old/youtube-dl/ChangeLog    2016-11-13 20:48:14.000000000 +0100
+++ new/youtube-dl/ChangeLog    2016-11-17 18:25:21.000000000 +0100
@@ -1,3 +1,11 @@
+version 2016.11.18
+
+Extractors
+* [youtube:live] Relax _VALID_URL (#11164)
+* [openload] Fix extraction (#10408, #11122)
+* [vlive] Prefer locale over language for subtitles id (#11203)
+
+
 version 2016.11.14.1
 
 Core
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/bash-completion.py 
new/youtube-dl/devscripts/bash-completion.py
--- old/youtube-dl/devscripts/bash-completion.py        2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/bash-completion.py        2016-11-13 
22:39:54.000000000 +0100
@@ -25,5 +25,6 @@
         filled_template = template.replace("{{flags}}", " ".join(opts_flag))
         f.write(filled_template)
 
+
 parser = youtube_dl.parseOpts()[0]
 build_completion(parser)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/create-github-release.py 
new/youtube-dl/devscripts/create-github-release.py
--- old/youtube-dl/devscripts/create-github-release.py  2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/create-github-release.py  2016-11-13 
22:39:54.000000000 +0100
@@ -2,11 +2,13 @@
 from __future__ import unicode_literals
 
 import base64
+import io
 import json
 import mimetypes
 import netrc
 import optparse
 import os
+import re
 import sys
 
 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@@ -90,16 +92,23 @@
 
 
 def main():
-    parser = optparse.OptionParser(usage='%prog VERSION BUILDPATH')
+    parser = optparse.OptionParser(usage='%prog CHANGELOG VERSION BUILDPATH')
     options, args = parser.parse_args()
-    if len(args) != 2:
+    if len(args) != 3:
         parser.error('Expected a version and a build directory')
 
-    version, build_path = args
+    changelog_file, version, build_path = args
+
+    with io.open(changelog_file, encoding='utf-8') as inf:
+        changelog = inf.read()
+
+    mobj = re.search(r'(?s)version %s\n{2}(.+?)\n{3}' % version, changelog)
+    body = mobj.group(1) if mobj else ''
 
     releaser = GitHubReleaser()
 
-    new_release = releaser.create_release(version, name='youtube-dl %s' % 
version)
+    new_release = releaser.create_release(
+        version, name='youtube-dl %s' % version, body=body)
     release_id = new_release['id']
 
     for asset in os.listdir(build_path):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/fish-completion.py 
new/youtube-dl/devscripts/fish-completion.py
--- old/youtube-dl/devscripts/fish-completion.py        2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/fish-completion.py        2016-11-13 
22:39:54.000000000 +0100
@@ -44,5 +44,6 @@
     with open(FISH_COMPLETION_FILE, 'w') as f:
         f.write(filled_template)
 
+
 parser = youtube_dl.parseOpts()[0]
 build_completion(parser)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/generate_aes_testdata.py 
new/youtube-dl/devscripts/generate_aes_testdata.py
--- old/youtube-dl/devscripts/generate_aes_testdata.py  2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/generate_aes_testdata.py  2016-11-13 
22:39:54.000000000 +0100
@@ -23,6 +23,7 @@
     out, _ = prog.communicate(secret_msg)
     return out
 
+
 iv = key = [0x20, 0x15] + 14 * [0]
 
 r = openssl_encode('aes-128-cbc', key, iv)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/gh-pages/update-sites.py 
new/youtube-dl/devscripts/gh-pages/update-sites.py
--- old/youtube-dl/devscripts/gh-pages/update-sites.py  2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/gh-pages/update-sites.py  2016-11-13 
22:39:54.000000000 +0100
@@ -32,5 +32,6 @@
     with open('supportedsites.html', 'w', encoding='utf-8') as sitesf:
         sitesf.write(template)
 
+
 if __name__ == '__main__':
     main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/make_contributing.py 
new/youtube-dl/devscripts/make_contributing.py
--- old/youtube-dl/devscripts/make_contributing.py      2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/make_contributing.py      2016-11-13 
22:39:54.000000000 +0100
@@ -28,5 +28,6 @@
     with io.open(outfile, 'w', encoding='utf-8') as outf:
         outf.write(out)
 
+
 if __name__ == '__main__':
     main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/make_lazy_extractors.py 
new/youtube-dl/devscripts/make_lazy_extractors.py
--- old/youtube-dl/devscripts/make_lazy_extractors.py   2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/make_lazy_extractors.py   2016-11-13 
22:39:54.000000000 +0100
@@ -59,6 +59,7 @@
         s += make_valid_template.format(valid_url=ie._make_valid_url())
     return s
 
+
 # find the correct sorting and add the required base classes so that sublcasses
 # can be correctly created
 classes = _ALL_CLASSES[:-1]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/make_supportedsites.py 
new/youtube-dl/devscripts/make_supportedsites.py
--- old/youtube-dl/devscripts/make_supportedsites.py    2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/make_supportedsites.py    2016-11-13 
22:39:54.000000000 +0100
@@ -41,5 +41,6 @@
     with io.open(outfile, 'w', encoding='utf-8') as outf:
         outf.write(out)
 
+
 if __name__ == '__main__':
     main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/prepare_manpage.py 
new/youtube-dl/devscripts/prepare_manpage.py
--- old/youtube-dl/devscripts/prepare_manpage.py        2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/devscripts/prepare_manpage.py        2016-11-13 
22:39:54.000000000 +0100
@@ -74,5 +74,6 @@
 
     return ret
 
+
 if __name__ == '__main__':
     main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/release.sh 
new/youtube-dl/devscripts/release.sh
--- old/youtube-dl/devscripts/release.sh        2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/devscripts/release.sh        2016-11-13 22:39:54.000000000 
+0100
@@ -110,7 +110,7 @@
 for f in $RELEASE_FILES; do gpg --passphrase-repeat 5 --detach-sig 
"build/$version/$f"; done
 
 ROOT=$(pwd)
-python devscripts/create-github-release.py $version "$ROOT/build/$version"
+python devscripts/create-github-release.py ChangeLog $version 
"$ROOT/build/$version"
 
 ssh [email protected] "sh html/update_latest.sh $version"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/devscripts/zsh-completion.py 
new/youtube-dl/devscripts/zsh-completion.py
--- old/youtube-dl/devscripts/zsh-completion.py 2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/devscripts/zsh-completion.py 2016-11-13 22:39:54.000000000 
+0100
@@ -44,5 +44,6 @@
     with open(ZSH_COMPLETION_FILE, "w") as f:
         f.write(template)
 
+
 parser = youtube_dl.parseOpts()[0]
 build_completion(parser)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_InfoExtractor.py 
new/youtube-dl/test/test_InfoExtractor.py
--- old/youtube-dl/test/test_InfoExtractor.py   2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/test/test_InfoExtractor.py   2016-11-13 22:39:54.000000000 
+0100
@@ -84,5 +84,6 @@
         self.assertRaises(ExtractorError, self.ie._download_json, uri, None)
         self.assertEqual(self.ie._download_json(uri, None, fatal=False), None)
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_aes.py 
new/youtube-dl/test/test_aes.py
--- old/youtube-dl/test/test_aes.py     2016-11-13 20:27:41.000000000 +0100
+++ new/youtube-dl/test/test_aes.py     2016-11-13 22:39:54.000000000 +0100
@@ -51,5 +51,6 @@
         decrypted = (aes_decrypt_text(encrypted, password, 32))
         self.assertEqual(decrypted, self.secret_msg)
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_download.py 
new/youtube-dl/test/test_download.py
--- old/youtube-dl/test/test_download.py        2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/test/test_download.py        2016-11-13 22:39:54.000000000 
+0100
@@ -60,6 +60,7 @@
     with open(fn, 'rb') as f:
         return hashlib.md5(f.read()).hexdigest()
 
+
 defs = gettestcases()
 
 
@@ -217,6 +218,7 @@
 
     return test_template
 
+
 # And add them to TestDownload
 for n, test_case in enumerate(defs):
     test_method = generator(test_case)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_execution.py 
new/youtube-dl/test/test_execution.py
--- old/youtube-dl/test/test_execution.py       2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/test/test_execution.py       2016-11-13 22:39:54.000000000 
+0100
@@ -39,5 +39,6 @@
         _, stderr = p.communicate()
         self.assertFalse(stderr)
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_http.py 
new/youtube-dl/test/test_http.py
--- old/youtube-dl/test/test_http.py    2016-11-13 20:27:41.000000000 +0100
+++ new/youtube-dl/test/test_http.py    2016-11-13 22:39:54.000000000 +0100
@@ -169,5 +169,6 @@
         # b'xn--fiq228c' is '中文'.encode('idna')
         self.assertEqual(response, 'normal: http://xn--fiq228c.tw/')
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_iqiyi_sdk_interpreter.py 
new/youtube-dl/test/test_iqiyi_sdk_interpreter.py
--- old/youtube-dl/test/test_iqiyi_sdk_interpreter.py   2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/test/test_iqiyi_sdk_interpreter.py   2016-11-13 
22:39:54.000000000 +0100
@@ -43,5 +43,6 @@
         ie._login()
         self.assertTrue('unable to log in:' in logger.messages[0])
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_jsinterp.py 
new/youtube-dl/test/test_jsinterp.py
--- old/youtube-dl/test/test_jsinterp.py        2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/test/test_jsinterp.py        2016-11-13 22:39:54.000000000 
+0100
@@ -104,6 +104,14 @@
         }''')
         self.assertEqual(jsi.call_function('x'), [20, 20, 30, 40, 50])
 
+    def test_call(self):
+        jsi = JSInterpreter('''
+        function x() { return 2; }
+        function y(a) { return x() + a; }
+        function z() { return y(3); }
+        ''')
+        self.assertEqual(jsi.call_function('z'), 5)
+
 
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_utils.py 
new/youtube-dl/test/test_utils.py
--- old/youtube-dl/test/test_utils.py   2016-11-13 20:27:41.000000000 +0100
+++ new/youtube-dl/test/test_utils.py   2016-11-13 22:39:54.000000000 +0100
@@ -1075,5 +1075,6 @@
         self.assertEqual(get_element_by_class('foo', html), 'nice')
         self.assertEqual(get_element_by_class('no-such-class', html), None)
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_verbose_output.py 
new/youtube-dl/test/test_verbose_output.py
--- old/youtube-dl/test/test_verbose_output.py  2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/test/test_verbose_output.py  2016-11-13 22:39:54.000000000 
+0100
@@ -66,5 +66,6 @@
         self.assertTrue(b'-p' in serr)
         self.assertTrue(b'secret' not in serr)
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_write_annotations.py 
new/youtube-dl/test/test_write_annotations.py
--- old/youtube-dl/test/test_write_annotations.py       2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/test/test_write_annotations.py       2016-11-13 
22:39:54.000000000 +0100
@@ -24,6 +24,7 @@
         super(YoutubeDL, self).__init__(*args, **kwargs)
         self.to_stderr = self.to_screen
 
+
 params = get_params({
     'writeannotations': True,
     'skip_download': True,
@@ -74,5 +75,6 @@
     def tearDown(self):
         try_rm(ANNOTATIONS_FILE)
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_youtube_lists.py 
new/youtube-dl/test/test_youtube_lists.py
--- old/youtube-dl/test/test_youtube_lists.py   2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/test/test_youtube_lists.py   2016-11-13 22:39:54.000000000 
+0100
@@ -66,5 +66,6 @@
         for entry in result['entries']:
             self.assertTrue(entry.get('title'))
 
+
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/test/test_youtube_signature.py 
new/youtube-dl/test/test_youtube_signature.py
--- old/youtube-dl/test/test_youtube_signature.py       2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/test/test_youtube_signature.py       2016-11-13 
22:39:54.000000000 +0100
@@ -114,6 +114,7 @@
     test_func.__name__ = str('test_signature_' + stype + '_' + test_id)
     setattr(TestSignature, test_func.__name__, test_func)
 
+
 for test_spec in _TESTS:
     make_tfunc(*test_spec)
 
Files old/youtube-dl/youtube-dl and new/youtube-dl/youtube-dl differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/__init__.py 
new/youtube-dl/youtube_dl/__init__.py
--- old/youtube-dl/youtube_dl/__init__.py       2016-11-13 20:27:41.000000000 
+0100
+++ new/youtube-dl/youtube_dl/__init__.py       2016-11-13 22:39:54.000000000 
+0100
@@ -95,8 +95,7 @@
                 write_string('[debug] Batch file urls: ' + repr(batch_urls) + 
'\n')
         except IOError:
             sys.exit('ERROR: batch file could not be read')
-    all_urls = batch_urls + args
-    all_urls = [url.strip() for url in all_urls]
+    all_urls = batch_urls + [url.strip() for url in args]  # batch_urls are 
already striped in read_batch_urls
     _enc = preferredencoding()
     all_urls = [url.decode(_enc, 'ignore') if isinstance(url, bytes) else url 
for url in all_urls]
 
@@ -450,4 +449,5 @@
     except KeyboardInterrupt:
         sys.exit('\nERROR: Interrupted by user')
 
+
 __all__ = ['main', 'YoutubeDL', 'gen_extractors', 'list_extractors']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/aes.py 
new/youtube-dl/youtube_dl/aes.py
--- old/youtube-dl/youtube_dl/aes.py    2016-11-13 20:27:41.000000000 +0100
+++ new/youtube-dl/youtube_dl/aes.py    2016-11-13 22:39:54.000000000 +0100
@@ -174,6 +174,7 @@
 
     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,
@@ -328,4 +329,5 @@
             break
     return data
 
+
 __all__ = ['aes_encrypt', 'key_expansion', 'aes_ctr_decrypt', 
'aes_cbc_decrypt', 'aes_decrypt_text']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/compat.py 
new/youtube-dl/youtube_dl/compat.py
--- old/youtube-dl/youtube_dl/compat.py 2016-11-13 20:27:41.000000000 +0100
+++ new/youtube-dl/youtube_dl/compat.py 2016-11-13 22:39:54.000000000 +0100
@@ -2491,6 +2491,7 @@
     def doctype(self, name, pubid, system):
         pass
 
+
 if sys.version_info[0] >= 3:
     def compat_etree_fromstring(text):
         return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
@@ -2787,6 +2788,7 @@
             return real_add_option(self, *bargs, **bkwargs)
         optparse.OptionGroup.add_option = _compat_add_option
 
+
 if hasattr(shutil, 'get_terminal_size'):  # Python >= 3.3
     compat_get_terminal_size = shutil.get_terminal_size
 else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/downloader/external.py 
new/youtube-dl/youtube_dl/downloader/external.py
--- old/youtube-dl/youtube_dl/downloader/external.py    2016-11-13 
20:27:41.000000000 +0100
+++ new/youtube-dl/youtube_dl/downloader/external.py    2016-11-13 
22:39:54.000000000 +0100
@@ -293,6 +293,7 @@
 class AVconvFD(FFmpegFD):
     pass
 
+
 _BY_NAME = dict(
     (klass.get_basename(), klass)
     for name, klass in globals().items()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/extractor/openload.py 
new/youtube-dl/youtube_dl/extractor/openload.py
--- old/youtube-dl/youtube_dl/extractor/openload.py     2016-11-13 
20:27:42.000000000 +0100
+++ new/youtube-dl/youtube_dl/extractor/openload.py     2016-11-13 
22:39:54.000000000 +0100
@@ -1,6 +1,8 @@
 # coding: utf-8
 from __future__ import unicode_literals, division
 
+import re
+
 from .common import InfoExtractor
 from ..compat import (
     compat_chr,
@@ -10,6 +12,10 @@
     determine_ext,
     ExtractorError,
 )
+from ..jsinterp import (
+    JSInterpreter,
+    _NAME_RE
+)
 
 
 class OpenloadIE(InfoExtractor):
@@ -56,6 +62,44 @@
         'only_matching': True,
     }]
 
+    def openload_decode(self, txt):
+        symbol_dict = {
+            '(゚Д゚) [゚Θ゚]': '_',
+            '(゚Д゚) [゚ω゚ノ]': 'a',
+            '(゚Д゚) [゚Θ゚ノ]': 'b',
+            '(゚Д゚) [\'c\']': 'c',
+            '(゚Д゚) [゚ー゚ノ]': 'd',
+            '(゚Д゚) [゚Д゚ノ]': 'e',
+            '(゚Д゚) [1]': 'f',
+            '(゚Д゚) [\'o\']': 'o',
+            '(o゚ー゚o)': 'u',
+            '(゚Д゚) [\'c\']': 'c',
+            '((゚ー゚) + (o^_^o))': '7',
+            '((o^_^o) +(o^_^o) +(c^_^o))': '6',
+            '((゚ー゚) + (゚Θ゚))': '5',
+            '(-~3)': '4',
+            '(-~-~1)': '3',
+            '(-~1)': '2',
+            '(-~0)': '1',
+            '((c^_^o)-(c^_^o))': '0',
+        }
+        delim = '(゚Д゚)[゚ε゚]+'
+        end_token = '(゚Д゚)[゚o゚]'
+        symbols = '|'.join(map(re.escape, symbol_dict.keys()))
+        txt = re.sub('(%s)\+\s?' % symbols, lambda m: symbol_dict[m.group(1)], 
txt)
+        ret = ''
+        for aacode in 
re.findall(r'{0}\+\s?{1}(.*?){0}'.format(re.escape(end_token), 
re.escape(delim)), txt):
+            for aachar in aacode.split(delim):
+                if aachar.isdigit():
+                    ret += compat_chr(int(aachar, 8))
+                else:
+                    m = re.match(r'^u([\da-f]{4})$', aachar)
+                    if m:
+                        ret += compat_chr(int(m.group(1), 16))
+                    else:
+                        self.report_warning("Cannot decode: %s" % aachar)
+        return ret
+
     def _real_extract(self, url):
         video_id = self._match_id(url)
         webpage = self._download_webpage('https://openload.co/embed/%s/' % 
video_id, video_id)
@@ -70,19 +114,26 @@
             
r'<span[^>]*>([^<]+)</span>\s*<span[^>]*>[^<]+</span>\s*<span[^>]+id="streamurl"',
             webpage, 'encrypted data')
 
-        magic = compat_ord(enc_data[-1])
+        enc_code = self._html_search_regex(r'<script[^>]+>(゚ω゚[^<]+)</script>',
+                                           webpage, 'encrypted code')
+
+        js_code = self.openload_decode(enc_code)
+        jsi = JSInterpreter(js_code)
+
+        m_offset_fun = self._search_regex(r'slice\(0\s*-\s*(%s)\(\)' % 
_NAME_RE, js_code, 'javascript offset function')
+        m_diff_fun = self._search_regex(r'charCodeAt\(0\)\s*\+\s*(%s)\(\)' % 
_NAME_RE, js_code, 'javascript diff function')
+
+        offset = jsi.call_function(m_offset_fun)
+        diff = jsi.call_function(m_diff_fun)
+
         video_url_chars = []
 
         for idx, c in enumerate(enc_data):
             j = compat_ord(c)
-            if j == magic:
-                j -= 1
-            elif j == magic - 1:
-                j += 1
             if j >= 33 and j <= 126:
                 j = ((j + 14) % 94) + 33
-            if idx == len(enc_data) - 1:
-                j += 3
+            if idx == len(enc_data) - offset:
+                j += diff
             video_url_chars += compat_chr(j)
 
         video_url = 'https://openload.co/stream/%s?mime=true' % 
''.join(video_url_chars)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/extractor/vlive.py 
new/youtube-dl/youtube_dl/extractor/vlive.py
--- old/youtube-dl/youtube_dl/extractor/vlive.py        2016-11-13 
20:27:42.000000000 +0100
+++ new/youtube-dl/youtube_dl/extractor/vlive.py        2016-11-13 
22:39:54.000000000 +0100
@@ -17,7 +17,7 @@
 class VLiveIE(InfoExtractor):
     IE_NAME = 'vlive'
     _VALID_URL = r'https?://(?:(?:www|m)\.)?vlive\.tv/video/(?P<id>[0-9]+)'
-    _TEST = {
+    _TESTS = [{
         'url': 'http://www.vlive.tv/video/1326',
         'md5': 'cc7314812855ce56de70a06a27314983',
         'info_dict': {
@@ -27,7 +27,20 @@
             'creator': "Girl's Day",
             'view_count': int,
         },
-    }
+    }, {
+        'url': 'http://www.vlive.tv/video/16937',
+        'info_dict': {
+            'id': '16937',
+            'ext': 'mp4',
+            'title': '[V LIVE] 첸백시 걍방',
+            'creator': 'EXO',
+            'view_count': int,
+            'subtitles': 'mincount:12',
+        },
+        'params': {
+            'skip_download': True,
+        },
+    }]
 
     def _real_extract(self, url):
         video_id = self._match_id(url)
@@ -116,7 +129,7 @@
 
         subtitles = {}
         for caption in playinfo.get('captions', {}).get('list', []):
-            lang = dict_get(caption, ('language', 'locale', 'country', 
'label'))
+            lang = dict_get(caption, ('locale', 'language', 'country', 
'label'))
             if lang and caption.get('source'):
                 subtitles[lang] = [{
                     'ext': 'vtt',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/extractor/youtube.py 
new/youtube-dl/youtube_dl/extractor/youtube.py
--- old/youtube-dl/youtube_dl/extractor/youtube.py      2016-11-13 
20:27:42.000000000 +0100
+++ new/youtube-dl/youtube_dl/extractor/youtube.py      2016-11-13 
22:39:54.000000000 +0100
@@ -2175,7 +2175,7 @@
 
 class YoutubeLiveIE(YoutubeBaseInfoExtractor):
     IE_DESC = 'YouTube.com live streams'
-    _VALID_URL = 
r'(?P<base_url>https?://(?:\w+\.)?youtube\.com/(?:user|channel|c)/(?P<id>[^/]+))/live'
+    _VALID_URL = 
r'(?P<base_url>https?://(?:\w+\.)?youtube\.com/(?:(?:user|channel|c)/)?(?P<id>[^/]+))/live'
     IE_NAME = 'youtube:live'
 
     _TESTS = [{
@@ -2204,6 +2204,9 @@
     }, {
         'url': 'https://www.youtube.com/c/CommanderVideoHq/live',
         'only_matching': True,
+    }, {
+        'url': 'https://www.youtube.com/TheYoungTurks/live',
+        'only_matching': True,
     }]
 
     def _real_extract(self, url):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/jsinterp.py 
new/youtube-dl/youtube_dl/jsinterp.py
--- old/youtube-dl/youtube_dl/jsinterp.py       2016-11-13 20:27:42.000000000 
+0100
+++ new/youtube-dl/youtube_dl/jsinterp.py       2016-11-13 22:39:54.000000000 
+0100
@@ -198,12 +198,12 @@
             return opfunc(x, y)
 
         m = re.match(
-            r'^(?P<func>%s)\((?P<args>[a-zA-Z0-9_$,]+)\)$' % _NAME_RE, expr)
+            r'^(?P<func>%s)\((?P<args>[a-zA-Z0-9_$,]*)\)$' % _NAME_RE, expr)
         if m:
             fname = m.group('func')
             argvals = tuple([
                 int(v) if v.isdigit() else local_vars[v]
-                for v in m.group('args').split(',')])
+                for v in m.group('args').split(',')]) if len(m.group('args')) 
> 0 else tuple()
             if fname not in self._functions:
                 self._functions[fname] = self.extract_function(fname)
             return self._functions[fname](argvals)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/socks.py 
new/youtube-dl/youtube_dl/socks.py
--- old/youtube-dl/youtube_dl/socks.py  2016-11-13 20:27:42.000000000 +0100
+++ new/youtube-dl/youtube_dl/socks.py  2016-11-13 22:39:54.000000000 +0100
@@ -103,6 +103,7 @@
     SOCKS4A = 1
     SOCKS5 = 2
 
+
 Proxy = collections.namedtuple('Proxy', (
     'type', 'host', 'port', 'username', 'password', 'remote_dns'))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/swfinterp.py 
new/youtube-dl/youtube_dl/swfinterp.py
--- old/youtube-dl/youtube_dl/swfinterp.py      2016-11-13 20:27:42.000000000 
+0100
+++ new/youtube-dl/youtube_dl/swfinterp.py      2016-11-13 22:39:54.000000000 
+0100
@@ -115,6 +115,8 @@
     res = _read_int(reader)
     assert res & 0xf0000000 == 0
     return res
+
+
 _u32 = _read_int
 
 
@@ -176,6 +178,7 @@
         return 'undefined'
     __repr__ = __str__
 
+
 undefined = _Undefined()
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/youtube-dl/youtube_dl/version.py 
new/youtube-dl/youtube_dl/version.py
--- old/youtube-dl/youtube_dl/version.py        2016-11-13 20:48:14.000000000 
+0100
+++ new/youtube-dl/youtube_dl/version.py        2016-11-17 18:25:21.000000000 
+0100
@@ -1,3 +1,3 @@
 from __future__ import unicode_literals
 
-__version__ = '2016.11.14.1'
+__version__ = '2016.11.18'


Reply via email to