Play Video Locally

Gives you a simple button on certain media servers to send the video to a local player.

// ==UserScript==
// @name         Play Video Locally
// @namespace    https://naeembolchhi.github.io/
// @version      0.7
// @description  Gives you a simple button on certain media servers to send the video to a local player.
// @author       NaeemBolchhi
// @match        http*://circleftp.net/*
// @match        http*://10.16.100.244/*
// @match        http*://freedrivemovie.com/*
// @match        http*://movies.discoveryftp.net/*
// @license      GPL-3.0-or-later
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMC1jMDAwIDc5LjE3MWMyN2ZhYiwgMjAyMi8wOC8xNi0yMjozNTo0MSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZjA1MzA4NC02ODgzLWQ5NDgtYjg0Yy1iMTVlMzgyZmJhNjQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTQ0REMwMkMyQkM1MTFFRkIxRTZDMzBFNEJFMkQ4NDciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTQ0REMwMkIyQkM1MTFFRkIxRTZDMzBFNEJFMkQ4NDciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI0LjAgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N2YwNTMwODQtNjg4My1kOTQ4LWI4NGMtYjE1ZTM4MmZiYTY0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjdmMDUzMDg0LTY4ODMtZDk0OC1iODRjLWIxNWUzODJmYmE2NCIv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
// @run-at       document-idle
// @grant        none
// ==/UserScript==

// Supported video formats
const vform = [".mp4",".mkv"];

// Hide video players (change value to "invisible" to hide a player, and to "visible" to show it)
const vvid = {
    "potplayer": "visible",
    "vlcplayer": "visible",
    "xplayer": "visible",
    "mxplayer": "visible",
    "mxplayerpro": "visible"
};

// SVG Icons
const icons = {
    "toggle":`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 11H1v2h6v-2zm2.17-3.24L7.05 5.64 5.64 7.05l2.12 2.12 1.41-1.41zM13 1h-2v6h2V1zm5.36 6.05l-1.41-1.41-2.12 2.12 1.41 1.41 2.12-2.12zM17 11v2h6v-2h-6zm-5-2c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm2.83 7.24l2.12 2.12 1.41-1.41-2.12-2.12-1.41 1.41zm-9.19.71l1.41 1.41 2.12-2.12-1.41-1.41-2.12 2.12zM11 23h2v-6h-2v6z"/></svg>`,
    "next":`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"><path d="M150.4 180.1c-5.1-5.6-9.7-10.6-14.2-15.7-29.7-32.7-59.3-65.4-89-98.1-4.9-5.4-10.8-8.8-18.2-9.6C15.6 55.2 2.5 65.3.4 78.5c-1.4 9.4 1.7 17.2 8 24.1 24.9 27.3 49.7 54.7 74.5 82 14.8 16.3 30.1 32.1 44.1 49 10.9 13.1 34.8 12.8 46.1 0 38.9-43.9 78.6-87 118-130.4 6.1-6.7 9.9-14 8.7-23.3-1.4-10.7-7.3-18.3-17.5-21.8-10.9-3.8-20.7-1.1-28.5 7.3-18.5 20.1-36.7 40.3-55 60.5l-47.1 51.9c-.4.7-.7 1.4-1.3 2.3z"/></svg>`,
    "prev":`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"><path d="M150.4 119.7c-5.1 5.6-9.7 10.6-14.2 15.7-29.7 32.7-59.3 65.4-89 98.1-4.9 5.4-10.8 8.8-18.2 9.6-13.4 1.5-26.5-8.6-28.6-21.8-1.4-9.4 1.7-17.2 8-24.1 24.9-27.3 49.7-54.7 74.5-82 14.8-16.3 30.1-32.1 44.1-49 10.9-13.1 34.8-12.8 46.1 0 38.9 43.9 78.6 87 118 130.4 6.1 6.7 9.9 14 8.7 23.3-1.4 10.7-7.3 18.3-17.5 21.8-10.9 3.8-20.7 1.1-28.5-7.3-18.5-20.1-36.7-40.3-55-60.5L151.7 122c-.4-.7-.7-1.4-1.3-2.3z"/></svg>`,
    "player":``,
    "mobile":``,
    "pc":``
};

// Get URL variables
function getVar(vlink) {
    let vars = {};
    let parts = vlink.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
    return vars;
}

// Generate protocol URL
function getURL(player, url, text) {
    let matchList = [
        {"key": "none", "val": `${url}`},
        {"key": "potplayer", "val": `potplayer://${url}`},
        {"key": "vlcplayer", "val": `vlc://${url}`},
        {"key": "xplayer", "val": `intent:${url}#Intent;package=video.player.videoplayer;S.title=${text};end`},
        {"key": "mxplayer", "val": `intent:${url}#Intent;package=com.mxtech.videoplayer.ad;S.title=${text};end`},
        {"key": "mxplayerpro", "val": `intent:${url}#Intent;package=com.mxtech.videoplayer.pro;S.title=${text};end`}
    ]

    for (let x = 0; x < matchList.length; x++) {
        if (player === matchList[x].key) {
            return matchList[x].val;
        }
    }
}

