pervert-monkey 1.0.11 → 1.0.13

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 (55) hide show
  1. package/README.md +22 -11
  2. package/dist/core/pervertmonkey.core.es.d.ts +25 -16
  3. package/dist/core/pervertmonkey.core.es.js +712 -61
  4. package/dist/core/pervertmonkey.core.es.js.map +1 -1
  5. package/dist/core/pervertmonkey.core.umd.js +712 -61
  6. package/dist/core/pervertmonkey.core.umd.js.map +1 -1
  7. package/dist/userscripts/3hentai.user.js +19 -26
  8. package/dist/userscripts/camgirlfinder.user.js +2 -2
  9. package/dist/userscripts/camwhores.user.js +12 -16
  10. package/dist/userscripts/e-hentai.user.js +3 -4
  11. package/dist/userscripts/ebalka.user.js +6 -11
  12. package/dist/userscripts/eporner.user.js +11 -16
  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 +2 -2
  17. package/dist/userscripts/motherless.user.js +22 -42
  18. package/dist/userscripts/namethatporn.user.js +5 -4
  19. package/dist/userscripts/nhentai.user.js +3 -3
  20. package/dist/userscripts/obmenvsem.user.js +18 -4
  21. package/dist/userscripts/pornhub.user.js +9 -12
  22. package/dist/userscripts/spankbang.user.js +6 -38
  23. package/dist/userscripts/thisvid.user.js +20 -22
  24. package/dist/userscripts/xhamster.user.js +13 -16
  25. package/dist/userscripts/xvideos.user.js +7 -12
  26. package/package.json +1 -1
  27. package/src/core/data-handler/data-manager.ts +4 -4
  28. package/src/core/jabroni-config/index.ts +3 -2
  29. package/src/core/jabroni-config/jabroni-gui-controller.ts +61 -0
  30. package/src/core/parsers/thumb-data-parser.ts +10 -1
  31. package/src/core/rules/index.ts +12 -39
  32. package/src/userscripts/index.ts +1 -1
  33. package/src/userscripts/scripts/3hentai.ts +20 -24
  34. package/src/userscripts/scripts/camgirlfinder.ts +1 -1
  35. package/src/userscripts/scripts/camwhores.ts +10 -17
  36. package/src/userscripts/scripts/e-hentai.ts +1 -1
  37. package/src/userscripts/scripts/ebalka.ts +7 -12
  38. package/src/userscripts/scripts/eporner.ts +8 -14
  39. package/src/userscripts/scripts/erome.ts +1 -1
  40. package/src/userscripts/scripts/eroprofile.ts +3 -3
  41. package/src/userscripts/scripts/javhdporn.ts +1 -1
  42. package/src/userscripts/scripts/missav.ts +1 -1
  43. package/src/userscripts/scripts/motherless.ts +19 -48
  44. package/src/userscripts/scripts/namethatporn.ts +1 -1
  45. package/src/userscripts/scripts/nhentai.ts +1 -1
  46. package/src/userscripts/scripts/obmenvsem.ts +1 -1
  47. package/src/userscripts/scripts/pornhub.ts +1 -1
  48. package/src/userscripts/scripts/spankbang.ts +1 -1
  49. package/src/userscripts/scripts/thisvid.ts +18 -19
  50. package/src/userscripts/scripts/xhamster.ts +10 -11
  51. package/src/userscripts/scripts/xvideos.ts +6 -11
  52. package/src/utils/dom/index.ts +10 -0
  53. package/src/utils/events/on-hover.ts +17 -25
  54. package/src/utils/events/tick.ts +1 -3
  55. package/src/utils/parsers/index.ts +16 -0
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name 3Hentai PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 1.0.2
4
+ // @version 1.0.4
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://*.3hentai.net/*
14
- // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.10/dist/core/pervertmonkey.core.umd.js
14
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -41,32 +41,25 @@
41
41
  });
