ph_user_video

redirect link to user video list / muti select & copy video links

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         ph_user_video
// @namespace    https://github.com/x94fujo6rpg/SomeTampermonkeyScripts
// @version      0.11
// @description  redirect link to user video list / muti select & copy video links
// @author       x94fujo6
// @match        https://*.pornhub.com/*
// ==/UserScript==


(function () {
    'use strict';
    let itemIndex = 0;
    let trycount = 0;
    let listener = false;

    window.onload = startScript();

    function startScript() {
        if (document.visibilityState == "visible") {
            if (listener) document.removeEventListener("visibilitychange", startScript);
            main();
        } else {
            document.addEventListener("visibilitychange", startScript);
            listener = true;
        }
    }

    function main() {
        myCss();
        let link = document.location.href,
            target_list = ["/videos", "/playlist", "video/search",];

        //enable this if you want auto switch to EN
        //switchLan();

        if (link.includes("viewkey")) {
            setLink();
        } else if (target_list.some(t => link.includes(t))) {
            reDirect(link);
        } else {
            replaceLink(".usernameWrap");
        }

        function switchLan() {
            let host = document.location.host,
                target_host = "www.pornhub.com";
            if (host != target_host) {
                setTimeout(() => {
                    document.querySelector(`li[data-lang="en"] a`).click();
                }, 1000);
            }
        }

        function setLink() {
            let info = document.querySelector(".video-detailed-info");
            info = info.querySelector(".usernameBadgesWrapper");
            if (!info) return print("no user info");
            info = info.querySelector("a");
            let username = info.textContent;
            print("username", username);

            let link = `${info.href}/videos/public`;
            info.setAttribute("href", link);

            replaceLink(".usernameWrap");
            markSameUser(username);

            let button = newButton("myButtonB", "Copy Video link", copyLink);
            let div = document.createElement("div");
            div.appendChild(button);

            let pos = document.querySelector("#player");
            pos.insertAdjacentElement("afterend", div);

            function copyLink() {
                let link = window.location.href;
                navigator.clipboard.writeText(link);
            }
        }

        function markSameUser(username = "") {
            mark("#relatedVideosCenter");
            mark("#recommendedVideosVPage");

            function mark(css_selector) {
                let target = document.querySelector(css_selector);
                if (target) {
                    target = target.querySelectorAll("li");
                    if (target) {
                        target.forEach(e => {
                            let uploader = e.querySelector(".usernameWrap a");
                            if (uploader) {
                                if (uploader.textContent == username) {
                                    e.style = "border: red 0.2rem solid;";
                                }
                            }
                        });
                    }
                }
            }
        }

        function replaceLink(css_selector) {
            let target = document.querySelectorAll(css_selector);
            if (target) {
                target.forEach(e => {
                    let a = e.querySelector("a");
                    if (a) if (!a.href.includes("/videos")) a.href = `${a.href}/videos/public`;
                });
            } else {
                print(`target ${css_selector} not found`);
            }
        }

        function reDirect(link) {
            let vids = document.querySelector(".profileVids"); // profileVids videoUList
            if (!vids) {
                if (link.includes("/public")) {
                    console.log("public");
                    setTimeout(() => document.location.href = link.replace("/public", ""), 1000);
                }
                if (link.includes("/playlist")) {
                    console.log("playlist");
                    vids = document.querySelector(".container.playlistSectionWrapper");
                    if (vids) mutiSelect(vids);
                }
                if (link.includes("/search")) {
                    console.log("search");
                    vids = document.querySelector("#videoSearchResult").parentElement;
                    if (vids) mutiSelect(vids);
                }
                console.log("can't found video list, abort");
                return;
            } else {
                mutiSelect(vids);
            }

            function mutiSelect(vid_list) {
                let
                    select_box = document.createElement("div"),
                    textbox = document.createElement("textarea"),
                    textbox_style = `
                        width: 100%;
                        height: auto;
                        display: block;
                        margin: auto;
                    `;

                select_box.style = `
                    display: flex;
                    text-align: center;
                    flex-wrap: wrap;
                    width: 50%;
                    margin: auto;
                `;
                select_box.innerHTML = `<textarea id="selected_vid_list" rows="10" cols="70" style="${textbox_style}"></textarea>`;
                vid_list.insertAdjacentElement("afterbegin", select_box);

                let button,
                    button_class = "myButton line-4-item",
                    button_box = document.createElement("div");
                button_box.style = `width: 100%;`;
                [
                    { text: "Select All", click: secectAll },
                    { text: "Unselect All", click: unsecectAll },
                    { text: "Invert Select", click: invertSecect },
                    { text: "Copy", click: copyAll },
                ].forEach(o => {
                    button = newButton(button_class, o.text, o.click);
                    button_box.appendChild(button);
                });
                select_box.appendChild(button_box);

                vid_list = vid_list.querySelectorAll(".pcVideoListItem");
                addCheckbox(vid_list);

                let more = document.getElementById("moreDataBtn");
                if (more) {
                    more.addEventListener("click", loadEvent);
                    let ele = document.createElement("span");
                    ele.textContent = "Load button found, this user video list is ajax. Recommend using other tools to extract the list.";
                    textbox.insertAdjacentElement("beforebegin", ele);
                }

                function addCheckbox(nodelist) {
                    let e, key, vlink;
                    console.log(`itemIndex:${itemIndex}, nodecount:${nodelist.length}`);
                    for (itemIndex; itemIndex < nodelist.length; itemIndex++) {
                        e = nodelist[itemIndex];
                        key = e.attributes["data-video-vkey"].value;
                        vlink = `https://www.pornhub.com/view_video.php?viewkey=${key}`;

                        let ck = Object.assign(document.createElement("input"), {
                            type: "checkbox",
                            name: "selected_vid_list",
                            value: vlink,
                        });
                        ck.addEventListener("click", updateTextBox);

                        let label = Object.assign(document.createElement("label"), { className: "myLable", });
                        label.appendChild(ck);

                        let div = Object.assign(document.createElement("div"), { textContent: "Add to List", });
                        label.appendChild(div);

                        div = document.createElement("div");
                        div.appendChild(label);

                        let pos = e.querySelector(".thumbnail-info-wrapper");
                        pos.insertAdjacentElement("beforebegin", document.createElement("br"));
                        pos.insertAdjacentElement("beforebegin", div);

                        pos = e.querySelector("span.title").querySelector("a");
                        pos.removeAttribute("href");
                    }
                    itemIndex = nodelist.length;
                }

                function loadEvent() {
                    let vids = document.querySelector(".profileVids").querySelectorAll(".pcVideoListItem");
                    if (vids.length === itemIndex) {
                        if (trycount < 100) {
                            console.log(`no new item found, waiting for page to load [retry:${trycount}]`);
                            setTimeout(loadEvent, 100);
                        } else {
                            console.log("retry too much, script stop");
                        }
                        trycount++;
                    } else {
                        trycount = 0;
                        addCheckbox(vids);
                    }
                }

                function copyAll() {
                    let textbox = document.getElementById("selected_vid_list");
                    navigator.clipboard.writeText(textbox.value);
                }

                function invertSecect() {
                    let inputs = document.querySelectorAll("input[name='selected_vid_list']");
                    inputs.forEach(e => {
                        if (e.checked) {
                            e.checked = false;
                        } else {
                            e.checked = true;
                        }
                    });
                    updateTextBox();
                }

                function unsecectAll() {
                    let inputs = document.querySelectorAll("input[name='selected_vid_list']:checked");
                    inputs.forEach(e => {
                        e.checked = false;
                    });
                    updateTextBox();
                }

                function secectAll() {
                    let inputs = document.querySelectorAll("input[name='selected_vid_list']");
                    inputs.forEach(e => {
                        if (!e.checked) e.checked = true;
                    });
                    updateTextBox();
                }

                function updateTextBox() {
                    let inputs = document.querySelectorAll("input[name='selected_vid_list']:checked");
                    let newtext = "";
                    if (inputs) {
                        inputs.forEach(ck => {
                            if (!newtext.includes(ck.value)) newtext += `${ck.value}\n`;
                        });
                    }
                    let box = document.getElementById("selected_vid_list");
                    box.value = newtext;
                }
            }
        }
    }

    function print(...any) {
        console.log(...any);
    }

    function newButton(bclass, btext, handeler) {
        let button = document.createElement("button");
        Object.assign(button, {
            className: bclass,
            textContent: btext,
            onclick: handeler,
        });
        return button;
    }

    function myCss() {
        let s = document.createElement("style");
        s.className = "myCssSheet";
        document.head.appendChild(s);
        s.textContent = `
        .added {
            display:initial !important;
        }

        .myButtonB {
            position: relative;
            padding: 1rem;
            width: 100%;
            border-style: solid;
            font-size: 1rem;            
            background: transparent;
            color: white;
        }

        .myButton {
            position: relative;
            padding: 0.5rem 0;
            margin: 0.5rem;
            width: max-content;
            font-size: 1rem;
        }

        .line-4-item {
            max-width: 100%;
            width: calc(80% / 4);
        }

        .myButton:active, .myButtonB:active {
            background-color: DeepPink;
        }

        .myLable {
            position: relative;
            width: auto;
            padding: 0.5rem;
            border-style: solid;
            border-width: 0.1rem;
            border-color: gray;
            display: flex;
        }

        .myLable>input {
            position: relative;
            margin: auto;
            margin-left: 0rem;
            margin-right: 0.2rem;
        }

        .myLable>div {
            position: relative;
            margin: 0.1rem;
        }
        `;
    }
})();