pervert-monkey 1.0.18 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/pervertmonkey.core.es.d.ts +8 -11
- package/dist/core/pervertmonkey.core.es.js +31 -35
- package/dist/core/pervertmonkey.core.es.js.map +1 -1
- package/dist/core/pervertmonkey.core.umd.js +31 -35
- package/dist/core/pervertmonkey.core.umd.js.map +1 -1
- package/dist/test/test.user.js +10301 -0
- package/dist/userscripts/3hentai.user.js +2 -2
- package/dist/userscripts/camgirlfinder.user.js +2 -2
- package/dist/userscripts/camwhores.user.js +2 -2
- package/dist/userscripts/e-hentai.user.js +2 -2
- package/dist/userscripts/ebalka.user.js +2 -2
- package/dist/userscripts/eporner.user.js +2 -2
- package/dist/userscripts/erome.user.js +2 -2
- package/dist/userscripts/eroprofile.user.js +2 -2
- package/dist/userscripts/javhdporn.user.js +2 -2
- package/dist/userscripts/missav.user.js +2 -2
- package/dist/userscripts/motherless.user.js +2 -2
- package/dist/userscripts/namethatporn.user.js +2 -2
- package/dist/userscripts/nhentai.user.js +2 -2
- package/dist/userscripts/obmenvsem.user.js +3 -3
- package/dist/userscripts/pornhub.user.js +2 -2
- package/dist/userscripts/spankbang.user.js +2 -2
- package/dist/userscripts/thisvid.user.js +33 -27
- package/dist/userscripts/xhamster.user.js +3 -3
- package/dist/userscripts/xvideos.user.js +3 -3
- package/package.json +4 -4
- package/src/core/data-handler/data-filter.ts +4 -4
- package/src/core/infinite-scroll/index.ts +2 -9
- package/src/core/parsers/thumb-data-parser.ts +4 -3
- package/src/core/parsers/thumbs-parser.ts +9 -10
- package/src/core/rules/index.ts +6 -7
- package/src/userscripts/index.ts +1 -1
- package/src/userscripts/scripts/3hentai.ts +1 -1
- package/src/userscripts/scripts/camgirlfinder.ts +1 -1
- package/src/userscripts/scripts/camwhores.ts +1 -1
- package/src/userscripts/scripts/e-hentai.ts +1 -1
- package/src/userscripts/scripts/ebalka.ts +1 -1
- package/src/userscripts/scripts/eporner.ts +1 -1
- package/src/userscripts/scripts/erome.ts +1 -1
- package/src/userscripts/scripts/eroprofile.ts +1 -1
- package/src/userscripts/scripts/javhdporn.ts +1 -1
- package/src/userscripts/scripts/missav.ts +1 -1
- package/src/userscripts/scripts/motherless.ts +1 -1
- package/src/userscripts/scripts/namethatporn.ts +1 -1
- package/src/userscripts/scripts/nhentai.ts +1 -2
- package/src/userscripts/scripts/obmenvsem.ts +2 -2
- package/src/userscripts/scripts/pornhub.ts +1 -1
- package/src/userscripts/scripts/spankbang.ts +1 -1
- package/src/userscripts/scripts/thisvid.ts +43 -35
- package/src/userscripts/scripts/xhamster.ts +2 -2
- package/src/userscripts/scripts/xvideos.ts +2 -2
- package/src/utils/dom/index.ts +14 -10
- package/src/utils/parsers/index.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name 3Hentai PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 1.0.
|
|
4
|
+
// @version 1.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title, thumb preview
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.3hentai.net/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addStyle
|
|
17
17
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name CamGirlFinder PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 1.6.
|
|
4
|
+
// @version 1.6.11
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Adds model links for CamWhores, webcamrecordings, recu.me, camvideos, privat-zapisi
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://camgirlfinder.net/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant none
|
|
17
17
|
// @run-at document-idle
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name CamWhores PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 3.0.
|
|
4
|
+
// @version 3.0.15
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional]. Filter by Title, Duration and Private/Public. Sort by Duration and Views. Mass friend request button. Download button
|
|
7
7
|
// @license MIT
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// @match https://*.camwhores.tv
|
|
14
14
|
// @match https://*.camwhores.*/*
|
|
15
15
|
// @exclude https://*.camwhores.tv/*mode=async*
|
|
16
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
16
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
17
17
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
18
18
|
// @grant GM_addStyle
|
|
19
19
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name E-Hentai PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 1.0.
|
|
4
|
+
// @version 1.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.e-hentai.org/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addStyle
|
|
17
17
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Ebalka PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 3.0.
|
|
4
|
+
// @version 3.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title and Duration, Sort by Duration, Download button.
|
|
7
7
|
// @license MIT
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// @match https://*ebalka.*.*/*
|
|
16
16
|
// @match https://*.ebalk*.*/*
|
|
17
17
|
// @match https://*.fuckingbear*.*/*
|
|
18
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
18
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
19
19
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
20
20
|
// @grant GM_addStyle
|
|
21
21
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Eporner PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 2.0.
|
|
4
|
+
// @version 2.0.14
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title, Uploader, Duration and HD, Sort by Views and Duration
|
|
7
7
|
// @license MIT
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.eporner.com/*
|
|
14
14
|
// @match https://*.eporner.*/*
|
|
15
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
15
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
16
16
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
17
17
|
// @grant GM_addStyle
|
|
18
18
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Erome PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 5.0.
|
|
4
|
+
// @version 5.0.13
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title, Uploader and Video/Photo albums, Sort by Views. Show/Hide Photos in album. Remove disclaimer.
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match *://*.erome.com/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addStyle
|
|
17
17
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Eroprofile PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 2.0.
|
|
4
|
+
// @version 2.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title and Duration, Sort by Duration
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.eroprofile.com/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addStyle
|
|
17
17
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Javhdporn PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 3.0.
|
|
4
|
+
// @version 3.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title and Duration, Sort By Duration and Views
|
|
7
7
|
// @license MIT
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.javhdporn.net/*
|
|
14
14
|
// @match https://*.javhdporn.*/*
|
|
15
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
15
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
16
16
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
17
17
|
// @grant GM_addStyle
|
|
18
18
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Missav PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 3.0.
|
|
4
|
+
// @version 3.0.11
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title and Duration, Sort by Duration
|
|
7
7
|
// @license MIT
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// @match https://*.missav.ws/*
|
|
16
16
|
// @match https://*.missav.to/*
|
|
17
17
|
// @match https://*.missav.live/*
|
|
18
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
18
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
19
19
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
20
20
|
// @grant GM_addStyle
|
|
21
21
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Motherless PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 5.0.
|
|
4
|
+
// @version 5.0.13
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title, Uploader and Duration, Sort by Duration and Views
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://motherless.com/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addElement
|
|
17
17
|
// @grant GM_addStyle
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name NameThatPorn PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 3.0.
|
|
4
|
+
// @version 3.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title, Uploader and Solved/Unsolved
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://namethatporn.com/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addStyle
|
|
17
17
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name NHentai PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 4.0.
|
|
4
|
+
// @version 4.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title
|
|
7
7
|
// @license MIT
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.nhentai.net/*
|
|
14
14
|
// @match https://*.nhentai.*/*
|
|
15
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
15
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
16
16
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
17
17
|
// @grant GM_addStyle
|
|
18
18
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
|
-
// @name
|
|
2
|
+
// @name Obmenvsem PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 1.0.
|
|
4
|
+
// @version 1.0.14
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title and Duration, Sort by Duration
|
|
7
7
|
// @license MIT
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// @match https://*.obmenvsem.com/*
|
|
14
14
|
// @match https://*.obmenvsem.*/*
|
|
15
15
|
// @match https://*.obmenvsems.*/*
|
|
16
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
16
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
17
17
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
18
18
|
// @grant GM_addElement
|
|
19
19
|
// @grant GM_addStyle
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name PornHub PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 4.0.
|
|
4
|
+
// @version 4.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional]. Filter by Title, Uploader and Duration. Sort by Duration and Views
|
|
7
7
|
// @license MIT
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.pornhub.com/*
|
|
14
14
|
// @exclude https://*.pornhub.com/embed/*
|
|
15
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
15
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
16
16
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
17
17
|
// @grant GM_addStyle
|
|
18
18
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name SpankBang.com PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 4.0.
|
|
4
|
+
// @version 4.0.12
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional]. Filter by Title and Duration. Sort by Duration and Views
|
|
7
7
|
// @license MIT
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.spankbang.com/*
|
|
14
14
|
// @match https://*.spankbang.*/*
|
|
15
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
15
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
16
16
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
17
17
|
// @grant GM_addStyle
|
|
18
18
|
// @grant unsafeWindow
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
|
-
// @name ThisVid.com
|
|
2
|
+
// @name ThisVid.com PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 8.0.
|
|
4
|
+
// @version 8.0.13
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional]. Preview for private videos. Filter by Title, Duration, Quality and Public/Private. Sort by Duration and Views. Private/Public feed of friends uploads. Check access to private vids. Mass friend request button. Sorts messages. Download button 📼
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.thisvid.com/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addStyle
|
|
17
17
|
// @grant unsafeWindow
|
|
@@ -898,9 +898,35 @@ function takeWhile(predicate) {
|
|
|
898
898
|
const IS_MEMBER_FRIEND = IS_OTHER_MEMBER_PAGE && document.querySelector(".case-left")?.innerText.includes(
|
|
899
899
|
"is in your friends"
|
|
900
900
|
);
|
|
901
|
+
function fixContainersDuplication() {
|
|
902
|
+
const containers = document.querySelectorAll(
|
|
903
|
+
"div:has(> .tumbpu[title]):not(.thumbs-photo), div:has(> .thumb-holder)"
|
|
904
|
+
);
|
|
905
|
+
if (containers.length < 2 || utils.getCommonParents(containers).length > 1) return;
|
|
906
|
+
const mainContainer = containers.values().find((e) => e.id);
|
|
907
|
+
const badContainers = containers.values().filter((e) => !e.id);
|
|
908
|
+
badContainers.forEach((e) => {
|
|
909
|
+
mainContainer?.append(...e.children);
|
|
910
|
+
mainContainer && e.remove();
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
fixContainersDuplication();
|
|
901
914
|
function fixPlaylistThumbUrl(src) {
|
|
902
915
|
return src.replace(/playlist\/\d+\/video/, () => "videos");
|
|
903
916
|
}
|
|
917
|
+
function getImgData(thumb) {
|
|
918
|
+
const img = thumb.querySelector("img");
|
|
919
|
+
const privateThumb = thumb.querySelector(".private");
|
|
920
|
+
let imgSrc = img?.getAttribute("data-original");
|
|
921
|
+
if (privateThumb) {
|
|
922
|
+
imgSrc = utils.parseCssUrl(privateThumb.style.background);
|
|
923
|
+
privateThumb.removeAttribute("style");
|
|
924
|
+
}
|
|
925
|
+
img.removeAttribute("data-original");
|
|
926
|
+
img.removeAttribute("data-cnt");
|
|
927
|
+
img.classList.remove("lazy-load");
|
|
928
|
+
return { img, imgSrc };
|
|
929
|
+
}
|
|
904
930
|
const defaultRulesConfig = {
|
|
905
931
|
thumbs: {
|
|
906
932
|
selector: "div:has(> .tumbpu[title]):not(.thumbs-photo) > .tumbpu[title], .thumb-holder"
|
|
@@ -914,25 +940,8 @@ function takeWhile(predicate) {
|
|
|
914
940
|
views: { selector: ".view", type: "number" }
|
|
915
941
|
}
|
|
916
942
|
},
|
|
917
|
-
thumbImg: {
|
|
918
|
-
|
|
919
|
-
const img = thumb.querySelector("img");
|
|
920
|
-
const privateThumb = thumb.querySelector(".private");
|
|
921
|
-
let imgSrc = img?.getAttribute("data-original");
|
|
922
|
-
if (privateThumb) {
|
|
923
|
-
imgSrc = utils.parseCssUrl(privateThumb.style.background);
|
|
924
|
-
privateThumb.removeAttribute("style");
|
|
925
|
-
}
|
|
926
|
-
img.removeAttribute("data-original");
|
|
927
|
-
img.removeAttribute("data-cnt");
|
|
928
|
-
img.classList.remove("lazy-load");
|
|
929
|
-
return { img, imgSrc };
|
|
930
|
-
}
|
|
931
|
-
},
|
|
932
|
-
containerSelector: () => utils.querySelectorLast(
|
|
933
|
-
document,
|
|
934
|
-
"div:has(> .tumbpu[title]):not(.thumbs-photo), div:has(> .thumb-holder)"
|
|
935
|
-
) || document.querySelector(".thumbs-items"),
|
|
943
|
+
thumbImg: { getImgData },
|
|
944
|
+
containerSelectorLast: "div:has(> .tumbpu[title]):not(.thumbs-photo), div:has(> .thumb-holder), .thumbs-items",
|
|
936
945
|
animatePreview,
|
|
937
946
|
schemeOptions: [
|
|
938
947
|
"Title Filter",
|
|
@@ -946,11 +955,7 @@ function takeWhile(predicate) {
|
|
|
946
955
|
content: [{ autoRequestAccess: false, label: "check access sends friend requests" }]
|
|
947
956
|
}
|
|
948
957
|
],
|
|
949
|
-
gropeStrategy:
|
|
950
|
-
...document.querySelectorAll(
|
|
951
|
-
"div:has(> .tumbpu[title]):not(.thumbs-photo) > .tumbpu[title], .thumb-holder"
|
|
952
|
-
)
|
|
953
|
-
]).length < 2 ? "all-in-one" : "all-in-all"
|
|
958
|
+
gropeStrategy: "all-in-all"
|
|
954
959
|
};
|
|
955
960
|
const config = IS_MY_MEMBER_PAGE || IS_MY_WALL ? await( createPrivateFeed()) : defaultRulesConfig;
|
|
956
961
|
const rules = new core.Rules(config);
|
|
@@ -1271,6 +1276,7 @@ function takeWhile(predicate) {
|
|
|
1271
1276
|
const hideMemberVideos = (e, ignore = true) => {
|
|
1272
1277
|
const container2 = e.target?.closest("div");
|
|
1273
1278
|
let id = container2.id;
|
|
1279
|
+
feedGenerator.skip(1);
|
|
1274
1280
|
const videosCount = utils.querySelectorLastNumber(`#${id}`);
|
|
1275
1281
|
document.querySelectorAll(`#${id}~a`).values().take(videosCount).forEach((e2) => {
|
|
1276
1282
|
e2.remove();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
|
-
// @name Xhamster
|
|
2
|
+
// @name Xhamster PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 5.0.
|
|
4
|
+
// @version 5.0.14
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title, Duration and Watched/Unwatched. Sort by Duration and Views
|
|
7
7
|
// @license MIT
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// @match https://*.xhamster.com/*
|
|
14
14
|
// @match https://*.xhamster.*/*
|
|
15
15
|
// @exclude https://*.xhamster.com/embed*
|
|
16
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
16
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
17
17
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
18
18
|
// @grant GM_addElement
|
|
19
19
|
// @grant GM_addStyle
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
|
-
// @name XVideos
|
|
2
|
+
// @name XVideos PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 4.0.
|
|
4
|
+
// @version 4.0.14
|
|
5
5
|
// @author violent-orangutan
|
|
6
6
|
// @description Infinite scroll [optional], Filter by Title, Uploader and Duration. Sort by Duration and Views.
|
|
7
7
|
// @license MIT
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// @source github:smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
13
|
// @match https://*.xvideos.com/*
|
|
14
|
-
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.19/dist/core/pervertmonkey.core.umd.js
|
|
15
15
|
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
16
|
// @grant GM_addStyle
|
|
17
17
|
// @grant unsafeWindow
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pervert-monkey",
|
|
3
3
|
"description": "daddy told us not to be ashamed of our userscripts",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.19",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"userscript",
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
"scripts": {
|
|
37
37
|
"dev": "vite",
|
|
38
38
|
"build": "tsc && vite build",
|
|
39
|
-
"build:
|
|
40
|
-
"build:
|
|
41
|
-
"build:
|
|
39
|
+
"build:test": "node ./build/vite.build.test.ts",
|
|
40
|
+
"build:u": "node ./build/vite.build.userscripts.ts",
|
|
41
|
+
"build:uinc": "npm run build:u -- --inc"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "^25.2.3",
|
|
@@ -9,7 +9,7 @@ import { defaultDataFilterFns } from './data-filter-fn-defaults';
|
|
|
9
9
|
|
|
10
10
|
export class DataFilter {
|
|
11
11
|
public filters = new Map<string, () => DataFilterFnRendered>();
|
|
12
|
-
public
|
|
12
|
+
public filterDepsMapping: Record<string, string> = {};
|
|
13
13
|
|
|
14
14
|
constructor(private rules: Rules) {
|
|
15
15
|
this.registerFilters(rules.customDataFilterFns);
|
|
@@ -51,7 +51,7 @@ export class DataFilter {
|
|
|
51
51
|
dataFilterFn.deps.push(customSelectorName);
|
|
52
52
|
|
|
53
53
|
dataFilterFn.deps.forEach((name) => {
|
|
54
|
-
Object.assign(this.
|
|
54
|
+
Object.assign(this.filterDepsMapping, { [name]: customSelectorName });
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
this.filters.set(customSelectorName, dataFilterFn.renderFn(this.rules.store.state));
|
|
@@ -59,8 +59,8 @@ export class DataFilter {
|
|
|
59
59
|
|
|
60
60
|
public selectFilters(filters: { [key: string]: boolean }) {
|
|
61
61
|
const selectedFilters = Object.keys(filters)
|
|
62
|
-
.filter((k) => k in this.
|
|
63
|
-
.map((k) => this.
|
|
62
|
+
.filter((k) => k in this.filterDepsMapping)
|
|
63
|
+
.map((k) => this.filterDepsMapping[k])
|
|
64
64
|
.map((k) => this.filters.get(k) as () => DataFilterFnRendered);
|
|
65
65
|
return selectedFilters;
|
|
66
66
|
}
|
|
@@ -10,7 +10,6 @@ export type OffsetGenerator<T = GeneratorResult> = Generator<T> | AsyncGenerator
|
|
|
10
10
|
type IScrollerSubject = { type: 'scroll'; scroller: InfiniteScroller; page: HTMLElement };
|
|
11
11
|
|
|
12
12
|
export class InfiniteScroller {
|
|
13
|
-
public enabled = true;
|
|
14
13
|
public paginationOffset = 1;
|
|
15
14
|
public rules: Rules;
|
|
16
15
|
|
|
@@ -69,7 +68,7 @@ export class InfiniteScroller {
|
|
|
69
68
|
}
|
|
70
69
|
|
|
71
70
|
generatorConsumer = async () => {
|
|
72
|
-
if (!this.
|
|
71
|
+
if (!this.rules.store.state.infiniteScrollEnabled) return true;
|
|
73
72
|
|
|
74
73
|
const { value, done } = await this.paginationGenerator.next();
|
|
75
74
|
if (done) return false;
|
|
@@ -106,11 +105,9 @@ export class InfiniteScroller {
|
|
|
106
105
|
}
|
|
107
106
|
|
|
108
107
|
static create(rules: Rules) {
|
|
109
|
-
const enabled = rules.store.state.infiniteScrollEnabled as boolean;
|
|
110
|
-
|
|
111
108
|
rules.store.state.$paginationLast = rules.paginationStrategy.getPaginationLast();
|
|
112
109
|
|
|
113
|
-
const infiniteScroller = new InfiniteScroller({
|
|
110
|
+
const infiniteScroller = new InfiniteScroller({ rules });
|
|
114
111
|
|
|
115
112
|
rules.store.state.$paginationOffset = infiniteScroller.paginationOffset;
|
|
116
113
|
|
|
@@ -125,10 +122,6 @@ export class InfiniteScroller {
|
|
|
125
122
|
}
|
|
126
123
|
});
|
|
127
124
|
|
|
128
|
-
rules.store.stateSubject.subscribe(() => {
|
|
129
|
-
infiniteScroller.enabled = rules.store.state.infiniteScrollEnabled as boolean;
|
|
130
|
-
});
|
|
131
|
-
|
|
132
125
|
return infiniteScroller;
|
|
133
126
|
}
|
|
134
127
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
parseNumericAbbreviation,
|
|
3
3
|
querySelectorLast,
|
|
4
|
+
querySelectorOrSelf,
|
|
4
5
|
querySelectorText,
|
|
5
6
|
sanitizeStr,
|
|
6
7
|
timeToSeconds,
|
|
@@ -71,7 +72,7 @@ export class ThumbDataParser {
|
|
|
71
72
|
{ type, selector }: ThumbDataSelector,
|
|
72
73
|
): Primitive {
|
|
73
74
|
if (type === 'boolean') {
|
|
74
|
-
return !!thumb
|
|
75
|
+
return !!querySelectorOrSelf(thumb, selector);
|
|
75
76
|
}
|
|
76
77
|
if (type === 'string') {
|
|
77
78
|
return sanitizeStr(querySelectorLast(thumb, selector)?.innerText || '');
|
|
@@ -81,7 +82,7 @@ export class ThumbDataParser {
|
|
|
81
82
|
}
|
|
82
83
|
if (type === 'float') {
|
|
83
84
|
const value = querySelectorText(thumb, selector);
|
|
84
|
-
return
|
|
85
|
+
return parseNumericAbbreviation(value);
|
|
85
86
|
}
|
|
86
87
|
return Number.parseInt(querySelectorText(thumb, selector));
|
|
87
88
|
}
|
|
@@ -3,22 +3,21 @@ export class ThumbsParser {
|
|
|
3
3
|
public strategy: 'default' | 'auto' = 'default';
|
|
4
4
|
public transform?: (thumb: HTMLElement) => void;
|
|
5
5
|
|
|
6
|
-
public static create(
|
|
7
|
-
|
|
6
|
+
public static create(
|
|
7
|
+
options: Partial<Pick<ThumbsParser, 'selector' | 'strategy' | 'transform'>> = {},
|
|
8
|
+
) {
|
|
9
|
+
return Object.assign(new ThumbsParser(), options);
|
|
8
10
|
}
|
|
9
|
-
constructor(public containerSelector: string) { }
|
|
10
11
|
|
|
11
|
-
public getThumbs(
|
|
12
|
-
if (!
|
|
13
|
-
let thumbs: HTMLElement[];
|
|
12
|
+
public getThumbs(container: HTMLElement): HTMLElement[] {
|
|
13
|
+
if (!container) return [];
|
|
14
14
|
|
|
15
15
|
if (this.strategy === 'auto') {
|
|
16
16
|
if (typeof this.selector !== 'string') return [];
|
|
17
|
-
|
|
18
|
-
thumbs = [...(container?.children || [])] as HTMLElement[];
|
|
17
|
+
return [...(container?.children || [])] as HTMLElement[];
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
thumbs = Array.from(
|
|
20
|
+
const thumbs = Array.from(container.querySelectorAll<HTMLElement>(this.selector));
|
|
22
21
|
|
|
23
22
|
if (typeof this.transform === 'function') {
|
|
24
23
|
thumbs.forEach(this.transform);
|
|
@@ -26,4 +25,4 @@ export class ThumbsParser {
|
|
|
26
25
|
|
|
27
26
|
return thumbs;
|
|
28
27
|
}
|
|
29
|
-
}
|
|
28
|
+
}
|
package/src/core/rules/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { JabronioGUI, JabronioStore, type JabroniTypes, setupScheme } from 'jabr
|
|
|
2
2
|
import {
|
|
3
3
|
getCommonParents,
|
|
4
4
|
querySelectorLast,
|
|
5
|
+
querySelectorOrSelf,
|
|
5
6
|
waitForElementToDisappear,
|
|
6
7
|
} from '../../utils';
|
|
7
8
|
import { DataManager } from '../data-handler';
|
|
@@ -37,10 +38,10 @@ export class Rules {
|
|
|
37
38
|
|
|
38
39
|
get container() {
|
|
39
40
|
if (typeof this.containerSelectorLast === 'string') {
|
|
40
|
-
return querySelectorLast(document, this.containerSelectorLast) as HTMLElement;
|
|
41
|
+
return querySelectorLast(document.body, this.containerSelectorLast) as HTMLElement;
|
|
41
42
|
}
|
|
42
43
|
if (typeof this.containerSelector === 'string') {
|
|
43
|
-
return document.
|
|
44
|
+
return querySelectorOrSelf(document.body, this.containerSelector) as HTMLElement;
|
|
44
45
|
}
|
|
45
46
|
return this.containerSelector();
|
|
46
47
|
}
|
|
@@ -48,10 +49,8 @@ export class Rules {
|
|
|
48
49
|
public intersectionObservableSelector?: string;
|
|
49
50
|
|
|
50
51
|
public get intersectionObservable() {
|
|
51
|
-
return
|
|
52
|
-
|
|
53
|
-
document.querySelector(this.intersectionObservableSelector)
|
|
54
|
-
);
|
|
52
|
+
if (!this.intersectionObservableSelector) return undefined;
|
|
53
|
+
return document.querySelector<HTMLElement>(this.intersectionObservableSelector);
|
|
55
54
|
}
|
|
56
55
|
|
|
57
56
|
public get observable(): HTMLElement {
|
|
@@ -179,7 +178,7 @@ export class Rules {
|
|
|
179
178
|
|
|
180
179
|
this.thumbDataParser = ThumbDataParser.create(this.thumb);
|
|
181
180
|
this.thumbImgParser = ThumbImgParser.create(this.thumbImg);
|
|
182
|
-
this.thumbsParser = ThumbsParser.create(this.thumbs
|
|
181
|
+
this.thumbsParser = ThumbsParser.create(this.thumbs);
|
|
183
182
|
|
|
184
183
|
this.paginationStrategy = getPaginationStrategy(this.paginationStrategyOptions);
|
|
185
184
|
|