summaryrefslogtreecommitdiff
path: root/test/test_youtube_signature.py
blob: b5a4d0d5fb9f305a9ce47c3f7d35b5481196bb04 (plain)
    1 #!/usr/bin/env python
    2 
    3 from __future__ import unicode_literals
    4 
    5 # Allow direct execution
    6 import os
    7 import sys
    8 import unittest
    9 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
   10 
   11 import io
   12 import re
   13 import string
   14 
   15 from test.helper import FakeYDL
   16 from youtube_dl.extractor import YoutubeIE
   17 from youtube_dl.compat import compat_str, compat_urlretrieve
   18 
   19 _TESTS = [
   20     (
   21         'https://s.ytimg.com/yts/jsbin/html5player-vflHOr_nV.js',
   22         'js',
   23         86,
   24         '>=<;:/.-[+*)(\'&%$#"!ZYX0VUTSRQPONMLKJIHGFEDCBA\\yxwvutsrqponmlkjihgfedcba987654321',
   25     ),
   26     (
   27         'https://s.ytimg.com/yts/jsbin/html5player-vfldJ8xgI.js',
   28         'js',
   29         85,
   30         '3456789a0cdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS[UVWXYZ!"#$%&\'()*+,-./:;<=>?@',
   31     ),
   32     (
   33         'https://s.ytimg.com/yts/jsbin/html5player-vfle-mVwz.js',
   34         'js',
   35         90,
   36         ']\\[@?>=<;:/.-,+*)(\'&%$#"hZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjiagfedcb39876',
   37     ),
   38     (
   39         'https://s.ytimg.com/yts/jsbin/html5player-en_US-vfl0Cbn9e.js',
   40         'js',
   41         84,
   42         'O1I3456789abcde0ghijklmnopqrstuvwxyzABCDEFGHfJKLMN2PQRSTUVW@YZ!"#$%&\'()*+,-./:;<=',
   43     ),
   44     (
   45         'https://s.ytimg.com/yts/jsbin/html5player-en_US-vflXGBaUN.js',
   46         'js',
   47         '2ACFC7A61CA478CD21425E5A57EBD73DDC78E22A.2094302436B2D377D14A3BBA23022D023B8BC25AA',
   48         'A52CB8B320D22032ABB3A41D773D2B6342034902.A22E87CDD37DBE75A5E52412DC874AC16A7CFCA2',
   49     ),
   50     (
   51         'https://s.ytimg.com/yts/jsbin/html5player-en_US-vflBb0OQx.js',
   52         'js',
   53         84,
   54         '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ0STUVWXYZ!"#$%&\'()*+,@./:;<=>'
   55     ),
   56     (
   57         'https://s.ytimg.com/yts/jsbin/html5player-en_US-vfl9FYC6l.js',
   58         'js',
   59         83,
   60         '123456789abcdefghijklmnopqr0tuvwxyzABCDETGHIJKLMNOPQRS>UVWXYZ!"#$%&\'()*+,-./:;<=F'
   61     ),
   62     (
   63         'https://s.ytimg.com/yts/jsbin/html5player-en_US-vflCGk6yw/html5player.js',
   64         'js',
   65         '4646B5181C6C3020DF1D9C7FCFEA.AD80ABF70C39BD369CCCAE780AFBB98FA6B6CB42766249D9488C288',
   66         '82C8849D94266724DC6B6AF89BBFA087EACCD963.B93C07FBA084ACAEFCF7C9D1FD0203C6C1815B6B'
   67     ),
   68     (
   69         'https://s.ytimg.com/yts/jsbin/html5player-en_US-vflKjOTVq/html5player.js',
   70         'js',
   71         '312AA52209E3623129A412D56A40F11CB0AF14AE.3EE09501CB14E3BCDC3B2AE808BF3F1D14E7FBF12',
   72         '112AA5220913623229A412D56A40F11CB0AF14AE.3EE0950FCB14EEBCDC3B2AE808BF331D14E7FBF3',
   73     )
   74 ]
   75 
   76 
   77 class TestPlayerInfo(unittest.TestCase):
   78     def test_youtube_extract_player_info(self):
   79         PLAYER_URLS = (
   80             ('https://www.youtube.com/s/player/64dddad9/player_ias.vflset/en_US/base.js', '64dddad9'),
   81             # obsolete
   82             ('https://www.youtube.com/yts/jsbin/player_ias-vfle4-e03/en_US/base.js', 'vfle4-e03'),
   83             ('https://www.youtube.com/yts/jsbin/player_ias-vfl49f_g4/en_US/base.js', 'vfl49f_g4'),
   84             ('https://www.youtube.com/yts/jsbin/player_ias-vflCPQUIL/en_US/base.js', 'vflCPQUIL'),
   85             ('https://www.youtube.com/yts/jsbin/player-vflzQZbt7/en_US/base.js', 'vflzQZbt7'),
   86             ('https://www.youtube.com/yts/jsbin/player-en_US-vflaxXRn1/base.js', 'vflaxXRn1'),
   87             ('https://s.ytimg.com/yts/jsbin/html5player-en_US-vflXGBaUN.js', 'vflXGBaUN'),
   88             ('https://s.ytimg.com/yts/jsbin/html5player-en_US-vflKjOTVq/html5player.js', 'vflKjOTVq'),
   89         )
   90         for player_url, expected_player_id in PLAYER_URLS:
   91             player_id = YoutubeIE._extract_player_info(player_url)
   92             self.assertEqual(player_id, expected_player_id)
   93 
   94 
   95 class TestSignature(unittest.TestCase):
   96     def setUp(self):
   97         TEST_DIR = os.path.dirname(os.path.abspath(__file__))
   98         self.TESTDATA_DIR = os.path.join(TEST_DIR, 'testdata')
   99         if not os.path.exists(self.TESTDATA_DIR):
  100             os.mkdir(self.TESTDATA_DIR)
  101 
  102 
  103 def make_tfunc(url, stype, sig_input, expected_sig):
  104     m = re.match(r'.*-([a-zA-Z0-9_-]+)(?:/watch_as3|/html5player)?\.[a-z]+$', url)
  105     assert m, '%r should follow URL format' % url
  106     test_id = m.group(1)
  107 
  108     def test_func(self):
  109         basename = 'player-%s.%s' % (test_id, stype)
  110         fn = os.path.join(self.TESTDATA_DIR, basename)
  111 
  112         if not os.path.exists(fn):
  113             compat_urlretrieve(url, fn)
  114 
  115         ydl = FakeYDL()
  116         ie = YoutubeIE(ydl)
  117         if stype == 'js':
  118             with io.open(fn, encoding='utf-8') as testf:
  119                 jscode = testf.read()
  120             func = ie._parse_sig_js(jscode)
  121         else:
  122             assert stype == 'swf'
  123             with open(fn, 'rb') as testf:
  124                 swfcode = testf.read()
  125             func = ie._parse_sig_swf(swfcode)
  126         src_sig = (
  127             compat_str(string.printable[:sig_input])
  128             if isinstance(sig_input, int) else sig_input)
  129         got_sig = func(src_sig)
  130         self.assertEqual(got_sig, expected_sig)
  131 
  132     test_func.__name__ = str('test_signature_' + stype + '_' + test_id)
  133     setattr(TestSignature, test_func.__name__, test_func)
  134 
  135 
  136 for test_spec in _TESTS:
  137     make_tfunc(*test_spec)
  138 
  139 
  140 if __name__ == '__main__':
  141     unittest.main()

Generated by cgit