pervert-monkey 1.0.17 → 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.
Files changed (56) hide show
  1. package/dist/core/pervertmonkey.core.es.d.ts +22 -19
  2. package/dist/core/pervertmonkey.core.es.js +148 -159
  3. package/dist/core/pervertmonkey.core.es.js.map +1 -1
  4. package/dist/core/pervertmonkey.core.umd.js +148 -159
  5. package/dist/core/pervertmonkey.core.umd.js.map +1 -1
  6. package/dist/test/test.user.js +10301 -0
  7. package/dist/userscripts/3hentai.user.js +2 -2
  8. package/dist/userscripts/camgirlfinder.user.js +2 -2
  9. package/dist/userscripts/camwhores.user.js +4 -5
  10. package/dist/userscripts/e-hentai.user.js +2 -2
  11. package/dist/userscripts/ebalka.user.js +7 -3
  12. package/dist/userscripts/eporner.user.js +2 -2
  13. package/dist/userscripts/erome.user.js +2 -2
  14. package/dist/userscripts/eroprofile.user.js +2 -2
  15. package/dist/userscripts/javhdporn.user.js +2 -2
  16. package/dist/userscripts/missav.user.js +3 -8
  17. package/dist/userscripts/motherless.user.js +2 -2
  18. package/dist/userscripts/namethatporn.user.js +2 -2
  19. package/dist/userscripts/nhentai.user.js +2 -2
  20. package/dist/userscripts/obmenvsem.user.js +3 -3
  21. package/dist/userscripts/pornhub.user.js +2 -2
  22. package/dist/userscripts/spankbang.user.js +3 -4
  23. package/dist/userscripts/thisvid.user.js +35 -30
  24. package/dist/userscripts/xhamster.user.js +3 -3
  25. package/dist/userscripts/xvideos.user.js +3 -3
  26. package/package.json +4 -4
  27. package/src/core/data-handler/data-filter.ts +4 -4
  28. package/src/core/data-handler/data-manager.ts +47 -115
  29. package/src/core/infinite-scroll/index.ts +8 -13
  30. package/src/core/parsers/thumb-data-parser.ts +4 -3
  31. package/src/core/parsers/thumbs-parser.ts +9 -10
  32. package/src/core/rules/index.ts +6 -7
  33. package/src/userscripts/index.ts +1 -1
  34. package/src/userscripts/scripts/3hentai.ts +1 -1
  35. package/src/userscripts/scripts/camgirlfinder.ts +1 -1
  36. package/src/userscripts/scripts/camwhores.ts +3 -4
  37. package/src/userscripts/scripts/e-hentai.ts +1 -1
  38. package/src/userscripts/scripts/ebalka.ts +10 -3
  39. package/src/userscripts/scripts/eporner.ts +1 -1
  40. package/src/userscripts/scripts/erome.ts +1 -1
  41. package/src/userscripts/scripts/eroprofile.ts +1 -1
  42. package/src/userscripts/scripts/javhdporn.ts +1 -1
  43. package/src/userscripts/scripts/missav.ts +2 -7
  44. package/src/userscripts/scripts/motherless.ts +1 -1
  45. package/src/userscripts/scripts/namethatporn.ts +1 -1
  46. package/src/userscripts/scripts/nhentai.ts +1 -2
  47. package/src/userscripts/scripts/obmenvsem.ts +2 -2
  48. package/src/userscripts/scripts/pornhub.ts +1 -1
  49. package/src/userscripts/scripts/spankbang.ts +1 -3
  50. package/src/userscripts/scripts/thisvid.ts +46 -38
  51. package/src/userscripts/scripts/xhamster.ts +2 -2
  52. package/src/userscripts/scripts/xvideos.ts +2 -2
  53. package/src/utils/dom/index.ts +23 -16
  54. package/src/utils/index.ts +4 -22
  55. package/src/utils/parsers/index.ts +1 -1
  56. package/src/utils/performance/index.ts +44 -0
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name 3Hentai PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 1.0.7
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.17/dist/core/pervertmonkey.core.umd.js
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.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.17/dist/core/pervertmonkey.core.umd.js
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.10
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.17/dist/core/pervertmonkey.core.umd.js
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
@@ -163,9 +163,8 @@
163
163
  }
164
164
  const createDownloadButton = () => utils.downloader({
165
165
  append: ".tabs-menu > ul",
166
- after: "",
167
- button: '<li><a href="#tab_comments" class="toggle-button" style="text-decoration: none;">download 📼</a></li>',
168
- cbBefore: () => $(".fp-ui").click()
166
+ buttonHtml: '<li><a href="#tab_comments" class="toggle-button" style="text-decoration: none;">download 📼</a></li>',
167
+ doBefore: () => $(".fp-ui").click()
169
168
  });
