// ==UserScript==
// @name Twitter Video Download
// @namespace http://tampermonkey.net/
// @version 1.0.10
// @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 unsafeWindow
// @license Unlicense
// @downloadURL https://update.greasyfork.icu/scripts/434883/Twitter%20Video%20Download.user.js
// @updateURL https://update.greasyfork.icu/scripts/434883/Twitter%20Video%20Download.meta.js
// ==/UserScript==
'use strict';
setInterval(() => {
var doc = unsafeWindow.document;
if (unsafeWindow.wrappedJSObject) doc = unsafeWindow.wrappedJSObject.document; //Violentmonkey fix
var main = doc.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 = doc.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 videoInfos = [...tweet.extended_entities.media].filter(el => el.video_info);
var videos = videoInfos.map(el => [...el.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 = ``;
videos.forEach(video => el.insertAdjacentHTML("beforeend", `${svg}`));
}, 1000);