diff --git a/lib/NToken.js b/lib/NToken.js index bbc8807b..614b1aac 100644 --- a/lib/NToken.js +++ b/lib/NToken.js @@ -12,64 +12,72 @@ class NToken { transform(n) { let n_token = n.split(''); - let transformations = this.getTransformationData(this.raw_code); - - // Identifies the necessary transformation data and emulates them accordingly. - transformations = transformations.map((el) => { - if (el != null && typeof el != 'number') { - const is_reverse_base64 = el.includes('case 65:'); - if (el.includes('function(d){for(var')) { - el = (arr) => this.pushSplice(arr); - } else if (el.includes('d.push(e)')) { - el = (arr, item) => this.push(arr, item); - } else if (el.includes('d.reverse()')) { - el = (arr) => this.reverse(arr); - } else if (el.includes('d.length;d.splice(e,1)')) { - el = (arr, index) => this.spliceOnce(arr, index); - } else if (el.includes('d[0])[0])')) { - el = (arr, index) => this.spliceTwice(arr, index); - } else if (el.includes('reverse().forEach')) { - el = (arr, index) => this.spliceReverseUnshift(arr, index); - } else if (el.includes('f=d[0];d[0]')) { - el = (arr, index) => this.swapFirstItem(arr, index); - } else if (el.includes('unshift(d.pop())')) { - el = (arr, index) => this.unshiftPop(arr, index); - } else if (el.includes('switch')) { - el = (arr, e) => this.translateAB(arr, e, is_reverse_base64); - } else if (el === 'b') { - el = n_token; + + try { + let transformations = this.getTransformationData(this.raw_code); + + // Identifies the necessary transformation data and emulates them accordingly. + transformations = transformations.map((el) => { + if (el != null && typeof el != 'number') { + const is_reverse_base64 = el.includes('case 65:'); + if (el.includes('function(d){for(var')) { + el = (arr) => this.pushSplice(arr); + } else if (el.includes('d.push(e)')) { + el = (arr, item) => this.push(arr, item); + } else if (el.includes('d.reverse()')) { + el = (arr) => this.reverse(arr); + } else if (el.includes('d.length;d.splice(e,1)')) { + el = (arr, index) => this.spliceOnce(arr, index); + } else if (el.includes('d[0])[0])')) { + el = (arr, index) => this.spliceTwice(arr, index); + } else if (el.includes('reverse().forEach')) { + el = (arr, index) => this.spliceReverseUnshift(arr, index); + } else if (el.includes('f=d[0];d[0]')) { + el = (arr, index) => this.swapFirstItem(arr, index); + } else if (el.includes('unshift(d.pop())')) { + el = (arr, index) => this.unshiftPop(arr, index); + } else if (el.includes('switch')) { + el = (arr, e) => this.translateAB(arr, e, is_reverse_base64); + } else if (el === 'b') { + el = n_token; + } } - } - return el; - }); - - // Fills the null placeholders with a copy of the transformations array. - let null_placeholder_positions = [...this.raw_code.matchAll(this.null_placeholder_regex)].map((item) => parseInt(item[1])); - null_placeholder_positions.forEach((pos) => transformations[pos] = transformations); - - // Parses and emulates calls to functions of the transformations array. - let transformation_calls = [...Utils.getStringBetweenStrings(this.raw_code.replace(/\n/g, ''), 'try{', '}catch').matchAll(this.transformation_calls_regex)].map((params) => ({ index: params[1], params: params[2] })); - transformation_calls.forEach((data) => { - const index = data.index; - const param_index = data.params.split(',').map((param) => param.match(/c\[(.*?)\]/)[1]); - transformations[index](transformations[param_index[0]], transformations[param_index[1]]); - }); - + return el; + }); + + // Fills the null placeholders with a copy of the transformations array. + let null_placeholder_positions = [...this.raw_code.matchAll(this.null_placeholder_regex)].map((item) => parseInt(item[1])); + null_placeholder_positions.forEach((pos) => transformations[pos] = transformations); + + // Parses and emulates calls to functions of the transformations array. + let transformation_calls = [...Utils.getStringBetweenStrings(this.raw_code.replace(/\n/g, ''), 'try{', '}catch').matchAll(this.transformation_calls_regex)].map((params) => ({ index: params[1], params: params[2] })); + transformation_calls.forEach((data) => { + const index = data.index; + const param_index = data.params.split(',').map((param) => param.match(/c\[(.*?)\]/)[1]); + transformations[index](transformations[param_index[0]], transformations[param_index[1]]); + }); + } catch (err) { + return n; + } + return n_token.join(''); } getTransformationData() { - let transformation_data = `[${Utils.getStringBetweenStrings(this.raw_code, 'c=[', '];c')}]`; + // These variable names have always been the same since earlier player versions, so it should not be a problem for now. + let transformation_data = `[${Utils.getStringBetweenStrings(this.raw_code.replace(/\n/g, ''), 'c=[', '];c')}]`; transformation_data = transformation_data - .replace(/function\(d,e\)/g, '"function(d,e)') - .replace(/function\(d\)/g, '"function(d)') - .replace(/,b,/g, ',"b",') - .replace(/,b/g, ',"b"') - .replace(/b,/g, '"b",') - .replace(/b]/g, '"b"]') - .replace(/},/g, '}",') - .replace(/""/g, '') - .replace(/length]\)}"/g, 'length])}'); + .replace(/function\(d,e\)/g, '"function(d,e)') + .replace(/function\(d\)/g, '"function(d)') + .replace(/,b,/g, ',"b",') + .replace(/,b/g, ',"b"') + .replace(/b,/g, '"b",') + .replace(/b]/g, '"b"]') + .replace(/\[b/g, '["b"') + .replace(/}]/g, '"]') + .replace(/},/g, '}",') + .replace(/""/g, '') + .replace(/length]\)}"/g, 'length])}'); return JSON.parse(transformation_data); } diff --git a/package-lock.json b/package-lock.json index 3e5648bd..702348dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "youtubei.js", - "version": "1.2.2", + "version": "1.2.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "youtubei.js", - "version": "1.2.2", + "version": "1.2.3", "license": "MIT", "dependencies": { "axios": "^0.21.4", @@ -273,4 +273,4 @@ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index af757061..76dc6134 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "youtubei.js", - "version": "1.2.2", + "version": "1.2.3", "description": "An object-oriented library that allows you to search, get detailed info about videos, subscribe, unsubscribe, like, dislike, comment, download videos and much more!", "main": "index.js", "scripts": { @@ -43,4 +43,4 @@ "url": "https://github.com/LuanRT/YouTube.js/issues" }, "homepage": "https://github.com/LuanRT/YouTube.js#readme" -} +} \ No newline at end of file