Enhanced video downloader with a selection feature
当前为
// ==UserScript==
// @name Universal Video Downloader
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Enhanced video downloader with a selection feature
// @author usercromix
// @match
// @grant none
// ==/UserScript==
(function() {
'use strict';
// Create UI container
const uiContainer = document.createElement('div');
uiContainer.id = 'video-downloader-ui';
uiContainer.style.cssText = `
position: fixed;
z-index: 9999;
background: linear-gradient(135deg, #2b2d42, #8d99ae);
padding: 15px;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
cursor: move;
user-select: none;
top: 20px;
right: 20px;
font-family: Arial, sans-serif;
transition: all 0.3s ease;
`;
// Create header
const header = document.createElement('div');
header.textContent = 'Video Downloader';
header.style.cssText = `
color: #edf2f4;
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
text-align: center;
`;
// Create button container
const buttonContainer = document.createElement('div');
buttonContainer.style.cssText = `
display: flex;
flex-direction: column;
gap: 10px;
`;
// Create Download button
const downloadButton = document.createElement('button');
downloadButton.textContent = 'Download Video';
downloadButton.style.cssText = `
background: linear-gradient(45deg, #ef233c, #d90429);
color: white;
border: none;
padding: 8px 16px;
border-radius: 5px;
cursor: pointer;
transition: transform 0.2s ease;
`;
// Create Select Video button
const selectButton = document.createElement('button');
selectButton.textContent = 'Select Video';
selectButton.style.cssText = `
background: linear-gradient(45deg, #023e8a, #0077b6);
color: white;
border: none;
padding: 8px 16px;
border-radius: 5px;
cursor: pointer;
transition: transform 0.2s ease;
`;
// Button hover effects
[downloadButton, selectButton].forEach(button => {
button.addEventListener('mouseover', () => button.style.transform = 'scale(1.05)');
button.addEventListener('mouseout', () => button.style.transform = 'scale(1)');
});
// Append elements
buttonContainer.appendChild(downloadButton);
buttonContainer.appendChild(selectButton);
uiContainer.appendChild(header);
uiContainer.appendChild(buttonContainer);
document.body.appendChild(uiContainer);
// Make UI draggable
let isDragging = false;
let currentX = window.innerWidth - uiContainer.offsetWidth - 20;
let currentY = 20;
header.addEventListener('mousedown', (e) => {
isDragging = true;
const rect = uiContainer.getBoundingClientRect();
initialX = e.clientX - rect.left;
initialY = e.clientY - rect.top;
});
let initialX, initialY;
document.addEventListener('mousemove', (e) => {
if (isDragging) {
e.preventDefault();
currentX = e.clientX - initialX;
currentY = e.clientY - initialY;
uiContainer.style.left = currentX + 'px';
uiContainer.style.top = currentY + 'px';
uiContainer.style.right = 'auto';
}
});
document.addEventListener('mouseup', () => {
isDragging = false;
});
// Video handling functions
function downloadVideo(videoUrl) {
if (!videoUrl) {
alert('No video selected or detected!');
return;
}
const downloadLink = document.createElement('a');
downloadLink.href = videoUrl;
downloadLink.download = `video_${new Date().getTime()}.mp4`;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
alert('Video download started!');
}
function detectVideo() {
const videos = document.getElementsByTagName('video');
if (videos.length > 0) {
const video = videos[0];
return video.src || video.currentSrc ||
(video.getElementsByTagName('source')[0]?.src);
}
const pageLinks = Array.from(document.getElementsByTagName('a'));
const videoExtensions = ['.mp4', '.webm', '.mkv', '.avi', '.mov'];
const videoLink = pageLinks.find(link =>
videoExtensions.some(ext => link.href.toLowerCase().endsWith(ext))
);
return videoLink?.href;
}
// Download button handler
downloadButton.addEventListener('click', () => {
const videoUrl = detectVideo();
downloadVideo(videoUrl);
});
// Video selection feature
let isSelecting = false;
selectButton.addEventListener('click', () => {
if (!isSelecting) {
isSelecting = true;
selectButton.textContent = 'Click a Video';
document.body.style.cursor = 'crosshair';
const videoClickHandler = (e) => {
const video = e.target.closest('video') ||
e.target.closest('a[href*=".mp4"]') ||
e.target.closest('a[href*=".webm"]');
if (video) {
e.preventDefault();
const videoUrl = video.src || video.currentSrc || video.href;
downloadVideo(videoUrl);
cleanupSelection();
}
};
const cleanupSelection = () => {
isSelecting = false;
selectButton.textContent = 'Select Video';
document.body.style.cursor = 'default';
document.removeEventListener('click', videoClickHandler);
};
document.addEventListener('click', videoClickHandler, { once: true });
setTimeout(cleanupSelection, 10000); // 10-second timeout
}
});
// Anti-detection measures
Object.defineProperty(window, 'videoDownloader', {
value: undefined,
writable: false,
configurable: false
});
console.log = function() {};
})();