Alex_Qwerty
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: // ==UserScript== // @include *.youtube.com/* // @include *.youtube-nocookie.com/* // @include *.youtubeeducation.com/* // ==/UserScript== (function(opera){ var ScriptName = 'youtube_fuck_html5.js v17'; var conf = { relatedVideos : false // click title if not works , blockPlayerBase : true , videoQuality : 'auto' // highres hd1440 hd1080 hd720 large medium small tiny auto , autoplay : 1 // 1 0; not in background; not in iframe , del43 : true // remove format 43 (webm 640x360); can help switching to 720 , noSubtitles: true // they don't works , swf : 'https://s.ytimg.com/yts/swfbin/player-vfljf_kbO/watch_as3.swf' // dead //, swf : 'https://s.ytimg.com/yts/swfbin/player-vfljf_kbO/watch_as3-vfl7SkMGe.swf' // dead , deleteCookies: [ //'VISITOR_INFO1_LIVE' // messes with signatures ] , addParams: { theme: 'dark' // dark, light , color: 'red' // red, white //, hl: 'en' } //, wmode : 'direct' // window, direct, opaque, transparent, gpu https://helpx.adobe.com/ru/flash/kb/flash-object-embed-tag-attributes.html } /* Need something against crossdomain.xml and watch_as3.swf Filters for Proxomitron: [Patterns] Name = "youtube dash manifest fix" Active = TRUE URL = "manifest.googlevideo.com(:443|)/api/manifest/dash/" Limit = 256 Match = "(<SegmentList>)\1(<SegmentURL media="\2")\3" Replace = "\1<Initialization sourceURL="\2"/>\3" [HTTP headers] In = FALSE Out = TRUE Key = "URL: youtube crossdomain.xml" URL = "([^/]++.|)(youtube(-nocookie|education|).com|ytimg.com|googlevideo.com)(:443|)/crossdomain.xml$RDIR(http://local.ptron/crossdomain.xml)" In = FALSE Out = TRUE Key = "URL: youtube watch_as3.swf" URL = "s.ytimg.com(:443|)/yts/swfbin/player-*watch_as3.swf$RDIR(http://local.ptron/watch_as3.swf)" In = FALSE Out = TRUE Key = "Accept-encoding: youtube no gzip, enable filtering" URL = "manifest.googlevideo.com(:443|)/$FILTER(True)" crossdomain.xml (put in Proxomitron\html\): <?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy> */ var sts, pr, formats={}; document.createElement("video").constructor.prototype.canPlayType = function(type){return ""}; // disable HTML5 var showConf = true; function log(str){ opera.postError(ScriptName + (str?': '+str:'')+(showConf?'\nconf='+JSON.stringify(conf):'')); showConf = false; } //https://learn.javascript.ru/cookie function setCookie(name, value, options) {options = options || {};var expires = options.expires;if (typeof expires == "number" && expires) {var d = new Date();d.setTime(d.getTime() + expires * 1000);expires = options.expires = d;}if (expires && expires.toUTCString) {options.expires = expires.toUTCString();}value = encodeURIComponent(value);var updatedCookie = name + "=" + value;for (var propName in options) {updatedCookie += "; " + propName;var propValue = options[propName];if (propValue !== true) {updatedCookie += "=" + propValue;}}document.cookie = updatedCookie;} function deleteCookie(name, options) {options=options||{}; options.expires=-1; setCookie(name, "", options)} if (conf.deleteCookies) for (var i=0; i<conf.deleteCookies.length; i++) { deleteCookie(conf.deleteCookies[i],{domain:location.hostname}); deleteCookie(conf.deleteCookies[i],{domain:location.hostname.replace(/^www\./,'.')}); deleteCookie(conf.deleteCookies[i],{domain:location.hostname.replace(/^www\./,'')}); } //opera.postError(ScriptName); opera.addEventListener("BeforeScript",function(e){ if (e.element.src.match(/\/yts\/jsbin\/player.*?\/base\.js/)) { sts = e.element.text.match(/[{,]sts:(\d+)[},]/); sts=sts&&sts[1]; if (sts) { log('player: '+e.element.src+'\nsts='+sts+'\nUA='+navigator.userAgent); if (conf.blockPlayerBase) { if (window.canBlockPlayerBase) { var decf = e.element.text.match(/=function\(a\){(a=a.split\(""\)[^}]*?;return a.join\(""\))};/); decf = decf && decf[1]; var deco = decf && decf.match(/([\w$_]+)\.[\w$_]+\(a,\d+\);/); deco = deco && e.element.text.match(new RegExp('var '+deco[1]+'={[\\w$_]+:function\\(a[\\s\\S]*?};')) deco = deco && deco[0]; if (decf && deco) { decodeSignature = new Function('a', deco+decf); e.preventDefault(); log('blocked player base.js: '+e.element.src); } else { log("error: can't get decoder from player base.js") } } else { log('blockPlayerBase requires blockYoutubeScripts in youtube_fix.js'); } } else { e.element.text = e.element.text.replace('=function(a){a=a.split("")','=decodeSignature=function(a){a=a.split("")'); } } } },false); function getField(obj) { var tmp = obj; if (tmp) for (var i=1; i<arguments.length; i++) { tmp = tmp[arguments[i]]; if (!tmp) break; } return tmp; } function xhr(url, method, post, xml, headers){ var x = new XMLHttpRequest(); x.open(method || 'GET', url, false); if (headers) for (var i=0; i<headers.length; i++) x.setRequestHeader(headers[i][0], headers[i][1]); x.send(post); return xml?x.responseXML:x.responseText; } function splitKV(str) { var o = {}; var tmp; var re = /([\da-z_]+)=([^&]*)/gi; while ( (tmp = re.exec(str))!==null ) { o[tmp[1]] = decodeURIComponent(tmp[2].replace(/\+/g,' ')); } return o; } function concatKV(obj){ var tmp = []; for (var n in obj) tmp.push(n+'='+encodeURIComponent(obj[n]).replace(/,/g,'%2C') ); return tmp.join('&'); } var onceFix = true; function fix(str){ var tmp = str.split(','); for (var i=tmp.length-1; i>=0; i--) { var obj = splitKV(tmp[i]); del(obj,['xtags']); if (conf.del43 && obj.itag==43) { tmp.splice(i,1); // del log('removed format 43') } else if (obj.clen==0 && obj.url.indexOf('live=1')==-1) { tmp.splice(i,1); // del log('removed clen==0 itag='+obj.itag); } else if (obj.s) { obj.itag = parseInt(obj.itag); if (formats[obj.itag]) { obj.url = formats[obj.itag]; delete obj.s; } else if (!window.decodeSignature) { if (onceFix) onceFix = log('error: no decodeSignature()') return str; } else { obj.url += '&'+(obj.sp||'signature')+'='+decodeSignature(obj.s); delete obj.s; } tmp[i] = concatKV(obj); } } return tmp.join(','); } function del(obj,arr){ for (var d in arr) delete obj[arr[d]]; } function set(obj,arr){ for (var d in arr) obj[d]=arr[d]; } function setNew(obj,arr){ for (var d in arr) if (typeof(obj[d])=='undefined') obj[d]=arr[d]; } if (location.pathname.indexOf('/embed/')==0 || location.pathname=='/watch' && window==window.top) document.addEventListener('DOMContentLoaded',function(){ var errMsg = document.querySelector('#unavailable-message'); var div; var selectors = ['div.html5-video-player', 'div#player-api', 'div#player']; for (var i=0,s; s=selectors[i]; i++) if (div = document.querySelector(s)) break; if (!div) { log('player div not found'); } else { log('found div:'+(div.id?' id="'+div.id+'"':'') + (div.className?' class="'+div.className+'"':'')); if (!sts) log('warning: sts from /player-./base.js not found! Check content blocker.'); div.classList.remove('off-screen-target'); div.innerHTML = '<br><br>'+ScriptName; var u = document.querySelector('div#player-unavailable'); if (u) u.parentNode.removeChild(u); var id = (''+location).match(/\/embed\/([\da-z_-]{11})/i) || (''+location).match(/[&?]v=([\da-z_-]{11})/i); id = id&&id[1]; if (!id) { div.innerHTML += ' - no video id'; return log('no video id'); } var bg = 'https://i.ytimg.com/vi/'+id+'/hqdefault.jpg'; var info, infoLength, status, reason; function gvi(data) { var url = '/get_video_info?html5=1&asv=3&ps=default'+(sts?'&sts='+sts:'')+'&video_id='+id+(data||''); info = xhr(url); if (info.indexOf('status=')==-1) info = xhr(url); // second try infoLength = info.length; info = splitKV(info); if (info.player_response) info.player_response = JSON.parse(info.player_response); status = getField(info, "player_response", 'playabilityStatus', 'status'); if (status) status=status.toLowerCase(); reason = getField(info, "player_response", 'playabilityStatus', 'reason'); //alert(JSON.stringify(info,null,'\t')) } gvi(); if (status=="unplayable") { if (reason.indexOf("youtube.com/watch")!=-1) { var page = xhr('/watch?v='+id); var tmp = page.match(/ytplayer.config = ({.*?});ytplayer/); info = JSON.parse(tmp[1]).args; if (info.player_response) info.player_response = JSON.parse(info.player_response); status = getField(info, "player_response", 'playabilityStatus', 'status'); if (status) status=status.toLowerCase(); reason = getField(info, "player_response", 'playabilityStatus', 'reason'); //alert(JSON.stringify(tmp,null,'\t')) } else { gvi('&eurl=http://www.google.com/'); } } if (status!='ok') { div.innerHTML = '<br><br>'+reason; return log('reason: '+reason); } log(JSON.stringify({cbr:info.cbr, cbrver:info.cbrver, cbrand:info.cbrand, infoLength:infoLength})); if (!conf.relatedVideos) delete info.rvs; del (info, ['ppv_remarketing_url','remarketing_url', 'allowed_ads', 'survey_smartpixel_url']); pr = info.player_response; if (pr) { var sd = pr.streamingData || {}; var tmp = sd.formats; if (tmp) for (var i=0; i<tmp.length; i++) formats[parseInt(tmp[i].itag)]=tmp[i].url; tmp = sd.adaptiveFormats; if (tmp) for (var i=0; i<tmp.length; i++) formats[parseInt(tmp[i].itag)]=tmp[i].url; // manifests don't work? //if (!info.dashmpd) info.dashmpd = sd.dashManifestUrl; //if (!info.hlsvp) info.hlsvp = sd.hlsManifestUrl; if (getField(pr, 'playabilityStatus', 'status')=="UNPLAYABLE") return div.innerHTML = '<br><br>' + pr.playabilityStatus.reason; } //var eventid = (info.url_encoded_fmt_stream_map||info.adaptive_fmts).match(/ei%3D([^%]+)/)[1]; var crap = { storyboard_spec: getField(pr, 'storyboards', 'playerStoryboardSpecRenderer', 'spec') || "http://i9.ytimg.com/sb/LpWKhuvcXGU/storyboard3_L$L/$N.jpg?sqp=ovOX_wMGCMLdv58F|48#27#100#10#10#0#default#rs$AOn4CLCZ4iJXVfCkSXp3QGpGckl5vCoKAA|80#45#76#10#10#1000#M$M#rs$AOn4CLCLFHKsZ4N97Z2y-gYuQauK7NH3SQ|160#90#76#5#5#1000#M$M#rs$AOn4CLDLKWOa64VAWs_XCvNKMPnOd1xWCQ" , token: 'fuck' , length_seconds: getField(pr, 'videoDetails', 'lengthSeconds') , title: getField(pr, 'videoDetails', 'title') , video_id: getField(pr, 'videoDetails', 'videoId') } //alert(JSON.stringify(crap,null,'\t')) setNew(info, crap); if (conf.noSubtitles) { del(info, ['ttsurl','caption_tracks','caption_audio_tracks', 'cc_asr', 'cc3_module', 'caption_translation_languages', 'cc_font']); info.has_cc = 'False'; } else { var tmp = JSON.parse(info.player_response||'{}'); if (tmp.captions) { tmp = tmp.captions.playerCaptionsTracklistRenderer.captionTracks } } if (conf.del43 && info.fmt_list) info.fmt_list = info.fmt_list.replace('43/640x360,',''); if (conf.addParams) set(info, conf.addParams); if (conf.videoQuality) info.vq = conf.videoQuality; info.autoplay = conf.autoplay && !document.hidden && window==window.top && 1 || 0; if (info.url_encoded_fmt_stream_map) info.url_encoded_fmt_stream_map = fix(info.url_encoded_fmt_stream_map); if (info.adaptive_fmts) info.adaptive_fmts = fix(info.adaptive_fmts); if (info.dashmpd) info.dashmpd = info.dashmpd.replace(/\/s\/([\dA-F.]+)/,function(a,s){return '/signature/'+decodeSignature(s)}); set(info, {no_stats:1, allow_embed:1, no_get_video_log:1, rmkt:0, rtl:0, ad3_module:0, ad_preroll:0, enable_cardio:0 , enable_cardio_before_playback:0, advideo:0, skl:1}); del(info, ['player_response']); // for some videos del(info, ['fflags']); //alert(JSON.stringify(info,null,'\t')); info = concatKV(info); var wmode = conf.wmode ? 'wmode="'+conf.wmode+'"' : ''; div.innerHTML = '<embed src="'+conf.swf+'" flashvars="'+info+'" '+wmode+' style="background: url('+bg+') center no-repeat" type="application/x-shockwave-flash" width=100% height=100% allowfullscreen="true" allowscriptaccess="always" bgcolor="#000000" />' } // !div },false); })(opera) | Код: // ==UserScript== // @include *//youtube.com/* // @include *.youtube.com/* // @include *//youtube-nocookie.com/* // @include *.youtube-nocookie.com/* // @include *//youtubeeducation.com/* // @include *.youtubeeducation.com/* // @exclude http://tparser.org/* // ==/UserScript== if ( document.contentType=='text/html' || (''+location).match(/[/.]youtube(-nocookie|education|).com\/v\//) ) (function(opera){ var ScriptName = 'youtube_fix.js v13'; var conf = { fixObjects : true // object -> iframe , fixInsertedObjects : { enabled: true // may break sites; use whitelist or // @exclude * , blacklist : ['translate.yandex.ru'] // [] - works anywhere; ['tparser.org'] , whitelist : [] // [] - works anywhere; ['3dnews.ru', 'livejournal.com'] } , blockYoutubeScripts : true // except player base.js //, loadComments : true // don't works , addLinksInEmbeds : true , loadThumbnails : true , fixList : true // for long channel lists } var showConf = true; function log(str){ opera.postError(ScriptName +(str?': '+str:'')+(showConf?'\nconf='+JSON.stringify(conf):'')); showConf = false; } function findHost(hosts, host){ var flag = -1; while (flag==-1 && host) { flag = hosts.indexOf(host); host = host.replace(/^[^.]*\.?/,''); } return flag; } var youtubeHosts = ['youtube.com','youtube-nocookie.com','youtubeeducation.com']; function create(el, cn, ih){var tmp=document.createElement(el); if(cn)tmp.className=cn; tmp.innerHTML=ih||''; return tmp; } function xhr(url, method, post, xml, headers){ var x = new XMLHttpRequest(); x.open(method || 'GET', url, false); if (headers) for (var i=0; i<headers.length; i++) x.setRequestHeader(headers[i][0], headers[i][1]); x.send(post); return xml?x.responseXML:x.responseText; } var isYoutube = findHost(youtubeHosts, location.hostname)!=-1; var v = isYoutube && location.pathname.match(/^\/v\/([\da-z_-]{11})/i); if (v) { stop(); log('redirecting to /embed/'); location = '/embed/'+v[1]; } var videoId = (''+location).match(/[&?]v=([\da-z_-]{11})/i) || (''+location).match(/\/embed\/([\da-z_-]{11})/i); videoId = videoId && videoId[1]; if (conf.blockYoutubeScripts && isYoutube) { var once = true; window.canBlockPlayerBase = true; var needPlayerBase = true; var func = function(){}; requestAnimationFrame = func; writeEmbed = func; writeLightweightEmbed = func; spf = {script:{path:func, declare:func}}; ytcsi = {info: func, tick:func}; yt = {config_:{}, pushConfigArray:func, setMsg:func} yt.setConfig = function(o,v){ if (v) { yt.config_[o]=v } else {for (var k in o) yt.config_[k]=o[k]} if (needPlayerBase && o && o.PLAYER_CONFIG && o.PLAYER_CONFIG.assets && o.PLAYER_CONFIG.assets.js) { var s = document.createElement('script'); s.src = o.PLAYER_CONFIG.assets.js; document.body.appendChild(s); log('inserted player base.js: '+s.src); needPlayerBase = false; } } var moreButton; opera.addEventListener("BeforeExternalScript",function(e){ if (e.element.src.match(/\/yts\/jsbin\/player.*?\/base\.js/)) { needPlayerBase = false; } else { e.preventDefault(); if (once) once = log('blocking youtube scripts...'); } if (!moreButton) { moreButton = document.querySelector('button[data-uix-load-more-href]'); if (moreButton){ var L=document.selectNodes('//link[@rel="next"]'); for (var l=0; l<L.length; l++) { L[l].parentNode.removeChild(L[l]); }; var ln=document.createElement('link'); ln.rel='next'; ln.href="javascript:document.querySelector('button[data-uix-load-more-href]').click()"; document.body.appendChild(ln); opera.postError(ScriptName+' FF'); } } },false); } document.addEventListener('DOMContentLoaded',function(){ var tmp = document.querySelectorAll('a[href*="youtube.com/edit?"]'); for (var i=0,a; a=tmp[i]; i++) { var id = a.href.match(/[?&]video_id=([\da-z_-]{11})/i); if (id) a.href = 'https://www.youtube.com/watch?v='+id[1]; } if (conf.fixObjects) { function fixObjects(embeds) { for (var i=0,e,o; e=embeds[i]; i++){ o=e.parentNode.tagName.toLowerCase()=='object'? e.parentNode : e; var vid = o.outerHTML.match(/youtube(?:education|-nocookie|)\.com\/v\/([\da-z_-]{11})/i); if (vid=vid&&vid[1]) { var iframe = document.createElement('iframe'); var width = o.width || o.style.width || '640px'; var height = o.height || o.style.height || '480px'; if (!/[a-zA-Z%]+$/.test(width)) width +='px'; if (!/[a-zA-Z%]+$/.test(height)) height +='px'; //iframe.style = "width: "+width+" !important ; height: "+height + ' !important'; iframe.style = "width: "+width+"; height: "+height; if (o.className) iframe.className = o.className; if (o.id) iframe.id = o.id; iframe.src = 'https://www.youtube.com/embed/'+vid; // youtube-nocookie.com not always works o.parentNode.insertBefore(iframe, o); o.parentNode.removeChild(o); log('replaced object in html: '+vid); } } } fixObjects(document.querySelectorAll('object')); fixObjects(document.querySelectorAll('embed')); var fixInsertedObjectsEnabled = (conf.fixInsertedObjects && conf.fixInsertedObjects.enabled) && !isYoutube && (window != window.top ? document.body.innerHTML.length>0 : true) // scriptweeder iframe && (!conf.fixInsertedObjects.whitelist || (!conf.fixInsertedObjects.whitelist.length || findHost(conf.fixInsertedObjects.whitelist, location.hostname)!=-1) ) && (!conf.fixInsertedObjects.blacklist || (!conf.fixInsertedObjects.blacklist.length || findHost(conf.fixInsertedObjects.blacklist, location.hostname)==-1) ); if (fixInsertedObjectsEnabled) { log('warning: fixInsertedObjects may break sites'); document.addEventListener('DOMNodeInserted', function(e){ if (e.target.innerHTML && /youtube(education|-nocookie|)\.com\/v\//.test(e.target.innerHTML)) { log('DOMNodeInserted'); var tmp = e.target.outerHTML.replace(/<object[\s\S]*?youtube(?:education|-nocookie|)\.com\/v\/([\da-z_-]{11})[\s\S]*?<\/object>/ig, function(o,id){ var tmp = o.match(/^<object[\s\S]*?>/i)[0]; var width = tmp.match(/width\s*[:=]\s*(\d\w*)/); width = width&&width[1] || '640px'; var height = tmp.match(/height\s*[:=]\s*(\d\w*)/); height = height&&height[1] || '480px'; if (!/[a-zA-Z%]+$/.test(width)) width +='px'; if (!/[a-zA-Z%]+$/.test(height)) height +='px'; return '<iframe src="https://www.youtube.com/embed/'+id+'" style="width: '+width+' !important; height: '+height+' !important"></iframe>'; }); if (e.target.outerHTML!= tmp) e.target.outerHTML = tmp; } }, false); } } if (isYoutube && conf.loadThumbnails) { var pics = document.querySelectorAll('img[data-thumb]'); for (var i=0; i<pics.length; i++) pics[i].src = pics[i].getAttribute('data-thumb'); } if (conf.loadComments && conf.blockYoutubeScripts && isYoutube && location.pathname=='/watch' && window==window.top) { var tmp = document.querySelector('#watch-discussion'); if (!tmp) { log('no #watch-discussion'); } else { tmp.style.display='none'; var comments = create('div', 'crutch-comments-container'); comments.appendChild(create('div', 'crutch-comments-total', 'comments disabled ?')) tmp.parentNode.insertBefore(comments, tmp); var headers = [['Content-Type', 'application/x-www-form-urlencoded'],['X-YouTube-Identity-Token'," "]]; var c = xhr('/watch_fragments2_ajax?v='+videoId+'&tr=scroll&distiller=1&ctoken='+window.yt.config_.COMMENTS_TOKEN+'&frags=comments&spf=load', 'POST' , 'session_token='+encodeURIComponent(window.yt.config_.XSRF_TOKEN)+'&client_url='+location, false, headers); if (c.indexOf('{')!=-1) { c = JSON.parse(c); //alert(JSON.stringify(c,null,'\t')); //alert(c.content_html); comments.innerHTML = c.content_html; log('comments'); } } } if (conf.blockYoutubeScripts && isYoutube && location.pathname=='/watch' && window==window.top) { var s = document.createElement('style'); s.appendChild(document.createTextNode('#watch-description + .yt-uix-expander-collapsed-body {display:none !important} .yt-uix-expander-collapsed #watch-description-text {max-height: 100% !important}')); document.body.appendChild(s); } var id = window.yt && yt.config_ && yt.config_.VIDEO_ID; if (conf.addLinksInEmbeds && !location.pathname.indexOf('/embed/') && id) { var pics = id && window.yt.config_.PLAYER_CONFIG.args || {}; var img = pics.iurlmaxres || pics.iurlhq720 || pics.iurlsd || pics.iurl || 'http://i.ytimg.com/vi/'+id+'/hqdefault.jpg'; var span = document.createElement('span'); span.innerHTML = ' <a href="http://www.youtube.com/watch?v='+id+'" target="_blank">link</a> <a href="'+img+'" target="_blank">img</a>'; span.style='position:absolute; top:0; left:0; background:white'; document.body.appendChild(span); } // load more videos if (conf.blockYoutubeScripts && isYoutube) { var more = document.querySelector('button[data-uix-load-more-href]'); if (more) { loadNextPage = function(){ var next = this.getAttribute('data-uix-load-more-href'); var targetid = this.getAttribute('data-uix-load-more-target-id'); if (next) { var tmp = xhr(next); tmp = JSON.parse(tmp); var html = tmp.content_html; //alert(html) html = html.replace(/src="\/yts\/img\/pixel-[^>]*?data-thumb="/g,'src="'); if (conf.fixList) { var tmp2 = document.createElement('span'); tmp2.innerHTML = html; //var html2=[]; var videos = tmp2.querySelectorAll('li.yt-shelf-grid-item'); for (var i=0; i<videos.length; i++) { var v = videos[i]; var url = v.querySelector('a').href; var thumb = v.querySelector('img').src; var time = v.querySelector('.video-time'); var info = v.querySelector('.yt-lockup-meta-info'); var title = v.querySelector('h3'); v.innerHTML = ('<a href="'+url+'"><img src="'+thumb+'">'+'</a><br>'+title.outerHTML+'<br>'+info.outerHTML+time.innerText); } //alert(html2) // html = html2.join(''); document.getElementById(targetid).insertAdjacentElement('beforeend', tmp2); } else { document.getElementById(targetid).insertAdjacentHTML('beforeend', html); } if (tmp.load_more_widget_html) { next = tmp.load_more_widget_html.match(/data-uix-load-more-href="([^"]+)/); if (next) this.setAttribute('data-uix-load-more-href', next[1]); } else { this.parentNode.removeChild(this); } } } more.onclick = loadNextPage; } } // first video in channel var upsell = document.querySelector('#upsell-video'); if (upsell) { id = upsell.getAttribute('data-video-id'); if (id) upsell.innerHTML = '<a href="/watch?v='+id+'"><img src="https://i.ytimg.com/vi/'+id+'/mqdefault.jpg"></a>'; } },false); })(opera) | https://www.upload.ee/files/10718439/watch_as3_embed.zip.html Исправил функцию com.google.youtube.model:YouTubeEnvironment:::onSite()::Boolean чтоб всегда возвращала true - чтоб в менюхе был 'copy embed code'. | Всего записей: 2342 | Зарегистр. 09-09-2006 | Отправлено: 09:23 07-11-2017 | Исправлено: Alex_Qwerty, 10:08 13-11-2019 |
|