]>
Commit | Line | Data |
---|---|---|
f5756f38 PH |
1 | #!/usr/bin/env python |
2 | ||
3 | # Generate youtube signature algorithm from test cases | |
4 | ||
5 | import sys | |
6 | ||
7 | tests = [ | |
2aea08ed | 8 | # 92 - vflQw-fB4 2013/07/17 |
ccf36547 EK |
9 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`~\"", |
10 | "mrtyuioplkjhgfdsazxcvbnq1234567890QWERTY}IOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]\"|:;"), | |
444b1165 JMF |
11 | # 90 |
12 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`", | |
13 | "mrtyuioplkjhgfdsazxcvbne1234567890QWER[YUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={`]}|"), | |
2b9213cd EK |
14 | # 89 |
15 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'", | |
16 | "/?;:|}<[{=+-_)(*&^%$#@!MqBVCXZASDFGHJKLPOIUYTREWQ0987654321mnbvcxzasdfghjklpoiuyt"), | |
3e223834 | 17 | # 88 - vflapUV9V 2013/08/28 |
f5756f38 | 18 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<", |
3e223834 | 19 | "ioplkjhgfdsazxcvbnm12<4567890QWERTYUIOZLKJHGFDSAeXCVBNM!@#$%^&*()_-+={[]}|:;?/>.3"), |
2b9213cd | 20 | # 87 |
f5756f38 | 21 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$^&*()_-+={[]}|:;?/>.<", |
bda2c49d | 22 | "uioplkjhgfdsazxcvbnm1t34567890QWE2TYUIOPLKJHGFDSAZXCVeNM!@#$^&*()_-+={[]}|:;?/>.<"), |
52e1eea1 | 23 | # 86 - vflg0g8PQ 2013/08/29 |
f5756f38 | 24 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[|};?/>.<", |
52e1eea1 | 25 | ">/?;}|[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWq0987654321mnbvcxzasdfghjklpoiuytr"), |
bda2c49d | 26 | # 85 |
f5756f38 | 27 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[};?/>.<", |
bda2c49d | 28 | ".>/?;}[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWQ0q876543r1mnbvcx9asdfghjklpoiuyt2"), |
23b00bc0 | 29 | # 84 - vflg0g8PQ 2013/08/29 (sporadic) |
f5756f38 | 30 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[};?>.<", |
23b00bc0 | 31 | ">?;}[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWq0987654321mnbvcxzasdfghjklpoiuytr"), |
bda2c49d | 32 | # 83 |
f5756f38 | 33 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!#$%^&*()_+={[};?/>.<", |
bda2c49d | 34 | ".>/?;}[{=+_)(*&^%<#!MNBVCXZASPFGHJKLwOIUYTREWQ0987654321mnbvcxzasdfghjklpoiuytreq"), |
066090dd | 35 | # 82 - vflZK4ZYR 2013/08/23 |
f5756f38 | 36 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>.<", |
3669cdba | 37 | "wertyuioplkjhgfdsaqxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&z(-+={[};?/>.<"), |
aedd6bb9 | 38 | # 81 - vflLC8JvQ 2013/07/25 |
606d7e67 | 39 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>.", |
aedd6bb9 | 40 | "C>/?;}[{=+-(*&^%$#@!MNBVYXZASDFGHKLPOIU.TREWQ0q87659321mnbvcxzasdfghjkl4oiuytrewp"), |
066090dd JMF |
41 | # 80 - vflZK4ZYR 2013/08/23 (sporadic) |
42 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>", | |
43 | "wertyuioplkjhgfdsaqxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&z(-+={[};?/>"), | |
5c468ca8 JMF |
44 | # 79 - vflLC8JvQ 2013/07/25 (sporadic) |
45 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/", | |
46 | "Z?;}[{=+-(*&^%$#@!MNBVCXRASDFGHKLPOIUYT/EWQ0q87659321mnbvcxzasdfghjkl4oiuytrewp"), | |
f5756f38 PH |
47 | ] |
48 | ||
75952c6e JMF |
49 | tests_age_gate = [ |
50 | # 86 - vflqinMWD | |
51 | ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[|};?/>.<", | |
52 | "ertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!/#$%^&*()_-+={[|};?@"), | |
53 | ] | |
54 | ||
f5756f38 PH |
55 | def find_matching(wrong, right): |
56 | idxs = [wrong.index(c) for c in right] | |
57 | return compress(idxs) | |
58 | return ('s[%d]' % i for i in idxs) | |
59 | ||
60 | def compress(idxs): | |
61 | def _genslice(start, end, step): | |
62 | starts = '' if start == 0 else str(start) | |
63 | ends = ':%d' % (end+step) | |
64 | steps = '' if step == 1 else (':%d' % step) | |
65 | return 's[%s%s%s]' % (starts, ends, steps) | |
66 | ||
67 | step = None | |
68 | for i, prev in zip(idxs[1:], idxs[:-1]): | |
69 | if step is not None: | |
70 | if i - prev == step: | |
71 | continue | |
72 | yield _genslice(start, prev, step) | |
73 | step = None | |
74 | continue | |
75 | if i - prev in [-1, 1]: | |
76 | step = i - prev | |
77 | start = prev | |
78 | continue | |
79 | else: | |
80 | yield 's[%d]' % prev | |
81 | if step is None: | |
82 | yield 's[%d]' % i | |
83 | else: | |
84 | yield _genslice(start, i, step) | |
85 | ||
86 | def _assert_compress(inp, exp): | |
87 | res = list(compress(inp)) | |
88 | if res != exp: | |
89 | print('Got %r, expected %r' % (res, exp)) | |
90 | assert res == exp | |
91 | _assert_compress([0,2,4,6], ['s[0]', 's[2]', 's[4]', 's[6]']) | |
92 | _assert_compress([0,1,2,4,6,7], ['s[:3]', 's[4]', 's[6:8]']) | |
93 | _assert_compress([8,0,1,2,4,7,6,9], ['s[8]', 's[:3]', 's[4]', 's[7:5:-1]', 's[9]']) | |
94 | ||
95 | def gen(wrong, right, indent): | |
96 | code = ' + '.join(find_matching(wrong, right)) | |
97 | return 'if len(s) == %d:\n%s return %s\n' % (len(wrong), indent, code) | |
98 | ||
99 | def genall(tests): | |
100 | indent = ' ' * 8 | |
101 | return indent + (indent + 'el').join(gen(wrong, right, indent) for wrong,right in tests) | |
102 | ||
103 | def main(): | |
104 | print(genall(tests)) | |
75952c6e JMF |
105 | print(u' Age gate:') |
106 | print(genall(tests_age_gate)) | |
f5756f38 PH |
107 | |
108 | if __name__ == '__main__': | |
109 | main() |