pervert-monkey 1.0.11 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +22 -11
  2. package/dist/core/pervertmonkey.core.es.d.ts +25 -16
  3. package/dist/core/pervertmonkey.core.es.js +712 -61
  4. package/dist/core/pervertmonkey.core.es.js.map +1 -1
  5. package/dist/core/pervertmonkey.core.umd.js +712 -61
  6. package/dist/core/pervertmonkey.core.umd.js.map +1 -1
  7. package/dist/userscripts/3hentai.user.js +19 -26
  8. package/dist/userscripts/camgirlfinder.user.js +2 -2
  9. package/dist/userscripts/camwhores.user.js +12 -16
  10. package/dist/userscripts/e-hentai.user.js +3 -4
  11. package/dist/userscripts/ebalka.user.js +6 -11
  12. package/dist/userscripts/eporner.user.js +11 -16
  13. package/dist/userscripts/erome.user.js +2 -2
  14. package/dist/userscripts/eroprofile.user.js +2 -2
  15. package/dist/userscripts/javhdporn.user.js +2 -2
  16. package/dist/userscripts/missav.user.js +2 -2
  17. package/dist/userscripts/motherless.user.js +22 -42
  18. package/dist/userscripts/namethatporn.user.js +5 -4
  19. package/dist/userscripts/nhentai.user.js +3 -3
  20. package/dist/userscripts/obmenvsem.user.js +18 -4
  21. package/dist/userscripts/pornhub.user.js +9 -12
  22. package/dist/userscripts/spankbang.user.js +6 -38
  23. package/dist/userscripts/thisvid.user.js +20 -22
  24. package/dist/userscripts/xhamster.user.js +13 -16
  25. package/dist/userscripts/xvideos.user.js +7 -12
  26. package/package.json +1 -1
  27. package/src/core/data-handler/data-manager.ts +4 -4
  28. package/src/core/jabroni-config/index.ts +3 -2
  29. package/src/core/jabroni-config/jabroni-gui-controller.ts +61 -0
  30. package/src/core/parsers/thumb-data-parser.ts +10 -1
  31. package/src/core/rules/index.ts +12 -39
  32. package/src/userscripts/index.ts +1 -1
  33. package/src/userscripts/scripts/3hentai.ts +20 -24
  34. package/src/userscripts/scripts/camgirlfinder.ts +1 -1
  35. package/src/userscripts/scripts/camwhores.ts +10 -17
  36. package/src/userscripts/scripts/e-hentai.ts +1 -1
  37. package/src/userscripts/scripts/ebalka.ts +7 -12
  38. package/src/userscripts/scripts/eporner.ts +8 -14
  39. package/src/userscripts/scripts/erome.ts +1 -1
  40. package/src/userscripts/scripts/eroprofile.ts +3 -3
  41. package/src/userscripts/scripts/javhdporn.ts +1 -1
  42. package/src/userscripts/scripts/missav.ts +1 -1
  43. package/src/userscripts/scripts/motherless.ts +19 -48
  44. package/src/userscripts/scripts/namethatporn.ts +1 -1
  45. package/src/userscripts/scripts/nhentai.ts +1 -1
  46. package/src/userscripts/scripts/obmenvsem.ts +1 -1
  47. package/src/userscripts/scripts/pornhub.ts +1 -1
  48. package/src/userscripts/scripts/spankbang.ts +1 -1
  49. package/src/userscripts/scripts/thisvid.ts +18 -19
  50. package/src/userscripts/scripts/xhamster.ts +10 -11
  51. package/src/userscripts/scripts/xvideos.ts +6 -11
  52. package/src/utils/dom/index.ts +10 -0
  53. package/src/utils/events/on-hover.ts +17 -25
  54. package/src/utils/events/tick.ts +1 -3
  55. package/src/utils/parsers/index.ts +16 -0
@@ -242,36 +242,28 @@ function downloader(options = { append: "", after: "", button: "", cbBefore: ()
242
242
  });
243
243
  }
