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+
104106const 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