Greasy Fork is available in English.

All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)

Все-в-одном, быстрый и бесплатный HD видеозагрузчик. Поддерживает загрузку видео с YouTube, TikTok, Douyin, Instagram, Threads, X (бывший Twitter) и других. Наслаждайтесь безупречными загрузками высокого качества без водяных знаков.

Перед установкой, Greasy Fork хочет предупредить вас о наличии в скрипте нежелательной функциональности — то есть функциональности, которая полезна автору скрипта, а не вам.

Этот скрипт получает комиссию для автора, например изменяя ссылки или предоставляя купоны, чтобы добавить реферальные или партнёрские коды.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name        All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:ar     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:bg     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:cs     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:da     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:de     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:el     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:en     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:eo     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:es     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:es-419 All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:fi     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:fr     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:fr-CA  All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:he     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:hr     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:hu     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:id     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More))
// @name:it     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:ja     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:ka     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:ko     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:nb     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:nl     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:pl     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:pt-BR  All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:ro     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:ru     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:sv     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:th     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:tr     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:uk     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:ug     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @name:vi     All-in-One Video Downloader – HD (YouTube, TikTok, Instagram, X & More)
// @description       An all-in-one, fast, and free HD video downloader. Supports video downloads from YouTube, TikTok, Douyin, Instagram, Threads, X (formerly Twitter), and more. Enjoy seamless, high-quality downloads with no watermarks.
// @description:ar    أداة شاملة وسريعة ومجانية لتحميل مقاطع الفيديو بدقة عالية. يدعم تحميل مقاطع الفيديو من يوتيوب، تيك توك، إنستغرام، ثريدز، إكس (تويتر سابقًا)، والمزيد. استمتع بتحميلات عالية الجودة بدون علامات مائية.
// @description:bg    Всичко в едно, бързо и безплатно изтегляне на видео с висока резолюция. Поддържа изтегляне на видеа от YouTube, TikTok, Douyin, Instagram, Threads, X (бивш Twitter) и други. Насладете се на безпроблемни, висококачествени изтегляния без водни знаци.
// @description:cs    Vše v jednom, rychlý a bezplatný downloader videí ve vysoké kvalitě. Podporuje stahování videí z YouTube, TikTok, Douyin, Instagram, Threads, X (dříve Twitter) a dalších. Užijte si plynulé, kvalitní stahování bez vodoznaků.
// @description:da    En alt-i-en, hurtig og gratis HD video downloader. Understøtter video downloads fra YouTube, TikTok, Douyin, Instagram, Threads, X (tidligere Twitter) og mere. Nyd problemfri, høj kvalitet downloads uden vandmærker.
// @description:de    Ein All-in-One, schneller und kostenloser HD-Video-Downloader. Unterstützt das Herunterladen von Videos von YouTube, TikTok, Douyin, Instagram, Threads, X (ehemals Twitter) und mehr. Genießen Sie nahtlose, hochqualitative Downloads ohne Wasserzeichen.
// @description:el    Ένας ολοκληρωμένος, γρήγορος και δωρεάν downloader HD βίντεο. Υποστηρίζει λήψη βίντεο από YouTube, TikTok, Douyin, Instagram, Threads, X (πρώην Twitter) και άλλα. Απολαύστε απρόσκοπτες, υψηλής ποιότητας λήψεις χωρίς υδατογραφήματα.
// @description:en    An all-in-one, fast, and free HD video downloader. Supports video downloads from YouTube, TikTok, Douyin, Instagram, Threads, X (formerly Twitter), and more. Enjoy seamless, high-quality downloads with no watermarks.
// @description:eo    Ĉio-en-unu, rapida kaj senpaga HD-video-elŝutilo. Subtenas video-elŝutojn de YouTube, TikTok, Douyin, Instagram, Threads, X (antaŭe Twitter), kaj aliaj. Ŝatu seninterrompajn, altkvalitajn elŝutojn sen akvamaĵoj.
// @description:es    Un descargador de video todo en uno, rápido y gratuito en HD. Admite descargas de videos de YouTube, TikTok, Douyin, Instagram, Threads, X (anteriormente Twitter) y más. Disfruta de descargas de alta calidad sin marcas de agua.
// @description:fi    Kaikki yhdessä, nopea ja ilmainen HD-videoiden lataaja. Tukee videoiden lataamista YouTubesta, TikTokista, Instagramista, Threadsista, X:stä (entinen Twitter) ja muista. Nauti saumatonta, korkealaatuista lataamista ilman vesileimoja.
// @description:fr    Un téléchargeur vidéo HD tout-en-un, rapide et gratuit. Prend en charge les téléchargements de vidéos depuis YouTube, TikTok, Douyin, Instagram, Threads, X (anciennement Twitter) et plus encore. Profitez de téléchargements fluides et de haute qualité sans filigranes.
// @description:fr-CA Un téléchargeur vidéo HD tout-en-un, rapide et gratuit. Prend en charge les téléchargements de vidéos depuis YouTube, TikTok, Douyin, Instagram, Threads, X (anciennement Twitter) et plus encore. Profitez de téléchargements fluides et de haute qualité sans filigranes.
// @description:he    מנוע הורדות וידאו HD מהיר, חינמי ומקיף. תומך בהורדת וידאו מיוטיוב, טיקטוק, אינסטגרם, Threads, X (בעבר טוויטר) ועוד. תהנה מהורדות באיכות גבוהה ללא סימני מים.
// @description:hr    Svi-u-jednom, brzi i besplatni HD downloader za video. Podržava preuzimanje videa s YouTubea, TikToka, Instagrama, Threads, X (bivši Twitter) i još mnogo toga. Uživajte u besprijekornim, visokokvalitetnim preuzimanjima bez vodmarks.
// @description:hu    Egy minden-egyben, gyors és ingyenes HD videó letöltő. Támogatja a videók letöltését YouTube-ról, TikTok-ról, Instagram-ról, Threads, X (régen Twitter) és másról. Élvezze a zökkenőmentes, magas minőségű letöltéseket vízjel nélkül.
// @description:id    Downloader video HD serba ada, cepat, dan gratis. Mendukung unduhan video dari YouTube, TikTok, Douyin, Instagram, Threads, X (sebelumnya Twitter), dan banyak lagi. Nikmati unduhan berkualitas tinggi tanpa tanda air.
// @description:it    Un downloader video HD completo, veloce e gratuito. Supporta il download di video da YouTube, TikTok, Douyin, Instagram, Threads, X (precedentemente Twitter) e altri. Goditi download fluidi e di alta qualità senza filigrane.
// @description:ja    YouTube の視聴体験を向上させるための高速で無料な HD 動画ダウンローダー。YouTube、TikTok、Instagram、Threads、X(旧 Twitter)などからの動画ダウンロードをサポート。シームレスで高品質なダウンロードをウォーターマークなしでお楽しみください。
// @description:ka    ყველაფერი ერთში, სწრაფი და უფასო HD ვიდეო ჩამოტვირთვა. მხარს უჭერს ვიდეოს ჩამოტვირთვას YouTube, TikTok, Douyin, Instagram, Threads, X (ყოფილი Twitter) და სხვა პლატფორმებიდან. დატკბით უარყოფითი ნიშნების გარეშე, უმაღლესი ხარისხის ჩამოტვირთვებით.
// @description:ko    YouTube 시청 경험을 향상시키는 모든 기능을 갖춘, 빠르고 무료인 HD 비디오 다운로드기. YouTube, TikTok, Douyin, Instagram, Threads, X(이전 Twitter) 등에서 비디오 다운로드를 지원합니다. 워터마크 없이 원활한 고품질 다운로드를 즐기세요.
// @description:nb    En alt-i-en, rask og gratis HD video nedlaster. Støtter video nedlastinger fra YouTube, TikTok, Douyin, Instagram, Threads, X (tidligere Twitter), og mer. Nyt sømløse, høy kvalitet nedlastinger uten vannmerker.
// @description:nl    Een alles-in-één, snelle en gratis HD-video downloader. Ondersteunt video-downloads van YouTube, TikTok, Douyin, Instagram, Threads, X (voorheen Twitter) en meer. Geniet van naadloze, hoogwaardige downloads zonder watermerken.
// @description:pl    Jedno w jednym, szybki i darmowy pobieracz wideo HD. Obsługuje pobieranie wideo z YouTube, TikTok, Douyin, Instagram, Threads, X (dawniej Twitter) i innych. Ciesz się płynne, wysokiej jakości pobieranie bez znaków wodnych.
// @description:pt-BR Um downloader de vídeo HD completo, rápido e gratuito. Suporta downloads de vídeos do YouTube, TikTok, Douyin, Instagram, Threads, X (anteriormente Twitter) e muito mais. Aproveite downloads de alta qualidade sem marcas d'água.
// @description:ro    Un downloader video HD rapid și gratuit, totul într-un singur pachet. Suportă descărcarea de videoclipuri de pe YouTube, TikTok, Douyin, Instagram, Threads, X (fost Twitter) și altele. Bucurați-vă de descărcări de înaltă calitate fără filigrane.
// @description:ru    Все-в-одном, быстрый и бесплатный HD видеозагрузчик. Поддерживает загрузку видео с YouTube, TikTok, Douyin, Instagram, Threads, X (бывший Twitter) и других. Наслаждайтесь безупречными загрузками высокого качества без водяных знаков.
// @description:sv    En allt-i-ett, snabb och gratis HD-video nedladdare. Stöder video nedladdningar från YouTube, TikTok, Douyin, Instagram, Threads, X (tidigare Twitter) och mer. Njut av sömlösa, högkvalitativa nedladdningar utan vattenmärken.
// @description:th    เครื่องมือดาวน์โหลดวิดีโอ HD ที่รวดเร็วและฟรีแบบครบวงจร รองรับการดาวน์โหลดวิดีโอจาก YouTube, TikTok, Douyin, Instagram, Threads, X (เดิม Twitter) และอื่นๆ เพลิดเพลินกับการดาวน์โหลดที่มีคุณภาพสูงโดยไม่มีลายน้ำ
// @description:tr    Birçok platformdan video indirmenizi destekleyen, hızlı ve ücretsiz HD video indirme aracıdır. YouTube, TikTok, Douyin, Instagram, Threads, X (eski Twitter) ve daha fazlasını destekler. Su işareti olmadan kesintisiz yüksek kaliteli indirmelerin keyfini çıkarın.
// @description:uk    Всі в одному, швидкий та безкоштовний HD відео-завантажувач. Підтримує завантаження відео з YouTube, TikTok, Douyin, Instagram, Threads, X (колишній Twitter) та інших. Насолоджуйтесь безперешкодними високоякісними завантаженнями без водяних знаків.
// @description:ug    YouTube كۆرۈش تەجرىبەڭىزنى ياخشىلايدىغان، تىز ۋە ھەقسىز HD ۋىدىئو چۈشۈرگۈچى. يۇتۇب، تيك توك، ئىنستاگرام، Threads، X (ئالدىنقى Twitter) ۋە باشقا پلاتفورمالاردىن ۋىدىئو چۈشۈرۈشنى قوللايدۇ. سۇ ئىشاراتسىز ئېغىزدىن سۈپەتلىك چۈشۈرۈشتىن لەززەتلىنىڭ.
// @description:vi    Trình tải video HD tất cả trong một, nhanh chóng và miễn phí. Hỗ trợ tải video từ YouTube, TikTok, Douyin, Instagram, Threads, X (trước đây là Twitter) và nhiều nền tảng khác. Thưởng thức tải xuống chất lượng cao mượt mà mà không có watermark.
// @namespace   AllInOneDownloader_Daniel
// @version     1.0.3
// @author      Daniel
// @icon        data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAAwCAYAAABe6Vn9AAACZElEQVR4AeyZbVKDMBCGgYuJ/9WT2CNoqx6hnkT9T72YuA+WDg0M2SSblnFwWCfNfuR9EhqatiqM/+72bX3/3jZirccaYo2HL8yByrLYishazHfVx1hfXJDfHEhG18BIWHeFxHYJvn85gHxjZvWvQFmn16D4ukIGk5i1xLpCWafXoPi6QgaTmLXEukJZp9eg+LpCBpOYtYR6hTi7yPnGe84JVSs1feemlrG1ddVAx7OL+cd9jdDj2JpQ+wOeatTwIPVEqleobYuXcB3zGVqvjH2rjVUDfW3KQ3kFKGAY2xyIgh+bcndJqFAYNKpXiGDsUlAxMOgLBiIpN1QsDNqigEjMBZUCg65oIJKtoVJh0JQERAErKAsY9CQDUSQVygoGLSZAFIqFsoRBhxkQxUKheKaFPDQZw2emQAymhQKGWHIszRwIcQhFMO0pw0fMlC+1rwN62Lc7zblkLsY9syAY4a5A+vAN+8mdq63xwUDNikb795sOr6NNziyjH7AQDgAmhQ9sAPRJ+3QBQ+6pI7IBg4A/VzQia4zSEIbAoQMA7POxvHU3AGLJGcYntp+6Wy6xyFk6AhF61jnxghhiJ1xJXeZAqEEotzLtKcsFw1hZgCjMrQwUBkBvcp83ABOTw7IBIRYoDIDepF/9/YDEBl9qoODKV0pYIlC3vcuuWMqcHMTca9a/OCB5Zn3327s8t0bfNPn8iwP6KYrTqoi40ftt6C8m/iRnoveKXbJ5bPudUTaUG1fK0E/b9S8OSATWArIVsQ1tMfea9S8RyAUIel3Jm2z0xguqsKzgt4oPjv8BCgbZ6l9/AQAA//9HnEu0AAAABklEQVQDAI1HmgBXKvxdAAAAAElFTkSuQmCC
// @include     https://*.youtube.com/*
// @include     https://x.com/*
// @include     https://twitter.com/*
// @include     https://www.threads.com/*
// @include     https://www.instagram.com/reels/*
// @include     https://www.tikTok.com/*
// @include     https://www.douyin.com/*
// @noframes
// @license     MIT
// @run-at      document-start
// @antifeature referral-link
// @grant       GM_openInTab
// @grant       GM.openInTab
// @grant       GM_addStyle
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       unsafeWindow
// @grant       GM_download
// ==/UserScript==
(function () {
	'use strict';

	
	/*!
	* Copyright (c) 2026 - 2026, Daniel. All rights reserved.
	*
	* Permission is hereby granted, free of charge, to any person obtaining a copy
	* of this software and associated documentation files (the "Software"), to deal
	* in the Software without restriction, including without limitation the rights
	* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
	* copies of the Software, and to permit persons to whom the Software is
	* furnished to do so, subject to the following conditions:
	*
	* The above copyright notice and this permission notice shall be included in
	* all copies or substantial portions of the Software.
	*
	* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
	* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
	*
	* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
	* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
	* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
	* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
	* SOFTWARE.
	*/


	const CommonUtils = {
	  getSupportedLang: function() {
	    const lang = navigator.language || navigator.userLanguage;
	    const supportedLanguages = {
	      "en": "en",
	      "es": "es",
	      "fr": "fr",
	      "pt": "pt",
	      "ru": "ru",
	      "ja": "ja",
	      "de": "de",
	      "ko": "ko",
	      "it": "it",
	      "id": "id",
	      "tr": "tr",
	      "pl": "pl",
	      "uk": "uk",
	      "nl": "nl",
	      "vi": "vi",
	      "th": "th",
	      "ar": "ar",
	      "fa": "fa",
	      "hi": "hi",
	      "ms": "ms",
	      "zh-CN": "zh-CN",
	      "zh-TW": "zh-TW"
	    };
	    const langCode = lang.split("-")[0];
	    if (langCode === "zh") {
	      return lang === "zh-CN" ? "zh-CN" : "zh-TW";
	    }
	    return supportedLanguages[langCode] || "en";
	  },
	  openInTab: function(url, options = { "active": true, "insert": true, "setParent": true }) {
	    if (typeof GM_openInTab === "function") {
	      GM_openInTab(url, options);
	    } else {
	      GM.openInTab(url, options);
	    }
	  },
	  genrateDownloadSvg: function(color = "#FFF", width = 25, height = 25) {
	    let svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
	    svg.setAttribute("t", "1768806429307");
	    svg.setAttribute("class", "icon");
	    svg.setAttribute("viewBox", "0 0 1024 1024");
	    svg.setAttribute("version", "1.1");
	    svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
	    svg.setAttribute("p-id", "21520");
	    svg.setAttribute("width", width);
	    svg.setAttribute("height", height);
	    let path = document.createElementNS("http://www.w3.org/2000/svg", "path");
	    path.setAttribute("d", "M684.5 512H573.1V389.8c0-11.2-9.1-20.4-20.4-20.4h-81.5c-11.3 0-20.4 9.1-20.4 20.4v122.4l-112.4 0.6c-4 0-7.1 2.3-8.5 5.5 0 0.1-0.1 0.1-0.1 0.2-0.3 0.6-0.3 1.3-0.4 2-0.1 0.6-0.3 1.2-0.2 1.8 0 0.1-0.1 0.3-0.1 0.4 0 0.4 0.2 0.7 0.3 1.1 0.2 0.8 0.3 1.6 0.7 2.4 0.2 0.4 0.4 0.7 0.6 1 0.3 0.6 0.6 1.2 1 1.7l168.2 188c0.4 0.4 0.8 0.6 1.2 1 0.2 0.2 0.3 0.5 0.6 0.7 0.2 0.2 0.5 0.2 0.8 0.4 0.7 0.4 1.4 0.7 2.1 1 0.2 0.1 0.5 0.2 0.7 0.2 2.9 0.9 6 0.6 8.3-1.3 0.5-0.4 0.8-1.1 1.2-1.6 0.3-0.2 0.6-0.4 0.9-0.7l175.2-187.8c0.5-0.6 0.8-1.3 1.2-1.9 0.2-0.3 0.4-0.5 0.5-0.9 0.4-0.8 0.6-1.6 0.7-2.3 0.1-0.4 0.3-0.6 0.3-1v-1c0.6-5.4-3.6-9.7-9.1-9.7zM471.3 349.1h81.5c11.3 0 20.4-9.1 20.4-20.4v-20.4c0-11.2-9.1-20.4-20.4-20.4h-81.5c-11.3 0-20.4 9.1-20.4 20.4v20.4c0 11.3 9.1 20.4 20.4 20.4zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64z m0 814.6c-202.4 0-366.5-164.1-366.5-366.6 0-202.4 164.1-366.5 366.5-366.5S878.5 309.6 878.5 512 714.4 878.6 512 878.6z");
	    path.setAttribute("fill", color);
	    svg.appendChild(path);
	    return svg;
	  }
	};

	const YouTubeDownloader = {
	  downloadVideo: function() {
	    const url = "https://www.tool77.com/" + CommonUtils.getSupportedLang() + "/v/downloader?url=" + encodeURIComponent(window.location.href);
	    CommonUtils.openInTab(url);
	  },
	  genrate: function() {
	    return new Promise((resolve) => {
	      const buttonId = "all-in-one-downloader";
	      const boxContainer = document.createElement("div");
	      boxContainer.className = "ytp-button";
	      boxContainer.id = buttonId;
	      boxContainer.setAttribute("style", `position: relative;display: inline-block;width: 48px;height: 100%;`);
	      const boxInner = document.createElement("div");
	      boxInner.setAttribute("style", `position: absolute;width: 100%;height: 100%;	`);
	      const boxActiveButton = document.createElement("button");
	      boxActiveButton.setAttribute("style", `background-color: transparent;width: 100%;height: 100%;outline: none;flex: 1 1 0%;display: flex;-webkit-box-align: center;align-items: center;-webkit-box-pack: center;justify-content: center;border: none;padding: 0px;cursor: pointer;`);
	      boxContainer.appendChild(boxInner);
	      boxInner.appendChild(boxActiveButton);
	      boxActiveButton.appendChild(CommonUtils.genrateDownloadSvg("#FFF"));
	      boxContainer.addEventListener("click", () => {
	        this.downloadVideo();
	      });
	      const genrateHtml = () => {
	        const player = document.querySelector("#player-container-outer .html5-video-player");
	        if (player) {
	          const rightControls = player.querySelector(".ytp-right-controls");
	          if (rightControls) {
	            rightControls.prepend(boxContainer);
	          }
	        }
	      };
	      const interval = setInterval(() => {
	        if (!document.querySelector("#" + buttonId)) {
	          genrateHtml();
	        } else {
	          resolve();
	          clearInterval(interval);
	        }
	      }, 500);
	    });
	  },
	  genrateShorts: function() {
	    const genrateHtml = () => {
	      if (window.location.href.indexOf("/shorts/") != -1) {
	        const navigationButtonDown = document.querySelector("#navigation-button-down");
	        if (navigationButtonDown) {
	          const download = document.createElement("div");
	          download.style.cursor = "pointer";
	          download.setAttribute("style", "cursor:pointer;display: flex;justify-content: center;align-items: center;");
	          download.id = "script_download_shorts";
	          download.className = "navigation-button style-scope ytd-shorts";
	          navigationButtonDown.after(download);
	          download.appendChild(CommonUtils.genrateDownloadSvg("#3e3e3e", 45, 45));
	          download.addEventListener("click", () => {
	            this.downloadVideo();
	          });
	        }
	      }
	    };
	    setInterval(() => {
	      if (!document.querySelector("#script_download_shorts")) {
	        genrateHtml();
	      }
	    }, 800);
	  },
	  run: function() {
	    this.genrate();
	    this.genrateShorts();
	  },
	  start: function() {
	    const isRun = /youtube\.com/.test(window.location.host);
	    if (isRun) {
	      this.run();
	    }
	  }
	};

	const TiktokDownloader = {
	  downloadVideo: function(playId) {
	    if (playId) {
	      const url = "https://www.tool77.com/" + CommonUtils.getSupportedLang() + "/v/downloader?url=https%3A%2F%2Fwww.tiktok.com%2F%40_%2Fvideo/" + playId;
	      CommonUtils.openInTab(url);
	    }
	  },
	  findAncestorByClass: function(element, className, maxDepth = Infinity) {
	    let current = element;
	    let depth = 0;
	    while (current && depth < maxDepth) {
	      current = current.parentElement;
	      depth++;
	      if (current && current.classList.contains(className)) {
	        return current;
	      }
	    }
	    return null;
	  },
	  extractLastDashNumber: function(str) {
	    if (!str)
	      return null;
	    const match = str.match(/-(\d+)$/);
	    return match ? match[1] : null;
	  },
	  genrate: function() {
	    const randomId = Math.floor(1e5 + Math.random() * 9e5);
	    GM_addStyle(`
			.sc-download-` + randomId + `{
				cursor:pointer;
				justify-content:center;
				align-items:center;
				width:48px;
				height:48px;
				z-index:99999;
				position:absolute;
				right:55px;
				top:10px;
				border-radius:50%;
				display: flex;
			}
		`);
	    setInterval(() => {
	      document.querySelectorAll("video").forEach((element, index) => {
	        const parentNode = element.parentNode;
	        if (!parentNode.querySelector("*[x-add='true']")) {
	          const downloadElement = document.createElement("div");
	          downloadElement.setAttribute("x-add", "true");
	          downloadElement.classList.add("sc-download-" + randomId);
	          downloadElement.appendChild(CommonUtils.genrateDownloadSvg("#FFF"));
	          downloadElement.style.cursor = "pointer";
	          parentNode.appendChild(downloadElement);
	          downloadElement.addEventListener("click", () => {
	            const container = this.findAncestorByClass(parentNode, "xgplayer-container", 3);
	            if (container && container.getAttribute("id")) {
	              const playId = this.extractLastDashNumber(container.getAttribute("id"));
	              if (playId)
	                this.downloadVideo(playId);
	            }
	          });
	        }
	      });
	    }, 1e3);
	  },
	  start: function() {
	    const isRun = /tiktok\.com/.test(window.location.host);
	    if (isRun) {
	      this.genrate();
	    }
	  }
	};

	const ThreadsDownloader = {
	  downloadVideo: function(url) {
	    const openUrl = "https://www.tool77.com/" + CommonUtils.getSupportedLang() + "/v/downloader?url=" + encodeURIComponent(url);
	    CommonUtils.openInTab(openUrl);
	  },
	  run: function() {
	    setInterval(() => {
	      document.querySelectorAll("*[data-pressable-container='true']:not([detectvs='true'])").forEach((element) => {
	        element.setAttribute("detectvs", "true");
	        if (element.querySelector("video") === null) {
	          return;
	        }
	        const buttons = element.querySelectorAll("*[role='button']");
	        const lastButton = buttons[buttons.length - 1];
	        const shareButton = lastButton.parentElement;
	        const downloadButton = shareButton.cloneNode(false);
	        downloadButton.appendChild(CommonUtils.genrateDownloadSvg("#505050", 20, 20));
	        downloadButton.style.cursor = "pointer";
	        shareButton.insertAdjacentElement("afterend", downloadButton);
	        downloadButton.addEventListener("click", (e) => {
	          const links = element.querySelectorAll("a[role='link']");
	          e.stopPropagation();
	          e.preventDefault();
	          let link = "";
	          for (let i = 0; i < links.length; i++) {
	            if (links[i].getAttribute("href").indexOf("/post/") != -1) {
	              link = encodeURIComponent("https://www.threads.com") + links[i].getAttribute("href");
	            }
	          }
	          if (!!link) {
	            this.downloadVideo(link);
	          } else {
	            this.downloadVideo(window.location.href);
	          }
	        });
	      });
	    }, 500);
	  },
	  start: function() {
	    const isYoutube = /threads\.com/.test(window.location.host);
	    if (isYoutube) {
	      this.run();
	    }
	  }
	};

	const TwitterDownloader = {
	  svg: ` <g class="download"><path d="M11.99 16l-5.7-5.7L7.7 8.88l3.29 3.3V2.59h2v9.59l3.3-3.3 1.41 1.42-5.71 5.7zM21 15l-.02 3.51c0 1.38-1.12 2.49-2.5 2.49H5.5C4.11 21 3 19.88 3 18.5V15h2v3.5c0 .28.22.5.5.5h12.98c.28 0 .5-.22.5-.5L19 15h2z" /></g>`,
	  showSensitive: true,
	  isTweetdeck: () => window.location.host.includes("tweetdeck"),
	  extractStatusId: (url) => url ? (url.match(/\/status\/(\d+)/) || [null, null])[1] : null,
	  downloadVideo: function(statusIds) {
	    const url = "https://www.tool77.com/" + CommonUtils.getSupportedLang() + "/v/downloader?url=https%3A%2F%2Fx.com/_/status/" + statusIds;
	    CommonUtils.openInTab(url);
	  },
	  addButtonTo: function(article) {
	    if (article.dataset.detected)
	      return;
	    article.dataset.detected = "true";
	    const statusIds = Array.from(article.querySelectorAll('a[href*="/status/"]')).map((el) => this.extractStatusId(el.href)).filter((id) => id);
	    if (statusIds.length === 0)
	      return;
	    const mediaSelector = [
	      'div[role="progressbar"]',
	      'button[data-testid="playButton"]',
	      'div[data-testid="videoComponent"]',
	      'a[href="/settings/content_you_see"]',
	      "div.media-image-container",
	      "div.media-preview-container",
	      'div[aria-labelledby]>div:first-child>div[role="button"][tabindex="0"]'
	    ];
	    const hasMedia = article.querySelector(mediaSelector.join(","));
	    if (hasMedia) {
	      const btnGroup = article.querySelector('div[role="group"]:last-of-type, ul.tweet-actions, ul.tweet-detail-actions');
	      if (btnGroup) {
	        const btnShare = Array.from(btnGroup.querySelectorAll(":scope>div>div, li.tweet-action-item>a, li.tweet-detail-action-item>a")).pop().parentNode;
	        const btnDownload = btnShare.cloneNode(true);
	        btnDownload.style.marginLeft = "10px";
	        btnDownload.style.cursor = "pointer";
	        btnDownload.querySelector("button")?.removeAttribute("disabled");
	        const svgContainer = this.isTweetdeck() ? btnDownload.firstElementChild : btnDownload.querySelector("svg");
	        if (svgContainer) {
	          if (this.isTweetdeck()) {
	            svgContainer.innerHTML = `<svg viewBox="0 0 20 20" width="15" height="15">${this.svg}</svg>`;
	            svgContainer.removeAttribute("rel");
	            btnDownload.classList.replace("pull-left", "pull-right");
	          } else {
	            svgContainer.innerHTML = this.svg;
	          }
	        }
	        btnGroup.insertBefore(btnDownload, btnShare.nextSibling);
	        btnDownload.onclick = () => {
	          this.downloadVideo(statusIds);
	        };
	        if (this.showSensitive) {
	          article.querySelector('div[aria-labelledby] div[role="button"][tabindex="0"]:not([data-testid]) > div[dir] > span > span')?.click();
	        }
	      }
	    }
	  },
	  addButtonToMedia: function(listitems) {
	    listitems.forEach((li) => {
	      if (li.dataset.detected)
	        return;
	      li.dataset.detected = "true";
	      const statusElement = li.querySelector('a[href*="/status/"]');
	      const statusId = statusElement ? this.extractStatusId(statusElement.href) : null;
	      if (!statusId)
	        return;
	      const btnDownload = document.createElement("div");
	      btnDownload.style.cursor = "pointer";
	      btnDownload.innerHTML = `<div><div><svg viewBox="0 0 20 20" width="15" height="15">${this.svg}</svg></div></div>`;
	      li.appendChild(btnDownload);
	      btnDownload.onclick = () => {
	        this.downloadVideo(statusId);
	      };
	    });
	  },
	  detect: function(node) {
	    const article = node.tagName === "ARTICLE" && node || node.tagName === "DIV" && (node.querySelector("article") || node.closest("article"));
	    if (article) {
	      this.addButtonTo(article);
	    }
	    const listitems = node.tagName === "LI" && node.getAttribute("role") === "listitem" ? [node] : node.tagName === "DIV" && node.querySelectorAll('li[role="listitem"]');
	    if (listitems) {
	      this.addButtonToMedia(listitems);
	    }
	  },
	  run: function() {
	    const observer = new MutationObserver((mutations) => {
	      mutations.forEach((mutation) => {
	        mutation.addedNodes.forEach((node) => {
	          if (node.nodeType === 1) {
	            this.detect(node);
	          }
	        });
	      });
	    });
	    observer.observe(document.body, {
	      childList: true,
	      subtree: true
	    });
	  },
	  start: function() {
	    const isRun = /twitter|x\.com/.test(window.location.host);
	    if (isRun) {
	      this.run();
	    }
	  }
	};

	const InstagramDownloader = {
	  downloadVideo: function() {
	    const url = "https://www.tool77.com/" + CommonUtils.getSupportedLang() + "/v/downloader?url=" + encodeURIComponent(window.location.href);
	    CommonUtils.openInTab(url);
	  },
	  run: function() {
	    const interval = setInterval(() => {
	      const toolbar = document.querySelector("div[role='toolbar']");
	      if (toolbar) {
	        clearInterval(interval);
	        const downloadDiv = toolbar.firstElementChild.cloneNode();
	        downloadDiv.style.cursor = "pointer";
	        downloadDiv.appendChild(CommonUtils.genrateDownloadSvg("#000", 30, 30));
	        downloadDiv.addEventListener("click", () => {
	          this.downloadVideo();
	        });
	        toolbar.appendChild(downloadDiv);
	      }
	    }, 500);
	  },
	  start: function() {
	    const isRun = /instagram\.com/.test(window.location.host);
	    if (isRun) {
	      this.run();
	    }
	  }
	};

	const DouyinDownloader = {
	  downloadVideo: function() {
	    CommonUtils.openInTab("https://www.tool77.com/zh-CN/v/downloader?url=" + encodeURIComponent(window.location.href));
	  },
	  genrate: function() {
	    const controllers = document.querySelectorAll(".xg-inner-controls:not([downloaderx='true'])");
	    if (controllers.length === 0)
	      return;
	    controllers.forEach((controller) => {
	      controller.setAttribute("downloaderx", "true");
	      const rightGrid = controller.querySelector(".xg-right-grid");
	      if (rightGrid) {
	        const fullscreen = rightGrid.querySelector(".xgplayer-fullscreen");
	        if (fullscreen) {
	          const donwload = fullscreen.cloneNode(false);
	          donwload.style.display = "flex";
	          donwload.style.alignItems = "center";
	          donwload.style.justifyContent = "center";
	          donwload.style.margin = "0 7px";
	          donwload.appendChild(CommonUtils.genrateDownloadSvg("#FFF", 20, 20));
	          rightGrid.before(donwload);
	          donwload.addEventListener("click", () => {
	            this.downloadVideo();
	          });
	        }
	      }
	    });
	  },
	  start: function() {
	    const isRun = /douyin\.com/.test(window.location.host);
	    if (isRun) {
	      setInterval(() => {
	        this.genrate();
	      }, 500);
	    }
	  }
	};

	YouTubeDownloader.start();
	TiktokDownloader.start();
	ThreadsDownloader.start();
	TwitterDownloader.start();
	InstagramDownloader.start();
	DouyinDownloader.start();

}());