plugin.video.catchuptvandmore icon indicating copy to clipboard operation
plugin.video.catchuptvandmore copied to clipboard

Chinese Channels (CC-TV) not working

Open Madkat2 opened this issue 2 years ago • 19 comments

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):

Madkat2 avatar Jun 28 '22 13:06 Madkat2

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

joaopa00 avatar Jun 28 '22 19:06 joaopa00

That would be great, thanks a million, I'll keep an eye out for the next release and give it a shot

On Tue, 28 Jun 2022, 20:36 joaopa00, @.***> wrote:

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

— Reply to this email directly, view it on GitHub https://github.com/Catch-up-TV-and-More/plugin.video.catchuptvandmore/issues/902#issuecomment-1169150483, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZ2G5M4ANJGPV4X47JRRTBTVRNH2ZANCNFSM52CEQXXA . You are receiving this because you authored the thread.Message ID: <Catch-up-TV-and-More/plugin.video.catchuptvandmore/issues/902/1169150483@ github.com>

Madkat2 avatar Jun 28 '22 19:06 Madkat2

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

joaopa00 avatar Jun 29 '22 07:06 joaopa00

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

darodi avatar Jun 29 '22 11:06 darodi

That's good to hear, hopefully the other channels will be ok, thanks for having a look at it, much appreciated

On Wed, 29 Jun 2022, 12:21 darodi, @.***> wrote:

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

— Reply to this email directly, view it on GitHub https://github.com/Catch-up-TV-and-More/plugin.video.catchuptvandmore/issues/902#issuecomment-1169860306, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZ2G5M42LFSKQJMXVBKGWTTVRQWVDANCNFSM52CEQXXA . You are receiving this because you authored the thread.Message ID: <Catch-up-TV-and-More/plugin.video.catchuptvandmore/issues/902/1169860306@ github.com>

Madkat2 avatar Jun 29 '22 12:06 Madkat2

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 avatar Jun 29 '22 17:06 darodi

Duplicate of #900

darodi avatar Jun 29 '22 17:06 darodi

might be useful

https://stackoverflow.com/questions/10136319/executing-javascript-from-python https://github.com/jdollarKodi/script.module.js2py

darodi avatar Jun 29 '22 18:06 darodi

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.

joaopa00 avatar Jun 29 '22 19:06 joaopa00

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 avatar Jun 29 '22 19:06 darodi

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 avatar Jun 29 '22 23:06 darodi

aargh... the translated python still uses

from js2py.pyjs import *

darodi avatar Jun 29 '22 23:06 darodi

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.

joaopa00 avatar Jul 04 '22 08:07 joaopa00

@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);

darodi avatar Jul 04 '22 16:07 darodi

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

joaopa00 avatar Jul 04 '22 17:07 joaopa00

indeed :D

https://freeswitch.org/stash/users/pashat./repos/freeswitch/diff/html5/verto/video_demo-live_canvas/js/md5.min.js?sincePath=html5%2Fverto%2Fvideo_demo%2Fjs%2Fmd5.min.js&until=d1f89c4cf4632ac30c1c7bbace708ec57f943f94&at=d1f89c4cf46

darodi avatar Jul 04 '22 17:07 darodi

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 avatar Jul 05 '22 14:07 joaopa00

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

joaopa00 avatar Jul 07 '22 19:07 joaopa00

That's a pity, thanks for all your efforts, much appreciated. I'll keep an eye out for future updates, hopefully they might work at some point, thanks again

On Wed, 29 Jun 2022, 08:55 joaopa00, @.***> wrote:

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

— Reply to this email directly, view it on GitHub https://github.com/Catch-up-TV-and-More/plugin.video.catchuptvandmore/issues/902#issuecomment-1169653939, or unsubscribe https://github.com/notifications/unsubscribe-auth/AZ2G5M2EOXXAIONSCMGK5MTVRP6NJANCNFSM52CEQXXA . You are receiving this because you authored the thread.Message ID: <Catch-up-TV-and-More/plugin.video.catchuptvandmore/issues/902/1169653939@ github.com>

Madkat2 avatar Oct 11 '22 08:10 Madkat2