// Make any new element
function elemake(tag, innr, attr) {
    let element = document.createElement(tag);
    if (innr) {element.innerHTML = innr;}
    if (!attr) {return element;}

    for (let x = 0; x < attr.key.length; x++) {
        element.setAttribute(attr.key[x], attr.val[x]);
    }
    return element;
}

// let sample = elemake("div","ja monchay",{"key":["id","class"],"val":["oneDiv","nav pointer"]});
// document.body.appendChild(sample);

// Find supported videos in "src" and "href" of all tags
function getVids() {
    let allLinks = document.querySelectorAll('*[src], *[href]'),
        print = [];

    for (let x = 0; x < allLinks.length; x++) {
        var tmpl = "";
        if (allLinks[x].href !== undefined) {tmpl = allLinks[x].href;}
        if (allLinks[x].src !== undefined) {tmpl = allLinks[x].src;}

        if (tmpl.match(/source/)) {
            tmpl = decodeURIComponent(getVar(tmpl).source);
        }

        var ext = tmpl.replace(/.*(....)$/,'$1'),
            okay = 'no';

        for (let y = 0; y < vform.length; y++) {
            if (ext === vform[y]) {okay = 'yes';}
        }

        if (okay === 'yes' && print.indexOf(tmpl) === -1) {
            print.push(tmpl);
        }
    }

    window.vidlinks = JSON.stringify(print);
}

// Determine visibility
function visble(what, txt) {
    if (vvid[what] === "visible") {
        return `<a class="avid ${what}">Open with ${txt}</a>`;
    } else {
        return `<a class="avid ${what} hidden">Open with ${txt}</a>`;
    }
}

// Visualize the interface
function inTerface() {
    const inStyle = `<style type="text/css">
    #playVideoLocally, #playVideoLocally * {
        outline: none;
    }
    #playVideoLocally {
        position: fixed;
        display: block;
        z-index: 2147483647;
    }
    #playVideoLocally section {
        position: fixed;
        bottom: 0;
        left: 0;
        background: transparent;
        height: 100%;
        width: 100%;
        display: block;
        z-index: 2147483641;
        transition: opacity .1s linear, filter .1s linear, transform .1s linear;
    }
    #playVideoLocally section:not(.clicked) {
        opacity: 0;
        filter: blur(6px);
        transform: translateY(100%);
    }
    #playVideoLocally section > backdrop {
        position: fixed;
        background: transparent;
        height: 100svh;
        width: 100svw;
        display: block;
        z-index: 2147483640;
    }
    #playVideoLocally > .btn-main {
        position: fixed;
        bottom: 0;
        left: 0;
        z-index: 2147483642;
        display: flex;
        align-items: center;
        justify-content: center;
        height: 40px;
        width: 40px;
        padding: 10px;
        margin: 0 0 20px 20px;
        border-radius: 100%;
        fill: #cdd6f4;
        background: #11111b;
        cursor: pointer;
        box-shadow: 0 0 4px 1px rgba(0, 0, 0, 0.25);
        transition: opacity .1s linear;
    }
    #playVideoLocally > .btn-main > svg {
        transition: transform .1s linear;
    }
    #playVideoLocally > .btn-main.clicked > svg {
        transform: rotate(-90deg);
    }
    #playVideoLocally > .btn-main:not(.clicked) {
        opacity: .5;
    }
    #playVideoLocally > .btn-main:not(.clicked):hover {
        fill: #ffffff;
        opacity: 1;
    }
    #playVideoLocally > .btn-main.clicked:hover {
        opacity: 1;
        color: #ffffff;
        fill: #ffffff;
        background: #444654;
    }
    #playVideoLocally section > .section-sub {
        position: fixed;
        bottom: 0;
        left: 0;
        z-index: 2147483641;
        margin: 0 0 70px 20px;
        display: flex;
        flex-direction: column;
        gap: 10px;
    }
    #playVideoLocally section > .section-sub > span {
        height: 40px;
        width: 40px;
        padding: 10px;
        border-radius: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 14px;
        font-weight: 700;
        color: #cdd6f4;
        fill: #cdd6f4;
        background: #11111b;
        box-shadow: 0 0 4px 1px rgba(0, 0, 0, 0.25);
        cursor: pointer;
    }
    #playVideoLocally section > .section-sub > .current {
        cursor: default;
    }
    #playVideoLocally section > .section-sub > span:hover {
        color: #ffffff;
        fill: #ffffff;
        background: #444654;
    }
    #playVideoLocally section > .section-sub > span.disabled {
        fill: #999999 !important;
        cursor: not-allowed;
    }
    #playVideoLocally section > .section-main {
        position: fixed;
        bottom: 0;
        left: 0;
        z-index: 2147483641;
        margin: 0 0 20px 70px;
        display: flex;
        flex-direction: column;
        gap: 10px;
    }
    #playVideoLocally section > .section-main > a {
        height: 40px;
        min-width: 40px;
        width: fit-content;
        display: flex;
        align-items: center;
        padding: 15px;
        font-size: 14px;
        border-radius: 500px;
        color: #cdd6f4;
        fill: #cdd6f4;
        background: #11111b;
        text-decoration: none;
        box-shadow: 0 0 4px 1px rgba(0, 0, 0, 0.25);
    }
    #playVideoLocally section > .section-main > a:hover {
        color: #ffffff;
        fill: #ffffff;
        background: #444654;
    }
    #playVideoLocally .next > svg {
        transform: translateY(1px);
    }
    #playVideoLocally .prev > svg {
        transform: translateY(-1px);
    }
    #playVideoLocally .next:not(.disabled):active, #playVideoLocally .prev:not(.disabled):active {
        transform: scale(.75);
    }
    #playVideoLocally .hidden {
        display: none !important;
    }
    </style>`;

    const inSide = `
    <div class="btn-main">${icons.toggle}</div>
    <section>
        <div class="section-sub">
            <span class="prev">${icons.prev}</span>
            <span class="current"></span>
            <span class="next">${icons.next}</span>
        </div>
        <div class="section-main">
            ${visble('potplayer', 'PotPlayer')}
            ${visble('vlcplayer', 'VLC Player')}
            ${visble('xplayer', 'XPlayer')}
            ${visble('mxplayer', 'MX Player')}
            ${visble('mxplayerpro', 'MX Player Pro')}
            <a class="avid raw filename"></a>
        </div>
        <backdrop></backdrop>
    </section>
    `;

    let mainDiv = elemake("div", inStyle + inSide, {"key":["id"],"val":["playVideoLocally"]});
    document.body.appendChild(mainDiv);
}

