pervert-monkey 1.0.25 → 1.0.27
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/README.md +5 -2
- package/dist/core/pervertmonkey.core.es.d.ts +2 -541
- package/dist/core/pervertmonkey.core.es.js +8005 -9281
- package/dist/core/pervertmonkey.core.es.js.map +1 -1
- package/dist/core/pervertmonkey.core.umd.js +8833 -10051
- package/dist/core/pervertmonkey.core.umd.js.map +1 -1
- package/dist/userscripts/3hentai.user.js +40 -46
- package/dist/userscripts/camgirlfinder.user.js +56 -49
- package/dist/userscripts/camwhores.user.js +286 -343
- package/dist/userscripts/e-hentai.user.js +54 -57
- package/dist/userscripts/ebalka.user.js +52 -55
- package/dist/userscripts/eporner.user.js +76 -68
- package/dist/userscripts/erome.user.js +79 -84
- package/dist/userscripts/eroprofile.user.js +28 -29
- package/dist/userscripts/javhdporn.user.js +28 -22
- package/dist/userscripts/missav.user.js +22 -23
- package/dist/userscripts/motherless.user.js +141 -152
- package/dist/userscripts/namethatporn.user.js +49 -58
- package/dist/userscripts/nhentai.user.js +104 -99
- package/dist/userscripts/obmenvsem.user.js +61 -69
- package/dist/userscripts/pornhub.user.js +50 -47
- package/dist/userscripts/simpcity.user.js +82 -24
- package/dist/userscripts/socialmediagirls.user.js +26 -22
- package/dist/userscripts/spankbang.user.js +62 -44
- package/dist/userscripts/thisvid.user.js +1269 -1366
- package/dist/userscripts/xhamster.user.js +119 -132
- package/dist/userscripts/xmegadrive.user.js +82 -0
- package/dist/userscripts/xvideos.user.js +115 -91
- package/package.json +10 -6
- package/src/core/data-handler/data-filter.ts +3 -3
- package/src/core/data-handler/data-manager.ts +11 -3
- package/src/core/parsers/pagination-parser/index.ts +0 -4
- package/src/core/parsers/pagination-parser/pagination-strategies/PaginationStrategyPathnameParams.ts +36 -1
- package/src/core/rules/index.ts +3 -3
- package/src/userscripts/index.ts +1 -1
- package/src/userscripts/meta.json +1 -1
- package/src/userscripts/scripts/3hentai.ts +1 -1
- package/src/userscripts/scripts/camgirlfinder.ts +1 -1
- package/src/userscripts/scripts/camwhores.ts +2 -2
- package/src/userscripts/scripts/e-hentai.ts +1 -1
- package/src/userscripts/scripts/ebalka.ts +2 -2
- package/src/userscripts/scripts/eporner.ts +41 -15
- package/src/userscripts/scripts/erome.ts +1 -1
- package/src/userscripts/scripts/eroprofile.ts +6 -6
- package/src/userscripts/scripts/javhdporn.ts +1 -1
- package/src/userscripts/scripts/missav.ts +1 -1
- package/src/userscripts/scripts/motherless.ts +28 -19
- package/src/userscripts/scripts/namethatporn.ts +1 -1
- package/src/userscripts/scripts/nhentai.ts +1 -1
- package/src/userscripts/scripts/obmenvsem.ts +1 -1
- package/src/userscripts/scripts/pornhub.ts +4 -2
- package/src/userscripts/scripts/simpcity.ts +72 -5
- package/src/userscripts/scripts/{socialmediagirls copy.ts → socialmediagirls.ts} +1 -1
- package/src/userscripts/scripts/spankbang.ts +20 -4
- package/src/userscripts/scripts/thisvid.ts +8 -21
- package/src/userscripts/scripts/xhamster.ts +12 -4
- package/src/userscripts/scripts/xmegadrive.ts +78 -0
- package/src/userscripts/scripts/xvideos.ts +26 -7
- package/src/utils/fetch/index.ts +2 -0
- package/src/utils/objects/memoize.ts +1 -9
- package/dist/test/test.user.js +0 -10301
- package/dist/userscripts/socialmediagirls copy.user.js +0 -41
|
@@ -1,153 +1,140 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Xhamster PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 5.0.
|
|
4
|
+
// @version 5.0.23
|
|
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
|
|
8
8
|
// @icon https://www.google.com/s2/favicons?sz=64&domain=xhamster.com
|
|
9
9
|
// @homepage https://github.com/smartacephale/sleazy-fork#readme
|
|
10
10
|
// @homepageURL https://sleazyfork.org/en/users/1253342-smartacephale
|
|
11
|
-
// @source https://github.com/smartacephale
|
|
11
|
+
// @source https://github.com/smartacephale/sleazy-fork
|
|
12
12
|
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
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
|
-
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
16
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.27/dist/core/pervertmonkey.core.umd.js
|
|
18
17
|
// @grant GM_addElement
|
|
19
18
|
// @grant GM_addStyle
|
|
20
19
|
// @grant unsafeWindow
|
|
21
20
|
// @run-at document-idle
|
|
22
21
|
// ==/UserScript==
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
var ___core = window.pervertmonkey.core || pervertmonkey.core;
|
|
24
|
+
var ___utils = ___core;
|
|
26
25
|
|
|
27
|
-
var _GM_addElement = (() => typeof GM_addElement != "undefined" ? GM_addElement : undefined)();
|
|
28
|
-
var _unsafeWindow = (() => typeof unsafeWindow != "undefined" ? unsafeWindow : undefined)();
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
target.click();
|
|
145
|
-
});
|
|
146
|
-
observer.observe(e);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
if (IS_VIDEO_PAGE) {
|
|
150
|
-
expandMoreVideoPage();
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
})(core, utils);
|
|
27
|
+
(function(___core, ___utils) {
|
|
28
|
+
"use strict";
|
|
29
|
+
var _GM_addElement = (() => typeof GM_addElement != "undefined" ? GM_addElement : void 0)();
|
|
30
|
+
var _unsafeWindow = (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
|
|
31
|
+
var IS_VIDEO_PAGE = /^\/videos|moments\//.test(location.pathname);
|
|
32
|
+
var IS_PLAYLIST = /^\/my\/favorites\/videos\/\w+/.test(location.pathname);
|
|
33
|
+
function createThumb(data) {
|
|
34
|
+
return (0, ___utils.instantiateTemplate)(".video-thumb", {
|
|
35
|
+
href: data.pageURL,
|
|
36
|
+
"data-previewvideo": data.trailerURL,
|
|
37
|
+
"data-previewvideo-fallback": data.trailerFallbackUrl,
|
|
38
|
+
"data-sprite": data.spriteURL,
|
|
39
|
+
title: data.title,
|
|
40
|
+
"data-video-id": data.id,
|
|
41
|
+
srcset: data.thumbURL,
|
|
42
|
+
src: data.imageURL
|
|
43
|
+
}, {
|
|
44
|
+
".video-thumb-views": data.views,
|
|
45
|
+
"[title]": data.title,
|
|
46
|
+
"[data-role=\"video-duration\"] div": data.duration
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
var getPaginationData = !IS_PLAYLIST ? void 0 : async (url) => {
|
|
50
|
+
return (0, ___utils.parseHtml)(`<div>${(await (0, ___utils.fetchJson)(url)).list.map((e) => createThumb(e)).join("\n")}</div>`);
|
|
51
|
+
};
|
|
52
|
+
function createPlaylistPaginationStrategy() {
|
|
53
|
+
const collectionId = location.pathname.split("/my/favorites/videos/")[1].split("-")[0];
|
|
54
|
+
const data = _unsafeWindow.initials;
|
|
55
|
+
const paginationLast = data.favoritesVideoPaging.maxPages;
|
|
56
|
+
const paginationOffset = data.favoritesVideoPaging.active;
|
|
57
|
+
return {
|
|
58
|
+
paginationSelector: "nav[class *= \"pagination\"]",
|
|
59
|
+
getPaginationLast: () => paginationLast,
|
|
60
|
+
getPaginationOffset: () => paginationOffset,
|
|
61
|
+
getPaginationUrlGenerator: () => (offset) => {
|
|
62
|
+
return `https://xhamster.com/api/front/favorite/get-playlist?id=${collectionId}&perPage=60&page=${offset}`;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
var rules = new ___core.Rules({
|
|
67
|
+
paginationStrategyOptions: IS_PLAYLIST ? createPlaylistPaginationStrategy() : { paginationSelector: ".prev-next-list, .test-pager" },
|
|
68
|
+
getPaginationData,
|
|
69
|
+
containerSelectorLast: ".thumb-list",
|
|
70
|
+
thumbs: {
|
|
71
|
+
selector: ".video-thumb",
|
|
72
|
+
transform: (thumb) => {
|
|
73
|
+
if (thumb.querySelector("[class*=placeholder]")) console.log("has placeholder", thumb);
|
|
74
|
+
return thumb;
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
thumb: { selectors: {
|
|
78
|
+
title: ".video-thumb-info__name,.video-thumb-info>a",
|
|
79
|
+
duration: ".thumb-image-container__duration",
|
|
80
|
+
watched: {
|
|
81
|
+
selector: "[data-role=\"video-watched",
|
|
82
|
+
type: "boolean"
|
|
83
|
+
},
|
|
84
|
+
views: {
|
|
85
|
+
selector: ".video-thumb-views",
|
|
86
|
+
type: "float"
|
|
87
|
+
}
|
|
88
|
+
} },
|
|
89
|
+
thumbImg: { strategy: "auto" },
|
|
90
|
+
gropeStrategy: "all-in-all",
|
|
91
|
+
customDataFilterFns: [{ filterWatched: (e, state) => !!(state.filterWatched && e.watched) }, { filterUnwatched: (e, state) => !!(state.filterUnwatched && !e.watched) }],
|
|
92
|
+
schemeOptions: [
|
|
93
|
+
"Title Filter",
|
|
94
|
+
{
|
|
95
|
+
title: "Filter Watched",
|
|
96
|
+
content: [{
|
|
97
|
+
filterWatched: false,
|
|
98
|
+
label: "watched"
|
|
99
|
+
}, {
|
|
100
|
+
filterUnwatched: false,
|
|
101
|
+
label: "unwatched"
|
|
102
|
+
}]
|
|
103
|
+
},
|
|
104
|
+
"Sort By",
|
|
105
|
+
"Duration Filter",
|
|
106
|
+
"Badge",
|
|
107
|
+
"Advanced"
|
|
108
|
+
],
|
|
109
|
+
animatePreview
|
|
110
|
+
});
|
|
111
|
+
function animatePreview() {
|
|
112
|
+
function createPreviewVideoElement(src, mount) {
|
|
113
|
+
const video = _GM_addElement("video", {
|
|
114
|
+
playsInline: true,
|
|
115
|
+
autoplay: true,
|
|
116
|
+
loop: true,
|
|
117
|
+
class: "thumb-image-container__video",
|
|
118
|
+
src
|
|
119
|
+
});
|
|
120
|
+
video.addEventListener("loadeddata", () => {
|
|
121
|
+
mount.before(video);
|
|
122
|
+
}, false);
|
|
123
|
+
return () => (0, ___utils.exterminateVideo)(video);
|
|
124
|
+
}
|
|
125
|
+
___utils.OnHover.create(document.body, ".video-thumb", (e) => {
|
|
126
|
+
const container = e.querySelector(".thumb-image-container__image");
|
|
127
|
+
const videoSrc = e.querySelector("[data-previewvideo]")?.getAttribute("data-previewvideo");
|
|
128
|
+
return createPreviewVideoElement(videoSrc, container);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function expandMoreVideoPage() {
|
|
132
|
+
(0, ___utils.watchElementChildrenCount)(rules.container, () => setTimeout(rules.gropeInit, 1800));
|
|
133
|
+
(0, ___utils.waitForElementToAppear)(document.body, "button[data-role=\"show-more-next\"]", (e) => {
|
|
134
|
+
new ___utils.Observer((target) => {
|
|
135
|
+
target.click();
|
|
136
|
+
}).observe(e);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
if (IS_VIDEO_PAGE) expandMoreVideoPage();
|
|
140
|
+
})(___core, ___utils);
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// ==UserScript==
|
|
2
|
+
// @name xmegadrive PervertMonkey
|
|
3
|
+
// @namespace pervertmonkey
|
|
4
|
+
// @version 1.0.0
|
|
5
|
+
// @author violent-orangutan
|
|
6
|
+
// @description Infinite scroll [optional]. Filter by Title and Duration. Sort by Duration and Views.
|
|
7
|
+
// @license MIT
|
|
8
|
+
// @icon https://www.google.com/s2/favicons?sz=64&domain=xmegadrive.com
|
|
9
|
+
// @homepage https://github.com/smartacephale/sleazy-fork#readme
|
|
10
|
+
// @homepageURL https://sleazyfork.org/en/users/1253342-smartacephale
|
|
11
|
+
// @source https://github.com/smartacephale/sleazy-fork
|
|
12
|
+
// @supportURL https://github.com/smartacephale/sleazy-fork/issues
|
|
13
|
+
// @match https://*.xmegadrive.com/*
|
|
14
|
+
// @exclude https://*.xmegadrive.com/*mode=async*
|
|
15
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.27/dist/core/pervertmonkey.core.umd.js
|
|
16
|
+
// @grant GM_addStyle
|
|
17
|
+
// @grant unsafeWindow
|
|
18
|
+
// @run-at document-idle
|
|
19
|
+
// ==/UserScript==
|
|
20
|
+
|
|
21
|
+
var ___core = window.pervertmonkey.core || pervertmonkey.core;
|
|
22
|
+
var ___utils = ___core;
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
(function(___core, ___utils) {
|
|
26
|
+
"use strict";
|
|
27
|
+
var $ = (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)().$;
|
|
28
|
+
new ___core.Rules({
|
|
29
|
+
containerSelector: "[id*=\"playlist\"]:has(> .item .title),[id*=\"videos\"]:has(> .item .title),form:has(>.item .title)",
|
|
30
|
+
paginationStrategyOptions: { paginationSelector: ".pagination:not([id *= member])" },
|
|
31
|
+
thumbs: { selector: ".list-videos .item, .playlist .item, .list-playlists > div > .item, .item:has(.title)" },
|
|
32
|
+
thumb: {
|
|
33
|
+
strategy: "auto-select",
|
|
34
|
+
selectors: {
|
|
35
|
+
private: {
|
|
36
|
+
type: "boolean",
|
|
37
|
+
selector: "[class*=private]"
|
|
38
|
+
},
|
|
39
|
+
views: {
|
|
40
|
+
selector: ".views",
|
|
41
|
+
type: "float"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
dataManagerOptions: { removeDuplicates: true },
|
|
46
|
+
thumbImg: { selector: "data-original" },
|
|
47
|
+
gropeStrategy: "all-in-all",
|
|
48
|
+
schemeOptions: [
|
|
49
|
+
"Title Filter",
|
|
50
|
+
"Duration Filter",
|
|
51
|
+
"Sort By",
|
|
52
|
+
"Badge",
|
|
53
|
+
"Advanced"
|
|
54
|
+
],
|
|
55
|
+
animatePreview
|
|
56
|
+
});
|
|
57
|
+
function animatePreview(container) {
|
|
58
|
+
const tick = new ___utils.Tick(500);
|
|
59
|
+
function killjquery(n = 10) {
|
|
60
|
+
if (n > 0) {
|
|
61
|
+
n--;
|
|
62
|
+
$("img[data-cnt]").off();
|
|
63
|
+
setTimeout(() => killjquery(n), 250);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
killjquery();
|
|
67
|
+
function rotateImg(src, count) {
|
|
68
|
+
return src.replace(/(\d)(?=\.jpg$)/, (_, n) => `${(0, ___utils.circularShift)(parseInt(n), count)}`);
|
|
69
|
+
}
|
|
70
|
+
___utils.OnHover.create(container, ".list-videos .item, .playlist .item, .list-playlists > div > .item, .item:has(.title)", (e) => {
|
|
71
|
+
const img = e.querySelector("img");
|
|
72
|
+
const origin = img.src;
|
|
73
|
+
const count = parseInt(img.getAttribute("data-cnt")) || 5;
|
|
74
|
+
tick.start(() => {
|
|
75
|
+
img.src = rotateImg(img.src, count);
|
|
76
|
+
}, () => {
|
|
77
|
+
img.src = origin;
|
|
78
|
+
});
|
|
79
|
+
return () => tick.stop();
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
})(___core, ___utils);
|
|
@@ -1,112 +1,136 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name XVideos PervertMonkey
|
|
3
3
|
// @namespace pervertmonkey
|
|
4
|
-
// @version 4.0
|
|
4
|
+
// @version 4.1.0
|
|
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
|
|
8
8
|
// @icon https://www.google.com/s2/favicons?sz=64&domain=xvideos.com
|
|
9
9
|
// @homepage https://github.com/smartacephale/sleazy-fork#readme
|
|
10
10
|
// @homepageURL https://sleazyfork.org/en/users/1253342-smartacephale
|
|
11
|
-
// @source https://github.com/smartacephale
|
|
11
|
+
// @source https://github.com/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.
|
|
15
|
-
// @require data:application/javascript,var core = window.pervertmonkey.core || pervertmonkey.core; var utils = core;
|
|
14
|
+
// @require https://cdn.jsdelivr.net/npm/pervert-monkey@1.0.27/dist/core/pervertmonkey.core.umd.js
|
|
16
15
|
// @grant GM_addStyle
|
|
17
16
|
// @grant unsafeWindow
|
|
18
17
|
// @run-at document-idle
|
|
19
18
|
// ==/UserScript==
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
var ___core = window.pervertmonkey.core || pervertmonkey.core;
|
|
21
|
+
var ___utils = ___core;
|
|
23
22
|
|
|
24
|
-
var _unsafeWindow = (() => typeof unsafeWindow != "undefined" ? unsafeWindow : undefined)();
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
24
|
+
(function(___core, ___utils) {
|
|
25
|
+
"use strict";
|
|
26
|
+
var xv = (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)().xv;
|
|
27
|
+
new ___core.Rules({
|
|
28
|
+
paginationStrategyOptions: {
|
|
29
|
+
paginationSelector: "#main .pagination:last-child",
|
|
30
|
+
searchParamSelector: "p"
|
|
31
|
+
},
|
|
32
|
+
containerSelector: "*:has(>div.thumb-block[id^=video_]:not(.thumb-ad))",
|
|
33
|
+
thumbs: { selector: "div.thumb-block[id^=video_]:not(.thumb-ad)" },
|
|
34
|
+
thumb: {
|
|
35
|
+
selectors: {
|
|
36
|
+
title: "[class*=title]",
|
|
37
|
+
uploader: "[class*=name]",
|
|
38
|
+
duration: "[class*=duration]",
|
|
39
|
+
views: {
|
|
40
|
+
selector: ".metadata a ~ span",
|
|
41
|
+
type: "float"
|
|
42
|
+
},
|
|
43
|
+
quality: {
|
|
44
|
+
selector: ".video-hd-mark",
|
|
45
|
+
type: "string"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
callback: (thumb) => {
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
const id = parseInt(thumb.getAttribute("data-id"));
|
|
51
|
+
xv.thumbs.prepareVideo(id);
|
|
52
|
+
}, 200);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
customDataFilterFns: [{ qualityFilter: {
|
|
56
|
+
handle(el, state) {
|
|
57
|
+
if (!(state.qualityLow || state.quality360 || state.quality720 || state.quality1080 || state.quality1440 || state.quality4k)) return false;
|
|
58
|
+
return !(state.qualityLow && el.quality === "" || state.quality360 && el.quality === "360p" || state.quality720 && el.quality === "720p" || state.quality1080 && el.quality === "1080p" || state.quality1440 && el.quality === "1440p" || state.quality4k && el.quality === "4k");
|
|
59
|
+
},
|
|
60
|
+
deps: [
|
|
61
|
+
"qualityLow",
|
|
62
|
+
"quality360",
|
|
63
|
+
"quality720",
|
|
64
|
+
"quality1080",
|
|
65
|
+
"quality1440",
|
|
66
|
+
"quality4k"
|
|
67
|
+
]
|
|
68
|
+
} }],
|
|
69
|
+
schemeOptions: [
|
|
70
|
+
"Title Filter",
|
|
71
|
+
"Uploader Filter",
|
|
72
|
+
"Duration Filter",
|
|
73
|
+
{
|
|
74
|
+
title: "Quality Filter",
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
qualityLow: false,
|
|
78
|
+
label: "Low"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
quality360: false,
|
|
82
|
+
label: "360p"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
quality720: false,
|
|
86
|
+
label: "720p"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
quality1080: false,
|
|
90
|
+
label: "1080p"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
quality1440: false,
|
|
94
|
+
label: "1440p"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
quality4k: false,
|
|
98
|
+
label: "4k"
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
"Sort By",
|
|
103
|
+
"Badge",
|
|
104
|
+
"Advanced"
|
|
105
|
+
],
|
|
106
|
+
animatePreview
|
|
107
|
+
});
|
|
108
|
+
function animatePreview(container) {
|
|
109
|
+
function createPreviewElement(src, mount) {
|
|
110
|
+
const elem = (0, ___utils.parseHtml)(`
|
|
81
111
|
<div class="videopv" style="display: none;">
|
|
82
112
|
<video autoplay="autoplay" playsinline="playsinline" muted="muted"></video>
|
|
83
113
|
</div>`);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const videoSrc = getVideoURL(img.src);
|
|
108
|
-
return createPreviewElement(videoSrc, img);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
})(core, utils);
|
|
114
|
+
mount.after(elem);
|
|
115
|
+
const video = elem.querySelector("video");
|
|
116
|
+
video.src = src;
|
|
117
|
+
video.addEventListener("loadeddata", () => {
|
|
118
|
+
mount.style.opacity = "0";
|
|
119
|
+
elem.style.display = "block";
|
|
120
|
+
elem.style.background = "#000";
|
|
121
|
+
}, false);
|
|
122
|
+
return () => {
|
|
123
|
+
(0, ___utils.exterminateVideo)(video);
|
|
124
|
+
elem.remove();
|
|
125
|
+
mount.style.opacity = "1";
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function getVideoURL(src) {
|
|
129
|
+
return src.replace(/\w+\.\w+$/, () => "preview.mp4");
|
|
130
|
+
}
|
|
131
|
+
___utils.OnHover.create(container, "div.thumb-block[id^=video_]:not(.thumb-ad)", (target) => {
|
|
132
|
+
const img = target.querySelector("img");
|
|
133
|
+
return createPreviewElement(getVideoURL(img.src), img);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
})(___core, ___utils);
|
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.27",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"userscript",
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
"author": "ViolentOrangutan atm.mormon@protonmail.com (https://github.com/smartacephale)",
|
|
13
13
|
"homepage": "https://github.com/smartacephale/sleazy-fork#readme",
|
|
14
14
|
"type": "module",
|
|
15
|
-
"repository":
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/smartacephale/sleazy-fork.git"
|
|
18
|
+
},
|
|
16
19
|
"bugs": {
|
|
17
20
|
"url": "https://github.com/smartacephale/sleazy-fork/issues",
|
|
18
21
|
"email": "atm.mormon@protonmail.com"
|
|
@@ -42,16 +45,17 @@
|
|
|
42
45
|
},
|
|
43
46
|
"devDependencies": {
|
|
44
47
|
"@types/node": "^25.2.3",
|
|
48
|
+
"@typescript/typescript6": "^6.0.2",
|
|
45
49
|
"jabroni-outfit": "^2.1.4",
|
|
46
|
-
"typescript": "^
|
|
47
|
-
"vite": "^
|
|
48
|
-
"vite-plugin-dts": "^
|
|
50
|
+
"typescript": "^7.0.2",
|
|
51
|
+
"vite": "^8.1.5",
|
|
52
|
+
"vite-plugin-dts": "^5.0.3"
|
|
49
53
|
},
|
|
50
54
|
"dependencies": {
|
|
51
55
|
"ix": "^7.0.0",
|
|
52
56
|
"lskdb": "^1.0.2",
|
|
53
57
|
"rxjs": "^7.8.2",
|
|
54
58
|
"urlpattern-polyfill": "^10.1.0",
|
|
55
|
-
"vite-plugin-monkey": "^
|
|
59
|
+
"vite-plugin-monkey": "^8.1.0"
|
|
56
60
|
}
|
|
57
61
|
}
|
|
@@ -20,11 +20,11 @@ export class DataFilter {
|
|
|
20
20
|
return e.className.includes(DataFilterFn.prefix);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
public createCssFilters(
|
|
23
|
+
public createCssFilters() {
|
|
24
24
|
this.filters.forEach((_, name) => {
|
|
25
25
|
const className = DataFilterFn.setPrefix(name);
|
|
26
|
-
const cssRule =
|
|
27
|
-
GM_addStyle(
|
|
26
|
+
const cssRule = `@layer userscriptOverride { .${className} { display: none !important; } }`;
|
|
27
|
+
GM_addStyle(cssRule);
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
|