Share
Copy the link

// ==PersonScript==
// @identify Chaturbate Full Page Video
// @model 1.30
// @description Display the webcam video over the entire web page (with out fullscreen), within the appropriate ratio, with its controls.
// @creator James Koss
// @match https://chaturbate.com/*/
// @supportURL https://greasyfork.org/en/scripts/29745- chaturbate-full-page-video/feedback
// @run-at document-start
// @namespace http://www.JamesKoss.com/
// ==/PersonScript==

(perform() {
‘use strict’;
var vidElement = null;
var vidHolder = null;
var vid = null;
var ratio;
var maximized = true; // true is full web page, false is regular.
var resizeLimit = false;
var hasVideo = true; // false if no video supply, as a result of stream blocked for any purpose.

perform startTimer() {
// Start the timer on load. Keep attempting to detect the video ingredient.
var timer = setInterval(perform() {
strive {
// Only when web page has focus, so it may act.
if (!doc.hasFocus()) return;

vidElement = doc.querySelector(‘video[autoplay]’);

// Used for video ingredient ratio sizing.
vidHolder = vidElement.parentNode.parentNode;

// Video ingredient guardian to show over the complete web page.
vid = vidElement.parentNode;

// Must have a src to proceed.
if (vid.src === “”) return;

// Show controls at all times.
vidElement.controls = true;

// Start maximized.
//console.log(‘referred to as from var timer = setInterval(perform’)
resizeVideo();

// Track if video goes offline.
videoDown();

console.log(‘[Chaturbate Full Page Video] Video discovered!’); // maximized: ‘ + maximized);

// Stop timer.
clearInterval(timer);
} catch(e) {
//console.log(‘[Chaturbate Full Page Video] Cant discover video: ‘ + e);
//console.log(e);
}
}, 1000);
}

perform videoDown() {
// Check constantly to see if stream is down.
setInterval(perform() {
// Only when web page has focus, so it may act.
if (!doc.hasFocus()) return;

let vidSrc = doc.querySelector(‘video[autoplay]’);

if (vidSrc) {
if (maximized) {
if (vidSrc.src === “”) {
hasVideo = false;
maximized = false;

//console.log(‘referred to as from window.setInterval(perform’)
resizeVideo();
}
}
}
}, 1000);
}

doc.addEventListener(‘DOMContentLoaded’, perform() {
// Add toggle button for script.
var toggle = doc.createElement(“div”);

toggle.model.shade = “black”;
toggle.model.backgroundColor = “white”;
toggle.model.borderRadius = “100px”;
toggle.model.border = “1px stable pink”;
toggle.model.zIndex = 999999;
toggle.model.place = “mounted”;
toggle.model.prime = 0;
toggle.model.proper = 0;
toggle.model.cursor = “pointer”;
toggle.model[‘user-select’] = ‘none’;
toggle.model.width = “30px”;
toggle.model.top = “30px”;
toggle.model.margin = “4px”;
toggle.model.textAlign = “heart”;
toggle.model.verticalAlign = “center”;
toggle.model.lineHeight = “30px”;
toggle.model.fontSize = “30px”;
toggle.innerHTML = “☩”;
doc.physique.appendChild(toggle);

toggle.addEventListener(‘mouseover’, perform(e) {
toggle.model.opacity = “0.9”;
});

toggle.addEventListener(‘mouseout’, perform(e) {
toggle.model.opacity = “1.0”;
});

toggle.addEventListener(‘click on’, perform(e) {
// Left click on solely.
if (e.which !== 1) return;
// Toggle full web page video.
maximized = !maximized;
//console.log(‘referred to as from toggle.addEventListener(click on’)
resizeVideo();
});

// Create background cowl ingredient.
var d = doc.createElement(“div”);
d.id = “blackCover”;
d.model.backgroundColor = “black”;
d.model.zIndex = 998;
d.model.place = “mounted”;
d.model.prime = 0;
d.model.left = 0;
d.model.width = “100%”;
d.model.top = “100%”;
d.model.show = “none”;
doc.physique.appendChild(d);

startTimer();

// On window resized, match video ratio.
window.addEventListener(‘resize’, perform() {
// Script have to be prepared.
if (!vid) return;

// Update sizes.
if (!resizeLimit) {
resizeLimit = true;
setTimeout(perform() {
//console.log(‘referred to as from window.addEventListener(resize,’)
resizeVideo();
resizeLimit = false;
}, 500);
}
}, true);
}, false);

perform resizeVideo() {
let blackCover = doc.getElementById(“blackCover”);

// Restore video measurement.
if (!maximized && vid && blackCover) {
vid.model.place = “relative”;
vid.model.prime = “”;
vid.model.left = “”;
vid.model.width = “100%”;
vid.model.top = “100%”;
blackCover.model.show = “none”;
doc.physique.model.overflow = “”;
return;
}

// Place over full web page.
vid.model.place = “mounted”;
vid.model.zIndex = 999;
vid.model.prime = 0;
vid.model.left = 0;
vid.model.width = “100%”;
vid.model.top = “100%”;

// Keep width ratio.
if (!ratio) {
ratio = vidHolder.clientWidth / vidHolder.clientHeight;
}

var wWidth = window.innerWidth;
var wHeight = window.innerHeight;

vid.model.top = “100% !necessary”;
vid.model.prime = 0;

var correctWidth = vid.clientHeight * ratio;
var correctMarginLeft = (wWidth – correctWidth) / 2;

vid.model.width = correctWidth + ‘px’;
vid.model.left = correctMarginLeft + ‘px’;

// Decrease top if window much less huge than video.
if (correctMarginLeft < 1) {
vid.model.width = “100%”;
vid.model.left = 0;

var correctHeight = vid.clientWidth / ratio;
var correctMarginTop = (wHeight – correctHeight) / 2;

vid.model.top = correctHeight + “px”;
vid.model.prime = correctMarginTop + ‘px’;
}

// Hide scrollbars in physique.
doc.physique.model.overflow = “hidden”;

// Hide background parts.
blackCover.model.show = “”;
}
})();