pervert-monkey 1.0.8 → 1.0.10

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 (65) hide show
  1. package/dist/core/pervertmonkey.core.es.d.ts +121 -59
  2. package/dist/core/pervertmonkey.core.es.js +2555 -1812
  3. package/dist/core/pervertmonkey.core.es.js.map +1 -1
  4. package/dist/core/pervertmonkey.core.umd.js +2554 -1811
  5. package/dist/core/pervertmonkey.core.umd.js.map +1 -1
  6. package/dist/userscripts/3hentai.user.js +47 -9
  7. package/dist/userscripts/camgirlfinder.user.js +1 -1
  8. package/dist/userscripts/camwhores.user.js +15 -9
  9. package/dist/userscripts/e-hentai.user.js +12 -6
  10. package/dist/userscripts/ebalka.user.js +11 -5
  11. package/dist/userscripts/eporner.user.js +15 -10
  12. package/dist/userscripts/erome.user.js +11 -10
  13. package/dist/userscripts/eroprofile.user.js +9 -5
  14. package/dist/userscripts/javhdporn.user.js +9 -5
  15. package/dist/userscripts/missav.user.js +10 -6
  16. package/dist/userscripts/motherless.user.js +15 -8
  17. package/dist/userscripts/namethatporn.user.js +17 -13
  18. package/dist/userscripts/nhentai.user.js +12 -6
  19. package/dist/userscripts/obmenvsem.user.js +69 -0
  20. package/dist/userscripts/pornhub.user.js +14 -10
  21. package/dist/userscripts/spankbang.user.js +10 -6
  22. package/dist/userscripts/thisvid.user.js +27 -21
  23. package/dist/userscripts/xhamster.user.js +26 -26
  24. package/dist/userscripts/xvideos.user.js +19 -17
  25. package/package.json +6 -4
  26. package/src/core/{data-control → data-handler}/data-filter.ts +6 -10
  27. package/src/core/{data-control → data-handler}/data-manager.ts +8 -7
  28. package/src/core/data-handler/index.ts +2 -0
  29. package/src/core/index.ts +4 -4
  30. package/src/core/infinite-scroll/index.ts +20 -29
  31. package/src/core/parsers/index.ts +4 -0
  32. package/src/core/{pagination-parsing → parsers/pagination-parser}/index.ts +3 -0
  33. package/src/core/{pagination-parsing → parsers/pagination-parser}/pagination-strategies/PaginationStrategy.ts +1 -1
  34. package/src/core/{pagination-parsing → parsers/pagination-parser}/pagination-strategies/PaginationStrategyDataParams.ts +1 -1
  35. package/src/core/{pagination-parsing → parsers/pagination-parser}/pagination-strategies/PaginationStrategyPathnameParams.ts +2 -1
  36. package/src/core/{pagination-parsing → parsers/pagination-parser}/pagination-utils/index.ts +1 -4
  37. package/src/core/parsers/thumb-data-parser.ts +96 -0
  38. package/src/core/parsers/thumb-img-parser.ts +62 -0
  39. package/src/core/parsers/thumbs-parser.ts +29 -0
  40. package/src/core/rules/index.ts +39 -207
  41. package/src/userscripts/ascii-logos.js +43 -0
  42. package/src/userscripts/scripts/3hentai.ts +46 -6
  43. package/src/userscripts/scripts/camwhores.ts +19 -13
  44. package/src/userscripts/scripts/e-hentai.ts +13 -7
  45. package/src/userscripts/scripts/ebalka.ts +11 -5
  46. package/src/userscripts/scripts/eporner.ts +16 -10
  47. package/src/userscripts/scripts/erome.ts +11 -10
  48. package/src/userscripts/scripts/eroprofile.ts +10 -6
  49. package/src/userscripts/scripts/javhdporn.ts +9 -5
  50. package/src/userscripts/scripts/missav.ts +10 -6
  51. package/src/userscripts/scripts/motherless.ts +18 -9
  52. package/src/userscripts/scripts/namethatporn.ts +18 -14
  53. package/src/userscripts/scripts/nhentai.ts +13 -8
  54. package/src/userscripts/scripts/obmenvsem.ts +56 -0
  55. package/src/userscripts/scripts/pornhub.ts +14 -10
  56. package/src/userscripts/scripts/spankbang.ts +10 -6
  57. package/src/userscripts/scripts/thisvid.ts +32 -27
  58. package/src/userscripts/scripts/xhamster.ts +37 -38
  59. package/src/userscripts/scripts/xvideos.ts +18 -16
  60. package/src/utils/index.ts +7 -19
  61. package/src/utils/parsers/index.ts +4 -0
  62. package/src/utils/strings/index.ts +2 -0
  63. package/src/core/data-control/index.ts +0 -2
  64. /package/src/core/{pagination-parsing → parsers/pagination-parser}/pagination-strategies/PaginationStrategySearchParams.ts +0 -0
  65. /package/src/core/{pagination-parsing → parsers/pagination-parser}/pagination-strategies/index.ts +0 -0
