// ==UserScript==
// @name Menu - [ X ]
// @namespace http://tampermonkey.net/
// @version 3.0
// @description Add custome menu extender video list from video/image in new tab/page.
// @copyright 2022, terifash (https://greasyfork.org/en/users/964055-teri-fash)
// @author teri.fash <teri.fash@gmail.com>
// @license MIT
// @match *://*.xvideos.com/video*
// @icon https://www.xvideos.com/favicon-32x32.png
// @supportURL https://github.com/TeriFash/x.scripts.user/issues
// @homepageURL https://github.com/TeriFash/x.scripts.user
// @run-at document-start
// ==/UserScript==
(function() {
let listVideo = [];
const actionsDefault = {
position: 'left',
size: 'main',
hides: 'shows'
}
// Получаем значения со стора
function getStoreData(value) {
let result = window.localStorage.getItem(`video-menu-${value}`);
if(!result) {
window.localStorage.setItem(`video-menu-${value}`, actionsDefault[value]);
result = actionsDefault[value]
}
return result
};
// Создаем нужный узел
function elGenerator(parent = 'body', type = 'div', classes = '', data, title, styled, subClass) {
let el;
switch (type) {
case 'link':
el = $(`<a href="#" class="menu-list__btn ${classes}" data-title="${data}">${title}</a>`)[0];
break;
case 'menu':
el = $(`<div id="menu-content-list" class="menu-list"><div class="menu-list__btn-wrapper"></div><div class="menu-list__mozaique mozaique"></div></div>`)[0];
break;
case 'error':
case 'div':
case 'info':
default:
el = $(`<div class="${classes}" style="${styled}"></div>`)[0];
break;
}
$(parent).append(el);
}
// Действие по клику на кнопку
function configClick({event, getClass, setClass, dataType, title, iconOld, icon}) {
window.localStorage.setItem(`video-menu-${dataType}`, setClass);
$('#menu-content-list').toggleClass(`${getClass} ${setClass}`).data(dataType, setClass);
if(iconOld && icon) {
const iconBtn = $(`.menu-list__btn-wrapper > .${iconOld}`);
if(iconBtn) iconBtn.toggleClass(`${iconOld} ${icon}`);
} else {
event.toggleClass(`${getClass} ${setClass}`);
event.innerHTML = title;
}
}
// Слушалель клика на кнопку
function greetingClick(event) {
const menu = $(`#menu-content-list`);
const type = event.target.getAttribute('data-title');
const dataOptions = {
event: event.target,
getClass: '',
setClass: '',
dataType: type,
title: '',
iconOld: ``,
icon: ``
};
switch(type) {
case 'reload':
updateList();
setTimeout(() => {
$('.menu-list__btn-wrapper > .reload').attr('disabled', false);
}, 400);
break;
case 'hides':
if(menu.hasClass("shows")) {
Object.assign(dataOptions, {
getClass: 'shows',
setClass: 'hides',
iconOld: `icf-eye`,
icon: `icf-eye-blocked`
});
configClick(dataOptions);
} else {
Object.assign(dataOptions, {
getClass: 'hides',
setClass: 'shows',
iconOld: `icf-eye-blocked`,
icon: `icf-eye`
});
configClick(dataOptions);
setVideoList();
}
break;
case 'size':
if(menu.hasClass("main")) {
Object.assign(dataOptions, {
getClass: 'main',
setClass: 'small',
iconOld: `icf-device-mobile`,
icon: `icf-device-desktop`
});
configClick(dataOptions);
} else {
Object.assign(dataOptions, {
getClass: 'small',
setClass: 'main',
iconOld: `icf-device-desktop`,
icon: `icf-device-mobile`
});
configClick(dataOptions);
}
break;
case 'position':
$('.btn-settings-top').toggleClass('btn-settings-top--left btn-settings-top--right');
if(menu.hasClass("left")) {
Object.assign(dataOptions, {
getClass: 'left',
setClass: 'right',
iconOld: `icf-arrow-right`,
icon: `icf-arrow-left`
});
configClick(dataOptions);
} else {
Object.assign(dataOptions, {
getClass: 'right',
setClass: 'left',
iconOld: `icf-arrow-left`,
icon: `icf-arrow-right`
});
configClick(dataOptions);
}
break;
default:
break;
}
// configClick(dataOptions);
}
function updateList() {
$('.menu-list__btn-wrapper > .reload').attr('disabled', true);
$('#menu-content-list').children('.mozaique').children().remove();
// video = u('#html5video video');
// videoHandler = u('#html5video .video-click-handler').on(['mouseover', 'mouseout'], playVideoHandler);
// updateOnHover();
setTimeout(() => {
const clone = $('#related-videos > .mozaique').clone(true);
for (let i = 0; i <= clone.children('.thumb-block').length; i++) {
$('#menu-content-list > .mozaique').last().append(clone.children('.thumb-block')[i]);
if(i === clone.children('.thumb-block').length) $('#menu-content-list > .mozaique').append(clone.children('.thumb-block')[i - 1]);
};
}, 500);
};
// Создаем кнопку
function createBtn(type, value) {
let title = '';
let classList = `${value} icon-f icf`;
// @icf-dashboard: "\e903";
// @icf-device-desktop: "\e956";
// @icf-device-mobile: "\e958";
// @icf-device-tablet: "\e95a";
// @icf-device-tv-v2: "\e9af";
switch(type) {
case 'hides':
classList = `${classList}-${value === 'shows' ? 'eye-blocked' : 'eye'}`;
break;
case 'size':
classList = `${classList}-device-${value === 'small' ? 'desktop' : 'mobile'}`;
break;
case 'position':
default:
classList = `${classList}-arrow-${value === 'left' ? 'right' : 'left'}`;
break;
}
elGenerator('.menu-list__btn-wrapper', 'link', classList, type, title);
$('#menu-content-list').data([type], value).addClass(value);
}
// Загружаем основной конфиг
function init() {
elGenerator('#page', 'menu');
const videoList = $('#related-videos');
let video;
let videoHandler;
const btnShow = videoList.children("a.btn-default.show-more").on('click', (event) => {
videoList.addClass('active expanded');
});
async function setVideoList() {
try {
const clone = $('#related-videos > .mozaique').clone(true);
for (let i = 0; i <= clone.children('.thumb-block').length; i++) {
$('#menu-content-list > .mozaique').last().append(clone.children('.thumb-block')[i]);
if(i === clone.children('.thumb-block').length) $('#menu-content-list > .mozaique').append(clone.children('.thumb-block')[i - 1]);
};
$('#related-videos > .mozaique').find(".thumb-block").addClass('thumb-block--wrapper');
$('#menu-content-list > .mozaique').find(".thumb-block--wrapper").removeClass('thumb-block--wrapper');
} catch(e) {
console.log(e);
}
}
function playVideoHandler(event) {
switch(event.type) {
case 'mouseout':
setRewriteVideoList();
break;
case 'mouseover':
default:
setVideoList();
break;
}
// Выбираем целевой элемент
// const target = document.getElementById('menu-content-list');
// // Конфигурация observer (за какими изменениями наблюдать)
// const config = {
// attributes: true,
// childList: true,
// subtree: true
// };
// // Колбэк-функция при срабатывании мутации
// const callback = function(mutationsList, observer) {
// for (let mutation of mutationsList) {
// if (mutation.type === 'childList') {
// console.log('A child node has been added or removed.', mutation);
// } else if (mutation.type === 'attributes') {
// console.log('The ' + mutation.attributeName + ' attribute was modified.', mutation);
// }
// }
// };
// // Создаём экземпляр наблюдателя с указанной функцией колбэка
// const observer = new MutationObserver(callback);
// // Начинаем наблюдение за настроенными изменениями целевого элемента
// observer.observe(target, config);
// Позже можно остановить наблюдение
// observer.disconnect();
};
// function updateOnHover() {
// // u('#menu-content-list').children('.thumb-block').on(['mouseover', 'mouseout'], playVideoHandler);
// $('#html5video').hover(
// function () {
// $(this).addClass('video__hover');
// // u('#html5video .video-click-handler').trigger('focus');
// // u('#html5video').trigger('touchstart'); // .embed-responsive-item'
// // u(event.target).trigger('touchstart');
// },
// function () {
// $(this).removeClass('video__hover');
// // u('#html5video .video-click-handler').trigger('blur');
// // u('#html5video').trigger('touchstart');
// }
// )
// }
function getList() {
Object.keys(actionsDefault).forEach((action) => createBtn(action, getStoreData(action)));
elGenerator('.menu-list__btn-wrapper', 'link', 'icon-f icf-refresh-circle reload', 'reload');
setTimeout(() => {
btnShow.trigger('click');
}, 400);
setTimeout(() => {
setVideoList();
}, 1200);
$('a.menu-list__btn').on('click', greetingClick);
};
getList();
};
window.addEventListener('DOMContentLoaded', init);
})();