EMPviewer v2

Better porn browsing

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name             EMPviewer v2
// @namespace        https://www.empornium.sx/
// @version          2.0
// @description      Better porn browsing
// @author           p0wn3rd
// @contributors     someone234342, JoaoBravo88,howlingbanshee
// @match            https://www.empornium.sx/*
// @grant            none
// @require          https://code.jquery.com/jquery-3.2.1.min.js
// ==/UserScript==



(function($) {
    'use strict';

    $.noConflict();

    const config = {
        thumbSize: '20%', // Enter width here in % (Height will be calculated automatically) – 20% , 25% and 33% are good examples

        showTitle: false, // set false to hide title and only show when you hover on thumbnail

        showUploader: false, // set true to show uploader name on tiles

        maxTitleLength: 70, // title will be truncated after these many characters

        excludeCategories: 'sick, scat, animal, gay', // comma-separated list of categories you don't like

        excludeTags: '', // comma-separated list of tags you don't like
    };

    // --------------
    // Unless you know what you're doing, don't edit below this line;

    if (!$('.torrent_table').length || $('.torrent_table').parents('#details_top').length) return;
    const css = `
#content {
max-width: none;
}
.torrent_grid {
background: black;
padding: 5px;
}
.torrent_grid__torrent {
width: ${config.thumbSize};
height: 160px;
display: inline-block;
background-size: cover;
background-repeat: no-repeat;
background-position: center center;
border: 5px solid black;
box-sizing: border-box;
position: relative;
overflow: hidden;
color: white;
}
.torrent_grid__torrent__cat {
position: absolute;
top: 5px;
left: 5px;
background: rgba(0, 0, 0, 0.7);
font-size: 15px;
padding: 2px 10px;
text-transform: uppercase;
font-weight: bold;
}
.torrent_grid__torrent__info {
position: absolute;
display: block;
bottom: 0;
left: 0;
width: 100%;
background: rgba(0, 0, 0, 0.75);
padding: 10px;
box-sizing: border-box;
transition: .1s ease;
font-size: 13px;
}
.torrent_grid__torrent__info h3 {
font-weight: normal;
font-size: 1.2em;
color: #cccccc;
${!config.showTitle ? 'display: none' : ''}
}
.torrent__size {
color: #ccc;
border: none;
padding: 0px 2px;
font-size: 12px;
font-weight: normal;
margin-left: 2px;
}
h3 .torrent__size {
border-color: rgb(226, 226, 226);
color: rgb(226, 226, 226);
position: relative;
font-size: 13px;
top: -2px;
margin-right: 2px;
margin-left: 0;
}
@media (max-width: 1200px) {
.torrent_grid__torrent__info h3 {
font-size: 1em;
}
}
.torrent_grid__torrent__info h3:hover {
text-decoration: none;
}

.newtime{
position: absolute;
down: 0;
right: 0;
padding: 0px 5px;
}

.torrent_grid__torrent__info .uploader a {
font-weight: bold;
text-decoration: underline;
}
.seeders, .leechers {
margin-right: 5px;
}
.seeders svg, .leechers svg {
position: relative;
top: 4px;
margin-right: -2px
}

span[style="color: #FF0000;"] {
color: #ff4646 !important;
}

.torrent--freeleech {
background: rgba(0, 0, 0, 0.7);
position: absolute; top: 5px; right: 5px; padding: 10px 10px;
}
.torrent_grid__torrent:visited h3, .uploader a:visited {
color: #FF1493;
}
.torrent__info_extra {
position: absolute;
bottom: 9px;
right: 8px;
}
.torrent__info_extra img[alt="Freeleech"] {
display: none;
}
.torrent__info_extra .icon {
width: 18px;
width: 18px;
background-size: contain;
vertical-align: middle;
margin-right: 5px;
}
.icon.icon_okay {
    display: none;
}
.torrent__info__time {
display:none;
}
.torrent__cover {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-size: cover;
background-repeat: no-repeat;
background-position: center center;
}
.torrent--excluded .torrent__cover {
-webkit-filter: blur(20px);
-moz-filter: blur(20px);
filter: blur(20px);
}
`;

    // Add style to <head>
    const styleTag = document.createElement('style');
    styleTag.id = "pb_grid_css";
    styleTag.innerHTML = css;
    document.head.appendChild(styleTag);

    // returns torrents array
    var getTorrents = (table) => {
        const torrents = [];
        table.find('tr.torrent').each(function(){
            const $this = $(this);
            const cells = $this.find('td');
            let isTop10 = location.pathname === '/top10.php';

            const cellMap = isTop10 ? {
                main: 2,
                category: 1,
                size: 4,
                seeders: 6,
                leechers: 7,
                uploader: 9,

            } : {
                main: 1,
                category: 0,
                files: 2,
                time: 4,
                size: 5,
                seeders: 7,
                leechers: 8,
                uploader: 10,
            };

            const overlayID =  $this.find('a[href*="torrents.php?id"]').attr('onmouseover').split('overlib(')[1].split(', FULLHTML')[0];

            const thisTorrent = {
                category: cells.eq(cellMap.category).find('div[title]').attr('title'),
                overlayID: overlayID,
                cover: window[overlayID].split('src=')[1].split('></td>')[0],
                link: $this.find('a[href*="torrents.php?id"]')[0].href,
                title: $this.find('a[href*="torrents.php?id"]').text(),
                tags: $this.find('.tags').html(),
                files: cells.eq(cellMap.files).text(),
                time: cells.eq(cellMap.time).text(),
                time_full: cells.eq(cellMap.time).find('span[title]').attr('title'),
                size: cells.eq(cellMap.size).text(),
                snatches: cells.eq(cellMap.snatches).text(),
                seeders: cells.eq(cellMap.seeders).text(),
                leechers: cells.eq(cellMap.leechers).text(),
                uploader: cells.eq(cellMap.uploader).html(),
                uploaderName: cells.eq(cellMap.uploader).text(),
            };

            thisTorrent.fl = cells.eq(cellMap.main).find('img[alt="Freeleech"]');

            if(thisTorrent.fl.length){
                thisTorrent.fl = "<span class='torrent--freeleech'><img src='static/common/symbols/freedownload.gif' alt='Freeleech' title='Freeleech' /></span>";
            } else {
                thisTorrent.fl = "";
            }

            thisTorrent.status_icons = cells.eq(cellMap.main).find('span[style="float:right"]').html();

            if(thisTorrent.seeders > 0) {
                thisTorrent.seeders = "<span style='color: #3FEB00;'>" + thisTorrent.seeders + "</span>";
            } else {
                thisTorrent.seeders = "<span style='color: #FF0000;'>" + thisTorrent.seeders + "</span>";
            }
            if(thisTorrent.leechers > 0) {
                thisTorrent.leechers = "<span style='color: #FF0000;'>" + thisTorrent.leechers + "</span>";
            }

            torrents.push(thisTorrent);
        });
        table.html('<div class="torrent_grid">');
        return torrents;
    };
    $('.torrent_table').each(function(){
        const torrents = getTorrents($(this));
        const grid = $(this).find('.torrent_grid');

        // Insert grid
        torrents.forEach(torrent => {
            const thisTorrent = $(`<a href="${torrent.link}" class="torrent_grid__torrent" />`);

            const Icon_seed = '<svg style="width:17px;height:17px" viewBox="0 0 24 24"><path fill="#FFFFFF" d="M14,20H10V11L6.5,14.5L4.08,12.08L12,4.16L19.92,12.08L17.5,14.5L14,11V20Z" /></svg>';
            const Icon_leech = '<svg style="width:17px;height:17px" viewBox="0 0 24 24"><path fill="#FFFFFF" d="M10,4H14V13L17.5,9.5L19.92,11.92L12,19.84L4.08,11.92L6.5,9.5L10,13V4Z" /></svg>';

            const excludeCategories = config.excludeCategories.split(',');
            const excludeTags = config.excludeTags.split(',');

            excludeCategories.forEach(excludedCat => {
                if (excludedCat.length && torrent.category.toLowerCase() == excludedCat.trim().toLowerCase()) thisTorrent.addClass('torrent--excluded');
            });
            excludeTags.forEach(excludedTag => {
                if (excludedTag.length && torrent.tags.toLowerCase().indexOf('>' + excludedTag.trim().toLowerCase()) !== -1) thisTorrent.addClass('torrent--excluded');
            });

            const _category = torrent.category ? `<span class="torrent_grid__torrent__cat">${torrent.category}</span>` : '';
            const _uploader = torrent.uploader && config.showUploader ? `<span class="uploader" title="uploaded by ${torrent.uploaderName}">by: ${torrent.uploader}</span>` : '';
            const title_truncated = torrent.title.length > config.maxTitleLength ? torrent.title.slice(0, config.maxTitleLength) + '...' : torrent.title;

            thisTorrent.append(`
<div class="torrent__cover" style='background-image: url(${torrent.cover})'></div>
${_category}
${torrent.fl}
<div class="torrent_grid__torrent__info">
<h3 title="${torrent.title}">${config.showUploader ? `<span class="torrent__size">${torrent.size}</span>` : ''} ${title_truncated}</h3>
<div>
<span class="seeders">${Icon_seed} ${torrent.seeders}</span>
<span class="leechers">${Icon_leech} ${torrent.leechers}</span>
${config.showUploader ? '': `<span class="torrent__size">${torrent.size}</span>`}
${_uploader}
<span class="torrent__info_extra">
${torrent.status_icons}
<span class="torrent__info__time" title="${torrent.time_full}">${torrent.time}</span>
</span>
</div>
</div>`);
            grid.append(thisTorrent);
            thisTorrent.height(thisTorrent.outerWidth() - 10);
        });
    });

    $(window).resize(function(){
        const sizeCSS = $('#gridSizeCSS');
        const size = $('.torrent_grid__torrent').first().outerWidth();
        if (!sizeCSS.length) {
            const sizeCSS = $('<style type="text/css" id="gridSizeCSS" />');
            $('head').append(sizeCSS);
        }
        sizeCSS.html(`.torrent_grid__torrent { height: ${size - 10}px !important }`);
    });

    $('.torrent_grid__torrent').on('mouseover' , function() {
        $(this).find('h3').slideDown('fast');
    });
    $('.torrent_grid__torrent').on('mouseleave' , function() {
        $(this).find('h3').slideUp('fast');
    });
    $.noConflict();

})(jQuery);