42
42
  function animatePreview() {
43
43
  const tick = new utils.Tick(500, false);
44
- const end = 999;
44
+ const end = 9999;
45
45
  function rotate(src) {
46
- return src.replace(
47
- /(\d+)(?=t\.jpg$)/,
48
- (_, n) => `${utils.circularShift(parseInt(n), end)}`
49
- );
46
+ return src.replace(/(\d+)(?=t\.jpg$)/, (_, n) => `${utils.circularShift(parseInt(n), end)}`);
50
47
  }
51
- utils.OnHover.create(
52
- document.body,
53
- (e) => e instanceof HTMLImageElement && e.src.endsWith(".jpg"),
54
- (e) => {
55
- const t = e;
56
- const origin = t.src;
57
- t.src = t.src.replace(/\w+\.\w+$/, "1t.jpg");
58
- t.onerror = (_) => tick.stop();
59
- tick.start(
60
- () => {
61
- t.src = rotate(t.src);
62
- },
63
- () => {
64
- t.src = origin;
65
- }
66
- );
67
- },
68
- (_) => tick.stop()
69
- );
48
+ utils.OnHover.create(document.body, ".doujin-col", (e) => {
49
+ const img = e.querySelector("img");
50
+ const origin = img.src;
51
+ img.src = img.src.replace(/\w+\.\w+$/, "1t.jpg");
52
+ img.onerror = (_) => tick.stop();
53
+ tick.start(
54
+ () => {
55
+ img.src = rotate(img.src);
56
+ },
57
+ () => {
58
+ img.src = origin;
59
+ }
60
+ );
61
+ return () => tick.stop();
62
+ });
70
63
  }
71
64
 
72
65
  })(core, utils);
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name CamGirlFinder PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 1.6.0
4
+ // @version 1.6.2
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.10/dist/core/pervertmonkey.core.umd.js
14
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
4
+ // @version 3.0.6
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional]. Filter by Title, Duration and Private/Public. 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.10/dist/core/pervertmonkey.core.umd.js
16
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -107,8 +107,7 @@
107
107
  }
108
108
  },
109
109
  thumbImg: {
110
- selector: "data-original",
111
- strategy: "auto"
110
+ selector: "data-original"
112
111
  },
113
112
  gropeStrategy: "all-in-all",
114
113
  customDataSelectorFns: [
@@ -154,24 +153,21 @@
154
153
  }
155
154
  utils.OnHover.create(
156
155
  container,
157
- (target) => target.tagName === "IMG" && target.classList.contains("thumb") && !!target.getAttribute("src") && !/data:image|avatar/.test(target.getAttribute("src")),
158
- (_target) => {
159
- const target = _target;
160
- const origin = target.src;
161
- const count = parseInt(target.getAttribute("data-cnt")) || 5;
156
+ ".list-videos .item, .playlist .item, .list-playlists > div > .item, .item:has(.title)",
157
+ (e) => {
158
+ const img = e.querySelector("img");
159
+ const origin = img.src;
160
+ const count = parseInt(img.getAttribute("data-cnt")) || 5;
162
161
  tick.start(
163
162
  () => {
164
- target.src = rotateImg(target.src, count);
163
+ img.src = rotateImg(img.src, count);
165
164
  },
166
165
  () => {
167
- target.src = origin;
166
+ img.src = origin;
168
167
  }
169
168
  );
170
- return {
171
- leaveTarget: target.closest(".item")
172
- };
173
- },
174
- () => tick.stop()
169
+ return () => tick.stop();
170
+ }
175
171
  );
176
172
  }
177
173
  const createDownloadButton = () => utils.downloader({
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name E-Hentai PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 1.0.0
4
+ // @version 1.0.2
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.10/dist/core/pervertmonkey.core.umd.js
14
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -29,8 +29,7 @@
29
29
  }
30
30
  },
31
31
  thumbImg: {
32
- selector: "data-lazy-load",
33
- strategy: "auto"
32
+ selector: "data-lazy-load"
34
33
  },
35
34
  containerSelectorLast: ".itg.gld",
36
35
  paginationStrategyOptions: createPaginationStrategyOptions(),
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name Ebalka PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 3.0.1
4
+ // @version 3.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and Duration
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.10/dist/core/pervertmonkey.core.umd.js
18
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -55,15 +55,10 @@
55
55
  utils.exterminateVideo(videoElem);
56
56
  };
57
57
  }
58
- utils.OnHover.create(
59
- container,
60
- (target) => target.tagName === "IMG",
61
- (target) => {
62
- const thumb = target.closest(".card");
63
- const onOverCallback = animateThumb(thumb);
64
- return { leaveTarget: thumb, onOverCallback };
65
- }
66
- );
58
+ utils.OnHover.create(container, ".card_video", (target) => {
59
+ const thumb = target.closest(".card");
60
+ return animateThumb(thumb);
61
+ });
67
62
  }
