// ==UserScript== // @name Twitter Video Download // @namespace http://tampermonkey.net/ // @version 1.0.7 // @description Adds a button to download video from a tweet // @run-at document-idle // @author naileD // @match https://x.com/* // @match https://mobile.x.com/* // @match https://twitter.com/* // @match https://mobile.twitter.com/* // @icon https://www.google.com/s2/favicons?domain=x.com // @grant none // @license Unlicense // @downloadURL none // ==/UserScript== 'use strict'; setInterval(() => { var main = document.querySelector("main[role='main'] section[role='region']"); if (!main) return; var react = Object.entries(main.parentElement).find(el => el[0].startsWith("__reactFiber")); if (!react || !react[1] || !react[1].memoizedProps.children.length) return; var tweet = react[1].memoizedProps.children.filter(el => (el || {})._owner).map(el => el._owner.memoizedProps.focalTweet).filter(el => el)[0]; if (!tweet || !tweet.extended_entities || !tweet.extended_entities.media || !tweet.extended_entities.media.find(el => el.video_info)) return; var el = document.querySelector(`a[href*="${tweet.id_str}"]`); if (!el) return; while (el.tagName !== "ARTICLE") { el = el.parentElement; } el = el.querySelector(`[id^="id"][role="group"]`); if (!el) return; if (el.lastElementChild.tagName === "A") return; var video = tweet.extended_entities.media.find(el => el.video_info).video_info.variants.filter(v => v.content_type == "video/mp4").sort((a,b) => b.bitrate - a.bitrate)[0].url.replace(new RegExp("\\?tag=.*"), ""); var color = el.firstElementChild.style.color || "#536471"; var svg = ` `; el.insertAdjacentHTML("beforeend", `${svg}`); }, 1000);