170
169
  const DEFAULT_FRIEND_REQUEST_FORMDATA = utils.objectToFormData({
171
170
  message: "",
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name E-Hentai PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 1.0.7
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.17/dist/core/pervertmonkey.core.umd.js
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,9 +1,9 @@
1
1
  // ==UserScript==
2
2
  // @name Ebalka PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 3.0.7
4
+ // @version 3.0.12
5
5
  // @author violent-orangutan
6
- // @description Infinite scroll [optional], Filter by Title and Duration, Sort by Duration
6
+ // @description Infinite scroll [optional], Filter by Title and Duration, Sort by Duration, Download button.
7
7
  // @license MIT
8
8
  // @icon https://www.google.com/s2/favicons?sz=64&domain=ebalka.zip
9
9
  // @homepage https://github.com/smartacephale/sleazy-fork
@@ -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.17/dist/core/pervertmonkey.core.umd.js
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
@@ -68,5 +68,9 @@
68
68
  return animateThumb(thumb);
69
69
  });
70
70
  }
71
+ document.querySelector(".tooltip-container") && utils.downloader({
72
+ append: ".tooltip-container",
73
+ buttonHtml: '<a class="button button_regular button_list root__link">Download ⤓</a>'
74
+ });
71
75
 
72
76
  })(core, utils);
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name Eporner PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 2.0.9
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.17/dist/core/pervertmonkey.core.umd.js
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.8
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.17/dist/core/pervertmonkey.core.umd.js
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.7
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.17/dist/core/pervertmonkey.core.umd.js
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.7
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.17/dist/core/pervertmonkey.core.umd.js
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.7
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.17/dist/core/pervertmonkey.core.umd.js
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
@@ -31,12 +31,7 @@
31
31
  },
32
32
  containerSelector: ".grid[x-data]",
33
33
  thumbs: { selector: "div:has(> .thumbnail.group)" },
34
- thumb: {
35
- selectors: {
36
- title: "div > div > a.text-secondary",
37
- duration: "div > a > span.text-xs"
38
- }
39
- },
34
+ thumb: { strategy: "auto-text" },
40
35
  thumbImg: { strategy: "auto" },
41
36
  schemeOptions: [
42
37
  "Title Filter",
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name Motherless PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 5.0.8
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.17/dist/core/pervertmonkey.core.umd.js
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.7
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.17/dist/core/pervertmonkey.core.umd.js
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.7
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.17/dist/core/pervertmonkey.core.umd.js
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 Obmensvem PervertMonkey
2
+ // @name Obmenvsem PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 1.0.8
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.17/dist/core/pervertmonkey.core.umd.js
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.7
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.17/dist/core/pervertmonkey.core.umd.js
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.7
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.17/dist/core/pervertmonkey.core.umd.js
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
@@ -22,7 +22,7 @@
22
22
  (function (core) {
23
23
  'use strict';
24
24
 
25
- const rules = new core.Rules({
25
+ new core.Rules({
26
26
  containerSelector: ".main-container .js-media-list, .main_content_container .video-list",
27
27
  paginationStrategyOptions: {
28
28
  paginationSelector: ".paginate-bar, .pagination"
@@ -59,6 +59,5 @@ views: { selector: '[data-testid="views"]', type: "float" },
59
59
  "Advanced"
60
60
  ]
61
61
  });
62
- console.log(rules.dataManager.data.values().toArray());
63
62
 
64
63
  })(core);
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
- // @name ThisVid.com Improved
2
+ // @name ThisVid.com PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 8.0.7
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.17/dist/core/pervertmonkey.core.umd.js
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
- getImgData(thumb) {
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: utils.getCommonParents([
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);
@@ -1124,10 +1129,9 @@ function takeWhile(predicate) {
1124
1129
  }
1125
1130
  }
1126
1131
  const createDownloadButton = () => utils.downloader({
1127
- append: "",
1128
1132
  after: ".share_btn",
1129
- button: '<li><a href="#" style="text-decoration: none;font-size: 2rem;">📼</a></li>',
1130
- cbBefore: () => $(".fp-ui").click()
1133
+ buttonHtml: '<li><a href="#" style="text-decoration: none;font-size: 2rem;">📼</a></li>',
1134
+ doBefore: () => $(".fp-ui").click()
1131
1135
  });
1132
1136
  function animatePreview(_) {
1133
1137
  const tick = new utils.Tick(750);
@@ -1272,6 +1276,7 @@ function takeWhile(predicate) {
1272
1276
  const hideMemberVideos = (e, ignore = true) => {
1273
1277
  const container2 = e.target?.closest("div");
1274
1278
  let id = container2.id;
1279
+ feedGenerator.skip(1);
1275
1280
  const videosCount = utils.querySelectorLastNumber(`#${id}`);
1276
1281
  document.querySelectorAll(`#${id}~a`).values().take(videosCount).forEach((e2) => {
1277
1282
  e2.remove();
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
- // @name Xhamster Improved
2
+ // @name Xhamster PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 5.0.8
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.17/dist/core/pervertmonkey.core.umd.js
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 Improved
2
+ // @name XVideos PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 4.0.8
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.17/dist/core/pervertmonkey.core.umd.js
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.17",
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:userscripts": "node vite.build.userscripts.ts",
40
- "build:test": "node vite.build.test.ts",
41
- "build:inc": "node vite.build.version.inc.ts"
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 filterMapping: Record<string, string> = {};
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.filterMapping, { [name]: customSelectorName });
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.filterMapping)
63
- .map((k) => this.filterMapping[k])
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
  }