// ==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;
}
`;
}
})();