DMZ
11:05 10-01-2009
Интересующимся и любителям экспериментов стоит погуглить на тему GreaseMonkey
Для Firefox-а есть плагин
последний Chrome вроде это дело поддерживает уже из коробки
Opera, хоть и использует свой формат UserJS, но пытается поддерживать GreaseMonkey
Про Safari мне неизвестно
А Internet Explorer тут вроде не при делах. Хотя для него точно есть какой-то плагин, но совместим ли он с GreaseMonkey не знаю

В итоге умелыми руками можно разукрашивать чужие сайты самим


// ==UserScript==
// @name        Download video from http://youtube.com/
// @version     1.12
// @date        2008-04-19
// @author      Mike Samokhvalov <mikivanch@gmail.com>
// @download    http://www.puzzleclub.ru/files/youtube_com.js
// @include     http://youtube.com/watch*
// @include     http://*.youtube.com/watch*
// ==/UserScript==

(function(){
  ///////////////////////////////////////////////////////////////////
  // SETTINGS
  
  var highQualityVideo = false;
  
  ///////////////////////////////////////////////////////////////////
  // DO NOT EDIT
  
  if(highQualityVideo)
  {
    window.opera.addEventListener('BeforeScript', function(e){
      if(e.element.text && !e.element.getAttribute('src', false))
      {
        if(e.element.text.search(/var\s*swfargs\s*=/i) != -1)
        {
          e.element.text = e.element.text.replace(/([\x22\x27]fmt_map[\x22\x27]\s*:\s*[\x22\x27])[^\x22\x27\s]*([\x22\x27])/, '$1' + '18/512000/9/0/115' + '$2');
          e.element.text = e.element.text.replace(/fmt_map=[^&\s]*/, 'fmt_map=18%2F512000%2F9%2F0%2F115');
          e.element.text = e.element.text.replace(/([\x22\x27]vq[\x22\x27]\s*:\s*)null/i, '$1' + '"2"');
          e.element.text = e.element.text.replace(/vq=none/i, 'vq=2');
        }
      }
    }, false);
  }
  
  var url = '';
  window.opera.addEventListener('AfterScript', function(e){
    if(e.element.text)
    {
      if(e.element.text.search(/var\s*swfargs\s*=/i) != -1)
      {
	/*DMZ Hack=*/
	var l = /var\s+swfargs\s*=\s*(\{.+?\});/i.exec(e.element.text);
	eval(l[0]);
	/*=DMZ Hack*/
        var site = '';
        if(swfArgs)
        {
          url = '', sep = '';
          for(var i in swfArgs)
          {
            if(i == 'BASE_YT_URL')
            {
              site = swfArgs[i] + 'get_video?';
            }
            else if(i != 'video_id')
            {
              url += sep + i + '=' + encodeURIComponent(swfArgs[i]);
              sep = '&';
            }
            else if(i != 't')
            {
              url += sep + i + '=' + encodeURIComponent(swfArgs[i]);
              sep = '&';
            }
          }
        }  

        if(site)  
          url = site + url;
        
        if(url.indexOf('get_video?') == -1)
          url = 'http://youtube.com/get_video?' + url;
      }
    }  
  }, false);

  function onLoad()
  {
    if(!url)
      return;
      
    var url1 = url;
    var url2 = url;
    if(url2.search(/\bfmt=\d+\b/i) != -1)
      url2 = url2.replace(/\bfmt=\d+\b/i, 'fmt=18');
    else
      url2 += '&fmt=18';    

    var n = '';  
    var t = document.getElementById('watch-vid-title');
    if(t)
    {
      n = t.innerText;
      n = n.replace(/[\x2F\x5C\x3A\x7C]/g, '-');
      n = n.replace(/[\x2A\x3F]/g, '');
      n = n.replace(/\x22/g, ''');
      n = n.replace(/\x3C/g, '(');
      n = n.replace(/\x3E/g, ')');
      n = n.replace(/(?:^\s+)|(?:\s+$)/g, '');
    }  
    
    var n1 = '', n2 = '';
    if(n)
    {
      n1 = n + '.flv';
      n2 = n + '.mp4';
    }
    
    var size = n1.length + 8;
    if(size > 64)
      size = 64;
      
    var inputAttr = (
      'type="text"  '
      +'onfocus="if(this.value && this.select){this.select()}" '
      +'style="border: 1px solid #c3d0ec; background-color: transparent;"'
    );

    var p = document.createElement('div');
    p.setAttribute('style', 'display:  block; color: #003399; background-color: #e7eefa; border: 1px solid #c3d0ec; padding: 5px 0; text-align: center;', false);
    var html = '<table style="border-collapse: collapse; border: none; margin: 0 auto;"><tr><td><a href="' + url1 + '">FLV</a>: </td><td>';
    if(n1)
    {
      html += '<input size="' + size + '" value="' + n1 + '" ' + inputAttr + '>';
    } 
    html += '</td></tr><tr><td><a href="' + url2 + '">MP4</a>: </td><td>';
    if(n2)
    {
      html += '<input size="' + size + '" value="' + n2 + '" ' + inputAttr + '>';
    }  
    html += '</td></tr></table>';
    p.innerHTML = html;
    document.body.insertBefore(p, document.body.firstChild);
  }

  if(typeof(opera.version) == 'function' && opera.version() >= 9)
    document.addEventListener('DOMContentLoaded', onLoad, false);  
  else
    document.addEventListener('load', onLoad, false);

})();