2022-10-03 12:39:49 +00:00
const tabIDs = { } ;
const textDecoder = new TextDecoder ( ) ;
function requestToClipboard ( tabId ) {
const lic _headers = tabIDs [ tabId ] . license _request [ 0 ] ? . license _headers ;
const lic _url = tabIDs [ tabId ] . license _url ;
const lic _data _json = tabIDs [ tabId ] . license _data ;
const video _link = tabIDs [ tabId ] . video _metadata _url ;
if ( ! lic _headers )
return ;
// Fetching the user's ip for setting the header X-Forwarded-For.
// This might help to bypass regional restrictions when performing the license request in some cases.
const ip _retrieve _link = "https://ipinfo.io/ip" ;
var get _ip = new XMLHttpRequest ( ) ;
get _ip . open ( 'GET' , ip _retrieve _link , true ) ;
get _ip . onload = function ( ) {
var ip _resposnse = this . responseText ;
console . log ( ip _resposnse ) ;
var i = 0 ;
let curl _license _data = "curl " ;
curl _license _data += ` ' ${ lic _url } ' \\ ` ;
for ( ; i < lic _headers . length ; ++ i )
curl _license _data += ` \n -H ' ${ lic _headers [ i ] . name . toLowerCase ( ) } : ${ lic _headers [ i ] . value } ' \\ ` ;
curl _license _data += ` \n -H 'x-forwarded-for: ${ ip _resposnse } ' \\ ` ;
curl _license _data += "\n --data-raw " ;
if ( lic _data _json . includes ( "u0008" ) ) {
curl _license _data += ` ${ lic _data _json } \\ ` ;
} else {
curl _license _data += ` ' ${ lic _data _json } ' \\ ` ; /* It is not the same as above line. Note the additional ' symbol at the start and end! */
}
curl _license _data += "\n --compressed" ;
// Generating the curl license text link for https://t.me/drm_downloader_robot
const jio _gen _link = "https://drm-bot.herokuapp.com/jio.php" ;
var data = new FormData ( ) ;
data . append ( 'playlist' , curl _license _data ) ;
data . append ( 'api' , 'api' ) ;
var gen _link = new XMLHttpRequest ( ) ;
gen _link . open ( 'POST' , jio _gen _link , true ) ;
gen _link . onload = function ( ) {
var gen _link _resposnse = this . responseText ;
let json _resp = JSON . parse ( gen _link _resposnse ) ;
console . log ( json _resp ) ;
let generated _license _link = json _resp . data ;
const final = ` ${ video _link } * ${ generated _license _link } ` ;
console . log ( final ) ;
const copyText = document . createElement ( "textarea" ) ;
copyText . style . position = "absolute" ;
copyText . style . left = "-5454px" ;
copyText . style . top = "-5454px" ;
copyText . style . opacity = 0 ;
document . body . appendChild ( copyText ) ;
copyText . value = final ;
copyText . select ( ) ;
document . execCommand ( "copy" ) ;
document . body . removeChild ( copyText ) ;
chrome . browserAction . setBadgeBackgroundColor ( { color : "#FF0000" , tabId : tabId } ) ;
chrome . browserAction . setBadgeText ( { text : "📋" , tabId : tabId } ) ;
2022-10-03 12:48:04 +00:00
console . log ( "The jio link and the generated link of widevine license curl data has been copied to your clipboard successfully!\n\nNow go to https://t.me/drm_downloader_robot and paste it and send it to the bot.\n\nIf you need to play this video on the site please remember to disable this extension and reload the page." ) ;
2022-10-03 12:39:49 +00:00
tabIDs [ tabId ] . timeout _id = setTimeout ( ( ) => { chrome . browserAction . setBadgeText ( { text : "" , tabId : tabId } ) ; } , 20000 ) ;
}
gen _link . send ( data ) ;
}
get _ip . send ( ) ;
}
function getLicenseRequestData ( details ) {
tabIDs [ details . tabId ] = tabIDs [ details . tabId ] || { } ;
if ( details . url . includes ( "playbackrights" ) && details . method == "POST" ) {
console . log ( details . url ) ;
tabIDs [ details . tabId ] . video _metadata _url = details . url ;
} else if ( details . requestBody && details . requestBody . raw && details . method == "POST" ) {
for ( var j = 0 ; j < details . requestBody . raw . length ; ++ j ) {
try {
const decodedString = textDecoder . decode ( details . requestBody . raw [ j ] . bytes ) ;
const encodedString = btoa ( unescape ( encodeURIComponent ( decodedString ) ) ) ;
// If the license request does not uses json payloads the data has been sent in raw format.
// But the base64 encoded format of it will have the characters "CAES".
if ( encodedString . includes ( "CAES" ) ) {
tabIDs [ details . tabId ] = { license _data : ` $ ' \\ u0008 \\ u0004' ` , license _request : [ ] , license _url : details . url , req _id : details . requestId , video _metadata _url : tabIDs [ details . tabId ] . video _metadata _url ? ? "" } ;
// If the license request uses json payloads the charcters "CAES" will be there in almost all cases.
} else if ( decodedString . includes ( "CAES" ) || details . url . includes ( "license" ) && decodedString . includes ( "token" ) && decodedString . length > 4000 || decodedString . includes ( "8, 1, 18" ) ) {
tabIDs [ details . tabId ] = { license _data : decodedString , license _request : [ ] , license _url : details . url , req _id : details . requestId , video _metadata _url : tabIDs [ details . tabId ] . video _metadata _url ? ? "" } ;
} else {
return ;
}
} catch ( e ) {
console . error ( e ) ;
}
}
}
}
chrome . webRequest . onBeforeRequest . addListener (
getLicenseRequestData ,
{ urls : [ "https://prod.media.jio.com/apis/common/v3/playbackrights/*" , "https://prod.media.jio.com/proxy*" ] , types : [ "xmlhttprequest" ] } ,
[ "requestBody" ]
) ;
function getLicenseRequestHeaders ( details ) {
if ( details . method == "POST" && tabIDs [ details . tabId ] && tabIDs [ details . tabId ] . license _url === details . url && tabIDs [ details . tabId ] . req _id === details . requestId ) {
console . log ( details . url ) ;
tabIDs [ details . tabId ] . license _request . push ( { license _headers : details . requestHeaders } ) ;
console . log ( tabIDs )
requestToClipboard ( details . tabId ) ;
}
}
chrome . webRequest . onBeforeSendHeaders . addListener (
getLicenseRequestHeaders ,
{ urls : [ "https://prod.media.jio.com/proxy*" ] , types : [ "xmlhttprequest" ] } ,
[ "requestHeaders" ]
) ;