Video Celebs Search And UI Tweaks

Video filters and UI manipulations

Устаревшая версия на 13.01.2021. Перейти к последней версии.

// ==UserScript==
// @name         Video Celebs Search And UI Tweaks
// @namespace    brazenvoid
// @version      1.2.9
// @author       brazenvoid
// @license      GPL-3.0-only
// @description  Video filters and UI manipulations
// @match        https://videocelebs.net/*
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js
// @require      https://greasyfork.org/scripts/375557-base-resource/code/Base%20Resource.js?version=889107
// @require      https://greasyfork.org/scripts/418665-brazen-configuration-manager/code/Brazen%20Configuration%20Manager.js?version=889083
// @require      https://greasyfork.org/scripts/416104-brazen-ui-generator/code/Brazen%20UI%20Generator.js?version=889085
// @require      https://greasyfork.org/scripts/416105-brazen-base-search-enhancer/code/Brazen%20Base%20Search%20Enhancer.js?version=890568
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

GM_addStyle(`#settings-wrapper{background-color:#ffa31a;top:15vh;width:250px}input.form-input.check-radio-input{width:auto;margin:0 5px 1px 0}label.title{margin: 0}`)

const PAGE_PATH_NAME = window.location.pathname

const IS_VIDEO_PAGE = PAGE_PATH_NAME.endsWith('.html')

const FILTER_VIDEOS_RATING = 'Rating'
const FILTER_VIDEOS_YEAR = 'Year'

const OPTION_MOVE_VIDEO_ATTRIBUTES_SECTION = 'Reposition Attributes Section'
const OPTION_REMOVE_COMMENTS_SECTION = 'Remove Comments Section'
const OPTION_REMOVE_IFRAME_SECTION = 'Remove Iframe Share Section'
const OPTION_REMOVE_RELATED_VIDEOS_SECTION = 'Remove Related Videos Section'

const SCRIPT_PREFIX = 'vc-sui-'

const SELECTOR_ITEM = 'div.item'
const SELECTOR_ITEM_LISTS = '.midle_div,.list_videos'
const SELECTOR_PAGINATION_LIST = '.midle_div'

class VideoCelebsSearchAndUITweaks extends BrazenBaseSearchEnhancer
{
    static getLastPageUrl ()
    {
        let lastPaginationElement = $('.wp-pagenavi a:last')
        return lastPaginationElement.length ? lastPaginationElement.attr('href') : window.location.href
    }

    constructor ()
    {
        super(SCRIPT_PREFIX, SELECTOR_ITEM)

        this._configurationManager.
            addFlagField(OPTION_MOVE_VIDEO_ATTRIBUTES_SECTION, 'Move the video attributes section from below the screenshot area to under the description.').
            addFlagField(OPTION_REMOVE_COMMENTS_SECTION, 'Remove comments area on video pages.').
            addFlagField(OPTION_REMOVE_IFRAME_SECTION, 'Remove iframe share section under video player.').
            addFlagField(OPTION_REMOVE_RELATED_VIDEOS_SECTION, 'Remove related videos section on video pages.').
            addRangeField(FILTER_VIDEOS_RATING, 0, 100, 'Filter videos by ratings.').
            addRangeField(FILTER_VIDEOS_YEAR, 0, new Date().getFullYear(), 'Filter videos by content release year.')

        if (!IS_VIDEO_PAGE) {
            this._paginator = BrazenPaginator.create($('.wp-pagenavi'), SELECTOR_PAGINATION_LIST, SELECTOR_ITEM, VideoCelebsSearchAndUITweaks.getLastPageUrl()).
                onGetPageNoFromUrl((url) => url.includes('/page/') ? parseInt(url.split('/').pop()) : 1).
                onGetPageUrlFromPageNo((newPageNo) => {
                    let currentUrl = window.location.href
                    if (currentUrl.includes('/page/')) {
                        let currentUrlFragments = currentUrl.split('/')
                        currentUrlFragments.pop()
                        currentUrl = currentUrlFragments.join('/')
                    } else {
                        currentUrl += 'page'
                    }
                    return currentUrl + '/' + newPageNo
                }).
                onGetPaginationElementForPageNo((pageNo, paginator) => {
                    let elementSelector = pageNo === paginator.getCurrentPageNo() ?
                        'span.current' : 'a[href="' + paginator.getPageUrlFromPageNo(pageNo).replace(window.location.origin, '') + '"]'
                    return paginator.getPaginationWrapper().find(elementSelector)
                })
        }

        this._addPaginationConfiguration()
        this._setupUI()
        this._setupCompliance()
        this._setupComplianceFilters()
    }

