Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chinese Channels (CC-TV) not working #902

Open
6 tasks
Madkat2 opened this issue Jun 28, 2022 · 19 comments
Open
6 tasks

Chinese Channels (CC-TV) not working #902

Madkat2 opened this issue Jun 28, 2022 · 19 comments

Comments

@Madkat2
Copy link

Madkat2 commented Jun 28, 2022

Describe the bug

None of the CC-TV channels are working

To Reproduce

Steps to reproduce the behaviour:
1.Open Any CCTV channels
2.error message
3.JSON decoder error
4.error log fails to upload

Expected behaviour

I expected them to work, they used to work on an older version

Actual behaviour

All channels not working

Screenshots

If applicable, add screenshots to help explain your problem:

Your environment

  • Android

  • iOS

  • Linux

  • OSX

  • Raspberry-Pi

  • [X ] Windows

  • Other

  • Operating system version/name:

  • Kodi version:Matrix latest

  • Catch-up TV & More version:latest stable and beta, tried both

  • Installation method:from repository

Additional context

I posted this the other day, I was told the channels are geoblocked, I have since found this is not the case, CC-TV 1-17 are available to watch via their website or app, I am not in China and had no problems watching

Debug log

If you can, please add your debug log information (Tutorial available here: https://kodi.wiki/view/Log_file/Easy):

@joaopa00
Copy link
Contributor

Should be fixed in the next beta, thanks to Darodi.

@Madkat2
Copy link
Author

Madkat2 commented Jun 28, 2022 via email

@joaopa00
Copy link
Contributor

Unfortunately, only CCV1 is fixed. Others channels do not offer no-drm stream.
So, more work is requested to make these channels working.

@darodi
Copy link
Contributor

darodi commented Jun 29, 2022

I must admit I've only tested CCV1 :P
I'll have a look.

@Madkat2
Copy link
Author

Madkat2 commented Jun 29, 2022 via email

@darodi
Copy link
Contributor

darodi commented Jun 29, 2022

Well... using the web, the drm is not easy...

the live stream url comes from

https://vdn.live.cntv.cn/api2/liveHtml5.do?channel=pc://cctv_p2p_hdcctv2&client=flash&tsp=xxxxxxxxx&vn=1537&vc=yyyyyyyyy&uid=&wlan=

where xxxxxxxxx and yyyyyyyyy come from
https://js.player.cntv.cn/creator/liveplayer.js

xxxxxxxxx= the value of
vdn_tsp =new Date().getTime().toString().slice(0,10);

yyyyyyyyy = the value of
vdn_vc = setH5Str((vdn_tsp+vdn_vnFlash+staticCheck_Flash+vdn_uid)).toLocaleUpperCase()

where setH5Str is a javascript function

!function(a){"use strict";function b(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}function c(a,b){return a<<b|a>>>32-b}function d(a,d,e,f,g,h){return b(c(b(b(d,a),b(f,h)),g),e)}function e(a,b,c,e,f,g,h){return d(b&c|~b&e,a,b,f,g,h)}function f(a,b,c,e,f,g,h){return d(b&e|c&~e,a,b,f,g,h)}function g(a,b,c,e,f,g,h){return d(b^c^e,a,b,f,g,h)}function h(a,b,c,e,f,g,h){return d(c^(b|~e),a,b,f,g,h)}function i(a,c){a[c>>5]|=128<<c%32,a[(c+64>>>9<<4)+14]=c;var d,i,j,k,l,m=1732584193,n=-271733879,o=-1732584194,p=271733878;for(d=0;d<a.length;d+=16)i=m,j=n,k=o,l=p,m=e(m,n,o,p,a[d],7,-680876936),p=e(p,m,n,o,a[d+1],12,-389564586),o=e(o,p,m,n,a[d+2],17,606105819),n=e(n,o,p,m,a[d+3],22,-1044525330),m=e(m,n,o,p,a[d+4],7,-176418897),p=e(p,m,n,o,a[d+5],12,1200080426),o=e(o,p,m,n,a[d+6],17,-1473231341),n=e(n,o,p,m,a[d+7],22,-45705983),m=e(m,n,o,p,a[d+8],7,1770035416),p=e(p,m,n,o,a[d+9],12,-1958414417),o=e(o,p,m,n,a[d+10],17,-42063),n=e(n,o,p,m,a[d+11],22,-1990404162),m=e(m,n,o,p,a[d+12],7,1804603682),p=e(p,m,n,o,a[d+13],12,-40341101),o=e(o,p,m,n,a[d+14],17,-1502002290),n=e(n,o,p,m,a[d+15],22,1236535329),m=f(m,n,o,p,a[d+1],5,-165796510),p=f(p,m,n,o,a[d+6],9,-1069501632),o=f(o,p,m,n,a[d+11],14,643717713),n=f(n,o,p,m,a[d],20,-373897302),m=f(m,n,o,p,a[d+5],5,-701558691),p=f(p,m,n,o,a[d+10],9,38016083),o=f(o,p,m,n,a[d+15],14,-660478335),n=f(n,o,p,m,a[d+4],20,-405537848),m=f(m,n,o,p,a[d+9],5,568446438),p=f(p,m,n,o,a[d+14],9,-1019803690),o=f(o,p,m,n,a[d+3],14,-187363961),n=f(n,o,p,m,a[d+8],20,1163531501),m=f(m,n,o,p,a[d+13],5,-1444681467),p=f(p,m,n,o,a[d+2],9,-51403784),o=f(o,p,m,n,a[d+7],14,1735328473),n=f(n,o,p,m,a[d+12],20,-1926607734),m=g(m,n,o,p,a[d+5],4,-378558),p=g(p,m,n,o,a[d+8],11,-2022574463),o=g(o,p,m,n,a[d+11],16,1839030562),n=g(n,o,p,m,a[d+14],23,-35309556),m=g(m,n,o,p,a[d+1],4,-1530992060),p=g(p,m,n,o,a[d+4],11,1272893353),o=g(o,p,m,n,a[d+7],16,-155497632),n=g(n,o,p,m,a[d+10],23,-1094730640),m=g(m,n,o,p,a[d+13],4,681279174),p=g(p,m,n,o,a[d],11,-358537222),o=g(o,p,m,n,a[d+3],16,-722521979),n=g(n,o,p,m,a[d+6],23,76029189),m=g(m,n,o,p,a[d+9],4,-640364487),p=g(p,m,n,o,a[d+12],11,-421815835),o=g(o,p,m,n,a[d+15],16,530742520),n=g(n,o,p,m,a[d+2],23,-995338651),m=h(m,n,o,p,a[d],6,-198630844),p=h(p,m,n,o,a[d+7],10,1126891415),o=h(o,p,m,n,a[d+14],15,-1416354905),n=h(n,o,p,m,a[d+5],21,-57434055),m=h(m,n,o,p,a[d+12],6,1700485571),p=h(p,m,n,o,a[d+3],10,-1894986606),o=h(o,p,m,n,a[d+10],15,-1051523),n=h(n,o,p,m,a[d+1],21,-2054922799),m=h(m,n,o,p,a[d+8],6,1873313359),p=h(p,m,n,o,a[d+15],10,-30611744),o=h(o,p,m,n,a[d+6],15,-1560198380),n=h(n,o,p,m,a[d+13],21,1309151649),m=h(m,n,o,p,a[d+4],6,-145523070),p=h(p,m,n,o,a[d+11],10,-1120210379),o=h(o,p,m,n,a[d+2],15,718787259),n=h(n,o,p,m,a[d+9],21,-343485551),m=b(m,i),n=b(n,j),o=b(o,k),p=b(p,l);return[m,n,o,p]}function j(a){var b,c="";for(b=0;b<32*a.length;b+=8)c+=String.fromCharCode(a[b>>5]>>>b%32&255);return c}function k(a){var b,c=[];for(c[(a.length>>2)-1]=void 0,b=0;b<c.length;b+=1)c[b]=0;for(b=0;b<8*a.length;b+=8)c[b>>5]|=(255&a.charCodeAt(b/8))<<b%32;return c}function l(a){return j(i(k(a),8*a.length))}function m(a,b){var c,d,e=k(a),f=[],g=[];for(f[15]=g[15]=void 0,e.length>16&&(e=i(e,8*a.length)),c=0;16>c;c+=1)f[c]=909522486^e[c],g[c]=1549556828^e[c];return d=i(f.concat(k(b)),512+8*b.length),j(i(g.concat(d),640))}function n(a){var b,c,d="0123456789abcdef",e="";for(c=0;c<a.length;c+=1)b=a.charCodeAt(c),e+=d.charAt(b>>>4&15)+d.charAt(15&b);return e}function o(a){return unescape(encodeURIComponent(a))}function p(a){return l(o(a))}function q(a){return n(p(a))}function r(a,b){return m(o(a),o(b))}function s(a,b){return n(r(a,b))}function t(a,b,c){return b?c?r(b,a):s(b,a):c?p(a):q(a)}"function"==typeof define&&define.amd?define(function(){return t}):a.setH5Str=t}(this);

Without those 2 parameters, the stream has audio but the image is scrambled.

We must find a way to execute javascript functions in python.


Another option would be to check the streaming app

https://app.cctv.com/special/download/ysyy/index.html

@darodi
Copy link
Contributor

darodi commented Jun 29, 2022

Duplicate of #900

@joaopa00
Copy link
Contributor

joaopa00 commented Jun 29, 2022

The best is to translate the javascript function in python and attach the code in a separate file. I am not enthousiast in shipping a new python module in CUTVM.
I think it would be a good idea to create in the resource/lib folder a new file gathering all the (future ?) drm functions.

@darodi
Copy link
Contributor

darodi commented Jun 29, 2022

In this case, yes, the function has a static code, it's not generated dynamically. We can translate it one time.
I hope we will not come across such a case in the future. (Dynamic function)

https://github.com/PiotrDabkowski/Js2Py#translating

@darodi
Copy link
Contributor

darodi commented Jun 29, 2022

I managed to translate the function :)

