Skip to content

Commit 6bae91b

Browse files
committed
Update
1 parent 94b94ab commit 6bae91b

1 file changed

Lines changed: 56 additions & 23 deletions

File tree

improve-adult-experience.user.js

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// ==UserScript==
22
// @name Improve Adult Experience
3-
// @description Skip intros, set better default quality/duration filters, make unwanted video previews transparent, workaround load failures, make input more consistent across the websites, remove spammy elements. Usually affects every media player it can find, designed to be used on a separate browser profile. Supported websites: anysex.com, beeg.com, bingato.com, drtuber.com, hqporner.com, hdzog.tube, hypnotube.com, incestporno.vip, inporn.com, manysex.com, mat6tube.com, pmvhaven.com, porn00.tv, pornhits.com, pornhub.com, porno365.best, porntrex.com, pornxp.com, redtube.com, spankbang.com, taboodude.com, tnaflix.com, tube8.com, txxx.com, veporn.com, vxxx.com, whoreshub.com, xgroovy.com, xhamster.com, xnxx.com, xvideos.com, xxxbp.tv, рус-порно.tv
3+
// @description Skip intros, set better default quality/duration filters, make unwanted video previews transparent, workaround load failures, make input more consistent across the websites, remove spammy elements. Usually affects every media player it can find, designed to be used on a separate browser profile. Supported websites: anysex.com, beeg.com, bingato.com, drtuber.com, hqporner.com, hdzog.tube, hypnotube.com, incestporno.vip, inporn.com, manysex.com, mat6tube.com, pmvhaven.com, porn00.tv, pornhits.com, pornhub.com, porno365.best, porntrex.com, pornxp.com, redtube.com, spankbang.com, taboodude.com, tnaflix.com, tube8.com, txxx.com, veporn.com, vxxx.com, whoreshub.com, xgroovy.com, xhamster.com, xnxx.com, xvideos.com, xxxbp.tv, youporn.com, рус-порно.tv
44
// @icon https://external-content.duckduckgo.com/ip3/pornhub.com.ico
5-
// @version 0.61
5+
// @version 0.62
66
// @downloadURL https://userscripts.codonaft.com/improve-adult-experience.user.js
77
// @grant GM_addStyle
88
// ==/UserScript==
99

10-
// TODO: cumlouder.com, pornone.com, pornheed.com, tubeon.com, xtits.xxx, eporner.com, pervclips.com, bigbumfun.com, momvids.com, zbporn.com, ok.xxx / perfectgirls.xxx, tubev.sex, youjizz.com, youporn.com, empflix.com, babestube.com, pornwhite.com, pornomira.net, videosection.com, upornia.com, free.brazzers.com, hdsex.org, gay0day.com, collectionofbestporn.com, pissjapantv.com, pervertslut.com, luxuretv.com, 4kporn.xxx, minuporno.com, prndb.net, familyporn.tv
10+
// TODO: cumlouder.com, pornone.com, pornheed.com, tubeon.com, xtits.xxx, eporner.com, pervclips.com, bigbumfun.com, momvids.com, zbporn.com, ok.xxx / perfectgirls.xxx, tubev.sex, youjizz.com, empflix.com, babestube.com, pornwhite.com, pornomira.net, videosection.com, upornia.com, free.brazzers.com, hdsex.org, gay0day.com, collectionofbestporn.com, pissjapantv.com, pervertslut.com, luxuretv.com, 4kporn.xxx, minuporno.com, prndb.net, familyporn.tv
1111

