1. // Видео на ссылке или строке адреса: проиграть/скачать внешним приложением. Текст в Clipboard = mpv Title
  2. (goVideo=> {
  3. var player = "mpv"; quality = 720;
  4. function goLink(link, e) {
  5. xclip = custombuttons.cbService.readFromClipboard().replace(/\s+/g,' ').replace(/^\s*/,''); // убрать служ. символы, пробелы в начале, конце
  6. if (xclip != '') xclip = '--force-media-title='+ xclip.substr(0, 128);
  7. if (/youtube.com/.test(link)) link = link.replace(/&t=.*/g,''); // убрать время перехода
  8. if (e.button == 0) {
  9. bash = [ player,'--fs','--player-operation-mode=pseudo-gui','--ytdl-format=bestvideo[height<=?'+ quality +']+bestaudio/best', window.convertFromUnicode("UTF-8", xclip), link ];
  10. param = [ '/C', 'echo', String.fromCharCode(7) ]; // Windows beep
  11. } else {
  12. bash = [ 'xterm', '-T', 'Download video: youtube-dl', '-e', 'youtube-dl', link ]; // батник youtube-dl в $PATH
  13. param = link;
  14. }
  15. window.exec('', bash ) // команда Linux
  16. window.statusTextField('Видео загружается, Ожидайте…', 7000);
  17. };
  18. var menuitem = goVideo.insertBefore(document.createElement("menuitem"), document.getElementById("context-selectall")); // context-selectall context-copyvideourl context-sep-open context-inspect
  19. menuitem.setAttribute("label", "Проиграть видео-ссылку");
  20. menuitem.setAttribute("class", "menuitem-iconic");
  21. menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAACNElEQVR42pWVA4xcYRDHN9ZtpLNt21JY23aERmWs2rYUqVLsOmp0mO+dbb25+a8tPc38RliDt1d3frqRMuLzKDVmDSVH7Sd8cZ6ZkNddkG50U/AOSjOK4kqVFPlEJYT/V/Fh4/KdwxfnuEdJkY9FZgXlpfkGi/U4ET6vEsL6VHyorsWHsacvnolMLyVFnaesxDjvsMTIp+LFrIoLhaLPL2QgKw48ha57mMlR5yGgxVkUoJgYYT569dQKjTrXnZdqD59SY1fKg14I2ISTo3jo0B4e2LCStdQYeOTL015hrDB7V5ARQihAnEvOUmN58s1Lnu/s4LGrF7ivuRoeyzN3MHSVFEqqH2KgjIQ8VA4PXIFT716zruusz8/x7K8fPHLiOPeU5LDyEDoYkstcA3oL7eANaH0BvDQ5wdOf3vPg3u2sZSU6pQEMSotdbUDDIrH+gGaqGbzQ38cTj+5zb2MlvLMC54S1LyigbgEuDg7wxPPH3NdUbQsfDDMwLTbwkKemePr7F0b1tZxkQNxDRiL9FmVhgef+/eGRsye4pzwfyi6FcSgKSo3Z9NY2C9TN47eucV97PWtJkR77EbrCeNSdL22DFwbdY2MfO8ADW9axlh4XeGPj1Z2H0Ys0jZ5D1cwe4dzfPCe7jB5e2BoYdEeoFsAcY8ooMzHWy8YBFOsrvFeEdY9gM8i8vpIjz3mD2cPPTTUip5hNbwsWzyBjDjPAF5n/AnJFcbWShiX54lxmP1eq6RW0DCJr1gH3GbOvAAAAAElFTkSuQmCC");
  22. addEventListener("popupshowing",()=> menuitem.hidden=( !gContextMenu.onLink && // показывать на ссылке и сайтах из списка
  23. !/www.youtube.com|ok.ru|vk.com|mail.ru/.test(content.location))
  24. , false, goVideo);
  25. menuitem.onclick = function(e) { // клик на ссылке (желательно на видео-ссылке)
  26. gContextMenu.onLink ? goLink(gContextMenu.getLinkURL(), e) : goLink(content.location.href, e);
  27. };
  28. // подсказка к пункту меню
  29. addEventListener("mouseover", function(e) {
  30. var target = e.target;
  31. var tooltip = gBrowser.appendChild( document.createElement("tooltip") );
  32. var label1 = tooltip.appendChild(document.createElement("label"));
  33. var txt = tooltip.appendChild(document.createElement("label"));
  34. var image = tooltip.appendChild( document.createElement("image") );
  35. var info = tooltip.appendChild(document.createElement("label"));
  36. label1.style.cssText = "font-weight: bold !important;";
  37. label1.setAttribute("value", "Открыть в плеере: " + player);
  38. txt.setAttribute("value", "Правый клик 🖰: скачать");
  39. image.setAttribute("src",'data:image/gif;base64,R0lGODlhAQABAIAAMQAAAP///ywAAAAAAQABAAACAkQBADs='); // чёрная точка
  40. info.setAttribute("value", "Текст в Clipboard = Title");
  41. tooltip.showPopup(e.target, -1, -1, "popup", "topleft", "topright");
  42. setTimeout(()=>tooltip.remove(), 20000);
  43. e.target.onmouseleave =()=> { tooltip.remove(); e.target.onmouseleave = null;};
  44. }, true, menuitem);
  45. addDestructor(()=> menuitem.remove() );
  46. })(document.getElementById("contentAreaContextMenu"));
  47. window.statusTextField = function (text, time) { // Показ сообщения в строке статуса
  48. time = time || 3000; // аргумент функции не указан
  49. XULBrowserWindow.statusTextField.label = text; setTimeout(()=> XULBrowserWindow.statusTextField.label = '',time); // window.sleep( time/2 );
  50. };
  51. window.convertFromUnicode = function(charset, str) {
  52. var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
  53. converter.charset = charset;
  54. str = converter.ConvertFromUnicode(str);
  55. return str + converter.Finish();
  56. };
  57. window.exec = function (path, args ) { // указать полный путь команды Windows
  58. if (!path) path = '/usr/bin/nohup'; // для Linux нужен только параметр: имя команды, скрипта
  59. var file = Services.dirsvc.get('CurProcD', Ci.nsIFile);
  60. file.initWithPath(path);
  61. if(file.exists()) {
  62. var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
  63. process.init(file);
  64. process.run(false, args, args.length);
  65. } else custombuttons. alertBox ("Файл не найден", path); // Сообщение об ошибке
  66. };

Видео на ссылке или строке адреса: проиграть/скачать внешним приложением. Текст в Clipboard = mpv Title