您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Download Link + Quality Selector + Rollover Preview + Media Controller
- // <![CDATA[
- // ==UserScript==
- // @name YouTube Enhancer from YouTube2009Year
- // @fullname YouTube Enhancer from YouTube2009Year
- // @author VoxelBeet129
- // @version 2014-12-29
- // @licence (CC) by-nc-sa
- // @namespace http://gf.qytechs.cn/scripts/show/33042
- // @description Download Link + Quality Selector + Rollover Preview + Media Controller
- // @include http://youtube2009year.weebly.com
- // ==/UserScript==
- // fmt=0 -> flv: 320x240 (flv1) / mp3 1.0 22KHz
- // fmt=5 -> flv: 320x240 (flv1) / mp3 1.0 22KHz
- // fmt=6 -> flv: 480x360 (flv1) / mp3 1.0 44KHz (No more...)
- // fmt=13 -> 3gp: 176x144 (mpg4) / ??? 2.0 8KHz
- // fmt=17 -> 3gp: 176x144 (mpg4) / ??? 1.0 22KHz
- // fmt=18 -> mp4: 480x360 (H264) / AAC 2.0 44KHz
- // fmt=22 -> mp4: 1280x720 (H264) / AAC 2.0 44KHz
- // fmt=34 -> flv: 320x180 (flv?) / ??? 2.0 44KHz (default now)
- // fmt=35 -> flv: 640x380 (flv?) / ??? 2.0 44KHz
- // YouTube URL: http://www.youtube.com/watch?v=[video_id] &fmt=[selected_fmt] &hl=[lang]
- // YouTube download link: http://www.youtube.com/get_video?video_id=[video_id]&t=[t_id]&fmt=[download_fmt]
- ( function() {
- //======================================== USER SETTING ==================================================//
- // Updater
- const YOUTUBE_ENHANCER_UPDATER_STATUS = 0; // -1=Disable / 0=No change / 1=Enable
- // Cleanning flashvars...
- const CLEAN_FLASHVARS = 1; // 0=disable / 1=enable cleanning
- const DISABLE_ANNOTATIONS = 0; // work only when CLEAN_FLASHVARS is enabled
- const DISABLE_SUBTITLES = 0; // work only when CLEAN_FLASHVARS is enabled
- // Video display Config
- const ENABLE_4DV3_VIDEO_RESIZING = 1; // 0=Normal size / 1=More height / 2=Largest size
- const ENABLE_WIDE_VIDEO_RESIZING = 1; // 0=Normal size / 1=Largest size
- const ENABLE_TITLE_HIDING = 1; // 0=Show Title / 1=Hide Title
- //======================================== ADVANCED SETTING ==============================================//
- // light or dark ? // false=Light colors / true=Dark colors
- const USE_DARK_COLORS=(GetLuminosity(window.getComputedStyle(document.body, null).backgroundColor)<128);
- // Color for Download Link
- var COLOR_DL_OPTIONS_BORDER = '#DDDDDD';
- var COLOR_DL_OPTIONS_BACKGROUND = '#F8E0E0';
- var COLOR_DL_OPTIONS_TEXT = '#6666FF';
- var COLOR_DL_POPUP_BORDER = '#000000';
- var COLOR_DL_POPUP_ARROW = '#000000';
- var COLOR_DL_POPUP_TEXT = '#000000';
- var COLOR_DL_POPUP_BG_BLUE_OUT = '#DDDDFF';
- var COLOR_DL_POPUP_BG_BLUE_IN = '#CCCCFF';
- var COLOR_DL_POPUP_BG_RED_OUT = '#FFDDDD';
- var COLOR_DL_POPUP_BG_RED_IN = '#FFCCCC';
- // Color for Media Controller
- var COLOR_MC_BORDER = '#CCCCCC';
- var COLOR_MC_BACKGROUND = '#E8E8E8';
- var COLOR_MC_TEXT_OUT = '#000000';
- var COLOR_MC_TEXT_ACTION_IN = '#E00000';
- var COLOR_MC_TEXT_TOGGLE_IN = '#00C040';
- var COLOR_MC_TOGGLE_BEG_END = '#FFDD00';
- var COLOR_MC_TOGGLE_LOOP = '#BBBBFF';
- var COLOR_MC_BG_RED = '#FFF0F0';
- var COLOR_MC_BG_BLUE_OUT = '#F0F0FF';
- var COLOR_MC_BG_BLUE_IN = '#E0E0FF';
- var COLOR_MC_TEXT_BLUE = '#0033CC';
- if (USE_DARK_COLORS==true) {
- // Color for Download Link
- COLOR_DL_OPTIONS_BORDER = '#666666';
- COLOR_DL_OPTIONS_BACKGROUND = '#5C3C3C';
- COLOR_DL_OPTIONS_TEXT = '#9999FF';
- COLOR_DL_POPUP_BORDER = '#888888';
- COLOR_DL_POPUP_ARROW = '#FFFFFF';
- COLOR_DL_POPUP_TEXT = '#FFFFFF';
- COLOR_DL_POPUP_BG_BLUE_OUT = '#444466';
- COLOR_DL_POPUP_BG_BLUE_IN = '#222266';
- COLOR_DL_POPUP_BG_RED_OUT = '#664444';
- COLOR_DL_POPUP_BG_RED_IN = '#662222';
- // Color for Media Controller
- COLOR_MC_BORDER = '#666666';
- COLOR_MC_BACKGROUND = '#3C3C3C';
- COLOR_MC_TEXT_OUT = '#B06000';
- COLOR_MC_TEXT_ACTION_IN = '#FF0000';
- COLOR_MC_TEXT_TOGGLE_IN = '#00C040';
- COLOR_MC_TOGGLE_BEG_END = '#888800';
- COLOR_MC_TOGGLE_LOOP = '#4444BB';
- COLOR_MC_BG_RED = '#5C3C3C';
- COLOR_MC_BG_BLUE_OUT = '#3C3C5C';
- COLOR_MC_BG_BLUE_IN = '#3C3C8C';
- COLOR_MC_TEXT_BLUE = '#0066FF';
- }
- // RollOver Config
- const ROLLOVER_DELAY_INIT = 200; // Initial delay
- const ROLLOVER_DELAY_LOAD = 50; // Small delay for testing if all images is loaded
- const ROLLOVER_DELAY_CONT = 800; // Normal delay of the rollover
- // Constants (Not important)
- const WATCH_VIDEO_INFO = 'watch-channel-vids-div'; // To get his background and border color
- const WATCH_MORE_FROM = 'watch-channel-vids-body'; // To add a load event in change_link()
- const WATCH_RELATED_VIDS = 'watch-related-vids-body'; // To add a load event in change_link()
- const PLAYLIST_PANEL = 'playlist-panel'; // To add a load event in change_link()
- const WATCH_SEARCH_RES = 'watch_search_results'; // To add a load event in change_link()
- const WATCH_PROMOTED = 'watch-promoted-videos-container'; // Used to remove the parent
- const WATCH_QUAL_SETTING = 'watch-video-quality-setting'; // Used to remove it
- const DEFAULT_LANG_BOX = 'default-language-box'; // Used to remove it
- const WATCH_URL_FIELD = 'watch-url-field'; // Add fmt
- // Constants (Better to have)
- const WATCH_PLAYER_DIV = 'watch-player-div'; // Used to retrieve the Video Embed if not found
- const WATCH_RATINGS_VIEW = 'watch-main-area'; // Used to append the Quality Selector
- // Constants (Important)
- const WATCH_TITLE_DIV = 'watch-vid-title'; // Div id of the video title
- const YT_PLAYER_EMBED = 'movie_player'; // Default Video Embed id
- const FMT_HIGH_QUALITY_FLV = 35;
- //*************************************** Languages support **********************************************//
- function get_text_DL(lang,variable) {
- switch(variable) {
- case "dlink": switch (lang) {
- // from Youtube Setting or Youtube URL (17 Languages actually)
- case "zh-cn": return "下载";
- case "zh-tw": return "下載";
- case "ja": return "ダウンロード";
- case "ko": return "다운로드";
- case "de": return "Herunterladen";
- default: // Default is set to English
- case "en": case "en-gb": return "Download";
- case "es": case "es-mx": return "Descargar";
- case "fr": return "Télécharger";
- case "it": return "Scaricare";
- case "nl": return "Downloaden";
- case "pl": return "Pobrać";
- case "pt": return "Baixar";
- case "ru": return "скачать";
- case "cs": return "Stáhnout";
- case "sv": return "Hämta";
- // from Browser Setting...
- case "ar": return "تحميل";
- }
- case "omenu": switch (lang) {
- case "zh-cn": return "选项";
- case "zh-tw": return "選項";
- case "ja": return "オプション";
- case "ko": return "옵션";
- case "de": return "Optionen";
- default:
- case "en": case "en-gb": return "Options";
- case "es": case "es-mx": return "Opciones";
- case "fr": return "Options";
- case "it": return "Opzioni";
- case "nl": return "Opties";
- case "pl": return "Opcje";
- case "pt": return "Opções";
- case "ru": return "Вариантов";
- case "ar": return "خيارات";
- }
- case "qual1": switch (lang) {
- case "zh-cn": return "1: 集下载链接到同一质量的视频观看";
- case "zh-tw": return "1: 集下載鏈接到同一質量的視頻觀看";
- case "ja": return "1: ダウンロードリンクを設定するの閲覧、ビデオの品質と同じ";
- case "ko": return "1: 설정 다운로드 링크를 볼 비디오의 품질은 동일";
- case "de": return "1: Gesetzte Downloadverbindung zur gleichen Qualität des gesehenen Videos";
- default:
- case "en": case "en-gb": return "1: Set download link to the same Quality of the viewed video";
- case "es": case "es-mx": return "1: Acoplamiento de la transferencia directa a la misma calidad del vídeo visto";
- case "fr": return "1: Lien de téléchargement vers la vidéo de même qualité que celle affiché";
- case "it": return "1: Impostare link per scaricare la stessa qualità dei video visualizzati";
- case "nl": return "1: Stel download link naar dezelfde kwaliteit van de video bekeken";
- case "pl": return "1: Ustaw link do pobierania takiej samej jakości na oglądany film wideo";
- case "pt": return "1: Ligação ajustada de transferência à mesma qualidade do vídeo visto";
- case "ru": return "1: Установить ссылку на тот же качества рассматривается видео";
- case "ar": return "1: تحميل نفس نوعية ملف الفيديو الحاليه";
- }
- case "qual2": switch (lang) {
- case "zh-cn": return "2: 集下载链接到一个高品质的视频文件(的FLV或的MP4)";
- case "zh-tw": return "2: 集下載鏈接到一個高品質的視頻文件(的FLV或的MP4)";
- case "ja": return "2: 高品質のビデオファイル(FLVのオレゴンのMP4)に設定ダウンロードリンク";
- case "ko": return "2: 높은 품질의 비디오 파일 (대한 FLV 또는는 MP4)로 설정 다운로드 링크";
- case "de": return "2: Gesetzte Downloadverbindung zu einer videoakte der Qualitäts (FLV oder MP4)";
- default:
- case "en": case "en-gb": return "2: Set download link to a High Quality video file (FLV or MP4)";
- case "es": case "es-mx": return "2: Acoplamiento de la transferencia directa a un archivo video de la alta calidad (FLV o MP4)";
- case "fr": return "2: Lien de téléchargement vers la vidéo en haute qualité (FLV ou MP4)";
- case "it": return "2: Impostare il download link ad un alta qualità di file video (FLV o MP4)";
- case "nl": return "2: Stel download link naar een High Quality video bestand (of MP4 FLV)";
- case "pl": return "2: Ustaw link do wysokiej jakości plików wideo (MP4 lub FLV)";
- case "pt": return "2: Ligação ajustada de transferência a uma lima video da alta qualidade (FLV ou MP4)";
- case "ru": return "2: Установка сети связи с высоким качеством видео файлов (FLV или MP4)";
- case "ar": return "2: تحميل جودة عالية لملف الفيديو بصيغة (FLV أو MP4)";
- }
- case "qual3": switch (lang) {
- case "zh-cn": return "3: 集下载链接到一个高品质的MP4视频文件";
- case "zh-tw": return "3: 集下載鏈接到一個高品質的MP4視頻文件";
- case "ja": return "3: は、高品質のビデオを設定するのMP4ファイルのダウンロードリンク";
- case "ko": return "3: a는 MP4 고품질 동영상으로 설정 파일 다운로드 링크";
- case "de": return "3: Gesetzte Downloadverbindung zu einer videoakte der Qualitäts MP4";
- default:
- case "en": case "en-gb": return "3: Set download link to a MP4 High Quality video file";
- case "es": case "es-mx": return "3: Acoplamiento de la transferencia directa a un archivo video de la alta calidad MP4";
- case "fr": return "3: Lien de téléchargement vers la vidéo en MP4 de haute qualité";
- case "it": return "3: Impostare il download link a un MP4 alta qualità di file video";
- case "nl": return "3: Stel download link naar een MP4 High Quality video bestand";
- case "pl": return "3: Ustaw link do pobrania MP4 wysokiej jakości plików wideo";
- case "pt": return "3: Ligação ajustada de transferência a uma lima video da alta qualidade MP4";
- case "ru": return "3: Установить ссылку на MP4 высокого качества видео-файл";
- case "ar": return "3: تحميل الملف بجودة عالية بصيغة MP4";
- }
- case "auto1": switch (lang) {
- case "zh-cn": return "1: 手册";
- case "zh-tw": return "1: 手冊";
- case "ja": return "1: マニュアル";
- case "ko": return "1: 매뉴얼";
- case "de": return "1: Manueller Start";
- default:
- case "en": case "en-gb": return "1: Set Autoplay to OFF";
- case "es": case "es-mx": return "1: Comienzo manual";
- case "fr": return "1: Démarrage manuel";
- case "it": return "1: Avviamento manuale";
- case "nl": return "1: Zet autoplay uit";
- case "pl": return "1: Podręcznik";
- case "pt": return "1: Arranque manual";
- case "ru": return "1: Руководство";
- case "ar": return "1: تشغيل تلقائي يعمل";
- }
- case "auto2": switch (lang) {
- default:
- case "en": case "en-gb": return "2: Set Autoplay to Buffering";
- case "fr": return "2: Mise en buffer";
- }
- case "auto3": switch (lang) {
- case "zh-cn": return "3: 自动";
- case "zh-tw": return "3: 自動";
- case "ja": return "3: 自動起動";
- case "ko": return "3: 자동";
- case "de": return "3: Automatischer Start";
- default:
- case "en": case "en-gb": return "3: Set Autoplay to ON";
- case "es": case "es-mx": return "3: Comienzo automático";
- case "fr": return "3: Démarrage automatique";
- case "it": return "3: Avviamento automatico";
- case "nl": return "3: Zet autoplay aan";
- case "pl": return "3: automatyczne rozpoczęcie";
- case "pt": return "3: Arranque automático";
- case "ru": return "3: Автоматический пуск";
- case "ar": return "3: تشغيل تلقائي لايعمل";
- }
- }
- return "";
- }
- function get_text_QS(lang,variable) {
- switch(variable) {
- case "link1": switch (lang) {
- case "zh-cn": return "查看低质量 (flv)";
- case "zh-tw": return "查看低質量 (flv)";
- case "ja": return "対象低品質 (flv)";
- case "ko": return "저가에 품질보기 (flv)";
- case "de": return "Ansicht in niedrige Qualität (flv)";
- default:
- case "en": case "en-gb": return "View in Low Quality (flv)";
- case "es": case "es-mx": return "Visión en la baja calidad (flv)";
- case "fr": return "Voir en Basse Qualité (flv)";
- case "it": return "Visualizza in bassa qualità (flv)";
- case "nl": return "Bekijk in lage kwaliteit (flv)";
- case "pl": return "Widok w niskiej jakości (flv)";
- case "pt": return "Vista na má qualidade (flv)";
- case "ru": return "Посмотреть с низким качеством (flv)";
- case "ar": return "عرض جودة منخفضة (flv)";
- }
- case "link2": switch (lang) {
- case "zh-cn": return "观高品质 (flv)";
- case "zh-tw": return "觀高品質 (flv)";
- case "ja": return "高品質表示 (flv)";
- case "ko": return "보기에 품질 높은 (flv)";
- case "de": return "Ansicht in hoher Qualität (flv)";
- default:
- case "en": case "en-gb": return "View in High Quality (flv)";
- case "es": case "es-mx": return "Visión en la alta calidad (flv)";
- case "fr": return "Voir en Haute Qualité (flv)";
- case "it": return "Visualizza in alta qualità (flv)";
- case "nl": return "Bekijk in hoge kwaliteit (flv)";
- case "pl": return "Widok w wysokiej jakości (flv)";
- case "pt": return "Vista na alta qualidade (flv)";
- case "ru": return "Посмотреть с высоким качеством (flv))";
- case "ar": return "عرض جودة عاليه (flv)";
- }
- case "link3": switch (lang) {
- case "zh-cn": return "观高品质 (mp4)";
- case "zh-tw": return "觀高品質 (mp4)";
- case "ja": return "高品質表示 (mp4)";
- case "ko": return "보기에 품질 높은 (mp4)";
- case "de": return "Ansicht in hoher Qualität (mp4)";
- default:
- case "en": case "en-gb": return "View in High Quality (mp4)";
- case "es": case "es-mx": return "Visión en la alta calidad (mp4)";
- case "fr": return "Voir en Haute Qualité (mp4)";
- case "it": return "Visualizza in alta qualità (mp4)";
- case "nl": return "Bekijk in hoge kwaliteit (mp4)";
- case "pl": return "Widok w wysokiej jakości (mp4)";
- case "pt": return "Vista na alta qualidade (mp4)";
- case "ru": return "Посмотреть с высоким качеством (mp4)";
- case "ar": return "عرض جودة عاليه (mp4)";
- }
- case "link4": switch (lang) {
- case "zh-cn": return "检视HD质量 (mp4)";
- case "zh-tw": return "檢視HD質量 (mp4)";
- case "ja": return "HDでの表示品質 (mp4)";
- case "ko": return "HD에서 품질 평가보기 (mp4)";
- case "de": return "Ansicht in HD-Qualität (mp4)";
- default:
- case "en": case "en-gb": return "View in HD Quality (mp4)";
- case "es": case "es-mx": return "Visión en la HD calidad (mp4)";
- case "fr": return "Voir en Qualité HD (mp4)";
- case "it": return "Visualizza in qualità HD (mp4)";
- case "nl": return "Bekijk in HD kwaliteit (mp4)";
- case "pl": return "Wyświetl w jakości HD (mp4)";
- case "pt": return "Ver na qualidade HD (mp4)";
- case "ru": return "Посмотреть в HD качества (mp4)";
- case "ar": return "رأي في نوعية HD (mp4)"
- }
- }
- return "";
- }
- function get_text_MC(lang,variable) {
- switch(variable) {
- case "stepback": switch (lang) {
- case "zh-cn": return "退后一步";
- case "zh-tw": return "退後一步";
- case "ja": return "後退";
- case "ko": return "뒤로 물러서";
- case "de": return "Schritt zurück";
- default:
- case "en": case "en-gb": return "Step back";
- case "es": case "es-mx": return "Paso atrás";
- case "fr": return "Pas arrière";
- case "it": return "Passo indietro";
- case "nl": return "Stap terug";
- case "pl": return "Krok wstecz";
- case "pt": return "Passo para trás";
- case "ru": return "шаг назад";
- case "ar": return "خطوة إلى الوراء";
- }
- case "stop": switch (lang) {
- case "zh-cn": return "停止";
- case "zh-tw": return "停止";
- case "ja": return "停止する";
- case "ko": return "멈추다";
- case "de": return "Erlass";
- default:
- case "en": case "en-gb": return "Stop";
- case "es": case "es-mx": return "Paro";
- case "fr": return "Arrêt";
- case "it": return "Arresto";
- case "nl": return "Stop";
- case "pl": return "Zatrzymać";
- case "pt": return "Acórdão";
- case "ru": return "Остановка";
- case "ar": return "توقف";
- }
- case "step": switch (lang) {
- case "zh-cn": return "向前迈出的一步";
- case "zh-tw": return "向前邁出的一步";
- case "ja": return "一歩前進";
- case "ko": return "앞으로";
- case "de": return "Schritt nach vorn";
- default:
- case "en": case "en-gb": return "Step forward";
- case "es": case "es-mx": return "Paso adelante";
- case "fr": return "Pas avant";
- case "it": return "Passo in avanti";
- case "nl": return "Stap voorwaarts";
- case "pl": return "Krok naprzód";
- case "pt": return "Passo em frente";
- case "ru": return "шаг вперед";
- case "ar": return "خطوة إلى الأمام";
- }
- case "play": switch (lang) {
- case "zh-cn": return "读 / 重新启动";
- case "zh-tw": return "讀 / 重新啟動";
- case "ja": return "読取り / 再起動";
- case "ko": return "읽기 / 다시 시작";
- case "de": return "Lesen / ankurbeln";
- default:
- case "en": case "en-gb": return "Play / Revive";
- case "es": case "es-mx": return "Leer / Reactivar";
- case "fr": return "Lire / Relancer";
- case "it": return "Giochi / Faccia rivivere";
- case "nl": return "Lees / Restart";
- case "pl": return "Odczyt / Uruchom";
- case "pt": return "Ler / relançar";
- case "ru": return "Прочитать / Перезагрузка";
- case "ar": return "تشغيل / استئناف";
- }
- case "pause": switch (lang) {
- case "zh-cn": return "休息";
- case "zh-tw": return "休息";
- case "ja": return "壊す";
- case "ko": return "휴식";
- case "de": return "Pause";
- default:
- case "en": case "en-gb": return "Pause";
- case "es": case "es-mx": return "Pausa";
- case "fr": return "Pause";
- case "it": return "Pausa";
- case "nl": return "Pauze";
- case "pl": return "Złamać";
- case "pt": return "Pausa";
- case "ru": return "Перерыв";
- case "ar": return "ايقاف مؤقت";
- }
- case "begin": switch (lang) {
- case "zh-cn": return "开始";
- case "zh-tw": return "開始";
- case "ja": return "開始する";
- case "ko": return "시작";
- case "de": return "Beginn";
- default:
- case "en": case "en-gb": return "Begin";
- case "es": case "es-mx": return "Comience";
- case "fr": return "Début";
- case "it": return "Cominci";
- case "nl": return "Beginnen";
- case "pl": return "Zacząć";
- case "pt": return "Comece";
- case "ru": return "Начать";
- case "ar": return "يبدأ";
- }
- case "loop": switch (lang) {
- case "zh-cn": return "环";
- case "zh-tw": return "環";
- case "ja": return "ループ";
- case "ko": return "루프";
- case "de": return "Schleife";
- default:
- case "en": case "en-gb": return "Loop";
- case "es": case "es-mx": return "Lazo";
- case "fr": return "En boucle";
- case "it": return "Ciclo";
- case "nl": return "Loop";
- case "pl": return "Pętla";
- case "pt": return "Laço";
- case "ru": return "Петля";
- case "ar": return "التفاف";
- }
- case "rewind": switch (lang) {
- case "zh-cn": return "倒带";
- case "zh-tw": return "倒帶";
- case "ja": return "巻き戻し";
- case "ko": return "되감기";
- case "de": return "Rückspulen";
- default:
- case "en": case "en-gb": return "Rewind";
- case "es": case "es-mx": return "Rebobinado";
- case "fr": return "Retour arrière";
- case "it": return "Riavvolgere";
- case "nl": return "Rewind";
- case "pl": return "Rewind";
- case "pt": return "Rebobinação";
- case "ru": return "Перемотка";
- case "ar": return "رجوع";
- }
- case "end": switch (lang) {
- case "zh-cn": return "完";
- case "zh-tw": return "完";
- case "ja": return "終わり";
- case "ko": return "끝";
- case "de": return "Ende";
- default:
- case "en": case "en-gb": return "End";
- case "es": case "es-mx": return "Final";
- case "fr": return "Fin";
- case "it": return "Fine";
- case "nl": return "Eindigen";
- case "pl": return "Koniec";
- case "pt": return "Fim";
- case "ru": return "Конец";
- case "ar": return "النهاية";
- }
- case "kill": switch (lang) {
- case "zh-cn": return "双击杀害网流和播放器";
- case "zh-tw": return "雙擊殺害網流和播放器";
- case "ja": return "ダブルクリックすると、 NetStreamとは、プレーヤーを殺すために";
- case "ko": return "NetStream을 더블 클릭하고 플레이어를 죽이고";
- case "de": return "Doppeltes Klicken, zum des NetStream und des Spielers zu töten";
- default:
- case "en": case "en-gb": return "Double click to kill the NetStream and the player";
- case "es": case "es-mx": return "Tecleo doble para matar el NetStream y al jugador";
- case "fr": return "Double click pour stopper le NetStream et le lecteur Vidéo";
- case "it": return "Fare doppio clic su di uccidere il NetStream e il giocatore";
- case "nl": return "Dubbelklik tot de dood van de NetStream en de speler";
- case "pl": return "Dwukrotnie kliknij, aby zabić NetStream i odtwarzacz";
- case "pt": return "Clique dobro para matar o NetStream e o jogador";
- case "ru": return "Дважды щелкните убить NetStream и игрок";
- case "ar": return "انقر نقره مزدوجه لايقاف العرض";
- }
- case "embed": switch (lang) {
- case "zh-cn": return "Embed 链接";
- case "zh-tw": return "Embed 鏈接";
- case "ja": return "Embed リンク";
- case "ko": return "Embed 링크";
- case "de": return "Embed Verbindung";
- default:
- case "en": case "en-gb": return "Embed Link";
- case "es": case "es-mx": return "Acoplamiento de Embed";
- case "fr": return "Lien Embed";
- case "it": return "Collegamento di Embed";
- case "nl": return "Embed Koppelen";
- case "pl": return "Embed Łącze";
- case "pt": return "Ligação de Embed";
- case "ru": return "Embed Ссылка";
- case "ar": return "فتح في لسان جديد";
- }
- case "fscr": switch (lang) {
- case "zh-cn": return "全屏链接";
- case "zh-tw": return "全屏鏈接";
- case "ja": return "フルスクリーンのリンク";
- case "ko": return "전체 링크";
- case "de": return "Auf dem ganzen Bildschirmverbindung";
- default:
- case "en": case "en-gb": return "Fullscreen Link";
- case "es": case "es-mx": return "Acoplamiento de plena pantalla";
- case "fr": return "Lien plein écran";
- case "it": return "Collegamento a schermo pieno";
- case "nl": return "Fullscreen Link";
- case "pl": return "Link do fullscreen";
- case "pt": return "Ligação da tela cheia";
- case "ru": return "Fullscreen ссылка";
- case "ar": return "ملء الشاشة";
- }
- }
- return "";
- }
- function get_text_Updater(lang,variable) {
- switch(variable) {
- case "disa": switch (lang) {
- default:
- case "en": case "en-gb": return "Updater Is Now Disabled";
- case "fr": return "La mise à jour est maintenant désactivé";
- }
- case "enab": switch (lang) {
- default:
- case "en": case "en-gb": return "Updater Is Now Enabled";
- case "fr": return "La mise à jour est maintenant activé";
- }
- case "foun": switch (lang) {
- default:
- case "en": case "en-gb": return "New Update Found";
- case "fr": return "Nouvelle mise à jour trouvée";
- }
- case "dnow": switch (lang) {
- default:
- case "en": case "en-gb": return "Visit Install Page";
- case "fr": return "Visiter la page d'installation";
- }
- case "dlat": switch (lang) {
- default:
- case "en": case "en-gb": return "Later";
- case "fr": return "Plus tard";
- }
- }
- return "";
- }
- function test_lang(lang) {
- switch(lang) {
- case "zh-cn": case "zh-tw": case "ja": case "ko": case "de":
- case "en": case "en-gb": case "es": case "es-mx": case "fr":
- case "it": case "nl": case "pl": case "pt": case "ru":
- case "cs": case "sv": // Tchèque & Suédois
- case "ar": case "www": return true;
- }
- return false;
- }
- //***************************************** Page settings ************************************************//
- // Get youtube locale (for languages support)
- function get_page_lang() {
- //== Use Mozilla browser language when youtube don't support it...
- var lang=String.substr(window.navigator.language,0,2).toLowerCase();
- if(lang=="ar") { // Arabic (ar)
- return lang;
- }
- //== via URL
- var language=window.location.search.match(/[?&]hl=([^(\&|$)]*)/i);
- if(language!=null) {
- lang=language[1].replace(/_/,"-").toLowerCase();
- if(test_lang(lang)) {
- GM_setValue("Youtube_Download_Locale_Setting",lang);
- return lang;
- }
- lang=String.substr(lang,0,2);
- if(test_lang(lang)) {
- GM_setValue("Youtube_Download_Locale_Setting",lang);
- return lang;
- }
- }
- //== via watch page
- var language=unsafeWindow.ytLocale;
- if(isDefined(language)) {
- lang=language.replace(/_/,"-").toLowerCase();
- if(test_lang(lang)) {
- GM_setValue("Youtube_Download_Locale_Setting",lang);
- return lang;
- }
- lang=String.substr(lang,0,2);
- if(test_lang(lang)) {
- GM_setValue("Youtube_Download_Locale_Setting",lang);
- return lang;
- }
- }
- //== via old watch page setting
- lang=GM_getValue("Youtube_Download_Locale_Setting","www");
- return lang;
- }
- function get_page_fmt() {
- var selected_fmt=window.location.search.match(/[?&]fmt=(\d*)/i);
- if(selected_fmt==null) { selected_fmt=0; } else { selected_fmt=selected_fmt[1]; }
- if(!(isPositiveInteger(selected_fmt))) { selected_fmt=0; }
- return(selected_fmt);
- }
- function check_on_youtube() {
- if(window.location.host.match(/^\w+?\.youtube\.\w+$/i)) { return 1; }
- return 0;
- }
- function check_on_watchpage() {
- if(window.location.pathname.match(/^\/watch$/i)) { return 1; }
- return 0;
- }
- function check_on_youtubewatchpage() {
- return check_on_youtube() && check_on_watchpage();
- }
- function get_PlayerEmbed_element() {
- var playerEmbed = document.getElementById(YT_PLAYER_EMBED);
- if(playerEmbed) { return playerEmbed; }
- var wpd = document.getElementById(WATCH_PLAYER_DIV);
- if(wpd) {
- var temp=null;
- try { temp=wpd.getElementsByTagName("embed"); } catch(err) { temp=null; }
- if(temp && temp[0]) { temp[0].setAttribute('id',YT_PLAYER_EMBED); return temp[0]; }
- }
- return null;
- }
- //************************************************************
- //***** Download Link ****************************************
- //************************************************************
- function clean_filename(filename) {
- // Clean filename (UNICODE Method)
- //filename = filename.replace(/\ /g,String.fromCharCode(65279));
- filename = filename.replace(/\:/g,String.fromCharCode(65306));
- filename = filename.replace(/\\/g,String.fromCharCode(65340));
- filename = filename.replace(/\//g,String.fromCharCode(65295));
- filename = filename.replace(/\</g,String.fromCharCode(65308));
- filename = filename.replace(/\>/g,String.fromCharCode(65310));
- filename = filename.replace(/\*/g,String.fromCharCode(65290));
- filename = filename.replace(/\?/g,String.fromCharCode(65311));
- filename = filename.replace(/\"/g,String.fromCharCode(65282));
- filename = filename.replace(/\|/g,String.fromCharCode(65372));
- // Clean filename (Underline Method)
- //filename = filename.replace(/[\:\\\/\<\>\?\*\"\|]/g, "_");
- return filename;
- }
- function get_clean_flashvars(flashvars) {
- if(CLEAN_FLASHVARS<=0) { return flashvars; }
- flashvars=flashvars+'&';
- var res; var res_annotations; var res_subtitles; var newfv='';
- do {
- res=flashvars.match(/^([^=]+?)\=([^\&]*?)\&(.*?)$/i);
- if(!res) { break; }
- var variable=res[1];
- var value=res[2];
- flashvars=res[3];
- if(DISABLE_ANNOTATIONS>0) { res_annotations=false; } else { res_annotations=variable.match(/^(iv_module|iv_storage_server)$/i); }
- if(DISABLE_SUBTITLES>0) { res_subtitles=false; } else { res_subtitles=variable.match(/^(subtitle_module|ttsurl)$/i); }
- res=variable.match(/^(BASE_YT_URL|rel|vq|ftm_map|video_id|t|sk|hl|fs|playnext|enablejsapi|autoplay)$/i)
- if(res || res_annotations || res_subtitles) {
- if(newfv!='') newfv+='&';
- newfv+=variable+'='+value;
- }
- } while(true);
- return newfv;
- }
- function add_ext(filename,fmt) {
- if(fmt==13 || fmt==17) { return(filename+".3gp"); }
- if(fmt==18 || fmt==22) { return(filename+".mp4"); }
- return(filename+".flv");
- }
- function url_fmt(fmt) {
- if(fmt==0) { return(""); }
- return("&fmt="+fmt);
- }
- function get_fmt_array(flashvars) {
- var fmt_array=[]; fmt_array[0]=true;
- if(!flashvars) { return fmt_array; }
- var fmt_map = flashvars.match(/fmt_map\=([^(\&|$)]*)/i);
- if(!fmt_map) { return fmt_array; }
- if(fmt_map[1]=='') { return fmt_array; }
- fmt_array[0]=false;
- fmt_map = fmt_map[1]+',';
- while(fmt_map=fmt_map.match(/^(\d+)[^,]*,(.*)$/)) {
- fmt_array[fmt_map[1]]=true;
- fmt_map=fmt_map[2];
- }
- return fmt_array;
- }
- function get_dl_fmt(fmt,flashvars,quality_setting) {
- var wide=(unsafeWindow.isWidescreen==true);
- var HDAvailable=(unsafeWindow.isHDAvailable==true);
- var fmt_first = flashvars.match(/fmt_map\=(\d+)/i);
- if(fmt_first) { fmt_first=fmt_first[1]; } else { fmt_first=0; }
- var fmt_array=get_fmt_array(flashvars);
- var dl_fmt=fmt;
- switch(quality_setting) {
- case 1:
- if(fmt_array[ 0]) { dl_fmt= 0; } // If no fmt_map, then the displayed video is LQ-FLV1
- if(fmt_array[ 5]) { dl_fmt= 5; }
- if(fmt_array[34]) { dl_fmt=34; } // fmt_map=34 is the new default
- break;
- case 2:
- dl_fmt=fmt_first; // Set the quality to the first one detected in the fmt_map
- if(HDAvailable || fmt_array[22]) { dl_fmt=22; } // Set to HD if available
- break;
- case 3:
- dl_fmt=18; // Default -> Set HQ-MPG4
- if((fmt==22) && (!fmt_array[22])) { dl_fmt=18; } // No HD-MPG4 -> Set HQ-MPG4
- if((fmt==18) && (!fmt_array[18])) { dl_fmt=FMT_HIGH_QUALITY_FLV; } // No HQ-MPG4 -> Set HQ-FLV1
- if(fmt_array[22] || HDAvailable) { dl_fmt=22; } // HD Available -> Set HD-MPG4
- break;
- }
- return dl_fmt;
- }
- function add_dl_qual_links(page_lang, selected_fmt) {
- var wvt = document.getElementById(WATCH_TITLE_DIV);
- if(!(wvt)) { show_alert('Download Link Disabled : "'+WATCH_TITLE_DIV+'" not found'); return; }
- var playerEmbed = get_PlayerEmbed_element();
- var flashvars='';
- if(playerEmbed) { // Get flashvars from the embed video
- flashvars = playerEmbed.getAttribute('flashvars');
- } else { // Get flashvars from the fullscreen link
- flashvars = get_fullscreenURL();
- }
- if(!flashvars) { show_alert('Download Link Disabled : "flashvars" not found'); return; }
- var Options_title = HtmlUnicodeDecode(get_text_DL(page_lang,"omenu"));
- var t_id = flashvars.match(/\&t=([^(\&|$)]*)/i)[1];
- var video_id = flashvars.match(/video_id=([^(\&|$)]*)/i)[1];
- var video_url = window.location.protocol+'//'+window.location.host+'/get_video?video_id='+video_id+'&t='+t_id;
- // Retrieve fmt
- var download_fmt = get_dl_fmt(selected_fmt,flashvars,GM_getValue("Youtube_Download_Quality_Setting",2));
- // === Add the download link and the filename ready to copy
- // Retrieve filename
- var filename = clean_filename(wvt.getElementsByTagName("h1")[0].textContent);
- if(filename.length<1) {filename="video";}
- // Getting BackgroundColor and BorderColor
- var title_bg_color="#EEEEEE";
- var title_border_color="#CCCCCC";
- var wcvd = document.getElementById(WATCH_VIDEO_INFO);
- if (wcvd) {
- title_bg_color=window.getComputedStyle(wcvd, null).backgroundColor;
- title_border_color=window.getComputedStyle(wcvd, null).borderTopColor;
- }
- // Insert the new element code
- var newElement = document.createElement('div');
- newElement.setAttribute('style','margin:6px 0 6px 0; padding:3px 2px; border: 1px solid transparent');
- newElement.style.backgroundColor=title_bg_color;
- newElement.style.borderColor=title_border_color;
- var newElement1 = document.createElement('div');
- newElement1.setAttribute('style','position:absolute');
- newElement.appendChild(newElement1);
- var newElement2 = document.createElement('table');
- //newElement2.setAttribute('class','vListBox');
- newElement2.setAttribute('style','width:100%; height:18px; padding:0px');
- var newElement2tr = document.createElement('tr');
- var newElement2td1 = document.createElement('td');
- newElement2td1.setAttribute('style','width:18px; padding-left:2px;');
- newElement2td1.setAttribute('lang','fr');
- var newElement2td1Div = document.createElement('div');
- newElement2td1Div.setAttribute('title',Options_title);
- newElement2td1Div.setAttribute('style','line-height:18px;font-size:18px;cursor:pointer; color:'+COLOR_DL_OPTIONS_TEXT+' !important; background:'+COLOR_DL_OPTIONS_BACKGROUND+' !important; border: 1px solid '+COLOR_DL_OPTIONS_BORDER+' !important; margin:-2px;');
- newElement2td1Div.textContent=String.fromCharCode(10070);
- user_select(newElement2td1,'none');
- newElement2td1.appendChild(newElement2td1Div);
- newElement2tr.appendChild(newElement2td1);
- var newElement2td2 = document.createElement('td');
- newElement2td2.setAttribute('style','width:auto; padding:0 3px 0 5px; white-space:nowrap;');
- var newElement2td2A = document.createElement('a');
- newElement2td2A.setAttribute('target','_blank');
- newElement2td2A.setAttribute('class','hLink');
- newElement2td2A.setAttribute('title',filename);
- newElement2td2A.setAttribute('href',video_url+url_fmt(download_fmt));
- newElement2td2A.textContent=HtmlUnicodeDecode(get_text_DL(page_lang,"dlink"));
- newElement2td2.appendChild(newElement2td2A);
- user_select(newElement2td2,'none');
- newElement2tr.appendChild(newElement2td2);
- var newElement2td3 = document.createElement('td');
- newElement2td3.setAttribute('style','width:100%;');
- var newElement2td3Div = document.createElement('div');
- var newElement2td3Input = document.createElement('input');
- newElement2td3Input.setAttribute('style','border:0; width:500px; background:inherit !important; color:inherit !important;');
- newElement2td3Input.setAttribute('type','text');
- newElement2td3Input.setAttribute('readonly','readonly');
- newElement2td3Input.setAttribute('onClick','this.focus();this.select();');
- newElement2td3Input.setAttribute('value',add_ext(filename,download_fmt));
- //user_select(newElement2td3Input,'all');
- newElement2td3Div.appendChild(newElement2td3Input);
- newElement2td3.appendChild(newElement2td3Div);
- newElement2tr.appendChild(newElement2td3);
- newElement2.appendChild(newElement2tr);
- newElement.appendChild(newElement2);
- wvt.parentNode.insertBefore(newElement, wvt);
- // Resize the inputbox
- newElement2td3Input.style.width=newElement2td3Input.parentNode.clientWidth+"px";
- // Hiding the title
- if (ENABLE_TITLE_HIDING) { wvt.style.display = 'none'; }
- return Array(newElement1,newElement2td1);
- }
- function set_quality(quality, download_link_table, selected_fmt) {
- // Set new quality value
- GM_setValue("Youtube_Download_Quality_Setting",quality);
- // Retrieve fmt
- var download_fmt=0;
- var playerEmbed = get_PlayerEmbed_element();
- var flashvars='';
- if(playerEmbed) { // Get flashvars from the embed video
- flashvars = playerEmbed.getAttribute('flashvars');
- } else { // Get flashvars from the fullscreen link
- flashvars = get_fullscreenURL();
- }
- if(flashvars) {
- download_fmt = get_dl_fmt(selected_fmt,flashvars,quality);
- }
- // Change download link
- var linkdl = download_link_table.getElementsByTagName('a')[0];
- if (linkdl) {
- var linktext = linkdl.href.replace(/(\&?fmt\=\d+)/gi,"");
- linkdl.href=linktext+url_fmt(download_fmt);
- }
- // Change filename
- var YDF = download_link_table.getElementsByTagName('input')[0];
- if (YDF) {
- var filename= YDF.value.match(/^(.*)\.[\w\d]{3,4}$/);
- if(filename!=null) { YDF.value=add_ext(filename[1],download_fmt); }
- }
- }
- function menu_quality(quality_menu, quality) {
- // Change the position of the ">" in the menu box and close it
- if(quality_menu) {
- var div_Elem=quality_menu.getElementsByTagName("div");
- div_Elem[0].style.visibility="hidden";
- div_Elem[1].style.visibility="hidden";
- div_Elem[2].style.visibility="hidden";
- div_Elem[quality-1].style.visibility="visible";
- }
- }
- function menu_autoplay(autoplay_menu, select) {
- // Change the position of the ">" in the menu box and close it
- if(autoplay_menu) {
- var div_Elem=autoplay_menu.getElementsByTagName("div");
- div_Elem[0].style.visibility="hidden";
- div_Elem[1].style.visibility="hidden";
- div_Elem[2].style.visibility="hidden";
- div_Elem[select].style.visibility="visible";
- }
- }
- function event_setQuality(quality_select, selected_fmt) {
- var quality=quality_select.value;
- var quality_menu=quality_select.parentNode;
- switch (quality) {
- case 1: case 2: case 3:
- menu_quality(quality_menu, quality);
- set_quality(quality, quality_menu.parentNode.parentNode.nextSibling, selected_fmt);
- quality_menu.parentNode.style.display="none";
- }
- }
- function event_autoplay(autoplay_select) {
- var select=autoplay_select.value;
- var autoplay_menu=autoplay_select.parentNode;
- switch (select) {
- case 0: case 1: case 2:
- menu_autoplay(autoplay_menu, select);
- GM_setValue("Youtube_Download_Autoplay_Setting",select);
- autoplay_menu.parentNode.style.display="none";
- }
- }
- function make_options_menu(page_lang, selected_fmt, posMenuelem, OpenMenuElem) {
- if(posMenuelem && OpenMenuElem) {
- //== Make a menubox for Quality setting
- var MenuElem = document.createElement('div');
- MenuElem.setAttribute("style", "display:none; position: absolute; z-index: 99; margin:0; padding:0; width: 890px");
- var arrow = document.createElement('div')
- arrow.setAttribute('style','float:left; width:1em; font-weight:bold; color:'+COLOR_DL_POPUP_ARROW+' !important;');
- arrow.textContent='>';
- var u1_Elem = document.createElement('ul');
- u1_Elem.setAttribute("style","float:left; list-style-type:none; cursor:pointer; margin:1px; padding:0; border: 1px solid "+COLOR_DL_POPUP_BORDER+" !important; background-color: "+COLOR_DL_POPUP_BG_BLUE_OUT+";width:540px;");
- var li_Elem1=new Array();
- for(var h=0;h<=2;h++) {
- li_Elem1[h] = document.createElement('li');
- li_Elem1[h].setAttribute("style","margin:0; padding:5px; color:"+COLOR_DL_POPUP_TEXT+" !important;");
- li_Elem1[h].appendChild(arrow.cloneNode(true));
- li_Elem1[h].appendChild(document.createTextNode(HtmlUnicodeDecode(get_text_DL(page_lang,"qual"+(h+1)))));
- li_Elem1[h].addEventListener('mouseover' , function() { this.style.backgroundColor=COLOR_DL_POPUP_BG_BLUE_IN; }, true);
- li_Elem1[h].addEventListener('mouseout' , function() { this.style.backgroundColor=""; }, true);
- li_Elem1[h].setAttribute('value',h+1);
- li_Elem1[h].addEventListener('click' , function() { event_setQuality(this, selected_fmt); }, true);
- u1_Elem.appendChild(li_Elem1[h]);
- }
- MenuElem.appendChild(u1_Elem);
- //== Make a menubox for autostart
- var u2_Elem = document.createElement('ul');
- u2_Elem.setAttribute("style","float:left; list-style-type:none; cursor:pointer; margin:1px; padding:0; border: 1px solid "+COLOR_DL_POPUP_BORDER+" !important; background-color: "+COLOR_DL_POPUP_BG_RED_OUT+"; width:340px;");
- var li_Elem2=new Array();
- for(var h=0;h<=2;h++) {
- li_Elem2[h] = document.createElement('li');
- li_Elem2[h].setAttribute("style","margin:0; padding:5px; color:"+COLOR_DL_POPUP_TEXT+" !important;");
- if(h<2) { li_Elem2[h].appendChild(arrow.cloneNode(true)); } else { li_Elem2[h].appendChild(arrow); }
- li_Elem2[h].appendChild(document.createTextNode(HtmlUnicodeDecode(get_text_DL(page_lang,"auto"+(h+1)))));
- li_Elem2[h].addEventListener('mouseover' , function() { this.style.backgroundColor=COLOR_DL_POPUP_BG_RED_IN; }, true);
- li_Elem2[h].addEventListener('mouseout' , function() { this.style.backgroundColor=""; }, true);
- li_Elem2[h].setAttribute('value',h);
- li_Elem2[h].addEventListener('click' , function() { event_autoplay(this); }, true);
- u2_Elem.appendChild(li_Elem2[h]);
- }
- MenuElem.appendChild(u2_Elem);
- // Select position of the menubox on top of the button
- user_select(MenuElem,'none');
- posMenuelem.appendChild(MenuElem);
- MenuElem.style.left = "-4px";
- MenuElem.style.top = (-2-getDisplayHeight(MenuElem))+"px";
- //== Make the openbutton to link to the menubox (with display update of the autoplay setting)
- OpenMenuElem.addEventListener('click', function() { menu_autoplay(u2_Elem, GM_getValue("Youtube_Download_Autoplay_Setting",2)); swap_display(MenuElem); }, true);
- // Update the menubox from the setting
- menu_quality (u1_Elem, GM_getValue("Youtube_Download_Quality_Setting" ,2));
- menu_autoplay(u2_Elem, GM_getValue("Youtube_Download_Autoplay_Setting",2));
- }
- }
- //** === Download Link === **//
- function add_download_link(page_lang, selected_fmt) {
- if(check_on_youtubewatchpage()) {
- els=add_dl_qual_links(page_lang, selected_fmt);
- if(els) { make_options_menu(page_lang, selected_fmt, els[0], els[1]); }
- }
- }
- //************************************************************
- //***** Quality Selector *************************************
- //************************************************************
- function add_quality_selector(page_lang, selected_fmt) {
- if(!check_on_youtubewatchpage()) { return; }
- var playerEmbed = get_PlayerEmbed_element();
- var wrv=document.getElementById(WATCH_RATINGS_VIEW);
- if(!wrv && playerEmbed) { wrv=playerEmbed.parentNode.nextSibling; }
- if(!wrv) { show_alert('Quality Selector Disabled : "'+WATCH_RATINGS_VIEW+'" and "'+YT_PLAYER_EMBED+'" not found'); return; }
- // Delete the original video quality setting switch (Cosmetic change)
- remove_watch_element(WATCH_QUAL_SETTING);
- // Clean URL
- var vurl = window.location.href;
- //vurl=vurl.replace(/\#$/,"");
- vurl=vurl.replace(/\&?fmt\=\d+(\&|$)/gi,"");
- vurl=vurl.replace(/\&?feature\=(channel|relate|user|search)[^(\&|$)]*/gi,"");
- var flashvars='';
- if(playerEmbed) { // Get flashvars from the embed video
- flashvars = playerEmbed.getAttribute('flashvars');
- } else { // Get flashvars from the fullscreen link
- flashvars = get_fullscreenURL();
- }
- var fmt_array=get_fmt_array(flashvars);
- // Create links
- var HDAvailable=(unsafeWindow.isHDAvailable==true);
- var link1=null; var link2=null; var link3=null; var link4=null;
- if(selected_fmt!=0) {
- link1=document.createElement("a");
- link1.setAttribute('class','hLink');
- link1.setAttribute('href',vurl+url_fmt(0));
- } else { link1=document.createElement("span"); link1.style.setProperty('color','inherit','important'); }
- if(selected_fmt!=FMT_HIGH_QUALITY_FLV) {
- link2=document.createElement("a");
- if((fmt_array[FMT_HIGH_QUALITY_FLV]) || (selected_fmt!=0)) {
- link2.setAttribute('class','hLink');
- } else {
- link2.style.setProperty('color',window.getComputedStyle(window.document.body,null).color,'important');
- }
- link2.setAttribute('href',vurl+url_fmt(FMT_HIGH_QUALITY_FLV));
- } else { link2=document.createElement("span"); link2.style.setProperty('color','inherit','important'); }
- if(selected_fmt!=18) {
- link3=document.createElement("a");
- link3.setAttribute('class','hLink');
- link3.setAttribute('href',vurl+url_fmt(18));
- } else { link3=document.createElement("span"); link3.style.setProperty('color','inherit','important'); }
- if(selected_fmt!=22) {
- link4=document.createElement("a");
- if(fmt_array[22] || HDAvailable || (selected_fmt!=0)) {
- link4.setAttribute('class','hLink');
- } else {
- link4.style.setProperty('color',window.getComputedStyle(window.document.body,null).color,'important');
- }
- link4.setAttribute('href',vurl+url_fmt(22));
- } else { link4=document.createElement("span"); link4.style.setProperty('color','inherit','important'); }
- link1.textContent = HtmlUnicodeDecode(get_text_QS(page_lang,"link1"));
- link2.textContent = HtmlUnicodeDecode(get_text_QS(page_lang,"link2"));
- link3.textContent = HtmlUnicodeDecode(get_text_QS(page_lang,"link3"));
- link4.textContent = HtmlUnicodeDecode(get_text_QS(page_lang,"link4"));
- link1.style.setProperty('font-weight','normal','important');
- link2.style.setProperty('font-weight','normal','important');
- link3.style.setProperty('font-weight','normal','important');
- link4.style.setProperty('font-weight','normal','important');
- if((selected_fmt== 0 ) || (!fmt_array[selected_fmt])) { link1.style.setProperty('font-weight','bold','important'); }
- if((selected_fmt==FMT_HIGH_QUALITY_FLV) && (fmt_array[selected_fmt] )) { link2.style.setProperty('font-weight','bold','important'); }
- if((selected_fmt==18 ) && (fmt_array[selected_fmt] )) { link3.style.setProperty('font-weight','bold','important'); }
- if((selected_fmt==22 ) && (fmt_array[selected_fmt] )) { link4.style.setProperty('font-weight','bold','important'); }
- // Change video size
- var wide=(unsafeWindow.isWidescreen==true);
- var low_quality=(selected_fmt<=6) || (selected_fmt==13) || (selected_fmt==17) || (selected_fmt==34);
- if(playerEmbed) {
- if(wide) {
- if(ENABLE_WIDE_VIDEO_RESIZING && !(low_quality)) {
- playerEmbed.parentNode.parentNode.style.width ='960px';
- playerEmbed.parentNode.parentNode.style.height='606px';
- playerEmbed.style.width ='960px';
- playerEmbed.style.height='566px';
- }
- } else {
- if(ENABLE_4DV3_VIDEO_RESIZING) {
- if((ENABLE_4DV3_VIDEO_RESIZING==1) || (low_quality)) {
- playerEmbed.style.height='505px';
- } else {
- playerEmbed.parentNode.parentNode.style.width ='960px';
- playerEmbed.parentNode.parentNode.style.height='785px';
- playerEmbed.style.width ='960px';
- playerEmbed.style.height='745px';
- }
- }
- }
- }
- // Add the Quality Video links
- var newElement = document.createElement('div');
- newElement.setAttribute('style','width:100%; margin:3px 0 10px 0;');
- var table = document.createElement('table');
- table.setAttribute('class','watch-comment-head');
- table.setAttribute('style','text-align:center; width:100%; color:#880000 !important; border: 1px solid transparent');
- table.style.backgroundColor="#F8F8F8";
- table.style.borderColor="#CCCCCC";
- newElement.appendChild(table);
- var tr1 = document.createElement('tr');
- tr1.setAttribute('style','color:inherit !important; border: none');
- table.appendChild(tr1);
- var td1 = document.createElement('td'); td1.appendChild(link1); tr1.appendChild(td1);
- td1.setAttribute('style','color:inherit !important; padding-top:3px !important; padding-bottom:2px !important');
- var td2 = document.createElement('td'); td2.appendChild(link3); tr1.appendChild(td2);
- td2.setAttribute('style','color:inherit !important; padding-top:3px !important; padding-bottom:2px !important');
- var tr2 = document.createElement('tr');
- tr2.setAttribute('style','color:inherit !important');
- table.appendChild(tr2);
- var td3 = document.createElement('td'); td3.appendChild(link2); tr2.appendChild(td3);
- td3.setAttribute('style','color:inherit !important; padding-bottom:3px !important; padding-top:2px !important');
- var td4 = document.createElement('td'); td4.appendChild(link4); tr2.appendChild(td4);
- td4.setAttribute('style','color:inherit !important; padding-bottom:3px !important; padding-top:2px !important');
- user_select(newElement,'none');
- wrv.parentNode.insertBefore(newElement, wrv);
- }
- //******************************
- //*** Image Preview Rollover ***
- //******************************
- var image_state=new Array;
- var image_count=new Array;
- var image_cache=new Array;
- function change_image(element) {
- const MAX_IMG=3;
- const colorlist=["#CC88FF","#CC0000","#00AA00","#0000DD"];
- var idvideo=element.getAttribute('qlicon');
- if(!idvideo) { return; }
- image_count[idvideo]=(image_count[idvideo] % 3)+1;
- if(isUndefined(image_cache[idvideo])) {
- var url_img=element.getAttribute('src');
- var imgpath=url_img.match(/^(.*\/).*?(\.jpg)$/i);
- if(!imgpath) { return; }
- image_cache[idvideo]=new Array;
- image_cache[idvideo][0]=false;
- for(var h=1;h<=MAX_IMG;h++) {
- url_img=imgpath[1]+h+imgpath[2];
- image_cache[idvideo][h]=new Image();
- image_cache[idvideo][h].src=url_img;
- }
- }
- if(!(image_cache[idvideo][0])) {
- var nbcomplete=0;
- for(var h=1;h<=MAX_IMG;h++) { if (image_cache[idvideo][h].complete == true) { nbcomplete++; } }
- if(nbcomplete==0) {
- image_count[idvideo]=0;
- } else {
- if(nbcomplete>=MAX_IMG) {
- image_cache[idvideo][0]=true;
- } else {
- while (image_cache[idvideo][image_count[idvideo]].complete != true) { image_count[idvideo]=(image_count[idvideo] % 3)+1; }
- }
- }
- }
- element.style.borderColor="#F0F0F0";
- if(element.className=='vimg50') { element.parentNode.parentNode.style.borderColor=colorlist[image_count[idvideo]]; }
- else { element.parentNode.parentNode.parentNode.style.borderColor=colorlist[image_count[idvideo]]; }
- if(image_count[idvideo]>0) {
- element.src=image_cache[idvideo][image_count[idvideo]].src;
- if(image_state[idvideo]) { image_state[idvideo]=setTimeout( function() { change_image(element); }, ROLLOVER_DELAY_CONT); }
- } else {
- if(image_state[idvideo]) { image_state[idvideo]=setTimeout( function() { change_image(element); }, ROLLOVER_DELAY_LOAD); }
- }
- }
- function start_rollover_event() {
- var elImg=this;
- var idvideo=elImg.getAttribute('qlicon');
- if(!idvideo) { return; }
- if(!(image_state[idvideo])) { image_state[idvideo]=setTimeout( function() { change_image(elImg); }, ROLLOVER_DELAY_INIT); }
- }
- function stop_rollover_event() {
- var elImg=this;
- var idvideo=elImg.getAttribute('qlicon');
- if(!idvideo) { return; }
- image_state[idvideo]=clearTimeout(image_state[idvideo]);
- }
- function bind_image_preview_rollover(elImg) {
- var idvideo=elImg.getAttribute('qlicon');
- if(!idvideo) {
- var imgpath=elImg.getAttribute('src');
- if(!imgpath) { return; }
- var temp=imgpath.match(/^.*\/(.*?)\/default\.jpg$/);
- if(!temp) { return; }
- idvideo=temp[1];
- elImg.setAttribute('qlicon',idvideo);
- }
- if(idvideo) {
- elImg.setAttribute('title',''); // Clear title
- if(isUndefined(image_state[idvideo])) { image_state[idvideo]=0; }
- if(isUndefined(image_count[idvideo])) { image_count[idvideo]=0; }
- elImg.addEventListener('mouseover' , start_rollover_event, true);
- elImg.addEventListener('mouseout' , stop_rollover_event , true);
- }
- }
- function image_preview_rollover(element) {
- if(!(element)) { return; }
- var links=null;
- try { links=document.evaluate('.//img[@src]',element,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); } catch(err) { links=null; }
- if(links) {
- var links_lg=links.snapshotLength;
- for(var h=0;h<links_lg;h++) {
- var image=links.snapshotItem(h);
- if(image) { bind_image_preview_rollover(image); }
- }
- return;
- }
- try { links=element.getElementsByTagName("img"); } catch(err) { links=null; }
- if(links) {
- var links_nb=links.length;
- for(var h=0;h<links_nb;h++) {
- var image=links[h];
- if(image) { bind_image_preview_rollover(image); }
- }
- return;
- }
- var msg="image_preview_rollover: Impossible to get links (XPath and getElementsByTagName failed)";
- if(arguments.callee.getlink_fail) { show_alert(msg,0); }
- else { arguments.callee.getlink_fail=1; show_alert(msg,1); }
- }
- //**********************
- //*** change_links() ***
- //**********************
- function clean_link_and_add_fmt(link,fmt) {
- // Clean URL
- //link=link.replace(/\#$/,'');
- link=link.replace(/\&?fmt\=\d+(\&|$)/gi,'');
- link=link.replace(/\&?search\=[^(\&|$)]*/gi,'');
- link=link.replace(/\&?feature\=(channel|relate|user|search)[^(\&|$)]*/gi,'');
- // Add fmt to URL
- return link+url_fmt(fmt);
- }
- function change_links_with_fmt(element,fmt) {
- if(!(element)) { return; }
- var links=null;
- try { links=document.evaluate('.//a[@href]',element,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); } catch(err) { links=null; }
- if(links) {
- var links_lg=links.snapshotLength;
- for(var h=0;h<links_lg;h++) {
- var link=links.snapshotItem(h).href;
- if(link.match(/youtube\.\w+\/watch\?/i)) { links.snapshotItem(h).href=clean_link_and_add_fmt(link,fmt); }
- }
- return;
- }
- try { links=element.getElementsByTagName("a"); } catch(err) { links=null; }
- if(links) {
- var links_nb=links.length;
- for(var h=0;h<links_nb;h++) {
- var link=links[h].href;
- if(link.match(/youtube\.\w+\/watch\?/i)) { links[h].href=clean_link_and_add_fmt(link,fmt); }
- }
- return;
- }
- var msg="change_links: Impossible to get links (XPath and getElementsByTagName failed)";
- if(arguments.callee.getlink_fail) { show_alert(msg,0); }
- else { arguments.callee.getlink_fail=1; show_alert(msg,1); }
- }
- function change_links_event() {
- var el=this;
- var fmt=GM_getValue("Youtube_Download_fmt",0);
- change_links_with_fmt(el,fmt);
- image_preview_rollover(el);
- }
- //** === change_links & image_preview_rollover === **//
- function change_links(selected_fmt) {
- var last_fmt=GM_getValue("Youtube_Download_fmt",0);
- if(check_on_youtubewatchpage()) { //== Watch pages
- if(last_fmt!=0) {
- var wurl=window.location.href;
- // Link from the Flash player ? (NR=1)
- if (wurl.search(/[?&]NR\=\d+/i)>=0) {
- wurl=wurl.replace(/\&?NR\=\d+(\&|$)/gi,'');
- wurl=clean_link_and_add_fmt(wurl,last_fmt);
- window.location.replace(wurl);
- return;
- }
- }
- GM_setValue("Youtube_Download_fmt",selected_fmt);
- // Add fmt to watch-url-field
- var wuf=document.getElementById(WATCH_URL_FIELD);
- if(wuf) { wuf.setAttribute('value',clean_link_and_add_fmt(wuf.getAttribute('value'),selected_fmt)); }
- // Change all links in the page
- change_links_with_fmt(window.document.body, selected_fmt);
- // Change links of User videos after loading it
- var wmf=document.getElementById(WATCH_MORE_FROM);
- if(wmf) { wmf.addEventListener ('load', change_links_event, true); }
- // Change links of Related videos box after loading it
- var wrvb=document.getElementById(WATCH_RELATED_VIDS);
- if(wrvb) { wrvb.addEventListener('load', change_links_event, true); }
- // Change links of Search box after loading it
- var wsr=document.getElementById(WATCH_SEARCH_RES);
- if(wsr) { wsr.addEventListener ('load', change_links_event, true); }
- // Playlist panel support
- var plst=document.getElementById(PLAYLIST_PANEL);
- if(plst) { plst.addEventListener('load', change_links_event, true); }
- image_preview_rollover(window.document.body);
- } else { //== Other pages
- // Change all links in the page
- if(last_fmt!=0) { change_links_with_fmt(window.document.body, last_fmt); }
- // == Youtube
- if(check_on_youtube()) { image_preview_rollover(window.document.body); }
- }
- }
- //************************************************************
- //***** Media Controller *************************************
- //************************************************************
- function get_movie_player(ytplayer_name) {
- if(!ytplayer_name) { ytplayer_name=YT_PLAYER_EMBED; }
- ytplayer=unsafeWindow.document.getElementById(ytplayer_name);
- if(!ytplayer) {
- var msg='Media Controller warning : "'+ytplayer_name+'" not found';
- if(arguments.callee.movie_player_fail) { show_alert(msg,0); }
- else { arguments.callee.movie_player_fail=1; show_alert(msg); }
- }
- return ytplayer;
- }
- // N/A (-2), unstarted (-1), ended (0), playing (1), paused (2), buffering (3), video cued (5).
- function get_player_state(ytplayer) {
- var state=-1; try { state=ytplayer.getPlayerState(); } catch(err) { state=-2; }
- if(state<=-2) {
- show_alert('Media Controller warning : "'+ytplayer.id+'" state not available',0);
- if(ytplayer.getAttribute('mc_embedtype')==1) {
- // Check allowscriptaccess (must be 'always')
- var allowScript=ytplayer.getAttribute('allowscriptaccess');
- if(!(allowScript) || !(allowScript.match(/^always$/i))) {
- ytplayer.setAttribute('allowscriptaccess','always');
- show_alert('Media Controller Notice: Reloading the player "'+ytplayer.id+'" to allow script access');
- player_revive(ytplayer.id); // Revive it...
- }
- }
- }
- return state;
- }
- // §§§ Step back §§§
- var player_Step_back_timerid=new Array;
- function player_stepback(ytplayer_name) {
- if(player_Step_back_timerid[ytplayer_name]) { return; }
- function player_stepback_check(ytplayer_name,frame_cursor,new_frame_cursor) {
- player_Step_back_timerid[ytplayer_name]=null;
- var ytplayer=get_movie_player(ytplayer_name);
- if(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state!=0 && state<2) { return; }
- cur_frame_cursor=ytplayer.getCurrentTime();
- if(cur_frame_cursor<frame_cursor) { return; }
- new_frame_cursor=new_frame_cursor-0.05; if(new_frame_cursor<0) { new_frame_cursor=0; }
- ytplayer.seekTo(new_frame_cursor,0);
- if(new_frame_cursor<=0) { return; }
- if(frame_cursor-new_frame_cursor>5) { return; } // Test for the Loading-start of the video
- player_Step_back_timerid[ytplayer_name]=window.setTimeout( function() { player_stepback_check(ytplayer_name,frame_cursor,new_frame_cursor); }, 50);
- }
- }
- var ytplayer=get_movie_player(ytplayer_name);
- if(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state<0) { return; }
- ytplayer.pauseVideo();
- state=get_player_state(ytplayer);
- if(state!=0 && state<2) { return; }
- frame_cursor=ytplayer.getCurrentTime();
- if(frame_cursor<=0) { return; }
- new_frame_cursor=frame_cursor-0.05; if(new_frame_cursor<0) { new_frame_cursor=0; }
- ytplayer.seekTo(new_frame_cursor,0);
- ytplayer.pauseVideo();
- if(new_frame_cursor<=0) { return; }
- player_Step_back_timerid[ytplayer_name]=window.setTimeout( function() { player_stepback_check(ytplayer_name,frame_cursor,new_frame_cursor); }, 50);
- }
- }
- // §§§ Stop §§§
- function player_stop(ytplayer_name) {
- var ytplayer=get_movie_player(ytplayer_name);
- if(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state==-1) { window.setTimeout( function() { player_stop(); }, 50); return; }
- if(state<0 || state>3) { return; }
- ytplayer.pauseVideo(); ytplayer.seekTo(0,1); player_pause(ytplayer_name);
- }
- }
- // §§§ Step forward §§§
- function player_frame(ytplayer_name) {
- var frame_cursor=0;
- var ytplayer=get_movie_player(ytplayer_name);
- function player_frame_pause(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state<=0) { return; }
- var new_pos=ytplayer.getCurrentTime();
- //show_alert(frame_cursor+"/"+new_pos,0);
- if(new_pos==frame_cursor || state==3) {
- window.setTimeout( function() { player_frame_pause(ytplayer); }, 2);
- return;
- }
- ytplayer.pauseVideo(ytplayer.id);
- }
- if(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state<=0 || state==3) { return; }
- frame_cursor=ytplayer.getCurrentTime();
- ytplayer.playVideo(ytplayer_name);
- player_frame_pause(ytplayer);
- }
- }
- // §§§ Play §§§
- function player_play(ytplayer_name) {
- if(player_killed[ytplayer_name]==1) { player_revive(ytplayer_name); return; }
- var ytplayer=get_movie_player(ytplayer_name);
- if(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state==-1) { window.setTimeout( function() { player_play(); }, 50); return; }
- if(state<0) { return; }
- ytplayer.playVideo();
- }
- }
- // Revive the player
- var player_killed=new Array;
- function player_revive(ytplayer_name) {
- var ytplayer = document.getElementById(ytplayer_name);
- if(!(ytplayer)) { show_alert('Revive Failed : "'+ytplayer_name+'" not found'); return; }
- // Make autoplay on
- if(ytplayer.getAttribute('mc_embedtype')==1) {
- var flashvars = ytplayer.getAttribute('flashvars');
- var autoplay = flashvars.match(/autoplay\=(\d+)/i);
- if(autoplay) { flashvars=flashvars.replace(/autoplay\=\d+/i,"autoplay=1"); }
- else { flashvars=flashvars+'&autoplay=1'; }
- ytplayer.setAttribute('flashvars',flashvars);
- } else { // mc_embedtype==2
- var srcvars = ytplayer.getAttribute('src');
- var autoplay = srcvars.match(/autoplay\=(\d+)/i);
- if(autoplay) { srcvars=srcvars.replace(/autoplay\=\d+/i,"autoplay=1"); }
- else { srcvars=srcvars+'&autoplay=1'; }
- ytplayer.setAttribute('src',srcvars);
- }
- // Revive the video player
- flushNode(ytplayer);
- player_killed[ytplayer_name]=0;
- // Test if a loop is set
- player_check_limit(ytplayer_name);
- }
- // §§§ Pause §§§
- function player_pause(ytplayer_name) {
- var ytplayer=get_movie_player(ytplayer_name);
- if(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state==-1 || state==3) { window.setTimeout( function() { player_pause(ytplayer_name); }, 50); return; }
- if(state<=0) { return; }
- ytplayer.pauseVideo();
- }
- }
- // §§§ Begin §§§
- function player_memo(ytplayer_name) {
- var ytplayer=get_movie_player(ytplayer_name);
- if(get_player_state(ytplayer)<-1) { return; }
- var bt_state=document.getElementById(ytplayer_name+'-Memo_state');
- if(ytplayer && bt_state) {
- if(get_player_state(ytplayer)<=0) {
- bt_state.style.display="none";
- bt_state.setAttribute('value',0);
- return;
- }
- if(bt_state.style.display=="none") {
- var new_pos=ytplayer.getCurrentTime();
- ytplayer.seekTo(new_pos,1); // Get real seek time
- new_pos=ytplayer.getCurrentTime();
- if(new_pos<0) { new_pos=0; }
- bt_state.style.display="block";
- bt_state.setAttribute('value',new_pos.toString());
- } else {
- bt_state.style.display="none";
- bt_state.setAttribute('value',0);
- }
- }
- }
- // §§§ Loop §§§
- function player_loop(ytplayer_name) {
- var bt_state=document.getElementById(ytplayer_name+'-Loop_state');
- if(bt_state) {
- if(bt_state.style.display=="none") {
- var ytplayer=get_movie_player(ytplayer_name);
- if(!ytplayer) { return; }
- if(get_player_state(ytplayer)<-1) { return; }
- bt_state.style.display="block";
- player_check_limit(ytplayer_name);
- } else {
- bt_state.style.display="none";
- }
- }
- }
- // §§§ Rewind §§§
- function player_rewind(ytplayer_name) {
- var ytplayer=get_movie_player(ytplayer_name);
- if(ytplayer) {
- var state=get_player_state(ytplayer);
- if(state<0) { return; }
- var memo_pos=0;
- var memo_state=document.getElementById(ytplayer_name+'-Memo_state');
- if(memo_state) { memo_pos=parseFloat(memo_state.getAttribute('value'),9); }
- var player_pos=ytplayer.getCurrentTime();
- if(memo_pos>=player_pos) {
- ytplayer.seekTo(0,1);
- } else {
- ytplayer.seekTo(memo_pos,1);
- }
- }
- }
- // §§§ End §§§
- function player_limit(ytplayer_name) {
- var ytplayer=get_movie_player(ytplayer_name);
- if(get_player_state(ytplayer)<-1) { return; }
- var bt_state=document.getElementById(ytplayer_name+'-Limit_state');
- if(ytplayer && bt_state) {
- if(get_player_state(ytplayer)<0) {
- bt_state.style.display="none";
- bt_state.setAttribute('value',0);
- return;
- }
- if(bt_state.style.display=="none") {
- var new_pos=ytplayer.getCurrentTime();
- if(new_pos<0) { new_pos=0; }
- bt_state.style.display="block";
- bt_state.setAttribute('value',new_pos.toString());
- player_check_limit(ytplayer_name);
- } else {
- bt_state.style.display="none";
- bt_state.setAttribute('value',0);
- }
- }
- }
- // §§§ Kill §§§ (Double click for this one)
- function player_freeze(ytplayer_name) {
- if(isUndefined(ytplayer_name)) { arguments.callee.freeze=0; return; }
- if(arguments.callee.freeze==1) {
- var ytplayer=get_movie_player(ytplayer_name);
- if(!ytplayer) { return; }
- if(get_player_state(ytplayer)>=-1) { ytplayer.pauseVideo(); ytplayer.stopVideo(); }
- player_killed[ytplayer_name]=1;
- return;
- }
- arguments.callee.freeze=1; window.setTimeout( function() { player_freeze(); }, 250);
- }
- // Need a serial of interrupts to check the end of the selection
- var player_check_limit_timerid=new Array;
- function player_check_limit_routine(ytplayer_name) {
- if(player_killed[ytplayer_name]==1) { return; }
- var ytplayer=get_movie_player(ytplayer_name);
- if(!ytplayer) { return; }
- var M_state=document.getElementById(ytplayer_name+'-Memo_state');
- var L_state=document.getElementById(ytplayer_name+'-Limit_state');
- var Loop_state=document.getElementById(ytplayer_name+'-Loop_state');
- if(L_state && M_state && Loop_state) {
- if(Loop_state.style.display=='none') { return; }
- var state=get_player_state(ytplayer);
- if(state<0) { player_check_limit_timerid[ytplayer_name]=window.setTimeout( function() { player_check_limit_timerid[ytplayer_name]=null; player_check_limit_routine(ytplayer_name); }, 1000); return; }
- var pos=ytplayer.getCurrentTime();
- // Test Infinite buffering
- if(state==3) { // video buffering
- if(pos>ytplayer.getDuration()-0.5) {
- if(ytplayer.getVideoStartBytes()+ytplayer.getVideoBytesLoaded()>=ytplayer.getVideoBytesTotal())
- { state=0; }
- }
- }
- var vmemo=parseFloat(M_state.getAttribute('value'),9);
- var vlimit=parseFloat(L_state.getAttribute('value'),9);
- if((pos>=vlimit && L_state.style.display!='none') || state==0) { ytplayer.seekTo(vmemo,1); if(state==0) { player_play(ytplayer_name); } }
- // On watch page, onMediaControllerPlayerStateChange take care of the video end, so we end here
- if(L_state.style.display=='none' && check_on_youtubewatchpage()) { return; }
- player_check_limit_timerid[ytplayer_name]=window.setTimeout( function() { player_check_limit_timerid[ytplayer_name]=null; player_check_limit_routine(ytplayer_name); }, 50);
- return;
- }
- }
- function player_check_limit(ytplayer_name) {
- window.clearTimeout(player_check_limit_timerid[ytplayer_name]);
- player_check_limit_routine(ytplayer_name);
- }
- function get_fullscreenURL() {
- var url=unsafeWindow.fullscreenUrl;
- if(url) { return window.location.protocol+"//"+window.location.host+url.toString(); }
- return null;
- }
- function get_embedURL() {
- var url=unsafeWindow.embedUrl;
- if(url) { return url.toString(); }
- return null;
- }
- // *********************************************************************************************************** //
- // Bind Player Event for the End of video
- function bind_movie_player_event() {
- // Only for youtube watch pages
- if(!check_on_youtubewatchpage()) { return; }
- //~~~~~~~~ Startof innerscript ~~~~~~//
- var innerscript = function() {
- function check_movie_player() {
- var playerEmbed = document.getElementById('__movie_player');
- var wpd = document.getElementById('__watch-player-div');
- if(wpd) {wpd.style.setProperty('padding-left','0','important');}
- if(playerEmbed) { return; }
- if(!wpd) { return; }
- var temp=null;
- try { temp=wpd.getElementsByTagName("embed"); } catch(err) { temp=null; }
- if(temp && temp[0]) { temp[0].setAttribute('id','__movie_player'); }
- }
- function check_allowscriptaccess(ytplayer) { // Check for allowscriptaccess (must be 'always')
- allowScript=ytplayer.getAttribute('allowscriptaccess');
- if(!(allowScript) || !(allowScript.match(/^always$/i))) {
- ytplayer.setAttribute('allowscriptaccess','always');
- return 1;
- }
- return 0;
- }
- function set_autoplay(ytplayer,new_autoplay) {
- var flashvars = ytplayer.getAttribute('flashvars');
- var autoplay=flashvars.match(/autoplay\=(\d+)/i);
- if(new_autoplay=="0") {
- if(!(autoplay)) {
- ytplayer.setAttribute('flashvars',flashvars+'&autoplay=0');
- return 1;
- } else if (autoplay[1]!=0) {
- ytplayer.setAttribute('flashvars',flashvars.replace(/autoplay\=\d+/i,"autoplay=0"));
- return 1;
- }
- } else {
- if(new_autoplay=="1") { // Mode: Buffering at start...
- try { ytplayer.pauseVideo(); } catch(err) {}
- onMediaControllerPlayerStateChange.Buffering_StopPlayer=true;
- }
- if(autoplay) {
- if(autoplay[1]!=1) {
- ytplayer.setAttribute('flashvars',flashvars.replace(/autoplay\=\d+/i,"autoplay=1"));
- return 1;
- }
- }
- }
- return 0;
- }
- function check_for_loop(ytplayer) {
- var loop_state=window.document.getElementById('__movie_player-Loop_state');
- if(loop_state.style.display!="none") {
- var memo_state=window.document.getElementById('__movie_player-Memo_state');
- if(memo_state) {
- var memo_pos=parseFloat(memo_state.getAttribute('value'),9);
- ytplayer.seekTo(memo_pos,1);
- ytplayer.playVideo();
- window.setTimeout( function() { ytplayer.pauseVideo(); ytplayer.playVideo(); }, 100);
- return 1;
- }
- }
- return 0;
- }
- function check_still_buffering() {
- var player=window.document.getElementById('__movie_player');
- if(!player) { return; }
- var state=-1; try { state=player.getPlayerState(); } catch(err) { state=-2; }
- if(state==3) {
- if(player.getCurrentTime()>player.getDuration()-0.5) {
- if(check_for_loop(player)) { return; }
- // Original Youtube Script (if no loop)
- try { handleWatchPagePlayerStateChange(0); } catch(err) {}
- }
- }
- }
- onMediaControllerPlayerStateChange = function(newState) {
- var player=window.document.getElementById('__movie_player');
- if(!player) { return; }
- if(arguments.callee.Buffering_StopPlayer==true) { // Mode: Buffering at start...
- if(newState<0 || newState>=3) {
- try { ytplayer.pauseVideo(); } catch(err) {}
- } else {
- arguments.callee.Buffering_StopPlayer=false;
- }
- }
- // Test Infinite buffering
- if(newState==3) { // video is buffering
- if(player.getCurrentTime()>player.getDuration()-0.5) {
- if(player.getVideoStartBytes()+player.getVideoBytesLoaded()>=player.getVideoBytesTotal()) {
- newState=0;
- } else {
- window.setTimeout( function() { check_still_buffering(); }, 1500);
- }
- }
- }
- // Check for Loop
- if(newState==0) { if(check_for_loop(player)) { return; } }
- // Original Youtube Script (if no loop)
- try { handleWatchPagePlayerStateChange(newState); } catch(err) {}
- }
- function bind_MediaControllerPlayerStateChange() {
- function isUndefined(x) { return x == null && x !== null; }
- check_movie_player();
- var ytplayer=window.document.getElementById('__movie_player');
- if(ytplayer) {
- // Flush to remove the initial event since there no removeEventListener ?
- if(isUndefined(arguments.callee.initialflush)) { arguments.callee.initialflush=0; } // Don't do it since i see no problem :p
- var flush=arguments.callee.initialflush; arguments.callee.initialflush=0;
- flush += check_allowscriptaccess(ytplayer);
- flush += set_autoplay(ytplayer,'__autoplay');
- if(flush) { ytplayer.parentNode.replaceChild(ytplayer.cloneNode(true),ytplayer); }
- var state=-1; try { state=ytplayer.getPlayerState(); } catch(err) { state=-2; }
- if(state<0) { // Still loading the player...
- window.setTimeout( function() { bind_MediaControllerPlayerStateChange(); }, 500);
- } else { // Loaded, so add an event
- try { g_YouTubePlayerIsReady=true; pollLocationHash(); if ('__autoplay'!=2) { ytplayer.pauseVideo(); } } catch(err) {}
- ytplayer.addEventListener("onStateChange", "onMediaControllerPlayerStateChange");
- try { ytplayer.addEventListener("onPlaybackQualityChange","onPlayerFormatChanged"); } catch(err) {}
- }
- }
- }
- // Redefine onYouTubePlayerReady (warning: can cause conflict with an other script)
- onYouTubePlayerReady = function(playerid) {
- bind_MediaControllerPlayerStateChange();
- }
- bind_MediaControllerPlayerStateChange();
- } //~~~~~~~ Endof innerscript ~~~~~~~//
- innerscript=innerscript.toString().replace(/__movie_player/g,YT_PLAYER_EMBED)
- .replace(/__watch-player-div/,WATCH_PLAYER_DIV)
- .replace(/__autoplay/g,GM_getValue("Youtube_Download_Autoplay_Setting",2));
- var script=document.createElement("script");
- //script.setAttribute('id','Youtube_Enhancer-PlayerStateChange');
- script.setAttribute('type','text/javascript');
- script.textContent="("+innerscript+")();";
- document.body.appendChild(script);
- }
- // *********************************************************************************************************** //
- //** === Media Controller === **//
- function media_controller(page_lang,ytplayer_name,tag) {
- var ytplayer = document.getElementById(ytplayer_name);
- if(!ytplayer) { show_alert('Media Controller Disabled : "'+ytplayer_name+'" not found'); return; }
- ytplayer.setAttribute('mc_embedtype',tag);
- // Media Controller display mode
- var lgref=480;
- var ytplayer_width=getWidth(ytplayer);
- if (check_on_youtubewatchpage()) { lgref=ytplayer_width; }
- var MC_height=26; var MC_leftB2=167; var MC_topB2=-1; var MC_leftB3=lgref-166;
- if(ytplayer_width<lgref-126) { MC_leftB2=(ytplayer_width-244)/2+117; MC_leftB3=ytplayer_width-30; }
- if(ytplayer_width<300) { MC_leftB2=19; MC_leftB3=145; MC_topB2=26; }
- var yt_p=ytplayer.parentNode; var yt_ns; var yt_c=ytplayer;
- if(yt_p.tagName=="OBJECT") { yt_c=yt_p; yt_p.setAttribute('mc_embedtype',3); yt_ns=yt_p.nextSibling; yt_p=yt_p.parentNode; }
- else { yt_ns=ytplayer.nextSibling; }
- mediabar=document.createElement('div');
- //mediabar.setAttribute('id','Media_Controller-'+ytplayer_name);
- mediabar.setAttribute('style','position:relative; width:'+ytplayer_width+'px; margin-bottom:3px; padding-bottom:3px; '
- +'height:'+(MC_height+MC_topB2-1)+'px; border:0px; font-family:Arial,sans-serif !important; color:'+COLOR_MC_TEXT_OUT+' !important;');
- mediabar.setAttribute('lang','fr');
- var loop_display_init='none'; // use 'block' (loop enabled at start) or 'none' (loop disabled at start)
- // === Unicode player buttons ===
- // Stop
- var buttonStopDiv=document.createElement('div');
- buttonStopDiv.setAttribute('style','position:absolute; top:-9px; left:6px; font-size:26px; line-height:38px; color:inherit !important;');
- buttonStopDiv.textContent=String.fromCharCode(9632);
- // Step back
- var buttonDiv1=document.createElement('div');
- buttonDiv1.setAttribute('style','position:absolute; top:0px; left:2px; font-size:18px; line-height:26px; color:inherit !important;');
- buttonDiv1.textContent=String.fromCharCode(9668);
- var buttonDiv2=document.createElement('div');
- buttonDiv2.setAttribute('style','position:absolute; top:0px; left:20px; font-size:12px; line-height:26px; color:inherit !important;');
- buttonDiv2.textContent=String.fromCharCode(9613);
- var buttonStepBackDiv=document.createElement('div');
- buttonStepBackDiv.setAttribute('style','color:inherit !important;');
- buttonStepBackDiv.appendChild(buttonDiv1);
- buttonStepBackDiv.appendChild(buttonDiv2);
- // Step forward
- var buttonDiv1=document.createElement('div');
- buttonDiv1.setAttribute('style','position:absolute; top:0px; left:5px; font-size:12px; line-height:26px; color:inherit !important;');
- buttonDiv1.textContent=String.fromCharCode(9613);
- var buttonDiv2=document.createElement('div');
- buttonDiv2.setAttribute('style','position:absolute; top:0px; left:8px; font-size:18px; line-height:26px; color:inherit !important;');
- buttonDiv2.textContent=String.fromCharCode(9658);
- var buttonStepForwardDiv=document.createElement('div');
- buttonStepForwardDiv.setAttribute('style','color:inherit !important;');
- buttonStepForwardDiv.appendChild(buttonDiv1);
- buttonStepForwardDiv.appendChild(buttonDiv2);
- // Play
- var buttonPlayDiv=document.createElement('div');
- buttonPlayDiv.setAttribute('style','position:absolute; top:-2px; left:5px; font-size:20px; line-height:30px; color:inherit !important;');
- buttonPlayDiv.textContent=String.fromCharCode(9658);
- // Pause
- var buttonDiv1=document.createElement('div');
- buttonDiv1.setAttribute('style','position:absolute; top:3px; left:8px; font-size:16px; line-height:21px; color:inherit !important;');
- buttonDiv1.textContent=String.fromCharCode(9613);
- var buttonDiv2=document.createElement('div');
- buttonDiv2.setAttribute('style','position:absolute; top:3px; left:16px; font-size:16px; line-height:21px; color:inherit !important;');
- buttonDiv2.textContent=String.fromCharCode(9613);
- var buttonPauseDiv=document.createElement('div');
- buttonPauseDiv.setAttribute('style','color:inherit !important;');
- buttonPauseDiv.appendChild(buttonDiv1);
- buttonPauseDiv.appendChild(buttonDiv2);
- // Begin
- var buttonDiv1=document.createElement('div');
- buttonDiv1.setAttribute('style','position:absolute; top:-1px; left:6px; font-size:18px; line-height:28px; z-index:2; color:inherit !important;');
- buttonDiv1.textContent=String.fromCharCode(12302);
- var buttonDiv2=document.createElement('div');
- buttonDiv2.setAttribute('id',ytplayer_name+'-Memo_state');
- buttonDiv2.setAttribute('style','display:none; position:absolute; left:1px; top:1px; width:26px; height:'+(MC_height-2)+'px; z-index:1; background:'+COLOR_MC_TOGGLE_BEG_END+';');
- buttonDiv2.setAttribute('value',0);
- var buttonBeginDiv=document.createElement('div');
- buttonBeginDiv.setAttribute('style','color:inherit !important;');
- buttonBeginDiv.appendChild(buttonDiv1);
- buttonBeginDiv.appendChild(buttonDiv2);
- // Loop
- var buttonDiv1=document.createElement('div');
- buttonDiv1.setAttribute('style','position:absolute; top:1px; width:35px; left:4px; font-size:42px; line-height:28px; height:26px; text-align:left; z-index:2; color:inherit !important;');
- buttonDiv1.textContent=String.fromCharCode(8617);
- var buttonDiv2=document.createElement('div');
- buttonDiv2.setAttribute('id',ytplayer_name+'-Loop_state');
- buttonDiv2.setAttribute('style','display:'+loop_display_init+'; position:absolute; left:1px; top:1px; width:35px; height:'+(MC_height-2)+'px; z-index:1; background:'+COLOR_MC_TOGGLE_LOOP+';');
- var buttonLoopDiv=document.createElement('div');
- buttonLoopDiv.setAttribute('style','color:inherit !important;');
- buttonLoopDiv.appendChild(buttonDiv1);
- buttonLoopDiv.appendChild(buttonDiv2);
- // Rewind
- var buttonDiv1=document.createElement('div');
- buttonDiv1.setAttribute('style','position:absolute; top:-1px; left:7px; font-size:14px; line-height:25px; color:inherit !important;');
- buttonDiv1.textContent='|';
- var buttonDiv2=document.createElement('div');
- buttonDiv2.setAttribute('style','position:absolute; top:1px; left:9px; font-size:24px; line-height:26px; color:inherit !important;');
- buttonDiv2.textContent=String.fromCharCode(9664);
- var buttonRewindDiv=document.createElement('div');
- buttonRewindDiv.setAttribute('style','color:inherit !important;');
- buttonRewindDiv.appendChild(buttonDiv1);
- buttonRewindDiv.appendChild(buttonDiv2);
- // End
- var buttonDiv1=document.createElement('div');
- buttonDiv1.setAttribute('style','position:absolute; top:-1px; left:14px; font-size:18px; line-height:26px; z-index:2; color:inherit !important;');
- buttonDiv1.textContent=String.fromCharCode(12303);
- var buttonDiv2=document.createElement('div');
- buttonDiv2.setAttribute('id',ytplayer_name+'-Limit_state');
- buttonDiv2.setAttribute('style','display:none; position:absolute; left:1px; top:1px; width:26px; height:'+(MC_height-2)+'px; z-index:1; background:'+COLOR_MC_TOGGLE_BEG_END+';');
- buttonDiv2.setAttribute('value',0);
- var buttonEndDiv=document.createElement('div');
- buttonEndDiv.setAttribute('style','color:inherit !important;');
- buttonEndDiv.appendChild(buttonDiv1);
- buttonEndDiv.appendChild(buttonDiv2);
- // Kill
- var buttonKillDiv=document.createElement('div');
- buttonKillDiv.setAttribute('style','position:absolute; top:0px; left:2px; font-size:24px; line-height:27px; color:inherit !important;');
- buttonKillDiv.textContent=String.fromCharCode(9760);
- // === Media Controller Bar ===
- // 1st group
- var buttonStop=document.createElement('div');
- buttonStop.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"stop")));
- buttonStop.setAttribute('style','left: 0px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonStop.appendChild(buttonStopDiv);
- buttonStop.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_ACTION_IN, "important"); }, true);
- buttonStop.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonStop.addEventListener('click', function() { player_stop(ytplayer_name); }, true);
- user_select(buttonStop,'none');
- mediabar.appendChild(buttonStop);
- var buttonStepBack=document.createElement('div');
- buttonStepBack.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"stepback")));
- buttonStepBack.setAttribute('style','left:29px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonStepBack.appendChild(buttonStepBackDiv);
- buttonStepBack.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_ACTION_IN, "important"); }, true);
- buttonStepBack.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonStepBack.addEventListener('click', function() { player_stepback(ytplayer_name); }, true);
- user_select(buttonStepBack,'none');
- mediabar.appendChild(buttonStepBack);
- var buttonFrame=document.createElement('div');
- buttonFrame.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"step")));
- buttonFrame.setAttribute('style','left:58px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonFrame.appendChild(buttonStepForwardDiv);
- buttonFrame.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_ACTION_IN, "important"); }, true);
- buttonFrame.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonFrame.addEventListener('click', function() { player_frame(ytplayer_name); }, true);
- user_select(buttonFrame,'none');
- mediabar.appendChild(buttonFrame);
- var buttonPlay=document.createElement('div');
- buttonPlay.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"play")));
- buttonPlay.setAttribute('style','left:87px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonPlay.appendChild(buttonPlayDiv);
- buttonPlay.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_ACTION_IN, "important"); }, true);
- buttonPlay.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonPlay.addEventListener('click', function() { player_play(ytplayer_name); }, true);
- user_select(buttonPlay,'none');
- mediabar.appendChild(buttonPlay);
- var buttonPause=document.createElement('div');
- buttonPause.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"pause")));
- buttonPause.setAttribute('style','left:116px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonPause.appendChild(buttonPauseDiv);
- buttonPause.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_ACTION_IN, "important"); }, true);
- buttonPause.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonPause.addEventListener('click', function() { player_pause(ytplayer_name); }, true);
- user_select(buttonPause,'none');
- mediabar.appendChild(buttonPause);
- // 2nd group
- var buttonMemo=document.createElement('div');
- buttonMemo.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"begin")));
- buttonMemo.setAttribute('style','left:'+MC_leftB2+'px; top:'+(MC_topB2+1)+'px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonMemo.appendChild(buttonBeginDiv);
- buttonMemo.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_TOGGLE_IN, "important"); }, true);
- buttonMemo.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonMemo.addEventListener('click', function() { player_memo(ytplayer_name); }, true);
- user_select(buttonMemo,'none');
- mediabar.appendChild(buttonMemo);
- var buttonLoop=document.createElement('div');
- buttonLoop.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"loop")));
- buttonLoop.setAttribute('style','left:'+(MC_leftB2+29)+'px; top:'+(MC_topB2+1)+'px; position:absolute; width:37px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonLoop.appendChild(buttonLoopDiv);
- buttonLoop.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_TOGGLE_IN, "important"); }, true);
- buttonLoop.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonLoop.addEventListener('click', function() { player_loop(ytplayer_name); }, true);
- user_select(buttonLoop,'none');
- mediabar.appendChild(buttonLoop);
- var buttonRewind=document.createElement('div');
- buttonRewind.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"rewind")));
- buttonRewind.setAttribute('style','left:'+(MC_leftB2+67)+'px; top:'+(MC_topB2+1)+'px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonRewind.appendChild(buttonRewindDiv);
- buttonRewind.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_ACTION_IN, "important"); }, true);
- buttonRewind.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonRewind.addEventListener('click', function() { player_rewind(ytplayer_name); }, true);
- user_select(buttonRewind,'none');
- mediabar.appendChild(buttonRewind);
- var buttonLimit=document.createElement('div');
- buttonLimit.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"end")));
- buttonLimit.setAttribute('style','left:'+(MC_leftB2+96)+'px; top:'+(MC_topB2+1)+'px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BACKGROUND+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonLimit.appendChild(buttonEndDiv);
- buttonLimit.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_TOGGLE_IN, "important"); }, true);
- buttonLimit.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonLimit.addEventListener('click', function() { player_limit(ytplayer_name); }, true);
- user_select(buttonLimit,'none');
- mediabar.appendChild(buttonLimit);
- // 3rd group
- var buttonFreeze=document.createElement('div');
- buttonFreeze.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"kill")));
- buttonFreeze.setAttribute('style','left:'+MC_leftB3+'px; position:absolute; width:28px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BG_RED+' !important; color:inherit !important; border-top:0; overflow:hidden;');
- buttonFreeze.appendChild(buttonKillDiv);
- buttonFreeze.addEventListener('mouseover', function() { this.style.setProperty("color", COLOR_MC_TEXT_ACTION_IN, "important"); }, true);
- buttonFreeze.addEventListener('mouseout', function() { this.style.setProperty("color", "inherit", "important"); }, true);
- buttonFreeze.addEventListener('click', function() { player_freeze(ytplayer_name); }, true);
- user_select(buttonFreeze,'none');
- mediabar.appendChild(buttonFreeze);
- // 4th group
- if(check_on_youtubewatchpage()) {
- var eurl=get_embedURL();
- if(eurl) {
- var buttonEUInner=document.createElement('div');
- buttonEUInner.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"embed")));
- buttonEUInner.setAttribute('style','color:#0000F0; font-size:14px; position:absolute; top:-1px; left:1px; width:38px; text-align:center; line-height:28px; color:'+COLOR_MC_TEXT_BLUE+' !important; text-decoration:none !important;');
- buttonEUInner.textContent=String.fromCharCode(10065);
- var buttonEU=document.createElement('div');
- buttonEU.setAttribute('style','left:'+(lgref-108)+'px; position:absolute; width:39px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BG_BLUE_OUT+' !important; border-top:0;');
- buttonEU.appendChild(buttonEUInner);
- buttonEU.addEventListener('mouseover' , function() { this.style.setProperty("background",COLOR_MC_BG_BLUE_IN ,'important'); buttonEUInner.style.setProperty("text-decoration","underline","important"); }, true);
- buttonEU.addEventListener('mouseout' , function() { this.style.setProperty("background",COLOR_MC_BG_BLUE_OUT,'important'); buttonEUInner.style.setProperty("text-decoration","none","important"); }, true);
- buttonEU.addEventListener('click' , function() { player_pause(ytplayer_name); }, true);
- user_select(buttonEU,'none');
- var buttonEULink=document.createElement('a');
- buttonEULink.setAttribute('href',eurl);
- buttonEULink.setAttribute('target','_blank');
- buttonEULink.appendChild(buttonEU);
- mediabar.appendChild(buttonEULink);
- } else { show_alert('Media Controller : Global variable for "Embed URL" not found',0); }
- var fsurl=get_fullscreenURL();
- if(fsurl) {
- var buttonFSInner=document.createElement('div');
- buttonFSInner.setAttribute('title',HtmlUnicodeDecode(get_text_MC(page_lang,"fscr")));
- buttonFSInner.setAttribute('style','color:#0000F0; font-size:14px; position:absolute; top:-1px; left:1px; width:60px; text-align:center; line-height:28px; color:'+COLOR_MC_TEXT_BLUE+' !important; text-decoration:none !important;');
- buttonFSInner.textContent=String.fromCharCode(8738,8194,8194,8194,10065);
- var buttonFS=document.createElement('div');
- buttonFS.setAttribute('style','left:'+(lgref-68)+'px; position:absolute; width:66px; height:'+MC_height+'px; border: 1px solid '+COLOR_MC_BORDER+' !important; cursor:pointer; background:'+COLOR_MC_BG_BLUE_OUT+' !important; border-top:0;');
- buttonFS.appendChild(buttonFSInner);
- buttonFS.addEventListener('mouseover' , function() { this.style.setProperty("background",COLOR_MC_BG_BLUE_IN ,'important'); buttonFSInner.style.setProperty("text-decoration","underline","important"); }, true);
- buttonFS.addEventListener('mouseout' , function() { this.style.setProperty("background",COLOR_MC_BG_BLUE_OUT,'important'); buttonFSInner.style.setProperty("text-decoration","none","important"); }, true);
- buttonFS.addEventListener('click' , function() { player_pause(ytplayer_name); }, true);
- user_select(buttonFS,'none');
- var buttonFSLink=document.createElement('a');
- buttonFSLink.setAttribute('href',fsurl);
- buttonFSLink.setAttribute('target','_blank');
- buttonFSLink.appendChild(buttonFS);
- mediabar.appendChild(buttonFSLink);
- } else { show_alert('Media Controller : Global variable for "Fullscreen URL" not found',0); }
- }
- yt_p.insertBefore(mediabar, yt_ns);
- // Horizontal offset fix
- var leftdiff=getAbsoluteLeft(mediabar)-getAbsoluteLeft(ytplayer);
- if(leftdiff!=0) { mediabar.style.left=(-leftdiff)+'px'; }
- // Vertical offset fix
- var ytplayer_height=getHeight(ytplayer);
- var topdiff=getAbsoluteTop(mediabar)-ytplayer_height-getAbsoluteTop(ytplayer);
- if(topdiff!=0) { mediabar.style.top=(-topdiff)+'px'; }
- player_check_limit(ytplayer_name);
- }
- function check_jsapi(vars) { // Force enabling JS
- var temp=vars.match(/enablejsapi\s*\=\s*(\d+)/i);
- if(temp) { if(temp[1]!="1") { return vars.replace(/enablejsapi\s*\=\s*\d+/i,'enablejsapi=1'); } }
- else { return vars+'&enablejsapi=1'; }
- return vars;
- }
- function check_autoplay(vars) { // If autoplay_setting = manual -> Force autoplay to manual
- if(GM_getValue("Youtube_Download_Autoplay_Setting",2)==0) {
- var temp=vars.match(/autoplay\s*\=\s*(\d+)/i);
- if(temp) { if(temp[1]!="0") { return vars.replace(/autoplay\s*\=\s*\d+/i,'autoplay=0'); } }
- else { return vars+'&autoplay=0'; }
- }
- return vars;
- }
- function bind_player_with_media_controller(page_lang,player,number) {
- if(player.getAttribute('mc_embedtype')) { return; } // Already binded
- var src_name="src"; // EMBED and VIDEO Tag
- if(player.nodeName.toUpperCase()=="OBJECT") { src_name="data"; } // OBJECT Tag
- var player_src=player.getAttribute(src_name);
- var needflush=false;
- if(player_src.match(/^http\:\/\/(\w+\.)?youtube\.com\/\w+\//i)) { // Object Embeded youtube video
- if(!player.id) { player.setAttribute('id','Youtube_movie-'+number); }
- var new_player_src=check_autoplay(check_jsapi(player_src));
- if(new_player_src!=player_src) { player.setAttribute(src_name,new_player_src); needflush=true; }
- var asa = player.getAttribute('allowscriptaccess');
- if (asa!='always') { player.setAttribute('allowscriptaccess','always'); needflush=true; }
- if (needflush) { flushNode(player); }
- media_controller(page_lang,player.id,2);
- } else if(player_src.match(/^http\:\/\/(\w+\.)?ytimg\.com\//i)) { // Normal youtube video
- if(!player.id) { player.setAttribute('id','Youtube_movie-'+number); }
- var flashvars = player.getAttribute('flashvars');
- var new_flashvars = get_clean_flashvars(flashvars);
- new_flashvars = check_autoplay(check_jsapi(new_flashvars));
- if(new_flashvars!=flashvars) { player.setAttribute('flashvars',new_flashvars); needflush=true; }
- var asa = player.getAttribute('allowscriptaccess');
- if (asa!='always') { player.setAttribute('allowscriptaccess','always'); needflush=true; }
- if (needflush) { flushNode(player); }
- media_controller(page_lang,player.id,1);
- }
- }
- function bind_media_players(page_lang) {
- var players=null;
- try { players=document.evaluate('//embed[@src]',document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null); } catch(err) { players=null; }
- if(players) {
- var players_lg=players.snapshotLength;
- for(var h=0;h<players_lg;h++) { bind_player_with_media_controller(page_lang,players.snapshotItem(h),h); }
- return;
- }
- try { players=document.getElementsByTagName("embed"); } catch(err) { players=null; }
- if(players) {
- var players_lg=players.length;
- for(var h=0;h<players_lg;h++) { bind_player_with_media_controller(page_lang,players[h],h); }
- return;
- }
- var msg="Media Controller: Impossible to get media players (XPath and getElementsByTagName failed)";
- show_alert(msg,1);
- }
- function add_media_controller(page_lang) {
- bind_media_players(page_lang);
- }
- //******************************************** Updater ***************************************************//
- function YouTube_Enhancer_Update_install(updateelem,Date_Now,Updater_url_dl) {
- GM_setValue("Youtube_Enhancer_Updater_Date", Date_Now)
- remove_element(updateelem);
- //GM_openInTab(Updater_url_dl);
- document.location.href=Updater_url_dl;
- }
- function YouTube_Enhancer_Update_later(updateelem,Date_Now) {
- GM_setValue("Youtube_Enhancer_Updater_Date", Date_Now)
- remove_element(updateelem);
- }
- function YouTube_Enhancer_Update_Display(page_lang,Updater_url_dl,Date_Now) {
- if ( top.location.href!=window.location.href ) { return; }
- var updateelem=document.createElement('div');
- updateelem.setAttribute('lang','fr');
- updateelem.setAttribute("style","position:fixed; top:0px; left:0px; right:0px; z-index:9998; color:#FFFFFF !important; background:#C080C0 !important; width:auto; text-align:center; font-family:arial,sans-serif; font-size:24px; line-height:24px; margin:2px; border: 3px solid #CC0088; border-right-width:24px;");
- updateelem.textContent='Youtube Enhancer - '+HtmlUnicodeDecode(get_text_Updater(page_lang,"foun"))+': ';
- var aelem1=document.createElement('a');
- aelem1.setAttribute('style','text-decoration:none; cursor:pointer; color:#0000CC !important; font-weight: normal; font-style:normal;');
- aelem1.setAttribute('title',Updater_url_dl);
- //aelem1.setAttribute('href',Updater_url_dl);
- aelem1.textContent=HtmlUnicodeDecode(get_text_Updater(page_lang,"dnow"));
- updateelem.appendChild(aelem1);
- var textelem=document.createTextNode(' / ');
- updateelem.appendChild(textelem);
- var aelem2=document.createElement('a');
- aelem2.setAttribute('style','text-decoration:none; cursor:pointer; color:#0000CC !important; font-weight: normal; font-style:normal;');
- aelem2.textContent=HtmlUnicodeDecode(get_text_Updater(page_lang,"dlat"));
- updateelem.appendChild(aelem2);
- var aelemX=document.createElement('a');
- aelemX.setAttribute('style','position:absolute; top:0px; height:26px; width: 20px; right:-21px; text-decoration:none; cursor:pointer; color:#0000CC !important; background:#CC0088 !important;');
- aelemX.textContent='X';
- updateelem.appendChild(aelemX);
- user_select(updateelem,'none');
- document.body.appendChild(updateelem);
- aelem1.addEventListener('click', function() { YouTube_Enhancer_Update_install(updateelem,Date_Now,Updater_url_dl); }, true);
- aelem2.addEventListener('click', function() { YouTube_Enhancer_Update_later(updateelem,Date_Now); }, true);
- aelemX.addEventListener('click', function() { remove_element(updateelem); }, true);
- }
- function YouTube_Enhancer_Updater(page_lang) {
- const scriptid='33042';
- if(YOUTUBE_ENHANCER_UPDATER_STATUS<0) {
- var LastVersion=GM_getValue("Youtube_Enhancer_Updater_Version", YOUTUBE_ENHANCER_UPDATER_STATUS);
- if(LastVersion>=0) {
- if(typeof GM_deleteValue == 'function') { GM_deleteValue("Youtube_Enhancer_Updater_Version"); GM_deleteValue("Youtube_Enhancer_Updater_Date"); }
- else { GM_setValue("Youtube_Enhancer_Updater", -1); GM_setValue("Youtube_Enhancer_Updater_Date", 0); }
- show_alert('Youtube Enhancer - Updater Disabled / Last_Version='+LastVersion,0);
- show_messageBox('Youtube Enhancer - '+HtmlUnicodeDecode(get_text_Updater(page_lang,"disa")));
- }
- return;
- }
- var Updater_Version=GM_getValue("Youtube_Enhancer_Updater_Version", YOUTUBE_ENHANCER_UPDATER_STATUS);
- if(Updater_Version<=0) { return; }
- GM_setValue("Youtube_Enhancer_Updater_Version",Updater_Version);
- var Updater_Date=GM_getValue("Youtube_Enhancer_Updater_Date", 0);
- var Date_Now=new Date();
- Date_Now=Date_Now.getFullYear()*10000+Date_Now.getMonth()*100+Date_Now.getDate();
- if(Updater_Date>Date_Now) { GM_setValue("Youtube_Enhancer_Updater_Date", Date_Now); return; }
- //var Updater_url_dl='https://userscripts.org/scripts/source/'+scriptid+'.user.js';
- var Updater_url_dl='https://userscripts.org/scripts/show/'+scriptid;
- if(Updater_Date<0) {
- show_alert('Youtube Enhancer - Update Was Found: Last='+Math.abs(Updater_Date)+' / Now='+Date_Now,0);
- YouTube_Enhancer_Update_Display(page_lang,Updater_url_dl,Date_Now);
- return;
- }
- if(Date_Now-Updater_Date<1) { return; }
- // Checking meta.js...
- var Updater_url_check='https://userscripts.org/scripts/source/'+scriptid+'.meta.js';
- GM_xmlhttpRequest({
- method: 'GET',
- url: Updater_url_check,
- headers: { 'User-agent': 'GM_xmlhttpRequest Updater', 'Accept': 'text/*' },
- onload: function(data) {
- show_alert('Youtube Enhancer - Check Update: Last='+Updater_Date+' / Now='+Date_Now,0);
- if(data.status!=200) { show_alert('Update check failed: HTTP Error '+data.status,0); return; }
- res=data.responseText.match(/\@name\s+YouTube\s+Enhancer/i);
- if(!res) { GM_setValue("Youtube_Enhancer_Updater_Date", Date_Now); return; }
- res=data.responseText.match(/\@namespace\s+https?\:\/\/userscripts\.org\/scripts\/show\/(\d+)/i);
- if(!res) { GM_setValue("Youtube_Enhancer_Updater_Date", Date_Now); return; }
- if(res[1]!=scriptid) { return; }
- res=data.responseText.match(/\@uso\:script\s+(\d+)/i);
- if(!res) { return; }
- if(res[1]!=scriptid) { return; }
- res=data.responseText.match(/\@uso\:version\s+(\d+)/i);
- if(!res) { return; }
- res=res[1];
- if(res==Updater_Version) {
- show_alert('Youtube Enhancer - No change / Current_Version='+res,0);
- GM_setValue("Youtube_Enhancer_Updater_Date", Date_Now)
- return;
- }
- if(Updater_Version==YOUTUBE_ENHANCER_UPDATER_STATUS) {
- show_alert('Youtube Enhancer - Updater Enabled / Current_Version='+res,0);
- GM_setValue("Youtube_Enhancer_Updater_Version", res)
- GM_setValue("Youtube_Enhancer_Updater_Date", Date_Now)
- show_messageBox('Youtube Enhancer - '+HtmlUnicodeDecode(get_text_Updater(page_lang,"enab")));
- } else {
- show_alert('Youtube Enhancer - Update Found / Version: '+Updater_Version+' -> '+res,0);
- GM_setValue("Youtube_Enhancer_Updater_Version", res)
- GM_setValue("Youtube_Enhancer_Updater_Date", -Math.abs(Date_Now))
- YouTube_Enhancer_Update_Display(page_lang,Updater_url_dl,Date_Now);
- }
- }
- });
- }
- //************************************** Useful Sub-routines *********************************************//
- function remove_watch_element(elementname) {
- if(check_on_youtube()) {
- var el=document.getElementById(elementname);
- if(el) { el.parentNode.removeChild(el); }
- }
- }
- function remove_watch_parent_element(elementname) {
- if(check_on_youtube()) {
- var el=document.getElementById(elementname);
- if(el) { var elp=el.parentNode; elp.parentNode.removeChild(elp); }
- }
- }
- function HtmlUnicodeDecode(str) {
- // Change HTML code "&#xxxxx;" to Unicode
- var out="";
- if(str==null) { return(out); }
- var l=str.length;
- for (var i=0; i<l; i++) {
- var ch=str.charAt(i);
- if(ch=='&') {
- var sci=str.indexOf(';',i+1);
- if(sci>0) {
- var entity=str.substring(i+1,sci);
- if(entity.length>1 && entity.charAt(0)=='#') {
- entity=entity.substring(1);
- if(entity.charAt(0).toLowerCase()=='x') { ch=String.fromCharCode(parseInt('0'+entity)); }
- else { ch=String.fromCharCode(parseInt(entity)); }
- } else {
- switch(entity) {
- case "nbsp": ch=String.fromCharCode(160);
- }
- }
- i=sci;
- }
- }
- out+=ch;
- }
- return out;
- }
- function getDisplayHeight(element) {
- var els = element.style;
- var oVisibility = els.visibility;
- var oPosition = els.position;
- var oDisplay = els.display;
- els.visibility = 'hidden';
- els.position = 'absolute';
- els.display = 'block';
- var Result = element.clientHeight;
- els.display = oDisplay;
- els.position = oPosition;
- els.visibility = oVisibility;
- return Result;
- }
- function getHeight(element) {
- //var Result=window.getComputedStyle(element,null).height.replace('px','');
- //if (Result=='auto') { Result = element.clientHeight; }
- return element.clientHeight;
- }
- function getWidth(element) {
- var Result = window.getComputedStyle(element,null).width.replace('px','');
- if (Result=='auto') { Result = element.clientWidth; }
- return Result;
- }
- function getAbsoluteLeft(element) {
- var AbsLeft = 0;
- while (element) { AbsLeft = AbsLeft + element.offsetLeft; element = element.offsetParent; }
- return(AbsLeft);
- }
- function getAbsoluteTop(element) {
- var AbsTop = 0;
- while (element) { AbsTop = AbsTop + element.offsetTop; element = element.offsetParent; }
- return(AbsTop);
- }
- function isPositiveInteger(value) { return (value.toString().search(/^\d+$/)==0); }
- function isDefined(x) { return !(x == null && x !== null); }
- function isUndefined(x) { return x == null && x !== null; }
- function flushNode(el) { el.parentNode.replaceChild(el.cloneNode(true),el); }
- function swap_display(element) {
- var els = element.style;
- if(els.display=="none") { els.display="block"; } else { els.display="none"; }
- }
- function user_select(element,value) {
- var els = element.style;
- if(isDefined(els.userSelect)) {els.userSelect=value;} // CSS3
- else if (isDefined(els.MozUserSelect)) {els.MozUserSelect=value;} // Mozilla
- }
- function GetLuminosity(color) {
- var rgb=color.match(/rgb\s*\(\s*(\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\s*\)/i);
- if (rgb) { return (rgb[1]+rgb[2]+rgb[3])/3; }
- rgb=color.match(/\#\s*([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})/i);
- if (rgb) { return (parseInt('0x'+rgb[1])+parseInt('0x'+rgb[2])+parseInt('0x'+rgb[3]))/3; }
- return 255;
- }
- function remove_element(element) { element.parentNode.removeChild(element); }
- function show_messageBox(msg) {
- if ( top.location.href!=window.location.href ) { return; }
- var element=document.createElement('div');
- element.setAttribute('lang','fr');
- element.setAttribute("style","position:fixed; top:0px; left:0px; right:0px; z-index:9998; height:26px; font-family:arial,sans-serif; font-size:24px; line-height:24px; text-align:center; vertical-align:middle; color:#FFFFFF !important; background:#C080C0 !important; margin:2px; border: 3px solid #CC0088; border-right-width:24px;");
- element.textContent=msg;
- var aelem=document.createElement('a');
- aelem.setAttribute('style','position:absolute; top:0px; height:26px; width: 20px; right:-21px; text-decoration:none; cursor:pointer; color:#0000CC !important; background:#CC0088 !important;');
- aelem.textContent='X';
- element.appendChild(aelem);
- user_select(element,'none');
- document.body.appendChild(element);
- aelem.addEventListener('click', function() { remove_element(element); }, true);
- }
- function show_alert(msg, force) {
- if(arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; }
- GM_log('('+arguments.callee.counter+') '+msg);
- if(force==0) { return; }
- // Show a HTML alert box (only for watch pages or if forced)
- if(force==1 || check_on_youtubewatchpage()) {
- warningelem=document.createElement('div');
- warningelem.setAttribute("style","color:#FFFFFF; background:#FF8000; width:auto; text-align:center; font-size:24px; border: 3px solid #CC0088; margin:2px;");
- warningelem.textContent=msg;
- document.body.insertBefore(warningelem, document.body.firstChild);
- }
- }
- /******************************************** Licence ******************************************************
- *** Creative Commons 3.0 ***
- *** by: BY-attribution (Requirement to acknowledge or credit the author "GIJoe") ***
- *** nc: Non-Commercial (Use for commercial purpose is forbidden) ***
- *** sa: Share Alike (Derivative works must be under the same or similar license to this one) ***
- ***********************************************************************************************************/
- //******************************************* Main() *****************************************************//
- function mediacontrollermenu() {
- var page_lang="www";
- try { page_lang=get_page_lang(); } catch(err) { show_alert('Initialisation failed: '+err); }
- try { add_media_controller(page_lang); } catch(err) { show_alert('media_controller => ' +err); }
- }
- function main() {
- // Clear onYouTubePlayerReady
- unsafeWindow.onYouTubePlayerReady=function() {};
- // Bind event for loop and autoplay (YouTube Watch pages only)
- try { bind_movie_player_event(); } catch(err) { show_alert('bind_movie_player_event => '+err); }
- // Get page info
- var page_lang="www"; var page_fmt=0;
- try { page_fmt=get_page_fmt(); page_lang=get_page_lang(); } catch(err) { show_alert('Initialisation failed: '+err); }
- // Miscellaneous (remove unneeded items)
- remove_watch_parent_element(WATCH_PROMOTED);
- remove_watch_element(DEFAULT_LANG_BOX);
- // change_links (part of Quality Selector) (image_preview_rollover included) (change_links must be the first to run)
- try { change_links(page_fmt); } catch(err) { show_alert('change_links => ' +err); }
- // Download Link (YouTube Watch pages only)
- try { add_download_link(page_lang, page_fmt); } catch(err) { show_alert('download_link => ' +err); }
- // Quality Selector (YouTube Watch pages only)
- try { add_quality_selector(page_lang, page_fmt); } catch(err) { show_alert('quality_selector => '+err); }
- // Media Controller
- try { add_media_controller(page_lang); } catch(err) { show_alert('media_controller => '+err); }
- // Add menu to rebind Media Controller
- GM_registerMenuCommand("Media Controller - Rebind", mediacontrollermenu );
- // Update check
- try { YouTube_Enhancer_Updater(page_lang); } catch(err) { show_alert('YouTube_Enhancer_Updater => '+err); }
- }
- main();
- } )();
- // ]]>
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址