    /**
     * @private
     */
    _moveVideoAttributesBelowDescription ()
    {
        if (this._configurationManager.getValue(OPTION_MOVE_VIDEO_ATTRIBUTES_SECTION)) {
            let videoInfoBlock = $('.entry-utility')
            videoInfoBlock.insertBefore(videoInfoBlock.prev().prev())
        }
    }

    /**
     * @private
     */
    _removeCommentsSection ()
    {
        if (this._configurationManager.getValue(OPTION_REMOVE_COMMENTS_SECTION)) {
            $('.comments-area').remove()
        }
    }

    /**
     * @private
     */
    _removeIFrameSection ()
    {
        if (this._configurationManager.getValue(OPTION_REMOVE_IFRAME_SECTION)) {
            $('#tab_share').remove()
        }
    }

    /**
     * @private
     */
    _removeRelatedVideosSection ()
    {
        if (this._configurationManager.getValue(OPTION_REMOVE_RELATED_VIDEOS_SECTION)) {
            $('.related').remove()
        }
    }

    /**
     * @private
     */
    _setupCompliance()
    {
        this._onGetItemLists = () => $(SELECTOR_ITEM_LISTS)
        this._onGetItemName = () => ''
    }

    /**
     * @private
     */
    _setupComplianceFilters()
    {
        this._addItemComplianceFilter(
            FILTER_VIDEOS_RATING,
            (range) => range.minimum > 0 || range.maximum > 0,
            (item, range) =>
                Validator.isInRange(parseInt(item.find('.rating').text().trim().replace('%', '')), range.minimum, range.maximum)
        )
        this._addItemComplianceFilter(FILTER_VIDEOS_YEAR, (range) => range.minimum > 0 || range.maximum > 0, (item, range) => {
                let yearFragments = item.find('.title a').text().trim().split('(')
                let year = parseInt(yearFragments[yearFragments.length - 1].replace(')', ''))
                return Validator.isInRange(year, range.minimum, range.maximum)
        })
    }

    /**
     * @private
     */
    _setupUI ()
    {
        this._onBeforeUIBuild = () => {
            if (IS_VIDEO_PAGE) {
                this._moveVideoAttributesBelowDescription()
                this._removeCommentsSection()
                this._removeIFrameSection()
                this._removeRelatedVideosSection()
            }
        }

        this._onUIBuild = () =>
            this._uiGen.createSettingsSection().append([
                this._uiGen.createTabsSection(['Filters', 'UI', 'Stats'], [
                    this._uiGen.createTabPanel('Filters', true).append([
                        this._configurationManager.createElement(FILTER_VIDEOS_RATING),
                        this._configurationManager.createElement(FILTER_VIDEOS_YEAR),
                        this._uiGen.createSeparator(),
                        this._configurationManager.createElement(OPTION_DISABLE_COMPLIANCE_VALIDATION),
                    ]),
                    this._uiGen.createTabPanel('UI').append([
                        this._configurationManager.createElement(OPTION_MOVE_VIDEO_ATTRIBUTES_SECTION),
                        this._configurationManager.createElement(OPTION_REMOVE_COMMENTS_SECTION),
                        this._configurationManager.createElement(OPTION_REMOVE_IFRAME_SECTION),
                        this._configurationManager.createElement(OPTION_REMOVE_RELATED_VIDEOS_SECTION),
                        this._uiGen.createSeparator(),
                        this._configurationManager.createElement(CONFIG_PAGINATOR_THRESHOLD),
                        this._configurationManager.createElement(CONFIG_PAGINATOR_LIMIT),
                        this._configurationManager.createElement(OPTION_ALWAYS_SHOW_SETTINGS_PANE),
                    ]),
                    this._uiGen.createTabPanel('Stats').append([
                        this._uiGen.createStatisticsFormGroup(FILTER_VIDEOS_RATING),
                        this._uiGen.createStatisticsFormGroup(FILTER_VIDEOS_YEAR),
                        this._uiGen.createSeparator(),
                        this._uiGen.createStatisticsTotalsGroup(),
                    ]),
                ]),
                this._createSettingsFormActions(),
                this._uiGen.createSeparator(),
                this._uiGen.createStatusSection(),
            ])

        this._onAfterUIBuild = () => {
            this._uiGen.getSelectedSection()[0].userScript = this
        }
    }
}

(new VideoCelebsSearchAndUITweaks).init()