Created
June 5, 2024 00:33
-
-
Save nmdra/b75b0af86b07e6e20d7812b941cd48b0 to your computer and use it in GitHub Desktop.
Detect m3u8 links, modify them, and display with copy and hide buttons.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Specific m3u8 Link Detector and Copier | |
// @version 1.2 | |
// @description Detect specific m3u8 links, modify them, and display with copy and hide buttons. Link text is displayed only on hover. | |
// @author Nimendra | |
// @icon https://img.icons8.com/?size=100&id=roUdNSN10VmV&format=png&color=000000 | |
// @match *://*/* | |
// @grant none | |
// @run-at document-start | |
// ==/UserScript== | |
(function() { | |
'use strict'; | |
const detectedLinks = []; | |
// Function to check if the URL matches the pattern and ends with .m3u8 | |
function isSpecificM3U8Link(url) { | |
return url.includes("_144.m3u8"); | |
} | |
// Function to modify the m3u8 link | |
function modifyM3U8Link(url) { | |
return url.replace("_144.m3u8", "_360.m3u8"); | |
} | |
// Function to create and show the floating element with copy and hide buttons | |
function showFloatingElement(url) { | |
if (detectedLinks.includes(url)) return; | |
const modifiedUrl = modifyM3U8Link(url); | |
detectedLinks.push(url); | |
const floatDiv = document.createElement("div"); | |
floatDiv.style.position = "fixed"; | |
floatDiv.style.bottom = "20px"; | |
floatDiv.style.right = "20px"; | |
floatDiv.style.backgroundColor = "transparent"; | |
floatDiv.style.color = "white"; | |
floatDiv.style.padding = "10px"; | |
floatDiv.style.borderRadius = "5px"; | |
floatDiv.style.zIndex = "9999999999"; | |
floatDiv.style.maxWidth = "300px"; | |
floatDiv.style.wordWrap = "break-word"; | |
floatDiv.style.display = "flex"; | |
floatDiv.style.flexDirection = "column"; | |
floatDiv.style.alignItems = "center"; | |
const linkText = document.createElement("div"); | |
linkText.innerText = modifiedUrl; | |
linkText.style.marginBottom = "10px"; | |
linkText.style.wordBreak = "break-all"; | |
linkText.style.opacity = "0"; // Initially hide link text | |
linkText.style.transition = "opacity 0.3s"; // Add transition effect | |
floatDiv.appendChild(linkText); | |
// Show link text on hover | |
floatDiv.addEventListener("mouseenter", () => { | |
linkText.style.opacity = "1"; | |
}); | |
floatDiv.addEventListener("mouseleave", () => { | |
linkText.style.opacity = "0"; | |
}); | |
const copyButton = document.createElement("button"); | |
copyButton.innerText = "Copy Link"; | |
copyButton.style.marginBottom = "5px"; | |
copyButton.style.padding = "5px 10px"; | |
copyButton.style.border = "none"; | |
copyButton.style.borderRadius = "3px"; | |
copyButton.style.backgroundColor = "white"; | |
copyButton.style.color = "black"; | |
copyButton.style.cursor = "pointer"; | |
copyButton.addEventListener("click", () => { | |
copyTextToClipboard(modifiedUrl); | |
copyButton.innerText = "Copied"; | |
setTimeout(() => { | |
copyButton.innerText = "Copy Link"; | |
}, 2000); | |
}); | |
floatDiv.appendChild(copyButton); | |
const hideButton = document.createElement("button"); | |
hideButton.innerText = "Hide"; | |
hideButton.style.padding = "5px 10px"; | |
hideButton.style.border = "none"; | |
hideButton.style.borderRadius = "3px"; | |
hideButton.style.backgroundColor = "white"; | |
hideButton.style.color = "black"; | |
hideButton.style.cursor = "pointer"; | |
hideButton.addEventListener("click", () => { | |
floatDiv.style.display = "none"; | |
}); | |
floatDiv.appendChild(hideButton); | |
document.body.appendChild(floatDiv); | |
} | |
// Function to copy text to the clipboard | |
function copyTextToClipboard(text) { | |
const textArea = document.createElement("textarea"); | |
textArea.value = text; | |
document.body.appendChild(textArea); | |
textArea.select(); | |
document.execCommand('copy'); | |
document.body.removeChild(textArea); | |
} | |
// Hook into fetch responses | |
const originalFetch = window.fetch; | |
window.fetch = function(...args) { | |
return originalFetch.apply(this, args).then(response => { | |
const clonedResponse = response.clone(); | |
const url = response.url; | |
if (isSpecificM3U8Link(url)) { | |
showFloatingElement(url); | |
} | |
return response; | |
}); | |
}; | |
// Hook into XMLHttpRequest responses | |
const originalOpen = XMLHttpRequest.prototype.open; | |
XMLHttpRequest.prototype.open = function(...args) { | |
this.addEventListener('load', function() { | |
const url = args[1]; | |
if (isSpecificM3U8Link(url)) { | |
showFloatingElement(url); | |
} | |
}); | |
originalOpen.apply(this, args); | |
}; | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment