- // ==UserScript==
- // @name Xtube Enhancer - Animated Thumbnails, Inline Video Loading, and Sponsor/Premium-Free Videos
- // @description Animates thumbnails, inlines video loading, and cleans up sponsored content
- // @namespace xtube
- // @version 4.3.3
- // @include http*://www.xtube.com/*
- // @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
- // @require https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js
- // @run-at document-end
- // ==/UserScript==
-
- const thumbSelectors = [
- '#mainSection > section > div > ul > li > article > a > div > div > img',
- '#mainSection > ul > li > article > a > div > div > img',
- '#tabVideos > ul > li > article > a > div > div > img',
- 'div.mainContent>ul>li>article>a>div>div>img',
- '[id*="vid_id_"]',
- '[id*="2_frame"]> a > img',
- '#tabMorefromthisuser > ul > li > article > a > div > div > img',
- '#mainSection > div > div > div > ul > li > article > a > div > div > img',
- '#contentVideos > div > div > ul > li > article > a > div > div.imageWrapper.video > img',
- '#tabVideos > div > ul > li > article > a > div > div.imageWrapper.video > img',
- '#contentActivities > div > div > ul > li > article > a > img',
- '#relatedVideoCarousel > ul > li.item.active > ul > li > article > a > div > div > img',
- ];
-
- const scoreArchiveSelectors = [
- ['#mainSection > section > div > ul > li', '#mainSection > section > div > ul'],
- ['#mainSection > section > div.mainContent > ul > li', '#mainSection > section > div.mainContent > ul'],
- ['#mainSection > section > div > div > ul > li', '#mainSection > section > div > div > ul'],
- ['#tabVideos > div > ul > li', '#tabVideos > div > ul'],
- ['#tabVideos > ul > li', '#tabVideos > ul'],
- ['#mainSection > ul > li', '#mainSection > ul']
- ];
-
- const linkSelectors = [
- '#mainSection > section > div > div > ul > li > article > a:nth-child(1)',
- '#mainSection > ul > li > article > a:nth-child(1)',
- ];
-
- jQuery(document).ready(function($) {
- let route = location.pathname.split('/')[1];
- let state = localStorage.getItem('__xte__');
- let watched = localStorage.getItem('__watched__');
-
- const addWatchedVideo = (url) => {
- if (watched.includes(url)) return;
-
- watched.push(url);
-
- url = _.uniq(url);
-
- localStorage.setItem('__watched__', JSON.stringify(watched));
- }
-
- if (!state) {
- state = {showPremium: false};
- localStorage.setItem('__xte__', JSON.stringify(state));
- } else {
- state = JSON.parse(state);
- }
-
- if (!watched) {
- watched = [];
- localStorage.setItem('__watched__', JSON.stringify(watched));
- } else {
- watched = JSON.parse(watched);
- }
-
- if (route === 'video-watch') {
- addWatchedVideo(location.href);
- }
-
- $(`<div title="Xtube Enhancer Settings" class="form-group" style="position: relative; top: 11px; left: 230px; color: #fff;">
- <label style="font-size: 12px; font-weight: 500;">Show premium videos:</label>
- <input type="checkbox" id="xte1" value="${state.showPremium}" style="margin-top: 1px;">
- </div>`
- ).insertAfter(
- '#searchForm'
- );
-
- if (state.showPremium) {
- $('#xte2').text(' Enabled');
- $('#xte1').attr('checked', 'checked')
- }
-
- $('#xte1').on('click', function(e) {
- state.showPremium = !state.showPremium;
- localStorage.setItem('__xte__', JSON.stringify(state))
- location.reload();
- });
-
-
-
- setTimeout(function() {
- $('div.advertisement').remove();
- $('a.clearfix').remove();
- $('li.pull-right').remove();
- $('h2.h1').remove();
- $('section.overviewPage>div:nth-child(5)').remove();
- $('body > div > div.container > div > div').remove();
- $('#mainSection > a').remove();
- $('[class*="Promotion"]').remove();
- $('[class*="Banner"]').remove();
- $('.lineSeparator').remove();
-
- $('.panelBottomSpace').each(function() {
- if (!$(this).children().length) {
- $(this).remove();
- }
- });
- }, 500);
- let selectors = [
- '#mainSection > section > div > ul > li',
- '#tabVideos > ul > li',
- '#mainSection > ul > li',
- '#mainSection > section > div.mainContent > ul > li',
- '#mainSection > section > div > div > ul > li',
- 'section.row>div>div>ul>li'
- ];
- let keywords = ['premium', 'preview', 'xtube_sponsor', 'ambassador', 'verified'];
-
- $('#mainSection > div > div > section.cntPanel > article.box.contentInfo.hasButtonFooter').insertAfter('#mainSection > div > div > section.cntPanel > div.playerWrapper.videoWrapper');
- $('body > div > div.container > div').remove();
-
- const removeSpam = function() {
- const handleSelector = function(selector) {
- $(selector).each(function() {
- if ($(this).find('article > a:nth-child(1) > h3').text().trim().indexOf($(this).find('article > a.userLink.ellipsis').text().trim().split('by ')[1]) !== -1) {
- $(this).remove();
- } else {
- if ($(this).find('article > a:nth-child(1) > h3').text().trim().indexOf('*****') !== -1) {
- let titleBegin = $(this).find('article > a:nth-child(1) > h3').text().trim().split('*****')[0];
- if (titleBegin === $(this).find('article > a.userLink.ellipsis').text().trim().split('by ')[1].substring(0, titleBegin.length)) {
- $(this).remove();
- }
- }
- }
- for (let i = 0; i < keywords.length; i++) {
- let keyword = keywords[i];
- if ($(this).find('article > a').text().toLowerCase().includes(keyword)) {
- $(this).remove();
- }
- if ($(this).find('article > a > div > span > span').text().toLowerCase().includes(keyword)) {
- $(this).remove();
- }
- if ($(this).find('article>a>span>span').text().toLowerCase() === keyword || $(this).find('article>a>div>span>span').text() === keyword) {
- $(this).remove();
- }
- if ($(this).find('article>dl>dd>a').text().toLowerCase() === keyword) {
- }
- if ($(this).find('article>a>span>span').text().toLowerCase() === keyword) {
- $(this).remove();
- }
- let img = $(this).find('article > div > div.userLink > div > a > img')
- if (img && img[0] && img[0].src.indexOf('Sponsor') > -1) {
- $(this).remove();
- }
- let duration = $(this).find('article > a.titleRemover.js-pop > div > span.duration');
- if (duration && duration.text().indexOf('0:1') > -1) {
- $(this).remove();
- }
- }
- });
- };
- // v2 - Remove videos that have similar title and author strings
- if (!state.showPremium) {
- for (let i = selectors.length - 1; i >= 0; i--) {
- if ($(selectors[i]).length > 0) {
- try {
- handleSelector(selectors[i]);
- } catch (e) {console.log(e)}
- }
- }
- // Kill profile ads
- $('#mainSection > section > div > ul > li > article').each(function(i, el) {
- if ($(el).hasClass('profile')) $(el).remove();
- });
- $('.weeklyTopAmateurVideoPlaceholder').each(function(i, el) {
- $(el).parent().remove();
- });
- }
- };
- removeSpam();
-
- const cleanVidPage = function() {
- $('#mainSection > div > aside > div.cntPanel').remove();
- $('#mainSection > div > div > section.cntPanel > div.onderSellamPlayer').remove();
- let relatedVideos = null;
- $('div#related_videos>div').each(function() {
- relatedVideos = $(this).text().split(' ');
- for (let i = relatedVideos.length - 1; i >= 0; i--) {
- if (relatedVideos[i] === '0:15') {
- $(this).prev().remove();
- $(this).remove();
- }
- }
- });
- // Remove sponsored content below video player.
- $('div#watchPageLeft>div>div').each(function() {
- if ($(this).find('a>span:nth-child(3)').text() === '0:15') {
- $(this).remove();
- }
- });
- // Remove sponsored content in full related videos view.
- $('div.Card-list>article').each(function() {
- if ($(this).find('div>div>div:nth-child(3)').text() === '0:15') {
- $(this).remove();
- }
- });
- // Remove footer ad.
- $('#mainSection > div > div > div.onderSellamPlayer').remove();
- $('.underPlayerBanner').remove();
- // Remove "Ads by Traffic Junky"
- // $('#mainSection > div > div > div.expandStage > div.playerWrapper > div > div > div.header').remove();
- // $('body.desktopView.hasFooterAd .mainSection').css({paddingBottom: '0px'});
- // $('#xtubePlayer > div:nth-child(1)').remove();
- // $('#playerWrapper > div > p').remove();
- //$('#playerWrapper > div > a').unwrap();
- };
- cleanVidPage();
- let paused = false;
- let animateThumbnails = function(selector) {
- let content = _.isString(selector) ? $(selector) : selector;
- if (content.length > 0) {
- content.each(function(i, el) {
- let originalSrc = $(el).attr('src');
- let setAnimations = () => {
- try {
- // let clone = $(el).clone();
- // clone.insertBefore($(el));
- // $(el).hide();
- el.__animation = [];
- let images;
- let _src = $(this).attr('src');
- let src = _src.split('/');
- let regexp = /_(\d\d\d\d)\.jpg$/;
- let match = _src.match(regexp);
-
- if (_.last(src).length <= 6 || match) {
- let imgSrc;
- let n = -1;
-
- if (match) {
- images = ['_0000.jpg', '_0001.jpg', '_0002.jpg', '_0003.jpg', '_0004.jpg', '_0005.jpg', '_0006.jpg', '_0007.jpg', '_0008.jpg', '_0009.jpg', '_0010.jpg', '_0011.jpg', '_0012.jpg', '_0013.jpg', '_0014.jpg'];
- imgSrc = _src.split(match[0])[0];
- } else {
- images = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg'];
- let src3 = _.without(src, _.last(src));
- imgSrc = src3.join('/') + '/';
- }
-
- for (let z = 0; z < images.length; z++) {
- el.__animation.push(imgSrc + images[z]);
- }
-
- let animate = function() {
- if (el.__timeout) clearTimeout(el.__timeout);
-
- el.onload = () => el.__timeout = setTimeout(animate, 500);
- el.onerror = () => {
- n = -1;
- el.onload();
- };
-
- if (!paused) {
- let newSrc = el.__animation[++n];
- if (!newSrc) {
- n = 0;
- newSrc = el.__animation[0];
- }
- el.src = newSrc;
- }
-
- };
- animate();
- }
- } catch (e) {console.log(e)}
- };
- let related = $('#mainSection > div > div > div.cntPanel.relatedVideosPanel');
- if (related.length) {
- paused = true;
- related.on('mouseenter', function() {
- paused = false;
- })
- related.on('mouseleave', function() {
- paused = true;
- })
- }
- if (originalSrc.indexOf('placehold') === -1) {
- setAnimations();
- } else {
- el.onload = function() {
- setTimeout(() => setAnimations(), 0);
- };
- }
- });
- }
- };
-
- // Animate thumbnails
- $('#relatedVideoCarousel > footer').on('click', function() {
- animateThumbnails('#relatedVideoCarousel > ul > li > ul > li > article > a > div > div > img');
- });
- setTimeout(function() {
- for (let i = 0; i < thumbSelectors.length; i++) {
- if ($(thumbSelectors[i]).length > 0) {
- animateThumbnails(thumbSelectors[i]);
- }
- }
-
- // Order each page by best score
- let __videos = [];
- let orderByScore = function(selector1, selector2) {
- $(selector1).each(function(i, el) {
- let views = parseInt($(el).find('article > div > div > div.metaInfoRight > span:nth-child(1)').text().trim().split('%')[0]);
- let score = parseInt($(el).find('article > div > div > div.metaInfoRight > span:nth-child(2)').text().trim().split('%')[0]);
- let duration = parseInt($(el).find('.videoDuration').text().trim().split(/\s+/)[0].replace(/:/g, ''));
-
- if (isNaN(views)) {
- views = parseInt($(el).find('article > div > div.metaInfoRight > span.viewCounter').text().trim().split('%')[0]);
- }
-
- if (isNaN(score)) {
- score = parseInt($(el).find('article > div > div.metaInfoRight > span.voting.score.like').text().trim().split('%')[0]);
- }
-
- duration = isNaN(duration) ? 0 : duration;
-
- __videos.push({
- score: isNaN(score) ? 0 : score,
- views: isNaN(views) ? 0 : views,
- duration,
- el: el
- });
-
- $(el).remove();
- });
-
- __videos = _.chain(__videos).orderBy(['score', 'duration', 'views'], ['asc', 'asc', 'asc']).uniq().value().reverse();
-
- $(selector2).each(function(el) {
- $(el).remove();
- });
-
- _.each(__videos, function(vid) {
- $(selector2).eq(0).append($(vid.el));
- });
- };
-
- for (let z = scoreArchiveSelectors.length - 1; z >= 0; z--) {
- if ($(scoreArchiveSelectors[z][0]).length > 0) {
- orderByScore(scoreArchiveSelectors[z][0], scoreArchiveSelectors[z][1]);
- }
- }
-
- for (let i = 0, len = linkSelectors.length; i < len; i++) {
- $(linkSelectors[i]).each((i, el) => {
- let duration = $(el).find('.videoDuration');
- let durationText = duration.text();
-
- if (watched.indexOf(el.href) > -1) {
- duration.text(`${durationText} ✓ Watched`);
- }
-
- $(el).on('click', (e) => {
- e.preventDefault();
-
- addWatchedVideo(el.href);
- duration.text(`${durationText} ✓ Watched`);
-
- window.open(el.href);
- })
- });
- }
-
- setTimeout(() => {
- removeSpam();
- $('#mainSection > section > div > ul > li.col-xs-12.col-s-12.col-l-8.col10-xl-2.col-xxl-4').remove();
- }, 6000);
- }, 0);
- });