expected (breakpoint in the javascript in the browser): 50108D777F1114A9BFBBA24A07A006CE
eval result for js in js2py: 50108D777F1114A9BFBBA24A07A006CE
result with translated code in python: 50108D777F1114A9BFBBA24A07A006CE

I'll test all live feeds and commit tomorrow if everything is OK.

@darodi
Copy link
Contributor

darodi commented Jun 29, 2022

aargh... the translated python still uses

from js2py.pyjs import *

@joaopa00
Copy link
Contributor

joaopa00 commented Jul 4, 2022

It looks like the drm function is only md5sum function. Actually, if it is the case, it should not be hard to find a python already-made version.
md5sum function

EDIT: It seems that Kodi supports the hashlib library. So, job is done already.

@darodi
Copy link
Contributor

darodi commented Jul 4, 2022

@joaopa00

the beautified code is here.
How did you find it is a md5sum?


! function(a) {
    "use strict";

    function b(a, b) {
        var c = (65535 & a) + (65535 & b),
            d = (a >> 16) + (b >> 16) + (c >> 16);
        return d << 16 | 65535 & c
    }

    function c(a, b) {
        return a << b | a >>> 32 - b
    }

    function d(a, d, e, f, g, h) {
        return b(c(b(b(d, a), b(f, h)), g), e)
    }

    function e(a, b, c, e, f, g, h) {
        return d(b & c | ~b & e, a, b, f, g, h)
    }

    function f(a, b, c, e, f, g, h) {
        return d(b & e | c & ~e, a, b, f, g, h)
    }

    function g(a, b, c, e, f, g, h) {
        return d(b ^ c ^ e, a, b, f, g, h)
    }

    function h(a, b, c, e, f, g, h) {
        return d(c ^ (b | ~e), a, b, f, g, h)
    }

    function i(a, c) {
        a[c >> 5] |= 128 << c % 32, a[(c + 64 >>> 9 << 4) + 14] = c;
        var d, i, j, k, l, m = 1732584193,
            n = -271733879,
            o = -1732584194,
            p = 271733878;
        for (d = 0; d < a.length; d += 16) i = m, j = n, k = o, l = p, m = e(m, n, o, p, a[d], 7, -680876936), p = e(p, m, n, o, a[d + 1], 12, -389564586), o = e(o, p, m, n, a[d + 2], 17, 606105819), n = e(n, o, p, m, a[d + 3], 22, -1044525330), m = e(m, n, o, p, a[d + 4], 7, -176418897), p = e(p, m, n, o, a[d + 5], 12, 1200080426), o = e(o, p, m, n, a[d + 6], 17, -1473231341), n = e(n, o, p, m, a[d + 7], 22, -45705983), m = e(m, n, o, p, a[d + 8], 7, 1770035416), p = e(p, m, n, o, a[d + 9], 12, -1958414417), o = e(o, p, m, n, a[d + 10], 17, -42063), n = e(n, o, p, m, a[d + 11], 22, -1990404162), m = e(m, n, o, p, a[d + 12], 7, 1804603682), p = e(p, m, n, o, a[d + 13], 12, -40341101), o = e(o, p, m, n, a[d + 14], 17, -1502002290), n = e(n, o, p, m, a[d + 15], 22, 1236535329), m = f(m, n, o, p, a[d + 1], 5, -165796510), p = f(p, m, n, o, a[d + 6], 9, -1069501632), o = f(o, p, m, n, a[d + 11], 14, 643717713), n = f(n, o, p, m, a[d], 20, -373897302), m = f(m, n, o, p, a[d + 5], 5, -701558691), p = f(p, m, n, o, a[d + 10], 9, 38016083), o = f(o, p, m, n, a[d + 15], 14, -660478335), n = f(n, o, p, m, a[d + 4], 20, -405537848), m = f(m, n, o, p, a[d + 9], 5, 568446438), p = f(p, m, n, o, a[d + 14], 9, -1019803690), o = f(o, p, m, n, a[d + 3], 14, -187363961), n = f(n, o, p, m, a[d + 8], 20, 1163531501), m = f(m, n, o, p, a[d + 13], 5, -1444681467), p = f(p, m, n, o, a[d + 2], 9, -51403784), o = f(o, p, m, n, a[d + 7], 14, 1735328473), n = f(n, o, p, m, a[d + 12], 20, -1926607734), m = g(m, n, o, p, a[d + 5], 4, -378558), p = g(p, m, n, o, a[d + 8], 11, -2022574463), o = g(o, p, m, n, a[d + 11], 16, 1839030562), n = g(n, o, p, m, a[d + 14], 23, -35309556), m = g(m, n, o, p, a[d + 1], 4, -1530992060), p = g(p, m, n, o, a[d + 4], 11, 1272893353), o = g(o, p, m, n, a[d + 7], 16, -155497632), n = g(n, o, p, m, a[d + 10], 23, -1094730640), m = g(m, n, o, p, a[d + 13], 4, 681279174), p = g(p, m, n, o, a[d], 11, -358537222), o = g(o, p, m, n, a[d + 3], 16, -722521979), n = g(n, o, p, m, a[d + 6], 23, 76029189), m = g(m, n, o, p, a[d + 9], 4, -640364487), p = g(p, m, n, o, a[d + 12], 11, -421815835), o = g(o, p, m, n, a[d + 15], 16, 530742520), n = g(n, o, p, m, a[d + 2], 23, -995338651), m = h(m, n, o, p, a[d], 6, -198630844), p = h(p, m, n, o, a[d + 7], 10, 1126891415), o = h(o, p, m, n, a[d + 14], 15, -1416354905), n = h(n, o, p, m, a[d + 5], 21, -57434055), m = h(m, n, o, p, a[d + 12], 6, 1700485571), p = h(p, m, n, o, a[d + 3], 10, -1894986606), o = h(o, p, m, n, a[d + 10], 15, -1051523), n = h(n, o, p, m, a[d + 1], 21, -2054922799), m = h(m, n, o, p, a[d + 8], 6, 1873313359), p = h(p, m, n, o, a[d + 15], 10, -30611744), o = h(o, p, m, n, a[d + 6], 15, -1560198380), n = h(n, o, p, m, a[d + 13], 21, 1309151649), m = h(m, n, o, p, a[d + 4], 6, -145523070), p = h(p, m, n, o, a[d + 11], 10, -1120210379), o = h(o, p, m, n, a[d + 2], 15, 718787259), n = h(n, o, p, m, a[d + 9], 21, -343485551), m = b(m, i), n = b(n, j), o = b(o, k), p = b(p, l);
        return [m, n, o, p]
    }

    function j(a) {
        var b, c = "";
        for (b = 0; b < 32 * a.length; b += 8) c += String.fromCharCode(a[b >> 5] >>> b % 32 & 255);
        return c
    }

    function k(a) {
        var b, c = [];
        for (c[(a.length >> 2) - 1] = void 0, b = 0; b < c.length; b += 1) c[b] = 0;
        for (b = 0; b < 8 * a.length; b += 8) c[b >> 5] |= (255 & a.charCodeAt(b / 8)) << b % 32;
        return c
    }

    function l(a) {
        return j(i(k(a), 8 * a.length))
    }

    function m(a, b) {
        var c, d, e = k(a),
            f = [],
            g = [];
        for (f[15] = g[15] = void 0, e.length > 16 && (e = i(e, 8 * a.length)), c = 0; 16 > c; c += 1) f[c] = 909522486 ^ e[c], g[c] = 1549556828 ^ e[c];
        return d = i(f.concat(k(b)), 512 + 8 * b.length), j(i(g.concat(d), 640))
    }

    function n(a) {
        var b, c, d = "0123456789abcdef",
            e = "";
        for (c = 0; c < a.length; c += 1) b = a.charCodeAt(c), e += d.charAt(b >>> 4 & 15) + d.charAt(15 & b);
        return e
    }

    function o(a) {
        return unescape(encodeURIComponent(a))
    }

    function p(a) {
        return l(o(a))
    }

    function q(a) {
        return n(p(a))
    }

    function r(a, b) {
        return m(o(a), o(b))
    }

    function s(a, b) {
        return n(r(a, b))
    }

    function t(a, b, c) {
        return b ? c ? r(b, a) : s(b, a) : c ? p(a) : q(a)
    }
    "function" == typeof define && define.amd ? define(function() {
        return t
    }) : a.setH5Str = t
}(this);

