billy-herrington-utils 1.4.7 → 1.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/billy-herrington-utils.es.js +28 -21
- package/dist/billy-herrington-utils.es.js.map +1 -1
- package/dist/billy-herrington-utils.umd.js +28 -21
- package/dist/billy-herrington-utils.umd.js.map +1 -1
- package/dist/index.d.ts +3 -7
- package/package.json +1 -1
- package/src/userscripts/data-manager/index.ts +7 -7
- package/src/userscripts/infinite-scroll/index.ts +2 -2
- package/src/userscripts/jabroni-outfit-wrap/index.ts +10 -11
- package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts +2 -2
- package/src/userscripts/rules/index.ts +6 -0
|
@@ -65,8 +65,8 @@ class DataFilter {
|
|
|
65
65
|
return (v) => {
|
|
66
66
|
const isPublic = !this.rules.isPrivate(v.element);
|
|
67
67
|
return {
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
condition: this.state.filterPublic && isPublic,
|
|
69
|
+
tag: "filter-public"
|
|
70
70
|
};
|
|
71
71
|
};
|
|
72
72
|
});
|
|
@@ -74,8 +74,8 @@ class DataFilter {
|
|
|
74
74
|
return (v) => {
|
|
75
75
|
const isPrivate = this.rules.isPrivate(v.element);
|
|
76
76
|
return {
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
condition: this.state.filterPrivate && isPrivate,
|
|
78
|
+
tag: "filter-private"
|
|
79
79
|
};
|
|
80
80
|
};
|
|
81
81
|
});
|
|
@@ -83,8 +83,8 @@ class DataFilter {
|
|
|
83
83
|
return (v) => {
|
|
84
84
|
const isHD = this.rules.isHD(v.element);
|
|
85
85
|
return {
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
condition: this.state.filterHD && isHD,
|
|
87
|
+
tag: "filter-hd"
|
|
88
88
|
};
|
|
89
89
|
};
|
|
90
90
|
});
|
|
@@ -92,8 +92,8 @@ class DataFilter {
|
|
|
92
92
|
return (v) => {
|
|
93
93
|
const notInRange = v.duration < this.state.filterDurationFrom || v.duration > this.state.filterDurationTo;
|
|
94
94
|
return {
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
condition: this.state.filterDuration && notInRange,
|
|
96
|
+
tag: "filter-duration"
|
|
97
97
|
};
|
|
98
98
|
};
|
|
99
99
|
});
|
|
@@ -102,8 +102,8 @@ class DataFilter {
|
|
|
102
102
|
return (v) => {
|
|
103
103
|
const containTags = tags.some((tag) => tag.test(v.title));
|
|
104
104
|
return {
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
condition: this.state.filterExclude && containTags,
|
|
106
|
+
tag: "filter-exclude"
|
|
107
107
|
};
|
|
108
108
|
};
|
|
109
109
|
});
|
|
@@ -112,8 +112,8 @@ class DataFilter {
|
|
|
112
112
|
return (v) => {
|
|
113
113
|
const containTagsNot = tags.some((tag) => !tag.test(v.title));
|
|
114
114
|
return {
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
condition: this.state.filterInclude && containTagsNot,
|
|
116
|
+
tag: "filter-include"
|
|
117
117
|
};
|
|
118
118
|
};
|
|
119
119
|
});
|
|
@@ -195,8 +195,8 @@ class DataManager {
|
|
|
195
195
|
const targets = [window, globalThis.unsafeWindow].filter(Boolean);
|
|
196
196
|
targets.forEach((w) => {
|
|
197
197
|
Object.assign(w, {
|
|
198
|
-
|
|
199
|
-
|
|
198
|
+
sortByDuration: () => this.sort("duration"),
|
|
199
|
+
sortByViews: () => this.sort("view")
|
|
200
200
|
});
|
|
201
201
|
});
|
|
202
202
|
}
|
|
@@ -398,14 +398,21 @@ class InfiniteScroller {
|
|
|
398
398
|
}
|
|
399
399
|
function createInfiniteScroller(store, parseData, rules) {
|
|
400
400
|
const enabled = store.state.infiniteScrollEnabled;
|
|
401
|
+
const paginationOffset = rules.paginationStrategy.getPaginationOffset();
|
|
402
|
+
const paginationElement = rules.paginationStrategy.getPaginationElement();
|
|
403
|
+
const paginationLast = rules.paginationStrategy.getPaginationLast();
|
|
404
|
+
const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
|
|
401
405
|
const iscroller = new InfiniteScroller({
|
|
402
406
|
enabled,
|
|
403
407
|
parseData,
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
408
|
+
paginationLast,
|
|
409
|
+
paginationOffset,
|
|
410
|
+
paginationElement,
|
|
411
|
+
paginationUrlGenerator,
|
|
412
|
+
...rules
|
|
413
|
+
}).onScroll(({ paginationLast: paginationLast2, paginationOffset: paginationOffset2 }) => {
|
|
414
|
+
store.localState.pagIndexLast = paginationLast2;
|
|
415
|
+
store.localState.pagIndexCur = paginationOffset2;
|
|
409
416
|
}, true);
|
|
410
417
|
store.subscribe(() => {
|
|
411
418
|
iscroller.enabled = store.state.infiniteScrollEnabled;
|
|
@@ -522,9 +529,9 @@ class PaginationStrategyDataParams extends PaginationStrategy {
|
|
|
522
529
|
const block_id = parametersElement?.getAttribute("data-block-id") || "";
|
|
523
530
|
const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
|
|
524
531
|
const attrs = {
|
|
525
|
-
mode: "async",
|
|
526
|
-
function: "get_block",
|
|
527
532
|
block_id,
|
|
533
|
+
function: "get_block",
|
|
534
|
+
mode: "async",
|
|
528
535
|
...parameters
|
|
529
536
|
};
|
|
530
537
|
Object.keys(attrs).forEach((k) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n ...rules,\n ...rules.paginationStrategy,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.es.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPublic && isPublic,\n tag: 'filter-public',\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPrivate && isPrivate,\n tag: 'filter-private',\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n condition: this.state.filterHD && isHD,\n tag: 'filter-hd',\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n condition: this.state.filterDuration && notInRange,\n tag: 'filter-duration',\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n condition: this.state.filterExclude && containTags,\n tag: 'filter-exclude',\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n condition: this.state.filterInclude && containTagsNot,\n tag: 'filter-include',\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByDuration: () => this.sort('duration'),\n sortByViews: () => this.sort('view'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay?: number;\n enabled?: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { IRules } from '../rules';\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const paginationOffset = rules.paginationStrategy.getPaginationOffset();\n const paginationElement = rules.paginationStrategy.getPaginationElement();\n const paginationLast = rules.paginationStrategy.getPaginationLast();\n const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n paginationLast,\n paginationOffset,\n paginationElement,\n paginationUrlGenerator,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n block_id,\n function: 'get_block',\n mode: 'async',\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer","paginationLast","paginationOffset"],"mappings":"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"}
|
|
@@ -69,8 +69,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
69
69
|
return (v) => {
|
|
70
70
|
const isPublic = !this.rules.isPrivate(v.element);
|
|
71
71
|
return {
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
condition: this.state.filterPublic && isPublic,
|
|
73
|
+
tag: "filter-public"
|
|
74
74
|
};
|
|
75
75
|
};
|
|
76
76
|
});
|
|
@@ -78,8 +78,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
78
78
|
return (v) => {
|
|
79
79
|
const isPrivate = this.rules.isPrivate(v.element);
|
|
80
80
|
return {
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
condition: this.state.filterPrivate && isPrivate,
|
|
82
|
+
tag: "filter-private"
|
|
83
83
|
};
|
|
84
84
|
};
|
|
85
85
|
});
|
|
@@ -87,8 +87,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
87
87
|
return (v) => {
|
|
88
88
|
const isHD = this.rules.isHD(v.element);
|
|
89
89
|
return {
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
condition: this.state.filterHD && isHD,
|
|
91
|
+
tag: "filter-hd"
|
|
92
92
|
};
|
|
93
93
|
};
|
|
94
94
|
});
|
|
@@ -96,8 +96,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
96
96
|
return (v) => {
|
|
97
97
|
const notInRange = v.duration < this.state.filterDurationFrom || v.duration > this.state.filterDurationTo;
|
|
98
98
|
return {
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
condition: this.state.filterDuration && notInRange,
|
|
100
|
+
tag: "filter-duration"
|
|
101
101
|
};
|
|
102
102
|
};
|
|
103
103
|
});
|
|
@@ -106,8 +106,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
106
106
|
return (v) => {
|
|
107
107
|
const containTags = tags.some((tag) => tag.test(v.title));
|
|
108
108
|
return {
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
condition: this.state.filterExclude && containTags,
|
|
110
|
+
tag: "filter-exclude"
|
|
111
111
|
};
|
|
112
112
|
};
|
|
113
113
|
});
|
|
@@ -116,8 +116,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
116
116
|
return (v) => {
|
|
117
117
|
const containTagsNot = tags.some((tag) => !tag.test(v.title));
|
|
118
118
|
return {
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
condition: this.state.filterInclude && containTagsNot,
|
|
120
|
+
tag: "filter-include"
|
|
121
121
|
};
|
|
122
122
|
};
|
|
123
123
|
});
|
|
@@ -199,8 +199,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
199
199
|
const targets = [window, globalThis.unsafeWindow].filter(Boolean);
|
|
200
200
|
targets.forEach((w) => {
|
|
201
201
|
Object.assign(w, {
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
sortByDuration: () => this.sort("duration"),
|
|
203
|
+
sortByViews: () => this.sort("view")
|
|
204
204
|
});
|
|
205
205
|
});
|
|
206
206
|
}
|
|
@@ -402,14 +402,21 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
402
402
|
}
|
|
403
403
|
function createInfiniteScroller(store, parseData, rules) {
|
|
404
404
|
const enabled = store.state.infiniteScrollEnabled;
|
|
405
|
+
const paginationOffset = rules.paginationStrategy.getPaginationOffset();
|
|
406
|
+
const paginationElement = rules.paginationStrategy.getPaginationElement();
|
|
407
|
+
const paginationLast = rules.paginationStrategy.getPaginationLast();
|
|
408
|
+
const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
|
|
405
409
|
const iscroller = new InfiniteScroller({
|
|
406
410
|
enabled,
|
|
407
411
|
parseData,
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
412
|
+
paginationLast,
|
|
413
|
+
paginationOffset,
|
|
414
|
+
paginationElement,
|
|
415
|
+
paginationUrlGenerator,
|
|
416
|
+
...rules
|
|
417
|
+
}).onScroll(({ paginationLast: paginationLast2, paginationOffset: paginationOffset2 }) => {
|
|
418
|
+
store.localState.pagIndexLast = paginationLast2;
|
|
419
|
+
store.localState.pagIndexCur = paginationOffset2;
|
|
413
420
|
}, true);
|
|
414
421
|
store.subscribe(() => {
|
|
415
422
|
iscroller.enabled = store.state.infiniteScrollEnabled;
|
|
@@ -526,9 +533,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
526
533
|
const block_id = parametersElement?.getAttribute("data-block-id") || "";
|
|
527
534
|
const parameters = parseDataParams(parametersElement?.getAttribute("data-parameters") || "");
|
|
528
535
|
const attrs = {
|
|
529
|
-
mode: "async",
|
|
530
|
-
function: "get_block",
|
|
531
536
|
block_id,
|
|
537
|
+
function: "get_block",
|
|
538
|
+
mode: "async",
|
|
532
539
|
...parameters
|
|
533
540
|
};
|
|
534
541
|
Object.keys(attrs).forEach((k) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-public',\n condition: this.state.filterPublic && isPublic,\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n tag: 'filter-private',\n condition: this.state.filterPrivate && isPrivate,\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n tag: 'filter-hd',\n condition: this.state.filterHD && isHD,\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n tag: 'filter-duration',\n condition: this.state.filterDuration && notInRange,\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n tag: 'filter-exclude',\n condition: this.state.filterExclude && containTags,\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n tag: 'filter-include',\n condition: this.state.filterInclude && containTagsNot,\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByViews: () => this.sort('view'),\n sortByDuration: () => this.sort('duration'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay: number;\n enabled: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { PaginationStrategy } from '../pagination-parsing/pagination-strategies';\n\ninterface IRules {\n paginationStrategy: PaginationStrategy;\n delay: number;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (n: number) => string;\n}\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n ...rules,\n ...rules.paginationStrategy,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n mode: 'async',\n function: 'get_block',\n block_id,\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"billy-herrington-utils.umd.js","sources":["../src/utils/observers/index.ts","../src/utils/strings/index.ts","../src/userscripts/data-manager/index.ts","../src/utils/dom/index.ts","../src/utils/fetch/index.ts","../src/userscripts/infinite-scroll/index.ts","../src/userscripts/jabroni-outfit-wrap/index.ts","../src/userscripts/pagination-parsing/pagination-utils/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategy.ts","../src/utils/parsers/index.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyPathnameParams.ts","../src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategySearchParams.ts","../src/userscripts/pagination-parsing/index.ts","../src/utils/arrays/index.ts","../src/utils/async/index.ts","../src/utils/device/index.ts","../src/utils/events/index.ts","../src/utils/math/index.ts"],"sourcesContent":["export class Observer {\n public observer: IntersectionObserver;\n constructor(private callback: (entry: Element) => void) {\n this.observer = new IntersectionObserver(this.handleIntersection.bind(this));\n }\n\n observe(target: Element) {\n this.observer.observe(target);\n }\n\n throttle(target: Element, throttleTime: number) {\n this.observer.unobserve(target);\n setTimeout(() => this.observer.observe(target), throttleTime);\n }\n\n handleIntersection(entries: Iterable<IntersectionObserverEntry>) {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.callback(entry.target);\n }\n }\n }\n\n static observeWhile(\n target: Element,\n callback: () => Promise<boolean> | boolean,\n throttleTime: number,\n ) {\n const observer_ = new Observer(async (target: Element) => {\n const condition = await callback();\n if (condition) observer_.throttle(target, throttleTime);\n });\n observer_.observe(target);\n return observer_;\n }\n}\n\nexport class LazyImgLoader {\n public lazyImgObserver: Observer;\n private attributeName = 'data-lazy-load';\n\n constructor(shouldDelazify: (target: Element) => boolean) {\n this.lazyImgObserver = new Observer((target: Element) => {\n if (shouldDelazify(target)) {\n this.delazify(target as HTMLImageElement);\n }\n });\n }\n\n lazify(_target: Element, img: HTMLImageElement, imgSrc: string) {\n if (!img || !imgSrc) return;\n img.setAttribute(this.attributeName, imgSrc);\n img.src = '';\n this.lazyImgObserver.observe(img);\n }\n\n delazify = (target: HTMLImageElement) => {\n this.lazyImgObserver.observer.unobserve(target);\n target.src = target.getAttribute(this.attributeName) as string;\n target.removeAttribute(this.attributeName);\n };\n}\n","export function stringToWords(s: string): Array<string> {\n return s.split(\",\").map(s => s.trim().toLowerCase()).filter(_ => _);\n}\n\nexport function sanitizeStr(s: string) {\n return s?.replace(/\\n|\\t/, ' ').replace(/ {2,}/, ' ').trim().toLowerCase() || \"\";\n}\n","import { LazyImgLoader } from '../../utils/observers';\nimport { stringToWords } from '../../utils/strings';\n\ninterface DataFilterState {\n filterPublic: boolean;\n filterPrivate: boolean;\n filterHD: boolean;\n filterDuration: boolean;\n filterDurationFrom: number;\n filterDurationTo: number;\n filterExclude: boolean;\n filterExcludeWords: string;\n filterInclude: boolean;\n filterIncludeWords: string;\n}\n\ninterface FilterResult {\n tag: string;\n condition: boolean;\n}\n\ntype FilterInput = Record<string, string | number | boolean | HTMLElement>;\ntype FilterFunction = (v: FilterInput) => FilterResult;\n\nclass DataFilter {\n public filters: { [key: string]: () => FilterFunction };\n\n constructor(\n private rules: IRules,\n private state: DataFilterState,\n ) {\n this.state = state;\n\n const methods = Object.getOwnPropertyNames(this);\n this.filters = methods.reduce((acc: { [key: string]: () => FilterFunction }, k) => {\n if (k in this.state) {\n acc[k] = this[k as keyof DataFilter] as unknown as () => FilterFunction;\n GM_addStyle(`.filter-${k.toLowerCase().slice(6)} { display: none !important; }`);\n }\n return acc;\n }, {});\n }\n\n filterPublic = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPublic = !this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPublic && isPublic,\n tag: 'filter-public',\n };\n };\n };\n\n filterPrivate = (): FilterFunction => {\n return (v: FilterInput) => {\n const isPrivate = this.rules.isPrivate(v.element as HTMLElement);\n return {\n condition: this.state.filterPrivate && isPrivate,\n tag: 'filter-private',\n };\n };\n };\n\n filterHD = (): FilterFunction => {\n return (v: FilterInput) => {\n const isHD = this.rules.isHD(v.element as HTMLElement);\n return {\n condition: this.state.filterHD && isHD,\n tag: 'filter-hd',\n };\n };\n };\n\n filterDuration = (): FilterFunction => {\n return (v: FilterInput) => {\n const notInRange =\n (v.duration as number) < this.state.filterDurationFrom ||\n (v.duration as number) > this.state.filterDurationTo;\n return {\n condition: this.state.filterDuration && notInRange,\n tag: 'filter-duration',\n };\n };\n };\n\n filterExclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterExcludeWords);\n return (v: FilterInput) => {\n const containTags = tags.some((tag) => tag.test(v.title as string));\n return {\n condition: this.state.filterExclude && containTags,\n tag: 'filter-exclude',\n };\n };\n };\n\n filterInclude = (): FilterFunction => {\n const tags = DataManager.filterDSLToRegex(this.state.filterIncludeWords);\n return (v: FilterInput) => {\n const containTagsNot = tags.some((tag) => !tag.test(v.title as string));\n return {\n condition: this.state.filterInclude && containTagsNot,\n tag: 'filter-include',\n };\n };\n };\n}\n\ninterface IRules {\n getThumbs: (html: HTMLElement) => HTMLElement[];\n getThumbUrl: (thumbElement: HTMLElement) => string;\n getThumbData: (thumbElement: HTMLElement) => { title: string; duration: number };\n getThumbImgData: (thumbElement: HTMLElement) => { img: HTMLElement; imgSrc: string };\n container: HTMLElement;\n isPrivate: (element: HTMLElement) => boolean;\n isHD: (element: HTMLElement) => boolean;\n}\n\nexport class DataManager {\n private rules: IRules;\n private state: DataFilterState;\n private data: Map<string, FilterInput>;\n private lazyImgLoader: LazyImgLoader;\n public dataFilters: { [key: string]: () => FilterFunction };\n\n constructor(rules: IRules, state: DataFilterState) {\n this.rules = rules;\n this.state = state;\n this.data = new Map();\n this.lazyImgLoader = new LazyImgLoader(\n (target: Element) => !this.isFiltered(target as HTMLElement),\n );\n this.dataFilters = new DataFilter(rules, state).filters;\n\n const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);\n targets.forEach((w: any) => {\n Object.assign(w, {\n sortByDuration: () => this.sort('duration'),\n sortByViews: () => this.sort('view'),\n });\n });\n }\n\n static filterDSLToRegex(str: string): RegExp[] {\n const toFullWord = (w: string) => `(^|\\\\ )${w}($|\\\\ )`;\n const str_ = str.replace(/f:(\\w+)/g, (_, w) => toFullWord(w));\n return stringToWords(str_).map((expr: string) => new RegExp(expr, 'i'));\n }\n\n isFiltered(el: HTMLElement): boolean {\n return el.className.includes('filtered');\n }\n\n applyFilters = (filters: { [key: string]: boolean }, offset = 0): void => {\n const filtersToApply = Object.keys(filters)\n .filter((k) => Object.hasOwn(this.dataFilters, k))\n .map((k) => this.dataFilters[k]());\n\n if (filtersToApply.length === 0) return;\n\n const updates: (() => void)[] = [];\n let offset_counter = 1;\n for (const v of this.data.values()) {\n if (++offset_counter > offset) {\n for (const f of filtersToApply) {\n const { tag, condition } = f(v as FilterInput);\n updates.push(() => (v.element as HTMLElement).classList.toggle(tag, condition));\n }\n }\n }\n\n requestAnimationFrame(() => {\n updates.forEach((update) => {\n update();\n });\n });\n };\n\n filterAll = (offset?: number): void => {\n const filters = Object.assign(\n {},\n ...Object.keys(this.dataFilters).map((f) => ({\n [f]: this.state[f as keyof DataFilterState],\n })),\n );\n this.applyFilters(filters, offset);\n };\n\n parseData = (\n html: HTMLElement,\n container?: HTMLElement,\n removeDuplicates = false,\n shouldLazify = true,\n ): void => {\n const thumbs = this.rules.getThumbs(html);\n const data_offset = this.data.size;\n\n for (const thumbElement of thumbs) {\n const url = this.rules.getThumbUrl(thumbElement);\n if (!url || this.data.has(url)) {\n if (removeDuplicates) thumbElement.remove();\n continue;\n }\n\n const data = this.rules.getThumbData(thumbElement);\n this.data.set(url, { element: thumbElement, ...data });\n\n if (shouldLazify) {\n const { img, imgSrc } = this.rules.getThumbImgData(thumbElement);\n this.lazyImgLoader.lazify(thumbElement, img as HTMLImageElement, imgSrc);\n }\n\n const parent = container || this.rules.container;\n if (!parent.contains(thumbElement)) parent.appendChild(thumbElement);\n }\n\n this.filterAll(data_offset);\n };\n\n sort(propName: string) {\n if (this.data.size < 2) return;\n\n const sorted = Array.from(this.data.keys()).sort((b, a) => {\n return (\n ((this.data.get(a) as FilterInput)[propName] as number) -\n ((this.data.get(b) as FilterInput)[propName] as number)\n );\n });\n\n const container = ((this.data.get(sorted[0]) as FilterInput).element as HTMLElement)\n .parentElement as HTMLElement;\n\n sorted.forEach((s) => {\n const e = (this.data.get(s) as FilterInput).element as HTMLElement;\n container.append(e);\n });\n }\n}\n","export function parseDom(html: string): HTMLElement {\n const parsed = new DOMParser().parseFromString(html, 'text/html').body;\n return parsed.children.length > 1 ? parsed : parsed.firstElementChild as HTMLElement;\n}\n\nexport function copyAttributes(target: HTMLElement | Element, source: HTMLElement | Element) {\n for (const attr of source.attributes) {\n attr.nodeValue && target.setAttribute(attr.nodeName, attr.nodeValue);\n }\n}\n\nexport function replaceElementTag(e: HTMLElement | Element, tagName: string) {\n const newTagElement = document.createElement(tagName);\n copyAttributes(newTagElement, e);\n newTagElement.innerHTML = e.innerHTML;\n e.parentNode?.replaceChild(newTagElement, e);\n return newTagElement;\n}\n\nexport function getAllUniqueParents(elements: HTMLCollection): Array<HTMLElement | Element> {\n return Array.from(elements).reduce((acc, v) => {\n if (v.parentElement && !acc.includes(v.parentElement as HTMLElement)) { acc.push(v.parentElement); }\n return acc;\n }, [] as Array<HTMLElement | Element>);\n}\n\nexport function findNextSibling(el: HTMLElement | Element) {\n if (el.nextElementSibling) return el.nextElementSibling;\n if (el.parentElement) return findNextSibling(el.parentElement);\n return null;\n}\n\nexport function waitForElementExists(parent: HTMLElement | Element, selector: string, callback: (el: Element) => void): void {\n const observer = new MutationObserver((_mutations) => {\n const el = parent.querySelector(selector);\n if (el) {\n observer.disconnect();\n callback(el);\n }\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function watchElementChildrenCount(element: HTMLElement | Element,\n callback: (observer: MutationObserver, count: number) => void): void {\n let count = element.children.length;\n const observer = new MutationObserver((mutationList, observer) => {\n for (const mutation of mutationList) {\n if (mutation.type === \"childList\") {\n if (count !== element.children.length) {\n count = element.children.length;\n callback(observer, count);\n }\n }\n }\n });\n observer.observe(element, { childList: true });\n}\n\nexport function watchDomChangesWithThrottle(\n element: HTMLElement | Element, \n callback: () => void,\n throttle = 1000,\n times = Infinity,\n options: Record<string, boolean> = { childList: true, subtree: true, attributes: true }\n) {\n let lastMutationTime: number;\n let timeout: number;\n let times_ = times;\n const observer = new MutationObserver((_mutationList, _observer) => {\n if (times_ !== Infinity && times_ < 1) {\n observer.disconnect();\n return;\n }\n times_--;\n const now = Date.now();\n if (lastMutationTime && now - lastMutationTime < throttle) {\n timeout && clearTimeout(timeout);\n }\n timeout = setTimeout(callback, throttle);\n lastMutationTime = now;\n });\n observer.observe(element, options);\n return observer;\n}\n\nexport function downloader(options = { append: \"\", after: \"\", button: \"\", cbBefore: () => { } }) {\n const btn = parseDom(options.button);\n\n if (options.append) document.querySelector(options.append)?.append(btn);\n if (options.after) document.querySelector(options.after)?.after(btn);\n\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n\n if (options.cbBefore) options.cbBefore();\n\n waitForElementExists(document.body, 'video', (video: Element) => {\n window.location.href = video.getAttribute('src') as string;\n });\n });\n}\n\nexport function exterminateVideo(video: HTMLVideoElement) {\n video.removeAttribute('src');\n video.load();\n video.remove();\n}","import { parseDom } from '../dom';\n\nexport const MOBILE_UA = [\n 'Mozilla/5.0 (Linux; Android 10; K)',\n 'AppleWebKit/537.36 (KHTML, like Gecko)',\n 'Chrome/114.0.0.0 Mobile Safari/537.36',\n].join(' ');\n\nexport function fetchWith(\n url: string,\n options: Record<string, boolean> = { html: false, mobile: false },\n) {\n const reqOpts = {};\n if (options.mobile) Object.assign(reqOpts, { headers: new Headers({ 'User-Agent': MOBILE_UA }) });\n return fetch(url, reqOpts)\n .then((r) => r.text())\n .then((r) => (options.html ? parseDom(r) : r));\n}\n\nexport const fetchHtml = (url: string) => fetchWith(url, { html: true }) as Promise<HTMLElement>;\n\nexport const fetchText = (url: string) => fetchWith(url) as Promise<string>;\n\nexport function objectToFormData(object: Record<string, number | boolean | string>): FormData {\n const formData = new FormData();\n Object.entries(object).forEach(([k, v]) => formData.append(k, v as string));\n return formData;\n}\n","import { fetchHtml } from '../../utils/fetch';\nimport { Observer } from '../../utils/observers';\n\ninterface IInfiniteScroller {\n delay?: number;\n enabled?: boolean;\n writeHistory?: boolean;\n paginationOffset: number;\n paginationLast: number;\n paginationElement: HTMLElement;\n paginationUrlGenerator: (offset: number) => string;\n parseData: (document: HTMLElement) => void;\n intersectionObservable?: HTMLElement;\n alternativeGenerator?: () => OffsetGenerator;\n}\n\ninterface GeneratorResult {\n url: string;\n offset: number;\n}\n\ntype OffsetGenerator = Generator<GeneratorResult> | AsyncGenerator<GeneratorResult>;\n\nexport class InfiniteScroller {\n public paginationGenerator: OffsetGenerator;\n public enabled: boolean;\n public delay: number;\n public paginationOffset: number;\n public paginationLast: number;\n public writeHistory: boolean;\n private parseData: (document: HTMLElement) => void;\n\n constructor({\n enabled = true,\n delay = 300,\n writeHistory = false,\n paginationOffset,\n paginationLast,\n paginationElement,\n paginationUrlGenerator,\n parseData,\n alternativeGenerator,\n intersectionObservable,\n }: IInfiniteScroller) {\n this.enabled = enabled;\n this.delay = delay;\n this.writeHistory = writeHistory;\n this.paginationOffset = paginationOffset;\n this.paginationLast = paginationLast;\n this.parseData = parseData;\n\n this.paginationGenerator =\n alternativeGenerator?.() ??\n InfiniteScroller.createPaginationGenerator(\n paginationOffset,\n paginationLast,\n paginationUrlGenerator,\n );\n\n const observable = intersectionObservable || paginationElement;\n Observer.observeWhile(observable, this.generatorConsumer, this.delay);\n }\n\n private onScrollCBs: Array<(scroller: InfiniteScroller) => void> = [];\n\n public onScroll(callback: (scroller: InfiniteScroller) => void, initCall = false) {\n if (initCall) callback(this);\n this.onScrollCBs.push(callback);\n return this;\n }\n\n private _onScroll() {\n this.onScrollCBs.forEach((cb) => {\n cb(this);\n });\n }\n\n generatorConsumer = async () => {\n if (!this.enabled) return false;\n const { value: { url, offset } = {}, done } = await this.paginationGenerator.next();\n if (!done) {\n const nextPageHTML = await fetchHtml(url);\n const prevScrollPos = document.documentElement.scrollTop;\n this.paginationOffset = offset;\n this.parseData(nextPageHTML);\n this._onScroll();\n window.scrollTo(0, prevScrollPos);\n if (this.writeHistory) {\n history.replaceState({}, '', url);\n }\n }\n return !done;\n };\n\n static *createPaginationGenerator(\n currentPage: number,\n totalPages: number,\n generateURL: (offset: number) => string,\n ): OffsetGenerator {\n for (let offset = currentPage + 1; offset <= totalPages; offset++) {\n const url = generateURL(offset);\n yield { url, offset };\n }\n }\n}\n","import { InfiniteScroller } from '../infinite-scroll';\nimport type { IRules } from '../rules';\n\nexport interface JabroniStore {\n state: Record<string, boolean | string | number>;\n localState: Record<string, boolean | string | number>;\n subscribe: (callback: () => void) => void;\n}\n\nexport function createInfiniteScroller(\n store: JabroniStore,\n parseData: (document: HTMLElement) => void,\n rules: IRules,\n) {\n const enabled = store.state.infiniteScrollEnabled as boolean;\n\n const paginationOffset = rules.paginationStrategy.getPaginationOffset();\n const paginationElement = rules.paginationStrategy.getPaginationElement();\n const paginationLast = rules.paginationStrategy.getPaginationLast();\n const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();\n\n const iscroller = new InfiniteScroller({\n enabled,\n parseData,\n paginationLast,\n paginationOffset,\n paginationElement,\n paginationUrlGenerator,\n ...rules,\n }).onScroll(({ paginationLast, paginationOffset }) => {\n store.localState.pagIndexLast = paginationLast;\n store.localState.pagIndexCur = paginationOffset;\n }, true);\n\n store.subscribe(() => {\n iscroller.enabled = store.state.infiniteScrollEnabled as boolean;\n });\n\n return iscroller;\n}\n","export function getPaginationLinks(\n doc: HTMLElement | Document = document,\n url: Location | URL | string = location.href,\n pathnameSelector = /\\/(page\\/)?\\d+\\/?$/,\n): string[] {\n const currentUrl = parseURL(url);\n currentUrl.pathname = currentUrl.pathname.replace(pathnameSelector, '/');\n const pageLinks = Array.from(\n (doc.querySelectorAll('a[href]') as NodeListOf<HTMLAnchorElement>) || [],\n (a) => a.href,\n ).filter((h) => {\n try {\n const linkUrl = new URL(h.replace(/#$/, ''), doc.baseURI || currentUrl.origin);\n return (\n linkUrl.origin === currentUrl.origin && linkUrl.pathname.startsWith(currentUrl.pathname)\n );\n } catch {\n return false;\n }\n });\n return pageLinks;\n}\n\nexport function parseURL(s: HTMLAnchorElement | Location | URL | string): URL {\n if (typeof s === 'string') return new URL(s);\n return new URL(s.href);\n}\n","import { parseURL } from '../pagination-utils';\n\nexport interface IPaginationStrategy {\n url?: URL | Location | string;\n doc?: Document | HTMLElement;\n paginationSelector?: string;\n fixPaginationLast?: (n: number, offset?: number) => number;\n pathnameSelector?: RegExp;\n searchParamSelector?: string;\n offsetMin?: number;\n}\n\nexport class PaginationStrategy {\n public doc = document;\n public url: URL;\n public paginationSelector = '.pagination';\n public fixPaginationLast?: (n: number, offset?: number) => number;\n public offsetMin = 1;\n\n constructor(options?: IPaginationStrategy) {\n if (options) {\n Object.entries(options).forEach(([k, v]) => {\n Object.assign(this, { [k]: v });\n });\n }\n\n this.url = parseURL(options?.url || this.doc.URL);\n }\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n getPaginationOffset() {\n return this.offsetMin;\n }\n getPaginationLast() {\n return this.offsetMin;\n }\n\n getPaginationUrlGenerator() {\n return (_: number) => this.url.href;\n }\n}\n","export function formatTimeToHHMMSS(timeString: string): string {\n const regex: RegExp = /(?:(\\d+)\\s*h\\s*)?(?:(\\d+)\\s*mi?n?\\s*)?(?:(\\d+)\\s*sec)?/;\n const match: RegExpMatchArray | null = timeString.match(regex);\n const h: number = parseInt(match?.[1] || '0');\n const m: number = parseInt(match?.[2] || '0');\n const s: number = parseInt(match?.[3] || '0');\n const pad = (num: number): string => String(num).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\n// \"01:22:03\" -> 4923\nexport function timeToSeconds(t: string): number {\n const r = /sec|min|h|m/.test(t) ? formatTimeToHHMMSS(t) : t;\n return (r?.match(/\\d+/gm) || [0])\n .reverse()\n .map((s, i) => parseInt(s as string) * 60 ** i)\n .reduce((a, b) => a + b);\n}\n\nexport function parseIntegerOr(n: string | number, or: number): number {\n return (num => Number.isNaN(num) ? or : num)(parseInt(n as string));\n}\n\n// \"data:02;body+head:async;void:;zero:;\"\nexport function parseDataParams(str: string): Record<string, string> {\n const paramsStr = decodeURI(str.trim()).split(';');\n return paramsStr.reduce((acc, s) => {\n const parsed = s.match(/([\\+\\w]+):([\\w\\-\\ ]+)?/);\n if (parsed) {\n const [, key, value] = parsed;\n if (value) {\n key.split('+').forEach(p => { acc[p] = value; });\n }\n }\n return acc;\n }, {} as Record<string, string>);\n}\n\nexport function parseCSSUrl(s: string) {\n return s.replace(/url\\(\"|\\\"\\).*/g, '');\n}\n","import { parseDataParams } from '../../../utils/parsers';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategyDataParams extends PaginationStrategy {\n getPaginationLast() {\n const links = this.getPaginationElement()?.querySelectorAll('[data-parameters *= from]');\n const pages = Array.from(links || [], (l) => {\n const p = l.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n });\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n const link = this.getPaginationElement()?.querySelector(\n '.prev[data-parameters *= from], .prev [data-parameters *= from]',\n );\n if (!link) return this.offsetMin;\n const p = link.getAttribute('data-parameters');\n const v = p?.match(/from\\w*:(\\d+)/)?.[1] || this.offsetMin.toString();\n return parseInt(v);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const parametersElement = this.getPaginationElement()?.querySelector(\n 'a[data-block-id][data-parameters]',\n );\n const block_id = parametersElement?.getAttribute('data-block-id') || '';\n const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');\n\n const attrs: Record<string, string> = {\n block_id,\n function: 'get_block',\n mode: 'async',\n ...parameters,\n };\n\n Object.keys(attrs).forEach((k) => {\n url.searchParams.set(k, attrs[k]);\n });\n\n const paginationUrlGenerator = (n: number) => {\n Object.keys(attrs).forEach((k) => {\n k.includes('from') && url.searchParams.set(k, n.toString());\n });\n url.searchParams.set('_', Date.now().toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\n// const fixPaginationLast = (n) => {\n// if difference < 9 = 999\n// }\n// maybe update doc after scroll to fix issues\n\nexport class PaginationStrategyPathnameParams extends PaginationStrategy {\n public pathnameSelector = /\\/(\\d+)\\/?$/;\n\n extractPage = (a: HTMLAnchorElement | Location | string): number => {\n const href = typeof a === 'string' ? a : a.href;\n const { pathname } = new URL(href, this.doc.baseURI || this.url.origin);\n return parseInt(pathname.match(this.pathnameSelector)?.pop() || this.offsetMin.toString());\n };\n\n getPaginationLast() {\n const links = getPaginationLinks(\n this.getPaginationElement(),\n this.url.href,\n this.pathnameSelector,\n );\n const pages = Array.from(links, this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n return this.extractPage(this.url.href);\n }\n\n getPaginationUrlGenerator(url_: URL = this.url) {\n const url = new URL(url_.href);\n\n const pathnameSelectorPlaceholder = this.pathnameSelector\n .toString()\n .replace(/[/|\\\\|$|?|(|)]+/g, '/');\n\n if (!this.pathnameSelector.test(url.pathname)) {\n url.pathname = url.pathname\n .concat(pathnameSelectorPlaceholder.replace(/d\\+/, this.offsetMin.toString()))\n .replace(/\\/{2,}/g, '/');\n }\n\n const paginationUrlGenerator = (offset: number) => {\n url.pathname = url.pathname.replace(\n this.pathnameSelector,\n pathnameSelectorPlaceholder.replace(/d\\+/, offset.toString()),\n );\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import { getPaginationLinks } from '../pagination-utils';\nimport { PaginationStrategy } from './PaginationStrategy';\n\nexport class PaginationStrategySearchParams extends PaginationStrategy {\n public searchParamSelector = 'page';\n\n getPaginationElement() {\n return (this.doc.querySelector(this.paginationSelector) || this.doc) as HTMLElement;\n }\n\n extractPage(a: HTMLAnchorElement | Location | URL | string): number {\n const href = typeof a === 'string' ? a : a.href;\n const p = new URL(href).searchParams.get(this.searchParamSelector) as string;\n return parseInt(p) || this.offsetMin;\n }\n\n getPaginationLast() {\n const links = getPaginationLinks(this.getPaginationElement(), this.url.href).filter((h) =>\n /(page|p)=\\d+/.test(h),\n );\n const pages = links.map(this.extractPage);\n const lastPage = Math.max(...pages, this.offsetMin);\n if (this.fixPaginationLast) return this.fixPaginationLast(lastPage);\n return lastPage;\n }\n\n getPaginationOffset() {\n if (this.doc === document) {\n return this.extractPage(this.url);\n }\n const link = this.getPaginationElement().querySelector(\n `a.active[href *= \"${this.searchParamSelector}=\"]`,\n ) as HTMLAnchorElement;\n return this.extractPage(link);\n }\n\n getPaginationUrlGenerator() {\n const url = new URL(this.url.href);\n\n const paginationUrlGenerator = (offset: number) => {\n url.searchParams.set(this.searchParamSelector, offset.toString());\n return url.href;\n };\n\n return paginationUrlGenerator;\n }\n}\n","import {\n type IPaginationStrategy,\n PaginationStrategy,\n PaginationStrategyDataParams,\n PaginationStrategyPathnameParams,\n PaginationStrategySearchParams,\n} from './pagination-strategies';\nimport { getPaginationLinks } from './pagination-utils';\n\nexport function getPaginationStrategy(options: IPaginationStrategy) {\n const { doc = document, url = location.href } = options;\n const pageLinks = getPaginationLinks(doc, url);\n\n console.log({ pageLinks });\n\n const getStrategy = (): typeof PaginationStrategy => {\n if (pageLinks.some((h) => /(page|p)=\\d+/.test(h))) {\n const l = pageLinks.filter((h) => /(page|p)=\\d+/.test(h));\n console.log('PaginationStrategySearchParams', l);\n return PaginationStrategySearchParams;\n }\n\n if (pageLinks.some((h) => /\\/(page\\/)?\\d+\\/?$/.test(h))) {\n const l = pageLinks.filter((h) => /\\/(page\\/)?\\d+\\/?$/.test(h));\n console.log('PaginationStrategyPathnameParams', l);\n return PaginationStrategyPathnameParams;\n }\n\n const type5Links = Array.from(document.querySelectorAll('[data-parameters *= from]'));\n if (type5Links.length > 0) {\n console.log('PaginationStrategyDataParams', type5Links);\n return PaginationStrategyDataParams;\n }\n\n console.error('Found No Strategy');\n return PaginationStrategy;\n };\n\n const paginationStrategy = new (getStrategy())(options);\n\n return paginationStrategy;\n}\n\n// const p = new PaginationStrategyPathnameParams();\n\n// console.table({\n// pagination: `class:${p.getPaginationElement().className} + id:${p.getPaginationElement().id}`,\n// last: p.getPaginationLast(),\n// offset: p.getPaginationOffset(),\n// generator: p.getPaginationUrlGenerator()(1488),\n// });\n","export function chunks<T>(arr: Array<T>, n: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => arr.slice(i * n, i * n + n));\n}\n\nexport function range(size: number, startAt: number = 1, step: number = 1): number[] {\n return Array.from({ length: size }, (_, index) => startAt + index * step);\n}\n","// https://2ality.com/2016/10/asynchronous-iteration.html\nexport async function computeAsyncOneAtTime(iterable: Iterable<() => Promise<void>>) {\n const res = [];\n for await (const f of iterable) {\n res.push(await f());\n }\n return res;\n}\n\nexport function wait(milliseconds: number) {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n\ninterface AsyncPoolTask {\n v: () => Promise<void>;\n p: number;\n}\n\nexport class AsyncPool {\n private cur = 0;\n private finished: Promise<boolean>;\n private _resolve?: (value: boolean | PromiseLike<boolean>) => void;\n\n public static async doNAsyncAtOnce(max = 1, pool: Array<AsyncPoolTask | (() => Promise<void>)> = []) {\n const spool = new AsyncPool(max);\n pool.forEach(f => spool.push(f));\n return spool.run();\n }\n\n constructor(private max = 1, private pool: Array<AsyncPoolTask> = []) {\n this.finished = new Promise((resolve) => {\n this._resolve = resolve;\n });\n }\n\n private getHighPriorityFirst(p = 0): (() => Promise<void>) | undefined {\n if (p > 3 || this.pool.length === 0) return undefined;\n const i = this.pool.findIndex((e) => e.p === p);\n if (i >= 0) {\n const res = this.pool[i].v;\n this.pool.splice(i, 1);\n return res;\n }\n return this.getHighPriorityFirst(p + 1);\n }\n\n private async runTask() {\n this.cur++;\n const f = this.getHighPriorityFirst();\n await f?.();\n this.cur--;\n this.runTasks();\n }\n\n private runTasks() {\n if (!this.pool.length) {\n this._resolve?.(true);\n return;\n }\n if (this.cur < this.max) {\n this.runTask();\n this.runTasks();\n }\n }\n\n public async run() {\n this.runTasks();\n return this.finished;\n }\n\n public push(x: AsyncPoolTask | (() => Promise<void>)) {\n this.pool.push('p' in x ? x : { v: x, p: 0 });\n }\n}\n\n","export function isMob() {\n return /iPhone|Android/i.test(navigator.userAgent);\n}","export function listenEvents(dom: HTMLElement | Element, events: Array<string>, callback: (e: Event) => void): void {\n for (const e of events) {\n dom.addEventListener(e, callback, true);\n }\n}\n\nexport class Tick {\n private tick?: number;\n private callbackFinal?: () => void;\n\n constructor(private delay: number, private startImmediate: boolean = true) {}\n\n public start(callback: () => void, callbackFinal?: () => void): void {\n this.stop();\n this.callbackFinal = callbackFinal;\n if (this.startImmediate) callback();\n this.tick = window.setInterval(callback, this.delay);\n }\n\n public stop(): void {\n if (this.tick !== undefined) {\n clearInterval(this.tick);\n this.tick = undefined;\n }\n if (this.callbackFinal) {\n this.callbackFinal();\n this.callbackFinal = undefined;\n }\n }\n}\n","export function circularShift(n: number, c = 6, s = 1): number {\n return (n + s) % c || c;\n}\n"],"names":["target","s","observer","paginationLast","paginationOffset"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -96,8 +96,8 @@ export declare function getAllUniqueParents(elements: HTMLCollection): Array<HTM
|
|
|
96
96
|
export declare function getPaginationStrategy(options: IPaginationStrategy): PaginationStrategy;
|
|
97
97
|
|
|
98
98
|
declare interface IInfiniteScroller {
|
|
99
|
-
delay
|
|
100
|
-
enabled
|
|
99
|
+
delay?: number;
|
|
100
|
+
enabled?: boolean;
|
|
101
101
|
writeHistory?: boolean;
|
|
102
102
|
paginationOffset: number;
|
|
103
103
|
paginationLast: number;
|
|
@@ -152,11 +152,7 @@ declare interface IRules {
|
|
|
152
152
|
|
|
153
153
|
declare interface IRules_2 {
|
|
154
154
|
paginationStrategy: PaginationStrategy;
|
|
155
|
-
delay
|
|
156
|
-
paginationOffset: number;
|
|
157
|
-
paginationLast: number;
|
|
158
|
-
paginationElement: HTMLElement;
|
|
159
|
-
paginationUrlGenerator: (n: number) => string;
|
|
155
|
+
delay?: number;
|
|
160
156
|
}
|
|
161
157
|
|
|
162
158
|
export declare function isMob(): boolean;
|
package/package.json
CHANGED
|
@@ -45,8 +45,8 @@ class DataFilter {
|
|
|
45
45
|
return (v: FilterInput) => {
|
|
46
46
|
const isPublic = !this.rules.isPrivate(v.element as HTMLElement);
|
|
47
47
|
return {
|
|
48
|
-
tag: 'filter-public',
|
|
49
48
|
condition: this.state.filterPublic && isPublic,
|
|
49
|
+
tag: 'filter-public',
|
|
50
50
|
};
|
|
51
51
|
};
|
|
52
52
|
};
|
|
@@ -55,8 +55,8 @@ class DataFilter {
|
|
|
55
55
|
return (v: FilterInput) => {
|
|
56
56
|
const isPrivate = this.rules.isPrivate(v.element as HTMLElement);
|
|
57
57
|
return {
|
|
58
|
-
tag: 'filter-private',
|
|
59
58
|
condition: this.state.filterPrivate && isPrivate,
|
|
59
|
+
tag: 'filter-private',
|
|
60
60
|
};
|
|
61
61
|
};
|
|
62
62
|
};
|
|
@@ -65,8 +65,8 @@ class DataFilter {
|
|
|
65
65
|
return (v: FilterInput) => {
|
|
66
66
|
const isHD = this.rules.isHD(v.element as HTMLElement);
|
|
67
67
|
return {
|
|
68
|
-
tag: 'filter-hd',
|
|
69
68
|
condition: this.state.filterHD && isHD,
|
|
69
|
+
tag: 'filter-hd',
|
|
70
70
|
};
|
|
71
71
|
};
|
|
72
72
|
};
|
|
@@ -77,8 +77,8 @@ class DataFilter {
|
|
|
77
77
|
(v.duration as number) < this.state.filterDurationFrom ||
|
|
78
78
|
(v.duration as number) > this.state.filterDurationTo;
|
|
79
79
|
return {
|
|
80
|
-
tag: 'filter-duration',
|
|
81
80
|
condition: this.state.filterDuration && notInRange,
|
|
81
|
+
tag: 'filter-duration',
|
|
82
82
|
};
|
|
83
83
|
};
|
|
84
84
|
};
|
|
@@ -88,8 +88,8 @@ class DataFilter {
|
|
|
88
88
|
return (v: FilterInput) => {
|
|
89
89
|
const containTags = tags.some((tag) => tag.test(v.title as string));
|
|
90
90
|
return {
|
|
91
|
-
tag: 'filter-exclude',
|
|
92
91
|
condition: this.state.filterExclude && containTags,
|
|
92
|
+
tag: 'filter-exclude',
|
|
93
93
|
};
|
|
94
94
|
};
|
|
95
95
|
};
|
|
@@ -99,8 +99,8 @@ class DataFilter {
|
|
|
99
99
|
return (v: FilterInput) => {
|
|
100
100
|
const containTagsNot = tags.some((tag) => !tag.test(v.title as string));
|
|
101
101
|
return {
|
|
102
|
-
tag: 'filter-include',
|
|
103
102
|
condition: this.state.filterInclude && containTagsNot,
|
|
103
|
+
tag: 'filter-include',
|
|
104
104
|
};
|
|
105
105
|
};
|
|
106
106
|
};
|
|
@@ -135,8 +135,8 @@ export class DataManager {
|
|
|
135
135
|
const targets = [window, (globalThis as any).unsafeWindow].filter(Boolean);
|
|
136
136
|
targets.forEach((w: any) => {
|
|
137
137
|
Object.assign(w, {
|
|
138
|
-
sortByViews: () => this.sort('view'),
|
|
139
138
|
sortByDuration: () => this.sort('duration'),
|
|
139
|
+
sortByViews: () => this.sort('view'),
|
|
140
140
|
});
|
|
141
141
|
});
|
|
142
142
|
}
|
|
@@ -2,8 +2,8 @@ import { fetchHtml } from '../../utils/fetch';
|
|
|
2
2
|
import { Observer } from '../../utils/observers';
|
|
3
3
|
|
|
4
4
|
interface IInfiniteScroller {
|
|
5
|
-
delay
|
|
6
|
-
enabled
|
|
5
|
+
delay?: number;
|
|
6
|
+
enabled?: boolean;
|
|
7
7
|
writeHistory?: boolean;
|
|
8
8
|
paginationOffset: number;
|
|
9
9
|
paginationLast: number;
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import { InfiniteScroller } from '../infinite-scroll';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
interface IRules {
|
|
5
|
-
paginationStrategy: PaginationStrategy;
|
|
6
|
-
delay: number;
|
|
7
|
-
paginationOffset: number;
|
|
8
|
-
paginationLast: number;
|
|
9
|
-
paginationElement: HTMLElement;
|
|
10
|
-
paginationUrlGenerator: (n: number) => string;
|
|
11
|
-
}
|
|
2
|
+
import type { IRules } from '../rules';
|
|
12
3
|
|
|
13
4
|
export interface JabroniStore {
|
|
14
5
|
state: Record<string, boolean | string | number>;
|
|
@@ -23,11 +14,19 @@ export function createInfiniteScroller(
|
|
|
23
14
|
) {
|
|
24
15
|
const enabled = store.state.infiniteScrollEnabled as boolean;
|
|
25
16
|
|
|
17
|
+
const paginationOffset = rules.paginationStrategy.getPaginationOffset();
|
|
18
|
+
const paginationElement = rules.paginationStrategy.getPaginationElement();
|
|
19
|
+
const paginationLast = rules.paginationStrategy.getPaginationLast();
|
|
20
|
+
const paginationUrlGenerator = rules.paginationStrategy.getPaginationUrlGenerator();
|
|
21
|
+
|
|
26
22
|
const iscroller = new InfiniteScroller({
|
|
27
23
|
enabled,
|
|
28
24
|
parseData,
|
|
25
|
+
paginationLast,
|
|
26
|
+
paginationOffset,
|
|
27
|
+
paginationElement,
|
|
28
|
+
paginationUrlGenerator,
|
|
29
29
|
...rules,
|
|
30
|
-
...rules.paginationStrategy,
|
|
31
30
|
}).onScroll(({ paginationLast, paginationOffset }) => {
|
|
32
31
|
store.localState.pagIndexLast = paginationLast;
|
|
33
32
|
store.localState.pagIndexCur = paginationOffset;
|
package/src/userscripts/pagination-parsing/pagination-strategies/PaginationStrategyDataParams.ts
CHANGED
|
@@ -34,9 +34,9 @@ export class PaginationStrategyDataParams extends PaginationStrategy {
|
|
|
34
34
|
const parameters = parseDataParams(parametersElement?.getAttribute('data-parameters') || '');
|
|
35
35
|
|
|
36
36
|
const attrs: Record<string, string> = {
|
|
37
|
-
mode: 'async',
|
|
38
|
-
function: 'get_block',
|
|
39
37
|
block_id,
|
|
38
|
+
function: 'get_block',
|
|
39
|
+
mode: 'async',
|
|
40
40
|
...parameters,
|
|
41
41
|
};
|
|
42
42
|
|