Greasy Fork is available in English.
Все-в-одном, быстрый и бесплатный HD видеозагрузчик. Поддерживает загрузку видео с YouTube, TikTok, Douyin, Instagram, Threads, X (бывший Twitter) и других. Наслаждайтесь безупречными загрузками высокого качества без водяных знаков.
// ==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();
}());