@@ -3,6 +3,7 @@ import { JabronioStore } from 'jabroni-outfit';
3
3
  import { JabroniTypes } from 'jabroni-outfit';
4
4
  import { setupScheme } from 'jabroni-outfit';
5
5
  import { StoreState } from 'jabroni-outfit';
6
+ import { Subject } from 'rxjs';
6
7
 
7
8
  declare type AnyFunction = (...args: any[]) => any;
8
9
 
@@ -17,21 +18,12 @@ export declare function circularShift(n: number, c?: number, s?: number): number
17
18
 
18
19
  export declare function copyAttributes<T extends Element = HTMLElement>(target: T, source: T): void;
19
20
 
20
- declare type CustomThumbDataSelector = {
21
- [x: string]: _CustomThumbDataSelector;
22
- };
23
-
24
- declare type _CustomThumbDataSelector = {
25
- selector: string;
26
- type: 'boolean' | 'string' | 'number';
27
- };
21
+ export declare type DataElement = Record<string, string | number | boolean | HTMLElement>;
28
22
 
29
- declare type DataElement = Record<string, string | number | boolean | HTMLElement>;
30
-
31
- declare class DataFilter {
23
+ export declare class DataFilter {
32
24
  private rules;
33
25
  filters: Map<string, () => DataFilterFn>;
34
- constructor(rules: RulesGlobal);
26
+ constructor(rules: Rules);
35
27
  static isFiltered(el: HTMLElement): boolean;
36
28
  applyCSSFilters(wrapper?: (cssRule: string) => string): void;
37
29
  customDataSelectorFns: Record<string, DataSelectorFn<any>>;
@@ -45,7 +37,7 @@ declare class DataFilter {
45
37
  static customDataSelectorFnsDefault: Record<string, DataSelectorFn<any>>;
46
38
  }
47
39
 
48
- declare type DataFilterFn = (v: DataElement) => DataFilterResult;
40
+ export declare type DataFilterFn = (v: DataElement) => DataFilterResult;
49
41
 
50
42
  declare interface DataFilterResult {
51
43
  tag: string;
@@ -54,26 +46,26 @@ declare interface DataFilterResult {
54
46
 
55
47
  export declare class DataManager {
56
48
  private rules;
49
+ private parseDataParentHomogenity?;
57
50
  data: Map<string, DataElement>;
58
51
  private lazyImgLoader;
59
52
  dataFilter: DataFilter;
60
- constructor(rules: RulesGlobal);
53
+ constructor(rules: Rules, parseDataParentHomogenity?: Parameters<typeof checkHomogenity>[2] | undefined);
61
54
  applyFilters: (filters?: Record<string, boolean>, offset?: number) => Promise<void>;
62
55
  filterAll: (offset?: number) => Promise<void>;
63
- parseDataParentHomogenity?: Parameters<typeof checkHomogenity>[2];
64
56
  parseData: (html: HTMLElement, container?: HTMLElement, removeDuplicates?: boolean, shouldLazify?: boolean) => void;
65
57
  sortBy<K extends keyof DataElement>(key: K, direction?: boolean): void;
66
58
  }
67
59
 
68
- declare type DataSelectorFn<R> = DataSelectorFnAdvanced<R> | DataSelectorFnShort;
60
+ export declare type DataSelectorFn<R> = DataSelectorFnAdvanced<R> | DataSelectorFnShort;
69
61
 
70
- declare type DataSelectorFnAdvanced<R> = {
62
+ export declare type DataSelectorFnAdvanced<R> = {
71
63
  handle: (el: DataElement, state: StoreState, $preDefineResult?: R) => boolean;
72
64
  $preDefine?: (state: StoreState) => R;
73
65
  deps?: string[];
74
66
  };
75
67
 
76
- declare type DataSelectorFnShort = (e: DataElement, state: StoreState) => boolean;
68
+ export declare type DataSelectorFnShort = (e: DataElement, state: StoreState) => boolean;
77
69
 
78
70
  declare const DefaultScheme: [{
79
71
  readonly title: "Text Filter";
@@ -177,6 +169,13 @@ export declare function fetchWith<T extends JSON | string | HTMLElement>(input:
177
169
 
178
170
  export declare function findNextSibling<T extends Element = HTMLElement>(e: T): Element | null;
179
171
 
172
+ /**
173
+ * Converts a duration string (e.g., "1h 22min 3sec") to HH:MM:SS format.
174
+ * @param timeStr - The duration string to format.
175
+ * @returns A string in the format HH:MM:SS.
176
+ */
177
+ export declare function formatTimeToHHMMSS(timeStr: string): string;
178
+
180
179
  declare type GeneratorResult = {
181
180
  url: string;
182
181
  offset: number;
@@ -189,28 +188,31 @@ export declare function getPaginationStrategy(options: Partial<PaginationStrateg
189
188
  export declare class InfiniteScroller {
190
189
  enabled: boolean;
191
190
  paginationOffset: number;
192
- parseData?: (document: HTMLElement) => void;
193
- rules: RulesGlobal;
191
+ rules: Rules;
194
192
  private observer?;
195
193
  private paginationGenerator;
196
194
  constructor(options: InfiniteScrollerOptions);
197
195
  dispose(): void;
198
196
  setObserver(observable: HTMLElement): this;
199
- private onScrollCBs;
200
- onScroll(callback: (scroller: InfiniteScroller) => void, initCall?: boolean): this;
201
- private _onScroll;
197
+ subject: Subject<IScrollerSubject>;
202
198
  private setAutoScroll;
203
199
  generatorConsumer: () => Promise<boolean>;
204
200
  private getPaginationData;
205
201
  doScroll(url: string, offset: number): Promise<void>;
206
202
  static generatorForPaginationStrategy(pstrategy: PaginationStrategy): OffsetGenerator;
207
- static create(rules: RulesGlobal): InfiniteScroller;
203
+ static create(rules: Rules): InfiniteScroller;
208
204
  }
209
205
 
210
206
  declare type InfiniteScrollerOptions = Pick<InfiniteScroller, 'rules'> & Partial<InfiniteScroller>;
211
207
 
212
208
  export declare function instantiateTemplate(sourceSelector: string, attributeUpdates: Record<string, string>, contentUpdates: Record<string, string>): string;
213
209
 
210
+ declare type IScrollerSubject = {
211
+ type: 'scroll';
212
+ scroller: InfiniteScroller;
213
+ page: HTMLElement;
214
+ };
215
+
214
216
  export declare class LazyImgLoader {
215
217
  lazyImgObserver: Observer;
216
218
  private attributeName;
@@ -226,6 +228,10 @@ declare interface MemoizedFunction<T extends AnyFunction> extends CallableFuncti
226
228
  clear: () => void;
227
229
  }
228
230
 
231
+ export declare const MOBILE_UA: {
232
+ readonly 'User-Agent': string;
233
+ };
234
+
229
235
  export declare function objectToFormData<T extends {}>(obj: T): FormData;
230
236
 
231
237
  export declare class Observer {
@@ -240,7 +246,7 @@ export declare class Observer {
240
246
  static observeWhile(target: Element, callback: () => Promise<boolean> | boolean, throttleTime: number): Observer;
241
247
  }
242
248
 
243
- declare type OffsetGenerator<T = GeneratorResult> = Generator<T> | AsyncGenerator<T>;
249
+ export declare type OffsetGenerator<T = GeneratorResult> = Generator<T> | AsyncGenerator<T>;
244
250
 
245
251
  export declare class OnHover {
246
252
  private container;
@@ -259,7 +265,7 @@ export declare class OnHover {
259
265
  static create(...args: ConstructorParameters<typeof OnHover>): OnHover;
260
266
  }
261
267
 
262
- declare class PaginationStrategy {
268
+ export declare class PaginationStrategy {
263
269
  doc: Document;
264
270
  url: URL;
265
271
  paginationSelector: string;
@@ -277,6 +283,31 @@ declare class PaginationStrategy {
277
283
  getPaginationUrlGenerator(): (offset: number) => string | Promise<string>;
278
284
  }
279
285
 
286
+ export declare class PaginationStrategyDataParams extends PaginationStrategy {
287
+ getPaginationLast(): number;
288
+ getPaginationOffset(): number;
289
+ getPaginationUrlGenerator(): (n: number) => string;
290
+ static testLinks(doc?: HTMLElement | Document): boolean;
291
+ }
292
+
293
+ export declare class PaginationStrategyPathnameParams extends PaginationStrategy {
294
+ extractPage: (a: HTMLAnchorElement | Location | string) => number;
295
+ static checkLink(link: URL, pathnameSelector?: RegExp): boolean;
296
+ static testLinks(links: URL[], options: Partial<PaginationStrategy>): boolean;
297
+ getPaginationLast(): number;
298
+ getPaginationOffset(): number;
299
+ getPaginationUrlGenerator(url_?: URL): (offset: number) => string;
300
+ }
301
+
302
+ export declare class PaginationStrategySearchParams extends PaginationStrategy {
303
+ extractPage: (a: HTMLAnchorElement | Location | URL | string) => number;
304
+ getPaginationLast(): number;
305
+ getPaginationOffset(): number;
306
+ getPaginationUrlGenerator(): (offset: number) => string;
307
+ static checkLink(link: URL, searchParamSelector?: string): boolean;
308
+ static testLinks(links: URL[], searchParamSelector?: string): boolean;
309
+ }
310
+
280
311
  export declare function parseCssUrl(s: string): string;
281
312
 
282
313
  export declare function parseDataParams(str: string): Record<string, string>;
@@ -285,6 +316,12 @@ export declare function parseHtml(html: string): HTMLElement;
285
316
 
286
317
  export declare function parseIntegerOr(n: string | number, or: number): number;
287
318
 
319
+ export declare function parseUrl(s: HTMLAnchorElement | Location | URL | string): URL;
320
+
321
+ declare type Primitive = string | number | boolean;
322
+
323
+ declare type PrimitiveString = 'boolean' | 'string' | 'number' | 'duration';
324
+
288
325
  export declare function querySelectorLast<T extends Element = HTMLElement>(root: ParentNode | undefined, selector: string): T | undefined;
289
326
 
290
327
  export declare function querySelectorLastNumber(selector: string, e?: ParentNode): number;
@@ -305,45 +342,33 @@ export declare function removeClassesAndDataAttributes(element: HTMLElement, key
305
342
 
306
343
  export declare function replaceElementTag(e: HTMLElement, tagName: string): HTMLElement;
307
344
 
308
- export declare class RulesGlobal {
309
- delay?: number;
310
- customGenerator?: OffsetGenerator;
345
+ export declare class Rules {
311
346
  getThumbUrl(thumb: HTMLElement | HTMLAnchorElement): string;
312
- titleSelector: undefined | string;
313
- uploaderSelector: undefined | string;
314
- durationSelector: undefined | string;
315
- customThumbDataSelectors: undefined | CustomThumbDataSelector;
316
- getThumbDataStrategy: 'default' | 'auto-select' | 'auto-text';
317
- getThumbDataCallback?: (thumb: HTMLElement, thumbData: ThumbData) => void;
318
- getThumbData(thumb: HTMLElement): ThumbData;
319
- getThumbImgDataAttrSelector?: string | string[] | ((img: HTMLImageElement) => string);
320
- getThumbImgDataAttrDelete?: 'auto' | string;
321
- getThumbImgDataStrategy: 'default' | 'auto';
322
- getThumbImgData(thumb: HTMLElement): {
323
- img?: HTMLImageElement;
324
- imgSrc?: string;
325
- };
347
+ thumb: Parameters<typeof ThumbDataParser.create>[0];
348
+ thumbDataParser: ThumbDataParser;
349
+ thumbImg: Parameters<typeof ThumbImgParser.create>[0];
350
+ thumbImgParser: ThumbImgParser;
351
+ thumbs: Parameters<typeof ThumbsParser.create>[0];
352
+ thumbsParser: ThumbsParser;
326
353
  containerSelector: string | (() => HTMLElement);
327
354
  containerSelectorLast?: string;
355
+ get container(): HTMLElement;
328
356
  intersectionObservableSelector?: string;
329
357
  get intersectionObservable(): "" | Element | null | undefined;
330
358
  get observable(): HTMLElement;
331
- get container(): HTMLElement;
332
- thumbsSelector: string;
333
- getThumbsStrategy: 'default' | 'auto';
334
- getThumbsTransform?: (thumb: HTMLElement) => void;
335
- getThumbs(html: HTMLElement): HTMLElement[];
336
359
  paginationStrategyOptions: Partial<PaginationStrategy>;
337
360
  paginationStrategy: PaginationStrategy;
361
+ dataManager: DataManager;
362
+ dataHomogenity: ConstructorParameters<typeof DataManager>[1];
338
363
  customDataSelectorFns: (Record<string, DataSelectorFn<any>> | string)[];
339
364
  animatePreview?: (doc: HTMLElement) => void;
340
365
  storeOptions?: JabroniTypes.StoreStateOptions;
341
- private createStore;
342
366
  schemeOptions: SchemeOptions;
343
- private createGui;
344
367
  store: JabronioStore;
345
368
  gui: JabronioGUI;
346
- dataManager: DataManager;
369
+ private createStore;
370
+ private createGui;
371
+ customGenerator?: OffsetGenerator;
347
372
  infiniteScroller?: InfiniteScroller;
348
373
  getPaginationData?: InfiniteScroller['getPaginationData'];
349
374
  private resetInfiniteScroller;
@@ -351,14 +376,12 @@ export declare class RulesGlobal {
351
376
  gropeInit(): void;
352
377
  get isEmbedded(): boolean;
353
378
  private setupStoreListeners;
354
- dataManagerOptions: Partial<DataManager>;
355
- private setupDataManager;
356
379
  private mutationObservers;
357
380
  resetOnPaginationOrContainerDeath: boolean;
358
381
  private resetOn;
359
382
  onResetCallback?: () => void;
360
383
  private reset;
361
- constructor(options: Partial<RulesGlobal>);
384
+ constructor(options: Partial<Rules>);
362
385
  }
363
386
 
364
387
  export declare function sanitizeStr(s: string): string;
@@ -367,13 +390,52 @@ declare type SchemeOptions = (Parameters<typeof setupScheme>[0][0] | JabroniType
367
390
 
368
391
  export declare function splitWith(s: string, c?: string): Array<string>;
369
392
 
370
- declare type ThumbData = {
371
- title: string;
372
- duration?: number;
373
- } & {
374
- [x: string]: string | boolean | number;
393
+ declare type ThumbData = Record<string, Primitive>;
394
+
395
+ export declare class ThumbDataParser {
396
+ strategy: 'manual' | 'auto-select' | 'auto-text';
397
+ selectors: ThumbDataSelectorsRaw;
398
+ callback?: ((thumb: HTMLElement, thumbData: ThumbData) => void) | undefined;
399
+ stringsMeltInTitle: boolean;
400
+ private autoParseText;
401
+ private preprocessCustomThumbDataSelectors;
402
+ private thumbDataSelectors;
403
+ private readonly defaultThumbDataSelectors;
404
+ private getThumbDataWith;
405
+ constructor(strategy?: 'manual' | 'auto-select' | 'auto-text', selectors?: ThumbDataSelectorsRaw, callback?: ((thumb: HTMLElement, thumbData: ThumbData) => void) | undefined, stringsMeltInTitle?: boolean);
406
+ static create(o?: Partial<Pick<ThumbDataParser, 'strategy' | 'selectors' | 'callback' | 'stringsMeltInTitle'>>): ThumbDataParser;
407
+ getThumbData(thumb: HTMLElement): ThumbData;
408
+ }
409
+
410
+ declare type ThumbDataSelector = {
411
+ name: string;
412
+ selector: string;
413
+ type: PrimitiveString;
375
414
  };
376
415
 
416
+ declare type ThumbDataSelectorsRaw = Record<string, string | Pick<ThumbDataSelector, 'selector' | 'type'>>;
417
+
418
+ export declare class ThumbImgParser {
419
+ selector?: string | string[] | ((img: HTMLImageElement) => string);
420
+ shouldDelete?: 'auto' | string;
421
+ strategy: 'default' | 'auto';
422
+ static create(options?: Partial<Pick<ThumbImgParser, 'selector' | 'shouldDelete' | 'strategy' | 'getImgData'>>): ThumbImgParser & Partial<Pick<ThumbImgParser, "selector" | "strategy" | "shouldDelete" | "getImgData">>;
423
+ getImgData(thumb: HTMLElement): {
424
+ img?: HTMLImageElement;
425
+ imgSrc?: string;
426
+ };
427
+ }
428
+
429
+ export declare class ThumbsParser {
430
+ containerSelector: string;
431
+ selector: string;
432
+ strategy: 'default' | 'auto';
433
+ transform?: (thumb: HTMLElement) => void;
434
+ static create(options: Partial<Pick<ThumbsParser, "selector" | "strategy" | "transform">> | undefined, containerSelector: string): ThumbsParser & Partial<Pick<ThumbsParser, "selector" | "strategy" | "transform">>;
435
+ constructor(containerSelector: string);
436
+ getThumbs(html: HTMLElement): HTMLElement[];
437
+ }
438
+
377
439
  export declare class Tick {
378
440
  private delay;
379
441
  private startImmediate;