68
63
 
69
64
  })(core, utils);
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name Eporner PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 2.0.2
4
+ // @version 2.0.4
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title, Duration and HD
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.10/dist/core/pervertmonkey.core.umd.js
15
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -29,6 +29,7 @@
29
29
  paginationStrategyOptions: {
30
30
  paginationSelector: ".numlist2"
31
31
  },
32
+ thumbs: { selector: "div[id^=vf][data-id]" },
32
33
  thumb: {
33
34
  selectors: {
34
35
  quality: { type: "number", selector: '[title="Quality"]' },
@@ -38,10 +39,8 @@
38
39
  }
39
40
  },
40
41
  thumbImg: {
41
- strategy: "auto"
42
- },
43
- thumbs: {
44
- selector: "div[id^=vf][data-id]"
42
+ strategy: "auto",
43
+ remove: "auto"
45
44
  },
46
45
  containerSelectorLast: "#vidresults",
47
46
  customDataSelectorFns: [
@@ -93,16 +92,12 @@
93
92
  animatePreview
94
93
  });
95
94
  function animatePreview(doc) {
96
- utils.OnHover.create(
97
- doc,
98
- (e) => e instanceof HTMLImageElement,
99
- (e) => {
100
- const target = e;
101
- const thumb = target.closest("[data-id]");
102
- const id = thumb?.getAttribute("data-id");
103
- show_video_prev(id);
104
- }
105
- );
95
+ utils.OnHover.create(doc, "div[id^=vf][data-id]", (e) => {
96
+ const target = e;
97
+ const thumb = target.closest("[data-id]");
98
+ const id = thumb?.getAttribute("data-id");
99
+ show_video_prev(id);
100
+ });
106
101
  }
107
102
 
108
103
  })(core, utils);
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name Erome PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 5.0.1
4
+ // @version 5.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and Video/Photo albums
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.10/dist/core/pervertmonkey.core.umd.js
14
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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.1
4
+ // @version 2.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and 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.10/dist/core/pervertmonkey.core.umd.js
14
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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.1
4
+ // @version 3.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and Duration
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.10/dist/core/pervertmonkey.core.umd.js
15
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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.1
4
+ // @version 3.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and 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.10/dist/core/pervertmonkey.core.umd.js
18
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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.2
4
+ // @version 5.0.4
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and 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://motherless.com/*
14
- // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.10/dist/core/pervertmonkey.core.umd.js
14
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -35,7 +35,8 @@
35
35
  selectors: {
36
36
  uploader: ".uploader",
37
37
  title: ".title",
38
- duration: ".size"
38
+ duration: ".size",
39
+ views: { selector: ".hits", type: "float" }
39
40
  }
40
41
  },
41
42
  thumbImg: { strategy: "auto" },
@@ -44,26 +45,16 @@
44
45
  },
45
46
  animatePreview,
46
47
  gropeStrategy: "all-in-all",
47
- schemeOptions: ["Text Filter", "Duration Filter", "Badge", "Advanced"]
48
+ schemeOptions: ["Text Filter", "Sort By", "Duration Filter", "Badge", "Advanced"]
48
49
  });
