Skip to content

Instantly share code, notes, and snippets.

@nmdra
Created June 5, 2024 00:33
Show Gist options
  • Save nmdra/b75b0af86b07e6e20d7812b941cd48b0 to your computer and use it in GitHub Desktop.
Save nmdra/b75b0af86b07e6e20d7812b941cd48b0 to your computer and use it in GitHub Desktop.
Detect m3u8 links, modify them, and display with copy and hide buttons.
// ==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