// Make it interactive
function inTeract(num) {
    if (num > JSON.parse(window.vidlinks).length - 1) {
        var numX = JSON.parse(window.vidlinks).length - 1;
    } else if (num < 0) {
        var numX = 0;
    } else {
        var numX = num;
    }

    let disLink = JSON.parse(window.vidlinks)[numX],
        disTitle = decodeURIComponent(disLink.replace(/.*\/(.*)$/,'$1'));

    document.querySelector('#playVideoLocally .filename').innerText = disTitle;

    document.querySelector('#playVideoLocally .avid.raw').href = getURL('none', disLink, disTitle);
    document.querySelector('#playVideoLocally .avid.potplayer').href = getURL('potplayer', disLink, disTitle);
    document.querySelector('#playVideoLocally .avid.vlcplayer').href = getURL('vlcplayer', disLink, disTitle);
    document.querySelector('#playVideoLocally .avid.xplayer').href = getURL('xplayer', disLink, disTitle);
    document.querySelector('#playVideoLocally .avid.mxplayer').href = getURL('mxplayer', disLink, disTitle);
    document.querySelector('#playVideoLocally .avid.mxplayerpro').href = getURL('mxplayerpro', disLink, disTitle);

    document.querySelector('#playVideoLocally .prev').classList.remove('disabled','hidden');
    document.querySelector('#playVideoLocally .next').classList.remove('disabled','hidden');

    document.querySelector('#playVideoLocally .current').innerText = numX + 1;
    document.querySelector('#playVideoLocally .current').setAttribute('data-num', numX);

    if (numX === 0) {
        document.querySelector('#playVideoLocally .prev').classList.add('disabled');
    } else if (numX === JSON.parse(window.vidlinks).length - 1) {
        document.querySelector('#playVideoLocally .next').classList.add('disabled');
    }

    if (JSON.parse(window.vidlinks).length === 1) {
        document.querySelector('#playVideoLocally .prev').classList.add('hidden');
        document.querySelector('#playVideoLocally .next').classList.add('hidden');
    }
}

// Event listeners
function inVent() {
    let prev = document.querySelector('#playVideoLocally .prev'),
        next = document.querySelector('#playVideoLocally .next'),
        current = document.querySelector('#playVideoLocally .current'),
        main = document.querySelector('#playVideoLocally .btn-main'),
        section = document.querySelector('#playVideoLocally section'),
        backdrop = document.querySelector('#playVideoLocally backdrop');

    document.addEventListener('click', function(e) {
        if (e.target == prev || prev.contains(e.target)) {
            inTeract(parseInt(current.getAttribute('data-num')) - 1);
        }
        if (e.target == next || next.contains(e.target)) {
            inTeract(parseInt(current.getAttribute('data-num')) + 1);
        }
        if (e.target == main || main.contains(e.target)) {
            try {getVids();} catch {}
            try {inTeract(0);} catch {}
            if (main.classList.contains('clicked')) {
                main.classList.remove('clicked');
                section.classList.remove('clicked');
            } else {
                main.classList.add('clicked');
                section.classList.add('clicked');
            }
        }
        if (e.target == backdrop || backdrop.contains(e.target)) {
            main.click();
        }
    });
}

if (!document.body.classList.contains('jwplayer')) {
    try {getVids();} catch {}
    try {inTerface();} catch {}
    try {inTeract(0);} catch {}
    try {inVent();} catch {}
}