49
50
  function animatePreview(_) {
50
- const ANIMATION_INTERVAL = 500;
51
- const tick = new utils.Tick(ANIMATION_INTERVAL);
52
- let currentOverlay = null;
53
- function onLeave(target) {
54
- tick.stop();
55
- const img = target.querySelector("img.static");
56
- img.classList.remove("animating");
57
- if (currentOverlay) {
58
- currentOverlay.style.display = "none";
59
- }
60
- }
51
+ const tick = new utils.Tick(500);
61
52
  function onOver(target) {
62
53
  $(".video").off();
63
- const container = target.closest(".desktop-thumb.video");
54
+ const container = target.querySelector(".desktop-thumb.video");
64
55
  const img = container.querySelector("img.static");
65
56
  const stripSrc = img.getAttribute("data-strip-src");
66
- img.classList.add("animating");
57
+ container.classList.toggle("animating");
67
58
  let overlay = img.nextElementSibling;
68
59
  if (!overlay || overlay.tagName !== "DIV") {
69
60
  overlay = document.createElement("div");
@@ -71,43 +62,32 @@
71
62
  "style",
72
63
  "z-index: 8; position: absolute; top: 0; left: 0; pointer-events: none;"
73
64
  );
74
- img.parentNode?.insertBefore(overlay, img.nextSibling);
65
+ img.after(overlay);
75
66
  }
76
- currentOverlay = overlay;
77
67
  overlay.style.display = "block";
78
68
  let j = 0;
79
- const containerHeight = container.offsetHeight;
69
+ const containerHeight = container.offsetHeight + 20;
70
+ const w = img.offsetWidth;
71
+ const h = img.offsetHeight;
72
+ const widthRatio = Math.floor(1000.303 * w / 100);
73
+ const heightRatio = Math.floor(228.6666 * h / 100);
74
+ const verticalOffset = (containerHeight - h) / 2;
80
75
  tick.start(() => {
81
- const w = img.offsetWidth;
82
- const h = img.offsetHeight;
83
- const widthRatio = Math.floor(1000.303 * w / 100);
84
- const heightRatio = Math.floor(228.6666 * h / 100);
85
- const verticalOffset = (containerHeight - h) / 2;
86
76
  Object.assign(overlay.style, {
87
77
  width: `${w}px`,
88
78
  height: `${containerHeight}px`,
89
79
  backgroundImage: `url('${stripSrc}')`,
90
80
  backgroundSize: `${widthRatio}px ${heightRatio}px`,
91
- backgroundPosition: `-${j++ * w % widthRatio}px ${verticalOffset}px`,
92
- backgroundRepeat: "no-repeat"
81
+ backgroundPosition: `-${j++ * w % widthRatio}px ${verticalOffset}px`
93
82
  });
94
83
  });
95
- const onOverCallback = () => onLeave(container);
96
- return { onOverCallback, leaveTarget: container };
84
+ return () => {
85
+ tick.stop();
86
+ container.classList.toggle("animating");
87
+ overlay.style.display = "none";
88
+ };
97
89
  }
98
- utils.OnHover.create(
99
- document.body,
100
- (e) => {
101
- const container = e.closest(".desktop-thumb.video");
102
- if (!container) return false;
103
- const img = container.querySelector("img.static");
104
- if (!img) return false;
105
- const stripSrc = img.getAttribute("data-strip-src");
106
- if (!stripSrc || img.classList.contains("animating")) return false;
107
- return true;
108
- },
109
- onOver
110
- );
90
+ utils.OnHover.create(document.body, ".thumb-container, .mobile-thumb", onOver);
111
91
  }