244
244
  class OnHover {
245
- constructor(container, subjectSelector, onOver, onLeave) {
245
+ constructor(container, targetSelector, onOver) {
246
246
  __publicField(this, "target");
247
- __publicField(this, "leaveSubject");
248
- __publicField(this, "onOverFinally");
247
+ __publicField(this, "onOverCallback");
249
248
  this.container = container;
250
- this.subjectSelector = subjectSelector;
249
+ this.targetSelector = targetSelector;
251
250
  this.onOver = onOver;
252
- this.onLeave = onLeave;
253
- this.container.addEventListener("pointerover", (e) => this.handleEvent(e));
251
+ this.container.addEventListener("pointerover", (e) => this.handleHover(e));
254
252
  }
255
- handleLeaveEvent() {
256
- var _a3, _b2;
257
- (_a3 = this.onLeave) == null ? void 0 : _a3.call(this, this.target);
258
- (_b2 = this.onOverFinally) == null ? void 0 : _b2.call(this);
253
+ handleLeave() {
254
+ var _a3;
255
+ (_a3 = this.onOverCallback) == null ? void 0 : _a3.call(this);
256
+ this.onOverCallback = void 0;
259
257
  this.target = void 0;
260
- this.onOverFinally = void 0;
261
- this.leaveSubject = void 0;
262
258
  }
263
- handleEvent(e) {
259
+ handleHover(e) {
264
260
  var _a3;
265
- const currentTarget = e.target;
266
- if (!this.subjectSelector(currentTarget) || this.target === currentTarget) return;
267
- (_a3 = this.leaveSubject) == null ? void 0 : _a3.dispatchEvent(new PointerEvent("pointerleave"));
268
- this.target = currentTarget;
269
- const result = this.onOver(this.target);
270
- this.onOverFinally = result == null ? void 0 : result.onOverCallback;
271
- this.leaveSubject = (result == null ? void 0 : result.leaveTarget) || this.target;
272
- this.leaveSubject.addEventListener("pointerleave", (_2) => this.handleLeaveEvent(), {
273
- once: true
274
- });
261
+ const newTarget = e.target.closest(this.targetSelector);
262
+ if (!newTarget || this.target === newTarget) return;
263
+ (_a3 = this.target) == null ? void 0 : _a3.dispatchEvent(new PointerEvent("pointerleave"));
264
+ this.target = newTarget;
265
+ this.onOverCallback = this.onOver(this.target);
266
+ this.target.addEventListener("pointerleave", () => this.handleLeave(), { once: true });
275
267
  }
276
268
  static create(...args) {
277
269
  return new OnHover(...args);
@@ -291,12 +283,11 @@ class Tick {
291
283
  this.tick = window.setInterval(callback, this.delay);
292
284
  }
293
285
  stop() {
286
+ var _a3;
294
287
  if (this.tick !== void 0) {
295
288
  clearInterval(this.tick);
296
289
  this.tick = void 0;
297
- }
298
- if (this.callbackFinal) {
299
- this.callbackFinal();
290
+ (_a3 = this.callbackFinal) == null ? void 0 : _a3.call(this);
300
291
  this.callbackFinal = void 0;
301
292
  }
302
293
  }
@@ -403,6 +394,18 @@ function parseIntegerOr(n, or2) {
403
394
  const num = Number(n);
404
395
  return Number.isSafeInteger(num) ? num : or2;
405
396
  }
397
+ function parseNumberWithLetter(str) {
398
+ var _a3;
399
+ const multipliers = { k: 1e3, m: 1e6 };
400
+ const match = str.trim().match(/^([\d.]+)(\w)?$/);
401
+ if (!match) return 0;
402
+ const num = parseFloat(match[1]);
403
+ const suffix = (_a3 = match[2]) == null ? void 0 : _a3.toLowerCase();
404
+ if (suffix && suffix in multipliers) {
405
+ return num * multipliers[suffix];
406
+ }
407
+ return num;
408
+ }
406
409
  function parseDataParams(str) {
407
410
  const paramsStr = decodeURI(str.trim()).split(";");
408
411
  return paramsStr.reduce(
@@ -524,7 +527,7 @@ __publicField(_DataFilter, "customDataSelectorFnsDefault", {
524
527
  });
525
528
  let DataFilter = _DataFilter;
526
529
  class DataManager {
527
- constructor(rules, parseDataParentHomogenity) {
530
+ constructor(rules, parentHomogenity) {
528
531
  __publicField(this, "data", /* @__PURE__ */ new Map());
529
532
  __publicField(this, "lazyImgLoader", new LazyImgLoader(
530
533
  (target) => !DataFilter.isFiltered(target)
@@ -533,13 +536,13 @@ class DataManager {
533
536
  __publicField(this, "applyFilters", async (filters = {}, offset = 0) => {
534
537
  const filtersToApply = this.dataFilter.selectFilters(filters);
535
538
  if (filtersToApply.length === 0) return;
536
- const iterator = this.data.values().drop(offset);
539
+ const iterator2 = this.data.values().drop(offset);
537
540
  let finished = false;
538
541
  await new Promise((resolve) => {
539
542
  function runBatch(deadline) {
540
543
  const updates = [];
541
544
  while (deadline.timeRemaining() > 0) {
542
- const { value, done } = iterator.next();
545
+ const { value, done } = iterator2.next();
543
546
  finished = !!done;
544
547
  if (done) break;
545
548
  for (const f of filtersToApply) {
@@ -575,13 +578,13 @@ class DataManager {
575
578
  const dataOffset = this.data.size;
576
579
  const fragment = document.createDocumentFragment();
577
580
  const parent = container || this.rules.container;
578
- const homogenity = !!this.parseDataParentHomogenity;
581
+ const homogenity = !!this.parentHomogenity;
579
582
  for (const thumbElement of thumbs) {
580
- const url = this.rules.getThumbUrl(thumbElement);
583
+ const url = this.rules.thumbDataParser.getUrl(thumbElement);
581
584
  if (!url || this.data.has(url) || parent !== container && (parent == null ? void 0 : parent.contains(thumbElement)) || homogenity && !checkHomogenity(
582
585
  parent,
583
586
  thumbElement.parentElement,
584
- this.parseDataParentHomogenity
587
+ this.parentHomogenity
585
588
  )) {
586
589
  if (removeDuplicates) thumbElement.remove();
587
590
  continue;
@@ -601,7 +604,7 @@ class DataManager {
601
604
  });
602
605
  });
603
606
  this.rules = rules;
604
- this.parseDataParentHomogenity = parseDataParentHomogenity;
607
+ this.parentHomogenity = parentHomogenity;
605
608
  this.dataFilter = new DataFilter(this.rules);
606
609
  }
607
610
  sortBy(key, direction = true) {
@@ -635,6 +638,102 @@ function __extends(d2, b2) {
635
638
  }
636
639
  d2.prototype = b2 === null ? Object.create(b2) : (__.prototype = b2.prototype, new __());
637
640
  }
641
+ function __awaiter(thisArg, _arguments, P2, generator) {
642
+ function adopt(value) {
643
+ return value instanceof P2 ? value : new P2(function(resolve) {
644
+ resolve(value);
645
+ });
646
+ }
647
+ return new (P2 || (P2 = Promise))(function(resolve, reject) {
648
+ function fulfilled(value) {
649
+ try {
650
+ step(generator.next(value));
651
+ } catch (e) {
652
+ reject(e);
653
+ }
654
+ }
655
+ function rejected(value) {
656
+ try {
657
+ step(generator["throw"](value));
658
+ } catch (e) {
659
+ reject(e);
660
+ }
661
+ }
662
+ function step(result) {
663
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
664
+ }
665
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
666
+ });
667
+ }
668
+ function __generator(thisArg, body) {
669
+ var _2 = { label: 0, sent: function() {
670
+ if (t[0] & 1) throw t[1];
671
+ return t[1];
672
+ }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
673
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
674
+ return this;
675
+ }), g;
676
+ function verb(n) {
677
+ return function(v2) {
678
+ return step([n, v2]);
679
+ };
680
+ }
681
+ function step(op2) {
682
+ if (f) throw new TypeError("Generator is already executing.");
683
+ while (g && (g = 0, op2[0] && (_2 = 0)), _2) try {
684
+ if (f = 1, y && (t = op2[0] & 2 ? y["return"] : op2[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op2[1])).done) return t;
685
+ if (y = 0, t) op2 = [op2[0] & 2, t.value];
686
+ switch (op2[0]) {
687
+ case 0:
688
+ case 1:
689
+ t = op2;
690
+ break;
691
+ case 4:
692
+ _2.label++;
693
+ return { value: op2[1], done: false };
694
+ case 5:
695
+ _2.label++;
696
+ y = op2[1];
697
+ op2 = [0];
698
+ continue;
699
+ case 7:
700
+ op2 = _2.ops.pop();
701
+ _2.trys.pop();
702
+ continue;
703
+ default:
704
+ if (!(t = _2.trys, t = t.length > 0 && t[t.length - 1]) && (op2[0] === 6 || op2[0] === 2)) {
705
+ _2 = 0;
706
+ continue;
707
+ }
708
+ if (op2[0] === 3 && (!t || op2[1] > t[0] && op2[1] < t[3])) {
709
+ _2.label = op2[1];
710
+ break;
711
+ }
712
+ if (op2[0] === 6 && _2.label < t[1]) {
713
+ _2.label = t[1];
714
+ t = op2;
715
+ break;
716
+ }
717
+ if (t && _2.label < t[2]) {
718
+ _2.label = t[2];
719
+ _2.ops.push(op2);
720
+ break;
721
+ }
722
+ if (t[2]) _2.ops.pop();
723
+ _2.trys.pop();
724
+ continue;
725
+ }
726
+ op2 = body.call(thisArg, _2);
727
+ } catch (e) {
728
+ op2 = [6, e];
729
+ y = 0;
730
+ } finally {
731
+ f = t = 0;
732
+ }
733
+ if (op2[0] & 5) throw op2[1];
734
+ return { value: op2[0] ? op2[1] : void 0, done: true };
735
+ }
736
+ }
638
737
  function __values(o) {
639
738
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
640
739
  if (m) return m.call(o);
@@ -672,6 +771,69 @@ function __spreadArray(to2, from, pack) {
672
771
  }
673
772
  return to2.concat(ar2 || Array.prototype.slice.call(from));
674
773
  }
774
+ function __await(v2) {
775
+ return this instanceof __await ? (this.v = v2, this) : new __await(v2);
776
+ }
777
+ function __asyncGenerator(thisArg, _arguments, generator) {
778
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
779
+ var g = generator.apply(thisArg, _arguments || []), i, q2 = [];
780
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() {
781
+ return this;
782
+ }, i;
783
+ function awaitReturn(f) {
784
+ return function(v2) {
785
+ return Promise.resolve(v2).then(f, reject);
786
+ };
787
+ }
788
+ function verb(n, f) {
789
+ if (g[n]) {
790
+ i[n] = function(v2) {
791
+ return new Promise(function(a2, b2) {
792
+ q2.push([n, v2, a2, b2]) > 1 || resume(n, v2);
793
+ });
794
+ };
795
+ if (f) i[n] = f(i[n]);
796
+ }
797
+ }
798
+ function resume(n, v2) {
799
+ try {
800
+ step(g[n](v2));
801
+ } catch (e) {
802
+ settle(q2[0][3], e);
803
+ }
804
+ }
805
+ function step(r) {
806
+ r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q2[0][2], r);
807
+ }
808
+ function fulfill(value) {
809
+ resume("next", value);
810
+ }
811
+ function reject(value) {
812
+ resume("throw", value);
813
+ }
814
+ function settle(f, v2) {
815
+ if (f(v2), q2.shift(), q2.length) resume(q2[0][0], q2[0][1]);
816
+ }
817
+ }
818
+ function __asyncValues(o) {
819
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
820
+ var m = o[Symbol.asyncIterator], i;
821
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
822
+ return this;
823
+ }, i);
824
+ function verb(n) {
825
+ i[n] = o[n] && function(v2) {
826
+ return new Promise(function(resolve, reject) {
827
+ v2 = o[n](v2), settle(resolve, reject, v2.done, v2.value);
828
+ });
829
+ };
830
+ }
831
+ function settle(resolve, reject, d2, v2) {
832
+ Promise.resolve(v2).then(function(v3) {
833
+ resolve({ value: v3, done: d2 });
834
+ }, reject);
835
+ }
836
+ }
675
837
  typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
676
838
  var e = new Error(message);
677
839
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
@@ -1112,6 +1274,69 @@ function isObserver(value) {
1112
1274
  function isSubscriber(value) {
1113
1275
  return value && value instanceof Subscriber || isObserver(value) && isSubscription(value);
1114
1276
  }
1277
+ function hasLift(source) {
1278
+ return isFunction(source === null || source === void 0 ? void 0 : source.lift);
1279
+ }
1280
+ function operate(init) {
1281
+ return function(source) {
1282
+ if (hasLift(source)) {
1283
+ return source.lift(function(liftedSource) {
1284
+ try {
1285
+ return init(liftedSource, this);
1286
+ } catch (err) {
1287
+ this.error(err);
1288
+ }
1289
+ });
1290
+ }
1291
+ throw new TypeError("Unable to lift unknown Observable type");
1292
+ };
1293
+ }
1294
+ function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
1295
+ return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
1296
+ }
1297
+ var OperatorSubscriber = (function(_super) {
1298
+ __extends(OperatorSubscriber2, _super);
1299
+ function OperatorSubscriber2(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
1300
+ var _this = _super.call(this, destination) || this;
1301
+ _this.onFinalize = onFinalize;
1302
+ _this.shouldUnsubscribe = shouldUnsubscribe;
1303
+ _this._next = onNext ? function(value) {
1304
+ try {
1305
+ onNext(value);
1306
+ } catch (err) {
1307
+ destination.error(err);
1308
+ }
1309
+ } : _super.prototype._next;
1310
+ _this._error = onError ? function(err) {
1311
+ try {
1312
+ onError(err);
1313
+ } catch (err2) {
1314
+ destination.error(err2);
1315
+ } finally {
1316
+ this.unsubscribe();
1317
+ }
1318
+ } : _super.prototype._error;
1319
+ _this._complete = onComplete ? function() {
1320
+ try {
1321
+ onComplete();
1322
+ } catch (err) {
1323
+ destination.error(err);
1324
+ } finally {
1325
+ this.unsubscribe();
1326
+ }
1327
+ } : _super.prototype._complete;
1328
+ return _this;
1329
+ }
1330
+ OperatorSubscriber2.prototype.unsubscribe = function() {
1331
+ var _a3;
1332
+ if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
1333
+ var closed_1 = this.closed;
1334
+ _super.prototype.unsubscribe.call(this);
1335
+ !closed_1 && ((_a3 = this.onFinalize) === null || _a3 === void 0 ? void 0 : _a3.call(this));
1336
+ }
1337
+ };
1338
+ return OperatorSubscriber2;
1339
+ })(Subscriber);
1115
1340
  var ObjectUnsubscribedError = createErrorClass(function(_super) {
1116
1341
  return function ObjectUnsubscribedErrorImpl() {
1117
1342
  _super(this);
@@ -1272,6 +1497,404 @@ var AnonymousSubject = (function(_super) {
1272
1497
  };
1273
1498
  return AnonymousSubject2;
1274
1499
  })(Subject);
1500
+ var dateTimestampProvider = {
1501
+ now: function() {
1502
+ return (dateTimestampProvider.delegate || Date).now();
1503
+ },
1504
+ delegate: void 0
1505
+ };
1506
+ var ReplaySubject = (function(_super) {
1507
+ __extends(ReplaySubject2, _super);
1508
+ function ReplaySubject2(_bufferSize, _windowTime, _timestampProvider) {
1509
+ if (_bufferSize === void 0) {
1510
+ _bufferSize = Infinity;
1511
+ }
1512
+ if (_windowTime === void 0) {
1513
+ _windowTime = Infinity;
1514
+ }
1515
+ if (_timestampProvider === void 0) {
1516
+ _timestampProvider = dateTimestampProvider;
1517
+ }
1518
+ var _this = _super.call(this) || this;
1519
+ _this._bufferSize = _bufferSize;
1520
+ _this._windowTime = _windowTime;
1521
+ _this._timestampProvider = _timestampProvider;
1522
+ _this._buffer = [];
1523
+ _this._infiniteTimeWindow = true;
1524
+ _this._infiniteTimeWindow = _windowTime === Infinity;
1525
+ _this._bufferSize = Math.max(1, _bufferSize);
1526
+ _this._windowTime = Math.max(1, _windowTime);
1527
+ return _this;
1528
+ }
1529
+ ReplaySubject2.prototype.next = function(value) {
1530
+ var _a3 = this, isStopped = _a3.isStopped, _buffer = _a3._buffer, _infiniteTimeWindow = _a3._infiniteTimeWindow, _timestampProvider = _a3._timestampProvider, _windowTime = _a3._windowTime;
1531
+ if (!isStopped) {
1532
+ _buffer.push(value);
1533
+ !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
1534
+ }
1535
+ this._trimBuffer();
1536
+ _super.prototype.next.call(this, value);
1537
+ };
1538
+ ReplaySubject2.prototype._subscribe = function(subscriber) {
1539
+ this._throwIfClosed();
1540
+ this._trimBuffer();
1541
+ var subscription = this._innerSubscribe(subscriber);
1542
+ var _a3 = this, _infiniteTimeWindow = _a3._infiniteTimeWindow, _buffer = _a3._buffer;
1543
+ var copy = _buffer.slice();
1544
+ for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
1545
+ subscriber.next(copy[i]);
1546
+ }
1547
+ this._checkFinalizedStatuses(subscriber);
1548
+ return subscription;
1549
+ };
1550
+ ReplaySubject2.prototype._trimBuffer = function() {
1551
+ var _a3 = this, _bufferSize = _a3._bufferSize, _timestampProvider = _a3._timestampProvider, _buffer = _a3._buffer, _infiniteTimeWindow = _a3._infiniteTimeWindow;
1552
+ var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
1553
+ _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
1554
+ if (!_infiniteTimeWindow) {
1555
+ var now = _timestampProvider.now();
1556
+ var last = 0;
1557
+ for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
1558
+ last = i;
1559
+ }
1560
+ last && _buffer.splice(0, last + 1);
1561
+ }
1562
+ };
1563
+ return ReplaySubject2;
1564
+ })(Subject);
1565
+ var isArrayLike = (function(x2) {
1566
+ return x2 && typeof x2.length === "number" && typeof x2 !== "function";
1567
+ });
1568
+ function isPromise(value) {
1569
+ return isFunction(value === null || value === void 0 ? void 0 : value.then);
1570
+ }
1571
+ function isInteropObservable(input) {
1572
+ return isFunction(input[observable]);
1573
+ }
1574
+ function isAsyncIterable(obj) {
1575
+ return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);
1576
+ }
1577
+ function createInvalidObservableTypeError(input) {
1578
+ return new TypeError("You provided " + (input !== null && typeof input === "object" ? "an invalid object" : "'" + input + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
1579
+ }
1580
+ function getSymbolIterator() {
1581
+ if (typeof Symbol !== "function" || !Symbol.iterator) {
1582
+ return "@@iterator";
1583
+ }
1584
+ return Symbol.iterator;
1585
+ }
1586
+ var iterator = getSymbolIterator();
1587
+ function isIterable(input) {
1588
+ return isFunction(input === null || input === void 0 ? void 0 : input[iterator]);
1589
+ }
1590
+ function readableStreamLikeToAsyncGenerator(readableStream) {
1591
+ return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {
1592
+ var reader, _a3, value, done;
1593
+ return __generator(this, function(_b2) {
1594
+ switch (_b2.label) {
1595
+ case 0:
1596
+ reader = readableStream.getReader();
1597
+ _b2.label = 1;
1598
+ case 1:
1599
+ _b2.trys.push([1, , 9, 10]);
1600
+ _b2.label = 2;
1601
+ case 2:
1602
+ return [4, __await(reader.read())];
1603
+ case 3:
1604
+ _a3 = _b2.sent(), value = _a3.value, done = _a3.done;
1605
+ if (!done) return [3, 5];
1606
+ return [4, __await(void 0)];
1607
+ case 4:
1608
+ return [2, _b2.sent()];
1609
+ case 5:
1610
+ return [4, __await(value)];
1611
+ case 6:
1612
+ return [4, _b2.sent()];
1613
+ case 7:
1614
+ _b2.sent();
1615
+ return [3, 2];
1616
+ case 8:
1617
+ return [3, 10];
1618
+ case 9:
1619
+ reader.releaseLock();
1620
+ return [7];
1621
+ case 10:
1622
+ return [2];
1623
+ }
1624
+ });
1625
+ });
1626
+ }
1627
+ function isReadableStreamLike(obj) {
1628
+ return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
1629
+ }
1630
+ function innerFrom(input) {
1631
+ if (input instanceof Observable) {
1632
+ return input;
1633
+ }
1634
+ if (input != null) {
1635
+ if (isInteropObservable(input)) {
1636
+ return fromInteropObservable(input);
1637
+ }
1638
+ if (isArrayLike(input)) {
1639
+ return fromArrayLike(input);
1640
+ }
1641
+ if (isPromise(input)) {
1642
+ return fromPromise(input);
1643
+ }
1644
+ if (isAsyncIterable(input)) {
1645
+ return fromAsyncIterable(input);
1646
+ }
1647
+ if (isIterable(input)) {
1648
+ return fromIterable(input);
1649
+ }
1650
+ if (isReadableStreamLike(input)) {
1651
+ return fromReadableStreamLike(input);
1652
+ }
1653
+ }
1654
+ throw createInvalidObservableTypeError(input);
1655
+ }
1656
+ function fromInteropObservable(obj) {
1657
+ return new Observable(function(subscriber) {
1658
+ var obs = obj[observable]();
1659
+ if (isFunction(obs.subscribe)) {
1660
+ return obs.subscribe(subscriber);
1661
+ }
1662
+ throw new TypeError("Provided object does not correctly implement Symbol.observable");
1663
+ });
1664
+ }
1665
+ function fromArrayLike(array) {
1666
+ return new Observable(function(subscriber) {
1667
+ for (var i = 0; i < array.length && !subscriber.closed; i++) {
1668
+ subscriber.next(array[i]);
1669
+ }
1670
+ subscriber.complete();
1671
+ });
1672
+ }
1673
+ function fromPromise(promise) {
1674
+ return new Observable(function(subscriber) {
1675
+ promise.then(function(value) {
1676
+ if (!subscriber.closed) {
1677
+ subscriber.next(value);
1678
+ subscriber.complete();
1679
+ }
1680
+ }, function(err) {
1681
+ return subscriber.error(err);
1682
+ }).then(null, reportUnhandledError);
1683
+ });
1684
+ }
1685
+ function fromIterable(iterable) {
1686
+ return new Observable(function(subscriber) {
1687
+ var e_1, _a3;
1688
+ try {
1689
+ for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {
1690
+ var value = iterable_1_1.value;
1691
+ subscriber.next(value);
1692
+ if (subscriber.closed) {
1693
+ return;
1694
+ }
1695
+ }
1696
+ } catch (e_1_1) {
1697
+ e_1 = { error: e_1_1 };
1698
+ } finally {
1699
+ try {
1700
+ if (iterable_1_1 && !iterable_1_1.done && (_a3 = iterable_1.return)) _a3.call(iterable_1);
1701
+ } finally {
1702
+ if (e_1) throw e_1.error;
1703
+ }
1704
+ }
1705
+ subscriber.complete();
1706
+ });
1707
+ }
1708
+ function fromAsyncIterable(asyncIterable) {
1709
+ return new Observable(function(subscriber) {
1710
+ process(asyncIterable, subscriber).catch(function(err) {
1711
+ return subscriber.error(err);
1712
+ });
1713
+ });
1714
+ }
1715
+ function fromReadableStreamLike(readableStream) {
1716
+ return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
1717
+ }
1718
+ function process(asyncIterable, subscriber) {
1719
+ var asyncIterable_1, asyncIterable_1_1;
1720
+ var e_2, _a3;
1721
+ return __awaiter(this, void 0, void 0, function() {
1722
+ var value, e_2_1;
1723
+ return __generator(this, function(_b2) {
1724
+ switch (_b2.label) {
1725
+ case 0:
1726
+ _b2.trys.push([0, 5, 6, 11]);
1727
+ asyncIterable_1 = __asyncValues(asyncIterable);
1728
+ _b2.label = 1;
1729
+ case 1:
1730
+ return [4, asyncIterable_1.next()];
1731
+ case 2:
1732
+ if (!(asyncIterable_1_1 = _b2.sent(), !asyncIterable_1_1.done)) return [3, 4];
1733
+ value = asyncIterable_1_1.value;
1734
+ subscriber.next(value);
1735
+ if (subscriber.closed) {
1736
+ return [2];
1737
+ }
1738
+ _b2.label = 3;
1739
+ case 3:
1740
+ return [3, 1];
1741
+ case 4:
1742
+ return [3, 11];
1743
+ case 5:
1744
+ e_2_1 = _b2.sent();
1745
+ e_2 = { error: e_2_1 };
1746
+ return [3, 11];
1747
+ case 6:
1748
+ _b2.trys.push([6, , 9, 10]);
1749
+ if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a3 = asyncIterable_1.return))) return [3, 8];
1750
+ return [4, _a3.call(asyncIterable_1)];
1751
+ case 7:
1752
+ _b2.sent();
1753
+ _b2.label = 8;
1754
+ case 8:
1755
+ return [3, 10];
1756
+ case 9:
1757
+ if (e_2) throw e_2.error;
1758
+ return [7];
1759
+ case 10:
1760
+ return [7];
1761
+ case 11:
1762
+ subscriber.complete();
1763
+ return [2];
1764
+ }
1765
+ });
1766
+ });
1767
+ }
1768
+ function map(project, thisArg) {
1769
+ return operate(function(source, subscriber) {
1770
+ var index = 0;
1771
+ source.subscribe(createOperatorSubscriber(subscriber, function(value) {
1772
+ subscriber.next(project.call(thisArg, value, index++));
1773
+ }));
1774
+ });
1775
+ }
1776
+ function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {
1777
+ return function(source, subscriber) {
1778
+ var hasState = hasSeed;
1779
+ var state = seed;
1780
+ var index = 0;
1781
+ source.subscribe(createOperatorSubscriber(subscriber, function(value) {
1782
+ var i = index++;
1783
+ state = hasState ? accumulator(state, value, i) : (hasState = true, value);
1784
+ subscriber.next(state);
1785
+ }, emitBeforeComplete));
1786
+ };
1787
+ }
1788
+ function scan(accumulator, seed) {
1789
+ return operate(scanInternals(accumulator, seed, arguments.length >= 2, true));
1790
+ }
1791
+ function share(options) {
1792
+ if (options === void 0) {
1793
+ options = {};
1794
+ }
1795
+ var _a3 = options.connector, connector = _a3 === void 0 ? function() {
1796
+ return new Subject();
1797
+ } : _a3, _b2 = options.resetOnError, resetOnError = _b2 === void 0 ? true : _b2, _c2 = options.resetOnComplete, resetOnComplete = _c2 === void 0 ? true : _c2, _d2 = options.resetOnRefCountZero, resetOnRefCountZero = _d2 === void 0 ? true : _d2;
1798
+ return function(wrapperSource) {
1799
+ var connection;
1800
+ var resetConnection;
1801
+ var subject;
1802
+ var refCount = 0;
1803
+ var hasCompleted = false;
1804
+ var hasErrored = false;
1805
+ var cancelReset = function() {
1806
+ resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();
1807
+ resetConnection = void 0;
1808
+ };
1809
+ var reset = function() {
1810
+ cancelReset();
1811
+ connection = subject = void 0;
1812
+ hasCompleted = hasErrored = false;
1813
+ };
1814
+ var resetAndUnsubscribe = function() {
1815
+ var conn = connection;
1816
+ reset();
1817
+ conn === null || conn === void 0 ? void 0 : conn.unsubscribe();
1818
+ };
1819
+ return operate(function(source, subscriber) {
1820
+ refCount++;
1821
+ if (!hasErrored && !hasCompleted) {
1822
+ cancelReset();
1823
+ }
1824
+ var dest = subject = subject !== null && subject !== void 0 ? subject : connector();
1825
+ subscriber.add(function() {
1826
+ refCount--;
1827
+ if (refCount === 0 && !hasErrored && !hasCompleted) {
1828
+ resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
1829
+ }
1830
+ });
1831
+ dest.subscribe(subscriber);
1832
+ if (!connection && refCount > 0) {
1833
+ connection = new SafeSubscriber({
1834
+ next: function(value) {
1835
+ return dest.next(value);
1836
+ },
1837
+ error: function(err) {
1838
+ hasErrored = true;
1839
+ cancelReset();
1840
+ resetConnection = handleReset(reset, resetOnError, err);
1841
+ dest.error(err);
1842
+ },
1843
+ complete: function() {
1844
+ hasCompleted = true;
1845
+ cancelReset();
1846
+ resetConnection = handleReset(reset, resetOnComplete);
1847
+ dest.complete();
1848
+ }
1849
+ });
1850
+ innerFrom(source).subscribe(connection);
1851
+ }
1852
+ })(wrapperSource);
1853
+ };
1854
+ }
1855
+ function handleReset(reset, on2) {
1856
+ var args = [];
1857
+ for (var _i4 = 2; _i4 < arguments.length; _i4++) {
1858
+ args[_i4 - 2] = arguments[_i4];
1859
+ }
1860
+ if (on2 === true) {
1861
+ reset();
1862
+ return;
1863
+ }
1864
+ if (on2 === false) {
1865
+ return;
1866
+ }
1867
+ var onSubscriber = new SafeSubscriber({
1868
+ next: function() {
1869
+ onSubscriber.unsubscribe();
1870
+ reset();
1871
+ }
1872
+ });
1873
+ return innerFrom(on2.apply(void 0, __spreadArray([], __read(args)))).subscribe(onSubscriber);
1874
+ }
1875
+ function shareReplay(configOrBufferSize, windowTime, scheduler) {
1876
+ var bufferSize;
1877
+ var refCount = false;
1878
+ {
1879
+ bufferSize = configOrBufferSize;
1880
+ }
1881
+ return share({
1882
+ connector: function() {
1883
+ return new ReplaySubject(bufferSize, windowTime, scheduler);
1884
+ },
1885
+ resetOnError: true,
1886
+ resetOnComplete: false,
1887
+ resetOnRefCountZero: refCount
1888
+ });
1889
+ }
1890
+ function takeUntil(notifier) {
1891
+ return operate(function(source, subscriber) {
1892
+ innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, function() {
1893
+ return subscriber.complete();
1894
+ }, noop));
1895
+ !subscriber.closed && source.subscribe(subscriber);
1896
+ });
1897
+ }
1275
1898
  class InfiniteScroller {
1276
1899
  constructor(options) {
1277
1900
  __publicField(this, "enabled", true);
@@ -2396,6 +3019,9 @@ class ThumbDataParser {
2396
3019
  const duration = timeToSeconds(((_a3 = title.match(/\d+m|\d+:\d+/)) == null ? void 0 : _a3[0]) || "");
2397
3020
  return { title, duration };
2398
3021
  }
3022
+ getUrl(thumb) {
3023
+ return (thumb.querySelector("a[href]") || thumb).href;
3024
+ }
2399
3025
  preprocessCustomThumbDataSelectors() {
2400
3026
  if (!this.selectors) return;
2401
3027
  Object.entries(this.selectors).forEach(([key, value]) => {
@@ -2423,6 +3049,10 @@ class ThumbDataParser {
2423
3049
  if (type === "duration") {
2424
3050
  return timeToSeconds(querySelectorText(thumb, selector));
2425
3051
  }
3052
+ if (type === "float") {
3053
+ const value = querySelectorText(thumb, selector);
3054
+ return parseNumberWithLetter(value);
3055
+ }
2426
3056
  return Number.parseInt(querySelectorText(thumb, selector));
2427
3057
  }
2428
3058
  static create(o = {}) {
@@ -9075,6 +9705,50 @@ const StoreStateDefault = {
9075
9705
  $paginationLast: 1,
9076
9706
  $paginationOffset: 1
9077
9707
  };
9708
+ class JabronioGuiController {
9709
+ constructor(store, dataManager) {
9710
+ __publicField(this, "destroy$", new Subject());
9711
+ __publicField(this, "directionalEventObservable$");
9712
+ __publicField(this, "eventsMap", {
9713
+ "sort by duration": (direction) => this.dataManager.sortBy("duration", direction),
9714
+ "sort by views": (direction) => this.dataManager.sortBy("views", direction)
9715
+ });
9716
+ this.store = store;
9717
+ this.dataManager = dataManager;
9718
+ this.directionalEventObservable$ = this.directionalEvent();
9719
+ this.setupStoreListeners();
9720
+ }
9721
+ dispose() {
9722
+ this.destroy$.next();
9723
+ this.destroy$.complete();
9724
+ }
9725
+ directionalEvent() {
9726
+ return this.store.eventSubject.pipe(
9727
+ scan(
9728
+ (acc, value) => ({
9729
+ type: value,
9730
+ direction: acc.type === value ? !acc.direction : true
9731
+ }),
9732
+ { type: void 0, direction: true }
9733
+ ),
9734
+ map(({ type, direction }) => ({
9735
+ type,
9736
+ direction
9737
+ })),
9738
+ shareReplay(1),
9739
+ takeUntil(this.destroy$)
9740
+ );
9741
+ }
9742
+ setupStoreListeners() {
9743
+ var _a3;
9744
+ (_a3 = this.directionalEventObservable$) == null ? void 0 : _a3.subscribe((e) => {
9745
+ this.eventsMap[e.type](e.direction);
9746
+ });
9747
+ this.store.stateSubject.pipe(takeUntil(this.destroy$)).subscribe((a2) => {
9748
+ this.dataManager.applyFilters(a2);
9749
+ });
9750
+ }
9751
+ }
9078
9752
  class Rules {
9079
9753
  constructor(options) {
9080
9754
  __publicField(this, "thumb", {});
@@ -9100,6 +9774,7 @@ class Rules {
9100
9774
  __publicField(this, "schemeOptions", []);
9101
9775
  __publicField(this, "store");
9102
9776
  __publicField(this, "gui");
9777
+ __publicField(this, "inputController");
9103
9778
  __publicField(this, "customGenerator");
9104
9779
  __publicField(this, "infiniteScroller");
9105
9780
  __publicField(this, "getPaginationData");
@@ -9116,11 +9791,9 @@ class Rules {
9116
9791
  this.store = this.createStore();
9117
9792
  this.gui = this.createGui();
9118
9793
  this.dataManager = new DataManager(this, this.dataHomogenity);
9794
+ this.inputController = new JabronioGuiController(this.store, this.dataManager);
9119
9795
  this.reset();
9120
9796
  }
9121
- getThumbUrl(thumb) {
9122
- return (thumb.querySelector("a[href]") || thumb).href;
9123
- }
9124
9797
  get container() {
9125
9798
  if (typeof this.containerSelectorLast === "string") {
9126
9799
  return querySelectorLast(document, this.containerSelectorLast);
@@ -9170,30 +9843,6 @@ class Rules {
9170
9843
  get isEmbedded() {
9171
9844
  return window.self !== window.top;
9172
9845
  }
9173
- setupStoreListeners() {
9174
- const eventsMap = {
9175
- "sort by duration": {
9176
- action: (direction2) => this.dataManager.sortBy("duration", direction2)
9177
- }
9178
- };
9179
- let lastEvent;
9180
- let direction = true;
9181
- this.store.eventSubject.subscribe((event) => {
9182
- if (event === lastEvent) {
9183
- direction = !direction;
9184
- } else {
9185
- lastEvent = event;
9186
- direction = true;
9187
- }
9188
- if (event in eventsMap) {
9189
- const ev = eventsMap[event];
9190
- ev == null ? void 0 : ev.action(direction);
9191
- }
9192
- });
9193
- this.store.stateSubject.subscribe((a2) => {
9194
- this.dataManager.applyFilters(a2);
9195
- });
9196
- }
9197
9846
  resetOn() {
9198
9847
  if (!this.resetOnPaginationOrContainerDeath) return;
9199
9848
  const observables = [
@@ -9216,7 +9865,8 @@ class Rules {
9216
9865
  this.mutationObservers = [];
9217
9866
  this.paginationStrategy = getPaginationStrategy(this.paginationStrategyOptions);
9218
9867
  this.dataManager = new DataManager(this, this.dataHomogenity);
9219
- this.setupStoreListeners();
9868
+ this.inputController.dispose();
9869
+ this.inputController = new JabronioGuiController(this.store, this.dataManager);
9220
9870
  this.resetInfiniteScroller();
9221
9871
  this.container && ((_a3 = this.animatePreview) == null ? void 0 : _a3.call(this, this.container));
9222
9872
  this.gropeInit();
@@ -9263,6 +9913,7 @@ export {
9263
9913
  parseDataParams,
9264
9914
  parseHtml,
9265
9915
  parseIntegerOr,
9916
+ parseNumberWithLetter,
9266
9917
  parseUrl,
9267
9918
  querySelectorLast,
9268
9919
  querySelectorLastNumber,