SigningSavvy++

Enhancements for SigningSavvy

// ==UserScript==
// @name         SigningSavvy++
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  Enhancements for SigningSavvy
// @author       daijro
// @license      MIT
// @match        https://www.signingsavvy.com/search/*
// @match        https://www.signingsavvy.com/sign/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=signingsavvy.com
// @require      https://update.greasyfork.org/scripts/395037/764968/MonkeyConfig%20Modern.js
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addStyle
// @grant        GM_registerMenuCommand
// @run-at       document-end
// ==/UserScript==

/*
Tweaks for SigningSavvy:
- Automatically plays videos after searching
- Significantly increases video player load time
- Use 720p HD videos instead of 360p LD videos
- Removes ads from video player
- Optionally remove other bloat from the website through the config UI
*/

// Initialize MonkeyConfig
const config = new MonkeyConfig({
    title: 'Settings',
    menuCommand: true,
    params: {
        AUTOPLAY_VIDEO: {
            label: 'Autoplay videos after searching',
            type: 'checkbox',
            default: true
        },
        LOOP_VIDEO: {
            label: 'Loop video',
            type: 'checkbox',
            default: true
        },
        HD_VIDEO: {
            label: 'Higher quality videos',
            type: 'checkbox',
            default: true
        },
        REMOVE_ADS: {
            label: 'Remove left panel/ads',
            type: 'checkbox',
            default: true
        },
        REMOVE_HEADER: {
            label: 'Remove header',
            type: 'checkbox',
            default: false
        },
        REMOVE_DETAILS: {
            label: 'Remove details & footer',
            type: 'checkbox',
            default: false
        },
    },
    onSave: function() {
        window.location.reload();
    }
});
// Patch MonkeyConfig to prevent the settings window cutting off
GM.addStyle('#__MonkeyConfig_frame { width: 110% !important; }')

// Initialize config variables
const AUTOPLAY_VIDEO = config.get('AUTOPLAY_VIDEO');
const LOOP_VIDEO = config.get('LOOP_VIDEO');
const HD_VIDEO = config.get('HD_VIDEO');
const REMOVE_ADS = config.get('REMOVE_ADS');
const REMOVE_HEADER = config.get('REMOVE_HEADER');
const REMOVE_DETAILS = config.get('REMOVE_DETAILS');


function initializeNewPlayer(sourceUrl) {
    // Initialize a new video player
    const newVideoElement = document.createElement('video');
    newVideoElement.id = 'video-2';
    newVideoElement.className = 'video-js vjs-default-skin vjs-16-9 vjs-static-controls vjs-big-play-centered video-1-dimensions vjs-controls-enabled vjs-has-started vjs-user-inactive vjs-playing';
    newVideoElement.setAttribute('preload', 'auto');
    newVideoElement.setAttribute('width', '100%');
    newVideoElement.setAttribute('padding', '0px');
    newVideoElement.setAttribute('height', '100%');
    // Use high definition
    newVideoElement.src = HD_VIDEO ? sourceUrl.replace('mp4-ld', 'mp4-hd') : sourceUrl;

    const container = document.querySelector('.videocontent');
    if (!container) {
        console.error("Video container not found.");
        return
    }
    container.prepend(newVideoElement);
    videojs('video-2', {
        controls: true,
        loop: LOOP_VIDEO,
        muted: true,
        autoplay: AUTOPLAY_VIDEO,
        inactivityTimeout: 1,
        controlBar: {
            volumeMenuButton: false,
            remainingTimeDisplay: false
        }
    }).ready(function() {
        if (!AUTOPLAY_VIDEO) {
            return
        }
        this.play().catch(error => {
            console.error("Failed to start video on load:", error);
        });
    });
}

(function() {
    'use strict';

    // Remove ads
    if (REMOVE_ADS) {
        // Removes #main_content_right
        document.querySelector('#main_content_right').remove();
        // Removes tag .main_content_left
        document.querySelector('#main_content_left').id = '';
    }
    // Remove details & footer
    if (REMOVE_DETAILS) {
        document.querySelector('.signing_details').remove();
        document.querySelector('#footer').remove();
    }
    // Remove header
    if (REMOVE_HEADER) {
        // Make invisible
        document.querySelector('#header').style.display = 'none';
    }

    // Check for the existing video player and replace it
    const existingVideoElement = document.querySelector('video');
    if (!existingVideoElement) {
        console.error("Existing video element not found.");
        return
    }
    const sourceUrl = existingVideoElement.src;

    const player = videojs('video-1');
    if (!player) {
        console.error("Existing VideoJS player instance not found.");
        return
    }
    player.dispose();
    initializeNewPlayer(sourceUrl);
})();