x Downloader

download bad videos

  1. // ==UserScript==
  2. // @name x Downloader
  3. // @version 7.4
  4. // @description download bad videos
  5. // @author https://t.me/cyru55
  6. // @namespace cyru55_x
  7. // @match https://*.pornhub.com/*
  8. // @match https://xhamster.com/*
  9. // @match https://spankbang.com/*
  10. // @match https://*.tnaflix.com/*
  11. // @run-at document-end
  12. // @unwrap x
  13. // @sandbox raw
  14. // @grant unsafeWindow
  15. // @grant GM_xmlhttpRequest
  16. // @grant GM_xmlHttpRequest
  17. // @grant GM.xmlHttpRequest
  18. // @grant GM_setClipboard
  19. // @license WTFPL
  20. // @connect pornhub.com
  21. // @connect pornhub.org
  22. // @connect phncdn.com
  23. // ==/UserScript==
  24.  
  25. ( (N5,Win)=>{
  26.  
  27. const Cy = {
  28. is: (H=>{ let P,L;return P=H.split("."),L=P.length-1,P[L].length<3?H:P.slice(-(L<2?2:L)).join("."); })(Win.location.host)??"",
  29. el:{
  30. id: str => document.getElementById(str),
  31. cls: str => document.getElementsByClassName(str),
  32. q: str => document.querySelectorAll(str),
  33. q1: str => document.querySelector(str),
  34. del: el => {
  35. if(typeof(el)=="string") el=Cy.el.id(el);
  36. try{if(el) el.parentNode.removeChild(el);}catch{}
  37. },
  38. }
  39. };
  40.  
  41. Cy[N5] = {
  42. log: str=>{console.log("%c"+N5,"background-color:#930;color:#fff;",str);},
  43. name_gen: str=>{
  44. if(typeof(str)!="string"||str.length<1) return "";
  45. let title = str
  46. .replace(/'s/ig,"")
  47. .replace(/[^\w\s\-\+\.,]/g,"")
  48. .replace(/([\-\+\.,]){2,}/g,"$1")
  49. .replace(/\s+/g," ")
  50. .replace(/^[\-\+\.\s_,]+/,"")
  51. .replace(/[\-\+\.\s_,]+$/,"")
  52. .replace(/\W*S\d+E\d+\W*/,"");
  53. return title.substr(0,232);
  54. },
  55. fetch: (url,cb,obj)=>{
  56. if(typeof(GM_xmlhttpRequest)!="undefined"){
  57. Cy[N5].log("--------------- fetch: GM_xmlhttpRequest");
  58. GM_xmlhttpRequest({
  59. method:"GET",
  60. url:url,
  61. onabort:()=>{ alert("GM_xmlhttpRequest>onabort"); },
  62. onerror:()=>{ alert("GM_xmlhttpRequest>onerror"); },
  63. ontimeout:()=>{ alert("GM_xmlhttpRequest>ontimeout"); },
  64. onload:function(r){
  65. let txt=r.responseText;
  66. Cy[N5].log(">fetch "+txt);
  67. cb(txt,obj);
  68. }
  69. });
  70. }else if(typeof(GM)!="undefined" && typeof(GM.xmlHttpRequest)!="undefined"){
  71. Cy[N5].log("--------------- fetch: GM.xmlHttpRequest");
  72. GM.xmlHttpRequest({
  73. method:"GET",
  74. url:url,
  75. onabort:()=>{ alert("GM.xmlHttpRequest>onabort"); },
  76. onerror:()=>{ alert("GM.xmlHttpRequest>onerror"); },
  77. ontimeout:()=>{ alert("GM.xmlHttpRequest>ontimeout"); }
  78. })
  79. .then( res=>{
  80. let txt=res.responseText;
  81. Cy[N5].log(">fetch "+txt);
  82. cb(txt,obj);
  83. })
  84. .catch( err=>{
  85. alert("Error while GM.xmlHttpRequest\n\n"+err);
  86. });
  87. }else{
  88. Cy[N5].log("--------------- fetch: fetch");
  89. fetch(url,{mode:"cors"})
  90. .then( res=>{
  91. if(res.ok)
  92. return res.text();
  93. throw("server returns non2xx");
  94. })
  95. .then( txt=>{
  96. Cy[N5].log(">fetch "+txt);
  97. cb(txt,obj);
  98. })
  99. .catch( err=>{
  100. alert("Error while api request\n\n"+err);
  101. });
  102. }
  103. },
  104. ph_block_adblock_blockers: ()=>{
  105. if(typeof(page_params)!="undefined")
  106. page_params.isAdBlockEnable=false;
  107. if(typeof(setCookieAdvanced)=="function")
  108. setCookieAdvanced("adBlockAlertHidden",1,1,"/","pornhub.com");
  109. Cy.el.del("abAlert");
  110. if(typeof(MG_Utils)!="undefined"){
  111. let header=Cy.el.id("header");
  112. if(header)
  113. MG_Utils.removeClass(header,"hasAdAlert");
  114. }
  115. },
  116. ph_rm_age_nag: ()=>{
  117. Cy.el.del("ageDisclaimerMainBG");
  118. Cy.el.del("ageDisclaimerOverlay");
  119. Cy.el.del("js-ageDisclaimerModal");
  120. Cy.el.del("modalWrapMTubes");
  121. if(typeof(setCookieAdvanced)=="function")
  122. setCookieAdvanced("accessAgeDisclaimerPH",1,1,"/","pornhub.com");
  123. },
  124. ph_change_params: ()=>{
  125. for(let i=32;i;){
  126. setTimeout( ()=>{
  127. if(typeof(essentialCookiesListAll)!="undefined"){
  128. essentialCookiesListAll["pornhub.com"]["CookieConsent"]=3;
  129. essentialCookiesListAll["pornhub.com"]["cookieConsent"]=3;
  130. essentialCookiesListAll["pornhub.com"]["accessAgeDisclaimerPH"]=1;
  131. essentialCookiesListAll["pornhub.com"]["accessAgeDisclaimerUK"]=1;
  132. essentialCookiesListAll["pornhub.com"]["accessPH"]=1;
  133. essentialCookiesListAll["pornhub.com"]["adBlockAlertHidden"]=1;
  134. essentialCookiesListAll["pornhub.com"]["age_verified"]=1;
  135. essentialCookiesListAll["pornhub.com"]["cookieBannerEU"]=1;
  136. essentialCookiesListAll["pornhub.com"]["cookieBannerState"]=1;
  137. essentialCookiesListAll["pornhub.com"]["cookiesBanner"]=1;
  138. essentialCookiesListAll["pornhub.com"]["cookiesBannerSeen"]=1;
  139. essentialCookiesListAll["pornhub.com"]["autoplay"]=0;
  140. }
  141. },500*--i);
  142. }
  143. },
  144. ph_to_list: (obj,src)=>{
  145. let out="";
  146. if(src.length){
  147. let title = Cy[N5].name_gen(obj.video_title);
  148. out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>';
  149. if(Win.location.href.indexOf("embed/")!=-1){
  150. out+='<div><a target="_blank" href="'+Win.location.href.replace("embed/","view_video.php?viewkey=")+'">🟡 High Resolution in New Tab</a></div><br>';
  151. }
  152. let vhex = Win.location.href.substr(Win.location.href.indexOf("=")+1);
  153. for(let i in src){
  154. if(src[i].format=="mp4"){
  155. out+='<div>'+
  156. '<a target="dl" download="'+title+(vhex.length>3?" ,PH"+vhex:"")+'.mp4" href="'+src[i].videoUrl+'">⬇️ '+src[i].quality+'</a>'+
  157. '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[i].videoUrl+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[i].videoUrl+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+
  158. '</div>';
  159. }
  160. }
  161. if(vhex.length>3){
  162. out+='<br><input type="text" value="PH_'+vhex+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  163. out+='<br><input type="text" value="'+title+(vhex.length>3?" ,PH"+vhex:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  164. }
  165. }
  166. return out;
  167. },
  168. xh_to_list: (obj,src)=>{
  169. let out="";
  170. let title = Cy[N5].name_gen(obj?.videoTitle?.pageTitle??"");
  171. out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>';
  172. let vid = Win.location.href.slice(Win.location.href.lastIndexOf("-")+1);
  173. for(let k in src){
  174. let web = obj?.xhlMlSource?.payload?.site?? obj?.collectorData?.site;
  175. if(web=="mobile"){
  176. let link = src[k]?.label?? src[k]?.quality?? "Click";
  177. if(link!="auto"){
  178. out+='<div>'+
  179. '<a target="dl" style="color:#ff0" download="'+title+(vid.length>3?" ,XH"+vid:"")+'.mp4" href="'+src[k].url+'">⬇️ '+link+'</a>'+
  180. '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[k].url+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[k].url+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+
  181. '</div>';
  182. }
  183. }else{// desktop
  184. out+='<div>'+
  185. '<a target="dl" style="color:#ff0" download="'+title+(vid.length>3?" ,XH"+vid:"")+'.mp4" href="'+src[k]+'">⬇️ '+k+'</a>'+
  186. '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[k]+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[k]+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+
  187. '</div>';
  188. }
  189. }
  190. if(vid.length>3){
  191. out+='<br><input type="text" value="XH_'+vid+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  192. out+='<br><input type="text" value="'+title+(vid.length>3?" ,XH"+vid:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  193. }
  194. return out;
  195. },
  196. sb_to_list: (name,src)=>{
  197. let out="";
  198. let title = Cy[N5].name_gen(name);
  199. out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>';
  200. let vid = Win.location.pathname.split("/")[1];
  201. for(let k in src){
  202. if(
  203. ["240p","320p","480p","720p","1080p","4k"].includes(k)&&
  204. src[k].length
  205. ){
  206. out+='<div>'+
  207. '<a target="dl" style="color:#ff0" download="'+title+(vid.length?" ,SB"+vid:"")+'.mp4" href="'+src[k][0]+'">⬇️ '+k+'</a>'+
  208. '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[k][0]+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[k][0]+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+
  209. '</div>';
  210. }
  211. }
  212. if(vid.length>3){
  213. out+='<br><input type="text" value="SB_'+vid+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  214. out+='<br><input type="text" value="'+title+(vid.length>3?" ,SB"+vid:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  215. }
  216. return out;
  217. },
  218. tn_to_list: (obj)=>{
  219. let out="";
  220. let title = Cy[N5].name_gen(obj?.name);
  221. out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>';
  222. for(let link of obj.vids){
  223. let pos=link.lastIndexOf(".");let resolution=link.substring(pos-5,pos).replace("-","");
  224. out+='<div>'+
  225. '<a target="dl" style="color:#ff0" download="'+title+(obj?.vid.length?" ,TN"+obj?.vid:"")+'.mp4" href="'+link+'">⬇️ '+resolution+'</a>'+
  226. '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+link+'\',\'text\');else try{navigator.clipboard.writeText(\''+link+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+
  227. '</div>';
  228. }
  229. if(obj?.vid.length>3){
  230. out+='<br><input type="text" value="TN_'+obj?.vid+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  231. out+='<br><input type="text" value="'+title+(obj?.vid.length>3?" ,TN"+obj?.vid:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>';
  232. }
  233. return out;
  234. },
  235. make_modal: (obj,src)=>{
  236. Cy[N5].log("--------------- make_modal");
  237. let html =
  238. Cy.is=="pornhub.com"? Cy[N5].ph_to_list(obj,src):
  239. Cy.is=="xhamster.com"? Cy[N5].xh_to_list(obj,src):
  240. Cy.is=="tnaflix.com"? Cy[N5].tn_to_list(obj):
  241. Cy[N5].sb_to_list(obj,src);// spankbang.com
  242. if(html.length){
  243. let top_pop = document.createElement("div");
  244. top_pop.id = "cymod";
  245. top_pop.style.cssText =
  246. 'position:fixed;'+
  247. 'z-index:999;'+
  248. 'top:50%;'+
  249. 'left:50%;'+
  250. 'transform:translate(-50%,-70%);'+
  251. 'width:320px;'+
  252. 'width:60vw;'+
  253. 'background:#000;'+
  254. 'background:#000c;'+
  255. 'padding:0 40px 40px;'+
  256. 'border-radius:44px;'+
  257. 'box-shadow:0 0 44px 22px #000;'+
  258. 'font-size:24px;';
  259. top_pop.innerHTML = html;
  260. document.body.appendChild(top_pop);
  261. // hide modal in dl btn
  262. if(Cy.is=="pornhub.com"){
  263. let is_mobile= typeof(isPlatformMobile)!="undefined"&&isPlatformMobile==1 || typeof(FLAG_COMMENT_DATA)!="undefined"&&FLAG_COMMENT_DATA.platform=="mobile";
  264. let el=Cy.el.id(is_mobile?"flagVideoBtn":"video_flag");
  265. if(el){
  266. let dl_btn = document.createElement("button");
  267. dl_btn.id = "btn_dl";
  268. dl_btn.className = "reportBtn buttonClass generalBtn";
  269. dl_btn.style.cssText="background:#723;animation:cyglow 2s infinite;";
  270. if(!is_mobile) dl_btn.style.cssText+="padding:7px;";
  271. dl_btn.innerHTML='<i class="ph-icon-arrow-down"></i><span>Download</span>';
  272. dl_btn.onclick=()=>{ top_pop.style.display="block"; };
  273. el.parentNode.insertBefore(dl_btn, el.nextSibling);
  274. Cy.el.del(el);
  275. top_pop.style.display="none";
  276. }
  277. }
  278. }
  279. },
  280. handler: obj=>{
  281. Cy[N5].log("--------------- handler");
  282. if(Cy.is=="pornhub.com"){
  283. for(let i in obj.mediaDefinitions){
  284. if(obj.mediaDefinitions[i].format=="mp4"){
  285. Cy[N5].log("---------------> "+obj.mediaDefinitions[i].videoUrl);
  286. let str=Cy[N5].fetch(
  287. obj.mediaDefinitions[i].videoUrl,
  288. (t,o)=>{
  289. Cy[N5].log("fetch>cb "+t);
  290. if(t.length){
  291. let json={};try{ json=JSON.parse(t); }catch{}
  292. Cy[N5].log(json);
  293. if(Object.keys(json).length)
  294. Cy[N5].make_modal(o,json);
  295. }
  296. },
  297. obj
  298. );
  299. break;
  300. }
  301. }
  302. }else if(Cy.is=="xhamster.com"){
  303. Cy[N5].make_modal(Win.initials, obj);
  304. }else if(Cy.is=="spankbang.com"){
  305. let name = "";
  306. let ld = document.querySelectorAll('script[type="application/ld+json"]')[0].textContent;
  307. if(ld){
  308. let json = {};
  309. try{
  310. json = JSON.parse(ld);
  311. if(Object.keys(json).length){
  312. name = json.name;
  313. }
  314. }catch(e){}
  315. }
  316. Cy[N5].make_modal(name, obj);
  317. }else if(Cy.is=="tnaflix.com"){
  318. Cy[N5].make_modal(obj);
  319. }
  320. }
  321. };
  322.  
  323. Cy[N5].log("--------------- RUN @ "+Cy.is);
  324.  
  325. if(Cy.is=="pornhub.com"){
  326. if(Win.location.href.indexOf("embed/")>0||Win.location.href.indexOf("view_video.php")>0){
  327. let vid = 0;
  328. let vars = null;
  329. if(typeof(Win.VIDEO_SHOW)!="undefined")
  330. vid = parseInt(Win.VIDEO_SHOW?.trackVideoId?? Win.VIDEO_SHOW?.video_id?? "0");
  331. if(!vid && typeof(VIDEO_SHOW)!="undefined")
  332. vid = parseInt(VIDEO_SHOW?.trackVideoId?? VIDEO_SHOW?.video_id?? "0");
  333. if(vid>0){
  334. Cy[N5].log("vid: "+vid);
  335. if(Win.hasOwnProperty("flashvars_"+vid)){
  336. vars = Win["flashvars_"+vid];
  337. }
  338. }
  339. if(vars==null){// try find it in window scope
  340. for(let k in Win) if(k.startsWith("flashvars")) vars=Win[k];
  341. }
  342. if(vars!=null){
  343. Cy[N5].log("vars: "+JSON.stringify(vars));
  344. if(vars.hasOwnProperty("mediaDefinitions")){
  345. Cy[N5].handler(vars);
  346. }else Cy[N5].log("'flashvars' found but not contains 'mediaDefinitions'");
  347. }else Cy[N5].log("cant find 'flashvars'");
  348. }
  349. // maximize view with removing right panel
  350. //for(let sideColumn of Cy.el.q("div.sideColumn")) Cy.el.del(sideColumn);// remove every side contents
  351. // just hide righ-side panel
  352. Cy.el.del(Cy.el.q1("#vpContentContainer .topSectionGrid .sideColumn"));
  353. // then maximize video width
  354. let el=Cy.el.q1("#vpContentContainer .topSectionGrid");
  355. if(el) el.style.display="block";
  356. // bigger watched flag
  357. let style1 = document.createElement("style");
  358. style1.innerText = "div.watchedVideoText{line-height:32px;font-size:32px;} @keyframes cyglow{0%{box-shadow:0 0 0px #f00}50%{box-shadow:0 0 48px #f00}}";
  359. document.head.appendChild(style1);
  360. // remove adblock blockers
  361. for(let i=16;i;) setTimeout( ()=>Cy[N5].ph_block_adblock_blockers(), 200*--i);
  362. // remove cookie banner
  363. Cy.el.del("cookieBanner");
  364. document.cookie = "cookieConsent=3; expires=0;domain=pornhub.com;secure;path=/";
  365. // may set backend dont-show-ads
  366. if(typeof(MG_Utils)!="undefined")
  367. MG_Utils.ajaxCall({
  368. type: "GET",
  369. url: "/front/cookie_kill_ajax",
  370. data: {cookie_name: "showPremiumWelcomeFromPornhub"}
  371. });
  372. // try set custom settings
  373. Cy[N5].ph_change_params();
  374. // remove Ads
  375. setInterval(()=>{
  376. // overlay text ads on the video
  377. Cy.el.del(Cy.el.q1("#player div.mgp_overlayText"));
  378. // side of video ads, on desktop only
  379. let side_ads=Cy.el.q(".sideAds");
  380. if(side_ads.length)
  381. side_ads.forEach(N=>N.remove());
  382. },500);
  383. // remove age warning
  384. //Cy.ph_rm_age_nag();
  385. }else if(Cy.is=="xhamster.com"){
  386. if(
  387. Win.hasOwnProperty("initials")&&
  388. !Win.location.pathname.indexOf("/videos/")
  389. ){
  390. let mp4 = initials?.videoModel?.sources?.mp4?? initials?.xplayerSettings?.sources?.standard?.h264;
  391. if(mp4){
  392. Cy[N5].handler(mp4);
  393. }else alert("it seems website scripts changed\ncontact me @cyru55");
  394. setInterval( ()=>{
  395. let ads = document.querySelectorAll("div.thumb-list>div:not(.thumb-list__item)");
  396. for(let ad of ads) Cy.el.del(ad);
  397. }, 200);
  398. let css = document.createElement("style");
  399. css.innerText = `
  400. .player-container{margin-right:unset !important}
  401. .thumb-image-container__watched{background:red !important;height:32px !important}
  402. .thumb-image-container__watched>div{font-size:26px}`;
  403. document.getElementsByTagName("head")[0].appendChild(css);
  404. }
  405. }else if(Cy.is=="spankbang.com"){
  406. if(
  407. Win.location.pathname.length>1&&
  408. Win.hasOwnProperty("stream_data")
  409. ){
  410. if(stream_data.length){
  411. Cy[N5].handler(stream_data);
  412. }else alert("it seems website scripts changed\ncontact me @cyru55");
  413. }
  414. let styl = document.getElementsByTagName("style");
  415. styl[styl.length-1].innerText+="#cymod input{background:#323232}";
  416. Cy.el.del(Cy.el.q1("#video .right"));
  417. }else if(Cy.is=="tnaflix.com"){
  418. if(Win.location.pathname.length>1){
  419. Cy[N5].i_tn1=setInterval(()=>{
  420. let vid_el=Cy.el.id("video-player");
  421. if(vid_el.children.length){
  422. clearInterval(Cy[N5].i_tn1);
  423. let vid=~~vid_el.getAttribute("data-vid");
  424. let vids=[];
  425. for(let el of vid_el.children){
  426. let link=el.getAttribute("src")??"";
  427. if(link.length) vids.push(link);
  428. }
  429. let name = "";
  430. let ld = document.querySelectorAll('script[type="application/ld+json"]')[0].textContent;
  431. if(ld){
  432. let json = {};
  433. try{
  434. json = JSON.parse(ld);
  435. if(Object.keys(json).length){
  436. name = json.name;
  437. }
  438. }catch(e){}
  439. }
  440. Cy[N5].log({"vid":vid,"vids":vids,"name":name});
  441. if(vids.length)
  442. Cy[N5].handler({"vid":vid+"","vids":vids,"name":name});
  443. }
  444. },500);
  445. }
  446. }
  447.  
  448. })(
  449. "cyru55_x",
  450. typeof(unsafeWindow)=="undefined"? window: unsafeWindow
  451. );