112
92
  function fixURLs() {
113
93
  document.querySelectorAll(".gallery-container").forEach((g) => {
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name NameThatPorn PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 3.0.1
4
+ // @version 3.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and Un/Solved
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.10/dist/core/pervertmonkey.core.umd.js
14
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -37,8 +37,9 @@
37
37
  }
38
38
  },
39
39
  thumbImg: {
40
- strategy: "auto",
41
- selector: (img) => img.getAttribute("data-dyn")?.concat(".webp") || img.getAttribute("src")
40
+ selector: (img) => {
41
+ return img.getAttribute("data-dyn")?.concat(".webp") || img.getAttribute("src");
42
+ }
42
43
  },
43
44
  paginationStrategyOptions: {
44
45
  paginationSelector: "#smi_wrp, #nsw_p"
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name NHentai PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 4.0.1
4
+ // @version 4.0.3
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.10/dist/core/pervertmonkey.core.umd.js
15
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -33,7 +33,7 @@
33
33
  },
34
34
  thumbImg: {
35
35
  strategy: "auto",
36
- shouldDelete: "auto"
36
+ remove: "auto"
37
37
  },
38
38
  containerSelectorLast: ".index-container, .container",
39
39
  customDataSelectorFns: ["filterInclude", "filterExclude"],
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name Obmensvem PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 1.0.1
4
+ // @version 1.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional], Filter by Title and Duration
7
7
  // @license MIT
@@ -12,8 +12,9 @@
12
12
  // @supportURL https://github.com/smartacephale/sleazy-fork/issues
13
13
  // @match https://*.obmenvsem.com/*
14
14
  // @match https://*.obmenvsem.*/*
15
- // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.10/dist/core/pervertmonkey.core.umd.js
15
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/dist/core/pervertmonkey.core.umd.js
16
16
  // @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
17
+ // @grant GM_addElement
17
18
  // @grant GM_addStyle
18
19
  // @grant unsafeWindow
19
20
  // @run-at document-idle
@@ -22,9 +23,11 @@
22
23
  (function (core, utils) {
23
24
  'use strict';
24
25
 
26
+ var _GM_addElement = (() => typeof GM_addElement != "undefined" ? GM_addElement : undefined)();
25
27
  var _GM_addStyle = (() => typeof GM_addStyle != "undefined" ? GM_addStyle : undefined)();
26
28
 
27
29
  const IS_USER_FILES = location.pathname.startsWith("/user_files");
30
+ const IS_VIDEO_PAGE = /info.php\?id=\d+$/.test(location.href);
28
31
  const SEARCH_PARAM = IS_USER_FILES ? "start" : "page";
29
32
  function setup() {
30
33
  const container = document.createElement("div");
@@ -33,7 +36,19 @@
33
36
  ...document.querySelectorAll(".item:has(> a.block[href *= info] > img)")
34
37
  );
35
38
  document.querySelector(".c2")?.after(container);
36
- _GM_addStyle("a.block[href *= info] > img:first-child { height: 240px; }");
39
+ if (!IS_VIDEO_PAGE) {
40
+ _GM_addStyle("a.block[href *= info] > img:first-child { height: 240px; }");
41
+ }
42
+ if (IS_VIDEO_PAGE) {
43
+ const vidh = document.querySelector("a[href*=mp4]");
44
+ vidh?.after(
45
+ _GM_addElement("video", {
46
+ src: vidh.href,
47
+ controls: true,
48
+ width: vidh.parentElement?.offsetWidth
49
+ })
50
+ );
51
+ }
37
52
  }
38
53
  setup();
39
54
  new core.Rules({
@@ -54,7 +69,6 @@
54
69
  thumbs: { selector: ".item:has(> a.block[href *= info] > img)" },
55
70
  thumb: { strategy: "auto-text" },
56
71
  thumbImg: {
57
- strategy: "auto",
58
72
  selector: (img) => {
59
73
  const url = img.closest("a").href;
60
74
  utils.fetchHtml(url).then((dom) => {
@@ -1,7 +1,7 @@
1
1
  // ==UserScript==
2
2
  // @name PornHub PervertMonkey
3
3
  // @namespace pervertmonkey
4
- // @version 4.0.1
4
+ // @version 4.0.3
5
5
  // @author violent-orangutan
6
6
  // @description Infinite scroll [optional]. Filter by Title and Duration
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.10/dist/core/pervertmonkey.core.umd.js
15
+ // @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.13/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
@@ -25,7 +25,7 @@
25
25
  new core.Rules({
26
26
  paginationStrategyOptions: {
27
27
  paginationSelector: ".paginationGated",
28
- overwritePaginationLast: (n) => n === 9 ? 999 : n
28
+ overwritePaginationLast: (n) => n === 9 ? 9999 : n
29
29
  },
30
30
  containerSelector: () => [...document.querySelectorAll("ul:has(> li[data-video-vkey])")].filter((e) => e.children.length > 0 && e.checkVisibility()).pop(),
31
31
  dataHomogenity: { id: true, className: true },
@@ -38,23 +38,20 @@
38
38
  }
39
39
  },
40
40
  thumbImg: {
41
- strategy: "auto",
42
- selector: ["data-mediumthumb", "data-image"]
41
+ selector: ["data-mediumthumb", "data-image"]
43
42
  },
44
43
  gropeStrategy: "all-in-all",
45
44
  schemeOptions: ["Text Filter", "Duration Filter", "Badge", "Advanced"]
46
45
  });
47
46
  function bypassAgeVerification() {
47
+ cookieStore.set({
48
+ name: "accessAgeDisclaimerPH",
49
+ value: "2",
50
+ expires: Date.now() + 90 * 24 * 60 * 60 * 1e3
51
+ });
48
52
  document.querySelectorAll('[data-label="over18_enter"]').forEach((b) => {
49
53
  b.click();
50
54
  });
51
- setTimeout(() => {
52
- cookieStore.set({
53
- name: "accessAgeDisclaimerPH",
54
- value: "2",
55
- expires: Date.now() + 90 * 24 * 60 * 60 * 1e3
56
- });
57
- }, 1e3);
58
55
  }
59
56
  bypassAgeVerification();
60
57