1212
(_ => {
1313
'use strict';
@@ -101,6 +101,8 @@ const timeToSeconds = rawText => {
101101
return total;
102102
};
103103

104+
const applySearchFilter = (params, url) => Object.entries(params).forEach(([key, value]) => url.searchParams.set(key, value));
105+
104106
const focus = node => {
105107
if (!node) return;
106108
if (!node.hasAttribute('tabindex')) {
@@ -600,7 +602,7 @@ const sites = {
600602
const url = new URL(node.href);
601603
if (url.pathname === '/') return;
602604

603-
Object.entries(searchFilterParams).forEach(([key, value]) => url.searchParams.set(key, value));
605+
applySearchFilter(searchFilterParams, url);
604606
updateUrl(node, url);
605607
},
606608
});
@@ -649,7 +651,7 @@ const sites = {
649651
const url = new URL(node.href);
650652
const params = url.searchParams;
651653
if (['/babe/', '/c/'].find(i => url.pathname.startsWith(i)) && !params.has(sort)) {
652-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
654+
applySearchFilter(searchFilterParams, url);
653655
updateUrl(node, url);
654656
}
655657
},
@@ -784,13 +786,13 @@ const sites = {
784786
const params = url.searchParams;
785787
if (p.startsWith('/categories/') && p.endsWith(latestUpdates)) {
786788
url.pathname = url.pathname.replace(latestUpdates, '/top-rated/1/');
787-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
789+
applySearchFilter(searchFilterParams, url);
788790
updateUrl(node, url);
789791
} else if (['/pornsite/', '/pornstar/'].find(i => p.startsWith(i)) && p.endsWith('/videos/1/') && params.get('sort') !== 'longest') {
790792
params.set('sort', 'longest');
791793
updateUrl(node, url);
792794
} else if (['/search/1/', '/top-rated/1/', '/videos/latest-updates/1/'].find(i => p.startsWith(i)) && !params.has('duration')) {
793-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
795+
applySearchFilter(searchFilterParams, url);
794796
updateUrl(node, url);
795797
}
796798
},
@@ -817,18 +819,18 @@ const sites = {
817819
const p = url.pathname;
818820
const params = url.searchParams;
819821
if (p.startsWith('/search/')) {
820-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
822+
applySearchFilter(searchFilterParams, url);
821823
updateUrl(node, url);
822824
} else if (p.includes(categories) && !p.endsWith(categories) && ![longest, topRated].find(i => p.includes(i))) {
823825
if (p.split(',').length <= 1) {
824-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
826+
applySearchFilter(searchFilterParams, url);
825827
url.pathname += topRated;
826828
} else {
827829
url.pathname += longest;
828830
}
829831
updateUrl(node, url);
830832
} else if (p.startsWith('/videos/') && !p.includes(`/${topRated}`)) {
831-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
833+
applySearchFilter(searchFilterParams, url);
832834
url.pathname += topRated;
833835
updateUrl(node, url);
834836
} else if (['/pornsite/', '/pornstar/'].find(i => p.startsWith(i))) {
@@ -860,7 +862,7 @@ const sites = {
860862
if (!validLink(node)) return;
861863
const url = new URL(node.href);
862864
if (!url.searchParams.has('len')) {
863-
Object.entries(searchFilterParams).forEach(([key, value]) => url.searchParams.set(key, value));
865+
applySearchFilter(searchFilterParams, url);
864866
updateUrl(node, url);
865867
}
866868
},
@@ -1101,7 +1103,7 @@ const sites = {
11011103
const p = url.pathname;
11021104
const ps = parts(p);
11031105
if (['/video', '/video/search'].includes(p) || p.startsWith('/categories/')) {
1104-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1106+
applySearchFilter(searchFilterParams, url);
11051107
} else if (p.startsWith('/pornstar/')) {
11061108
if (ps.length === 2) {
11071109
url.pathname = [...ps, 'videos', 'upload'].join('/');
@@ -1224,7 +1226,7 @@ const sites = {
12241226
const params = url.searchParams;
12251227
const p = url.pathname;
12261228
if ((p === '/' || p.startsWith('/redtube/') || params.has('search')) && (!params.has('min_duration') || !params.has('hd'))) {
1227-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1229+
applySearchFilter(searchFilterParams, url);
12281230
updateUrl(node, url);
12291231
} else if (['channels', 'pornstar'].find(i => p.startsWith(`/${i}/`)) && !p.endsWith('/longest')) {
12301232
url.pathname += '/longest';
@@ -1263,7 +1265,7 @@ const sites = {
12631265
if (p === '/') {
12641266
url.pathname = '/trending_videos/'
12651267
}
1266-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1268+
applySearchFilter(searchFilterParams, url);
12671269
updateUrl(node, url);
12681270
}
12691271
},
@@ -1290,7 +1292,7 @@ const sites = {
12901292
const url = new URL(node.href);
12911293
const p = url.pathname;
12921294
if (p === '/' || ['/category/', '/search', '/model/'].find(i => p.startsWith(i))) {
1293-
Object.entries(searchFilterParams).forEach(([key, value]) => url.searchParams.set(key, value));
1295+
applySearchFilter(searchFilterParams, url);
12941296
updateUrl(node, url);
12951297
}
12961298
}
@@ -1343,11 +1345,11 @@ const sites = {
13431345

13441346
if (p.includes('/search')) {
13451347
if (params.has('d')) return;
1346-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1348+
applySearchFilter(searchFilterParams, url);
13471349
updateUrl(node, url);
13481350
} else if (p !== '/' && !p.includes('/top-rated')) {
13491351
url.pathname += '/top-rated';
1350-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1352+
applySearchFilter(searchFilterParams, url);
13511353
updateUrl(node, url);
13521354
}
13531355
},
@@ -1374,7 +1376,7 @@ const sites = {
13741376
const p = url.pathname;
13751377
const params = url.searchParams;
13761378
if (['newest.html', 'mostviewed.html', 'searches.html', 'top.html', 'cat/', 'porntags/'].find(i => p.startsWith(`/${i}`)) && (!params.has('res') || !params.has('min_minutes'))) {
1377-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1379+
applySearchFilter(searchFilterParams, url);
13781380
updateUrl(node, url);
13791381
} else if (p.startsWith('/pornstar/') && !p.endsWith('/duration/')) {
13801382
url.pathname += 'duration/';
@@ -1410,7 +1412,7 @@ const sites = {
14101412
const url = new URL(node.href);
14111413
const p = url.pathname;
14121414
const params = url.searchParams;
1413-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1415+
applySearchFilter(searchFilterParams, url);
14141416
if (p.startsWith('/search/')) {
14151417
const page = parseFloat(p.split('/search/')[1]?.split('/')[0]) || 1;
14161418
url.pathname = `/search/${page}/`;
@@ -1465,7 +1467,7 @@ const sites = {
14651467
if (!parts(p).find(parseFloat)) {
14661468
url.pathname += '/1/';
14671469
}
1468-
Object.entries(searchFilterParams).forEach(([key, value]) => url.searchParams.set(key, value));
1470+
applySearchFilter(searchFilterParams, url);
14691471
updateUrl(node, url);
14701472
}
14711473
},
@@ -1525,7 +1527,7 @@ const sites = {
15251527
const params = url.searchParams;
15261528
const p = url.pathname;
15271529
if (p.startsWith('/search/') && params.get('length') !== 'full') {
1528-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1530+
applySearchFilter(searchFilterParams, url);
15291531
updateUrl(node, url);
15301532
} else if (p === '/' || (['/categories/', '/channels/'].find(i => p.startsWith(i)) && !p.includes(best))) {
15311533
url.pathname += `${best}/monthly`;
@@ -1624,7 +1626,7 @@ const sites = {
16241626
const params = url.searchParams;
16251627
const p = url.pathname;
16261628
if (p === '/' && params.has('k') && !params.has('quality')) {
1627-
Object.entries(searchFilterParams).forEach(([key, value]) => params.set(key, value));
1629+
applySearchFilter(searchFilterParams, url);
16281630
updateUrl(node, url);
16291631
return;
16301632
} else if (p.startsWith('/c/') && !p.includes(`q:${MIN_VIDEO_HEIGHT}P`)) {
@@ -1650,7 +1652,7 @@ const sites = {
16501652
.heading-sort .heading-sort-active { color: #ffd030 !important }
16511653
`,
16521654
searchInputSelector: 'input#searchInput[type="text"]',
1653-
searchFilter: query => [`x/${query.replaceAll(' ', '-')}${topRated}`, {}],
1655+
searchFilter: query => [`x/${encodeURIComponent(query.replaceAll(' ', '-'))}${topRated}`, {}],
16541656
thumbnailSelector: 'article.thumb',
16551657
durationSelector: 'span.thumb-box-title',
16561658
isUnwantedDuration: text => text.includes(':') && timeToSeconds(text) < MIN_DURATION_MINS * 60,
@@ -1661,6 +1663,37 @@ const sites = {
16611663
},
16621664
});
16631665
},
1666+
1667+
'youporn.com': _ => {
1668+
const rating = '/rating/';
1669+
const searchFilterParams = { res: 'HD', min_minutes: MIN_DURATION_MINS };
1670+
init({
1671+
searchInputSelector: 'input[name="query"][type="text"]',
1672+
searchFilter: query => ['search/', { query }],
1673+
searchFilterParams,
1674+
videoSelector: 'video.mgp_videoElement:not(.gifVideo)',
1675+
playSelector: 'div.mgp_playIcon, div.mgp_bigPlay, div.mgp_playbackBtn, mgp_smallPlay',
1676+
fullscreenSelector: 'div.mgp_fullscreenIcon, div[data-text="Enter Fullscreen"], div[data-text="Exit fullscreen"]',
1677+
thumbnailSelector: 'div.video-box',
1678+
durationSelector: 'div.video-duration',
1679+
isUnwantedDuration: text => timeToSeconds(text) < MIN_DURATION_MINS * 60,
1680+
isVideoUrl: href => href.includes('/watch/'),
1681+
hideSelector: 'div#cookie_consent_wrapper, div.channel-description, div.recommended-videos-wrapper',
1682+
onNodeChange: node => {
1683+
if (!validLink(node) || node.closest('ul.filter-list')) return;
1684+
1685+
const url = new URL(node.href);
1686+
const p = url.pathname;
1687+
if (['category', 'most_favorited', 'most_viewed', 'porntags', 'top_rated', 'search'].find(i => p.includes(`/${i}/`))) {
1688+
applySearchFilter(searchFilterParams, url);
1689+
updateUrl(node, url);
1690+
} else if (!p.includes(rating) && ['channel', 'pornstar'].find(i => p.includes(`/${i}/`))) {
1691+
url.pathname += rating;
1692+
updateUrl(node, url);
1693+
}
1694+
},
1695+
});
1696+
},
16641697
};
16651698
(sites[shortDomain] || defaultInit)();
16661699

0 commit comments

Comments
 (0)