Sleazy Fork is available in English.

海角大兄弟

播放并复制链接

// ==UserScript==
// @name         海角大兄弟
// @namespace    http://tampermonkey.net/
// @version      1.0
// @author       海角大兄弟
// @license    https://*/post/details*
// @description   播放并复制链接
// @match
https://hjy8.top/*
// @match        https://*/post/details?pid=*
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';

    const videoContainer = document.createElement('div');
    const closeButton = document.createElement('div');
    let video;

    const isMobileDevice = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);

    const getPidFromUrl = () => {
        const url = window.location.href;
        const regex = /[?&]pid=(\d+)/;
        const matches = regex.exec(url);
        if (matches && matches.length > 1) {
            return matches[1];
        }
        return null;
    };

    const sendApiRequestAndPlay = async (pid) => {
        const apiUrl = 'http://www.djyun.icu/api/hjjx?id=' + pid;
        try {
            const response = await fetch(apiUrl);
            const data = await response.text();
            const m3u8Url = getM3U8UrlFromData(data);
            if (m3u8Url) {
                GM_setClipboard(m3u8Url);
                showNotification('数据已复制');
                playVideo(m3u8Url);
            } else {
                console.error('无法获取m3u8链接');
                showNotification('无法获取m3u8链接,请重试!');
            }
        } catch (error) {
            console.error('请求失败:', error);
            showNotification('请求失败,请重试!');
        }
    };

    const showNotification = (message) => {
        const notification = document.createElement('div');
        notification.style = `
            position: fixed;
            bottom: 40px;
            right: 20px;
            width: 240px;
            padding: 16px;
            background: rgba(0, 0, 0, 0.8);
            color: white;
            border-radius: 8px;
            text-align: center;
            line-height: 20px;
            font-family: Arial, sans-serif;
            font-size: 14px;
            box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.3);
        `;
        notification.innerText = message;
        document.body.appendChild(notification);

        setTimeout(() => {
            notification.style.opacity = '0';
            setTimeout(() => {
                notification.remove();
            }, 500);
        }, 3000);
    };

    const playVideo = (m3u8Url) => {
        video = document.createElement('video');
        video.src = m3u8Url;
        video.controls = true;
        video.style = `
            width: 100%;
            height: 100%;
        `;
        videoContainer.appendChild(video);
        videoContainer.style = `
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.8);
            z-index: 9999;
        `;
        document.body.appendChild(videoContainer);

        closeButton.style = `
            position: fixed;
            top: 20px;
            right: 20px;
            width: 30px;
            height: 30px;
            background: #FF6161;
            border-radius: 50%;
            text-align: center;
            line-height: 30px;
            cursor: pointer;
            font-family: Arial, sans-serif;
            font-size: 16px;
            font-weight: bold;
            box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.3);
        `;
        closeButton.innerText = 'X';
        closeButton.addEventListener('click', () => {
            document.body.removeChild(videoContainer);
            video = null;
        });
        videoContainer.appendChild(closeButton);
    };

const stopVideo = () => {
    if (video) {
        video.pause(); // 暂停视频播放
        videoContainer.removeChild(video); // 从容器中移除视频
        video = null;
    }
};
    const addFloatingButton = () => {
        const button = document.createElement('div');
        button.style = `
            position: fixed;
            bottom: 50px;
            right: 20px;
            width: 60px;
            height: 60px;
            background: #FF6161;
            color: white;
            border-radius: 50%;
            text-align: center;
            line-height: 60px;
            cursor: pointer;
            font-family: Arial, sans-serif;
            font-size: 16px;
            font-weight: bold;
            box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.3);
        `;
        button.innerText = '复制';
        button.addEventListener('click', () => {
            const pid = getPidFromUrl();
            if (pid) {
                stopVideo();
                sendApiRequestAndPlay(pid);
            } else {
                showNotification('无法获取pid');
            }
        });
        document.body.appendChild(button);
    };

    const stopVideoOnUnload = () => {
        if (video) {
            stopVideo();
        }
    };

function getM3U8UrlFromData(data) {
    var regex = /http:\/\/www\.djyun\.icu\/api\/hjvido\?id=[\w.]+/;
    var matches = regex.exec(data);
    if (matches && matches.length > 0) {
        return matches[0];
    }
    return null;
}


    if (isMobileDevice()) {
        addFloatingButton();
        window.addEventListener('beforeunload', stopVideoOnUnload);
    }
})();