@joaopa00
Copy link
Contributor

joaopa00 commented Jul 4, 2022

I only googled "var c=(65535&a)+(65535&b)" :D

@joaopa00
Copy link
Contributor

joaopa00 commented Jul 5, 2022

La fonction md5 de hashlib donne le même résultat que la fonction utilisée par cctv. J'ai vérifié.
Mais ce n'est pas suffisant. Soit un vdn_uid valide est nécessaire, soit il y a quelque chose qui m'échappe.
tsp = str(int(time.time() * 1000))[0:10] #tsp = '1657014984' print("tsp = %s" % tsp) keys, vdn_uid_hash = Fingerprint2.Fingerprint2().generateFingerprint() vdn_uid = str(vdn_uid_hash).upper() print('vdn_uid = %s' % vdn_uid) seed= tsp + '1537' + 'B4B51E8523157ED8D17ADB76041BCD09' + vdn_uid print(seed) vc1= hashlib.md5(seed.encode()).hexdigest() print("vc1= %s" % vc1) vc = str(vc1).upper() print("vc = %s" % vc) live_id = 'cctv_p2p_hd%s' % item_id resp = requests.get( URL_LIVE + '?channel=pc://%s&client=flash&tsp=%s&vn=%s&uid=%s&wlan=' % (live_id, tsp, vc, vdn_uid), headers={ "User-Agent": web_utils.get_random_ua(), 'Cache-Control': 'max-age=-1, public' })

@joaopa00
Copy link
Contributor

joaopa00 commented Jul 7, 2022

Ben c'est pas gagné!!
il n'y a pas que nous que ca embète

@Madkat2
Copy link
Author

Madkat2 commented Oct 11, 2022 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants