diff --git a/docs/scraper.user.js b/docs/scraper.user.js
new file mode 100644
index 0000000..5aeafd5
--- /dev/null
+++ b/docs/scraper.user.js
@@ -0,0 +1,1146 @@
+
+// ==UserScript==
+// @name scraper
+// @version 2.2.0
+// @description Scrape the data from the page you're on
+// @author mbme
+// @match *
+// @grant GM_registerMenuCommand
+// @updateURL https://raw.githubusercontent.com/mbme/scraper/main/docs/scraper.user.js
+// @downloadURL https://raw.githubusercontent.com/mbme/scraper/main/docs/scraper.user.js
+// ==/UserScript==
+
+"use strict";
+(() => {
+ var __defProp = Object.defineProperty;
+ var __typeError = (msg) => {
+ throw TypeError(msg);
+ };
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
+
+ // src/utils.ts
+ function uniqArr(arr) {
+ const result = [];
+ for (const item of arr) {
+ if (!result.includes(item)) {
+ result.push(item);
+ }
+ }
+ return result;
+ }
+ var waitForTimeout = (timeoutMs) => new Promise((resolve) => setTimeout(resolve, timeoutMs));
+ var waitForFunction = async (callback, description, timeoutMs = 3e4) => {
+ if (timeoutMs === 0) {
+ throw new Error("timeoutMs must be positive number");
+ }
+ const ATTEMPT_TIMEOUT_MS = 500;
+ const maxAttempts = Math.ceil(timeoutMs / ATTEMPT_TIMEOUT_MS);
+ let attempt = 1;
+ while (attempt <= maxAttempts) {
+ if (callback()) {
+ return;
+ }
+ if (attempt < maxAttempts) {
+ await waitForTimeout(ATTEMPT_TIMEOUT_MS);
+ }
+ attempt += 1;
+ }
+ throw new Error(`waitForFunction: "${description}" timed out`);
+ };
+ var waitForSelector = async (el, selector, description, timeoutMs = 3e4) => {
+ await waitForFunction(() => !!el.querySelector(selector), description, timeoutMs);
+ return getEl(selector, description);
+ };
+ var getEl = (arg1, arg2, arg3) => {
+ let selector;
+ let root = document;
+ let description = void 0;
+ if (typeof arg1 === "string") {
+ selector = arg1;
+ description = arg2;
+ } else {
+ root = arg1;
+ if (typeof arg2 !== "string") {
+ throw new Error("expected second argument to be a string");
+ }
+ selector = arg2;
+ description = arg3;
+ }
+ const el = root.querySelector(selector);
+ if (!el) {
+ if (description !== void 0) {
+ throw new Error(`can't find '${description}' using selector '${selector}'`);
+ }
+ return el;
+ }
+ return el;
+ };
+ var getAll = (root, selector) => {
+ const results = Array.from(root.querySelectorAll(selector));
+ return results;
+ };
+ function getListValues(el, selector) {
+ var _a3;
+ const items = Array.from((_a3 = el == null ? void 0 : el.querySelectorAll(selector)) != null ? _a3 : []).map((el2) => el2.innerText.trim()).filter((item) => item.length > 0);
+ return uniqArr(items);
+ }
+ function getTable(el, rowSelector, split = ":") {
+ const items = getListValues(el, rowSelector);
+ const table = Object.fromEntries(
+ items.map(
+ (item) => item.split(split).map((value) => value.trim())
+ )
+ );
+ return table;
+ }
+ var getListStr = (el, selector) => {
+ const values = getListValues(el, selector);
+ return values.join(", ");
+ };
+
+ // node_modules/urlpattern-polyfill/dist/urlpattern.js
+ var R = class {
+ constructor(t, r, n, o, c, l) {
+ __publicField(this, "type", 3);
+ __publicField(this, "name", "");
+ __publicField(this, "prefix", "");
+ __publicField(this, "value", "");
+ __publicField(this, "suffix", "");
+ __publicField(this, "modifier", 3);
+ this.type = t, this.name = r, this.prefix = n, this.value = o, this.suffix = c, this.modifier = l;
+ }
+ hasCustomName() {
+ return this.name !== "" && typeof this.name != "number";
+ }
+ };
+ var be = /[$_\p{ID_Start}]/u;
+ var Pe = /[$_\u200C\u200D\p{ID_Continue}]/u;
+ var M = ".*";
+ function Re(e, t) {
+ return (t ? /^[\x00-\xFF]*$/ : /^[\x00-\x7F]*$/).test(e);
+ }
+ function v(e, t = false) {
+ let r = [], n = 0;
+ for (; n < e.length; ) {
+ let o = e[n], c = function(l) {
+ if (!t) throw new TypeError(l);
+ r.push({ type: "INVALID_CHAR", index: n, value: e[n++] });
+ };
+ if (o === "*") {
+ r.push({ type: "ASTERISK", index: n, value: e[n++] });
+ continue;
+ }
+ if (o === "+" || o === "?") {
+ r.push({ type: "OTHER_MODIFIER", index: n, value: e[n++] });
+ continue;
+ }
+ if (o === "\\") {
+ r.push({ type: "ESCAPED_CHAR", index: n++, value: e[n++] });
+ continue;
+ }
+ if (o === "{") {
+ r.push({ type: "OPEN", index: n, value: e[n++] });
+ continue;
+ }
+ if (o === "}") {
+ r.push({ type: "CLOSE", index: n, value: e[n++] });
+ continue;
+ }
+ if (o === ":") {
+ let l = "", s = n + 1;
+ for (; s < e.length; ) {
+ let i = e.substr(s, 1);
+ if (s === n + 1 && be.test(i) || s !== n + 1 && Pe.test(i)) {
+ l += e[s++];
+ continue;
+ }
+ break;
+ }
+ if (!l) {
+ c(`Missing parameter name at ${n}`);
+ continue;
+ }
+ r.push({ type: "NAME", index: n, value: l }), n = s;
+ continue;
+ }
+ if (o === "(") {
+ let l = 1, s = "", i = n + 1, a = false;
+ if (e[i] === "?") {
+ c(`Pattern cannot start with "?" at ${i}`);
+ continue;
+ }
+ for (; i < e.length; ) {
+ if (!Re(e[i], false)) {
+ c(`Invalid character '${e[i]}' at ${i}.`), a = true;
+ break;
+ }
+ if (e[i] === "\\") {
+ s += e[i++] + e[i++];
+ continue;
+ }
+ if (e[i] === ")") {
+ if (l--, l === 0) {
+ i++;
+ break;
+ }
+ } else if (e[i] === "(" && (l++, e[i + 1] !== "?")) {
+ c(`Capturing groups are not allowed at ${i}`), a = true;
+ break;
+ }
+ s += e[i++];
+ }
+ if (a) continue;
+ if (l) {
+ c(`Unbalanced pattern at ${n}`);
+ continue;
+ }
+ if (!s) {
+ c(`Missing pattern at ${n}`);
+ continue;
+ }
+ r.push({ type: "REGEX", index: n, value: s }), n = i;
+ continue;
+ }
+ r.push({ type: "CHAR", index: n, value: e[n++] });
+ }
+ return r.push({ type: "END", index: n, value: "" }), r;
+ }
+ function D(e, t = {}) {
+ var _a3, _b;
+ let r = v(e);
+ (_a3 = t.delimiter) != null ? _a3 : t.delimiter = "/#?", (_b = t.prefixes) != null ? _b : t.prefixes = "./";
+ let n = `[^${S(t.delimiter)}]+?`, o = [], c = 0, l = 0, s = "", i = /* @__PURE__ */ new Set(), a = (h) => {
+ if (l < r.length && r[l].type === h) return r[l++].value;
+ }, f = () => {
+ var _a4;
+ return (_a4 = a("OTHER_MODIFIER")) != null ? _a4 : a("ASTERISK");
+ }, d = (h) => {
+ let u = a(h);
+ if (u !== void 0) return u;
+ let { type: p, index: A } = r[l];
+ throw new TypeError(`Unexpected ${p} at ${A}, expected ${h}`);
+ }, T = () => {
+ var _a4;
+ let h = "", u;
+ for (; u = (_a4 = a("CHAR")) != null ? _a4 : a("ESCAPED_CHAR"); ) h += u;
+ return h;
+ }, Se = (h) => h, L = t.encodePart || Se, I = "", U = (h) => {
+ I += h;
+ }, $ = () => {
+ I.length && (o.push(new R(3, "", "", L(I), "", 3)), I = "");
+ }, V = (h, u, p, A, Y) => {
+ let g = 3;
+ switch (Y) {
+ case "?":
+ g = 1;
+ break;
+ case "*":
+ g = 0;
+ break;
+ case "+":
+ g = 2;
+ break;
+ }
+ if (!u && !p && g === 3) {
+ U(h);
+ return;
+ }
+ if ($(), !u && !p) {
+ if (!h) return;
+ o.push(new R(3, "", "", L(h), "", g));
+ return;
+ }
+ let m;
+ p ? p === "*" ? m = M : m = p : m = n;
+ let O = 2;
+ m === n ? (O = 1, m = "") : m === M && (O = 0, m = "");
+ let P;
+ if (u ? P = u : p && (P = c++), i.has(P)) throw new TypeError(`Duplicate name '${P}'.`);
+ i.add(P), o.push(new R(O, P, L(h), m, L(A), g));
+ };
+ for (; l < r.length; ) {
+ let h = a("CHAR"), u = a("NAME"), p = a("REGEX");
+ if (!u && !p && (p = a("ASTERISK")), u || p) {
+ let g = h != null ? h : "";
+ t.prefixes.indexOf(g) === -1 && (U(g), g = ""), $();
+ let m = f();
+ V(g, u, p, "", m);
+ continue;
+ }
+ let A = h != null ? h : a("ESCAPED_CHAR");
+ if (A) {
+ U(A);
+ continue;
+ }
+ if (a("OPEN")) {
+ let g = T(), m = a("NAME"), O = a("REGEX");
+ !m && !O && (O = a("ASTERISK"));
+ let P = T();
+ d("CLOSE");
+ let xe = f();
+ V(g, m, O, P, xe);
+ continue;
+ }
+ $(), d("END");
+ }
+ return o;
+ }
+ function S(e) {
+ return e.replace(/([.+*?^${}()[\]|/\\])/g, "\\$1");
+ }
+ function X(e) {
+ return e && e.ignoreCase ? "ui" : "u";
+ }
+ function Z(e, t, r) {
+ return F(D(e, r), t, r);
+ }
+ function k(e) {
+ switch (e) {
+ case 0:
+ return "*";
+ case 1:
+ return "?";
+ case 2:
+ return "+";
+ case 3:
+ return "";
+ }
+ }
+ function F(e, t, r = {}) {
+ var _a3, _b, _c, _d2, _e3, _f;
+ (_a3 = r.delimiter) != null ? _a3 : r.delimiter = "/#?", (_b = r.prefixes) != null ? _b : r.prefixes = "./", (_c = r.sensitive) != null ? _c : r.sensitive = false, (_d2 = r.strict) != null ? _d2 : r.strict = false, (_e3 = r.end) != null ? _e3 : r.end = true, (_f = r.start) != null ? _f : r.start = true, r.endsWith = "";
+ let n = r.start ? "^" : "";
+ for (let s of e) {
+ if (s.type === 3) {
+ s.modifier === 3 ? n += S(s.value) : n += `(?:${S(s.value)})${k(s.modifier)}`;
+ continue;
+ }
+ t && t.push(s.name);
+ let i = `[^${S(r.delimiter)}]+?`, a = s.value;
+ if (s.type === 1 ? a = i : s.type === 0 && (a = M), !s.prefix.length && !s.suffix.length) {
+ s.modifier === 3 || s.modifier === 1 ? n += `(${a})${k(s.modifier)}` : n += `((?:${a})${k(s.modifier)})`;
+ continue;
+ }
+ if (s.modifier === 3 || s.modifier === 1) {
+ n += `(?:${S(s.prefix)}(${a})${S(s.suffix)})`, n += k(s.modifier);
+ continue;
+ }
+ n += `(?:${S(s.prefix)}`, n += `((?:${a})(?:`, n += S(s.suffix), n += S(s.prefix), n += `(?:${a}))*)${S(s.suffix)})`, s.modifier === 0 && (n += "?");
+ }
+ let o = `[${S(r.endsWith)}]|$`, c = `[${S(r.delimiter)}]`;
+ if (r.end) return r.strict || (n += `${c}?`), r.endsWith.length ? n += `(?=${o})` : n += "$", new RegExp(n, X(r));
+ r.strict || (n += `(?:${c}(?=${o}))?`);
+ let l = false;
+ if (e.length) {
+ let s = e[e.length - 1];
+ s.type === 3 && s.modifier === 3 && (l = r.delimiter.indexOf(s) > -1);
+ }
+ return l || (n += `(?=${c}|${o})`), new RegExp(n, X(r));
+ }
+ var x = { delimiter: "", prefixes: "", sensitive: true, strict: true };
+ var B = { delimiter: ".", prefixes: "", sensitive: true, strict: true };
+ var q = { delimiter: "/", prefixes: "/", sensitive: true, strict: true };
+ function J(e, t) {
+ return e.length ? e[0] === "/" ? true : !t || e.length < 2 ? false : (e[0] == "\\" || e[0] == "{") && e[1] == "/" : false;
+ }
+ function Q(e, t) {
+ return e.startsWith(t) ? e.substring(t.length, e.length) : e;
+ }
+ function Ee(e, t) {
+ return e.endsWith(t) ? e.substr(0, e.length - t.length) : e;
+ }
+ function W(e) {
+ return !e || e.length < 2 ? false : e[0] === "[" || (e[0] === "\\" || e[0] === "{") && e[1] === "[";
+ }
+ var ee = ["ftp", "file", "http", "https", "ws", "wss"];
+ function N(e) {
+ if (!e) return true;
+ for (let t of ee) if (e.test(t)) return true;
+ return false;
+ }
+ function te(e, t) {
+ if (e = Q(e, "#"), t || e === "") return e;
+ let r = new URL("https://example.com");
+ return r.hash = e, r.hash ? r.hash.substring(1, r.hash.length) : "";
+ }
+ function re(e, t) {
+ if (e = Q(e, "?"), t || e === "") return e;
+ let r = new URL("https://example.com");
+ return r.search = e, r.search ? r.search.substring(1, r.search.length) : "";
+ }
+ function ne(e, t) {
+ return t || e === "" ? e : W(e) ? j(e) : z(e);
+ }
+ function se(e, t) {
+ if (t || e === "") return e;
+ let r = new URL("https://example.com");
+ return r.password = e, r.password;
+ }
+ function ie(e, t) {
+ if (t || e === "") return e;
+ let r = new URL("https://example.com");
+ return r.username = e, r.username;
+ }
+ function ae(e, t, r) {
+ if (r || e === "") return e;
+ if (t && !ee.includes(t)) return new URL(`${t}:${e}`).pathname;
+ let n = e[0] == "/";
+ return e = new URL(n ? e : "/-" + e, "https://example.com").pathname, n || (e = e.substring(2, e.length)), e;
+ }
+ function oe(e, t, r) {
+ return _(t) === e && (e = ""), r || e === "" ? e : K(e);
+ }
+ function ce(e, t) {
+ return e = Ee(e, ":"), t || e === "" ? e : y(e);
+ }
+ function _(e) {
+ switch (e) {
+ case "ws":
+ case "http":
+ return "80";
+ case "wws":
+ case "https":
+ return "443";
+ case "ftp":
+ return "21";
+ default:
+ return "";
+ }
+ }
+ function y(e) {
+ if (e === "") return e;
+ if (/^[-+.A-Za-z0-9]*$/.test(e)) return e.toLowerCase();
+ throw new TypeError(`Invalid protocol '${e}'.`);
+ }
+ function le(e) {
+ if (e === "") return e;
+ let t = new URL("https://example.com");
+ return t.username = e, t.username;
+ }
+ function fe(e) {
+ if (e === "") return e;
+ let t = new URL("https://example.com");
+ return t.password = e, t.password;
+ }
+ function z(e) {
+ if (e === "") return e;
+ if (/[\t\n\r #%/:<>?@[\]^\\|]/g.test(e)) throw new TypeError(`Invalid hostname '${e}'`);
+ let t = new URL("https://example.com");
+ return t.hostname = e, t.hostname;
+ }
+ function j(e) {
+ if (e === "") return e;
+ if (/[^0-9a-fA-F[\]:]/g.test(e)) throw new TypeError(`Invalid IPv6 hostname '${e}'`);
+ return e.toLowerCase();
+ }
+ function K(e) {
+ if (e === "" || /^[0-9]*$/.test(e) && parseInt(e) <= 65535) return e;
+ throw new TypeError(`Invalid port '${e}'.`);
+ }
+ function he(e) {
+ if (e === "") return e;
+ let t = new URL("https://example.com");
+ return t.pathname = e[0] !== "/" ? "/-" + e : e, e[0] !== "/" ? t.pathname.substring(2, t.pathname.length) : t.pathname;
+ }
+ function ue(e) {
+ return e === "" ? e : new URL(`data:${e}`).pathname;
+ }
+ function de(e) {
+ if (e === "") return e;
+ let t = new URL("https://example.com");
+ return t.search = e, t.search.substring(1, t.search.length);
+ }
+ function pe(e) {
+ if (e === "") return e;
+ let t = new URL("https://example.com");
+ return t.hash = e, t.hash.substring(1, t.hash.length);
+ }
+ var _i, _n, _t, _e, _s, _l, _o, _d, _p, _g, _H_instances, r_fn, R_fn, b_fn, u_fn, m_fn, a_fn, P_fn, E_fn, S_fn, O_fn, k_fn, x_fn, h_fn, f_fn, T_fn, A_fn, y_fn, w_fn, c_fn, C_fn, _a;
+ var H = (_a = class {
+ constructor(t) {
+ __privateAdd(this, _H_instances);
+ __privateAdd(this, _i);
+ __privateAdd(this, _n, []);
+ __privateAdd(this, _t, {});
+ __privateAdd(this, _e, 0);
+ __privateAdd(this, _s, 1);
+ __privateAdd(this, _l, 0);
+ __privateAdd(this, _o, 0);
+ __privateAdd(this, _d, 0);
+ __privateAdd(this, _p, 0);
+ __privateAdd(this, _g, false);
+ __privateSet(this, _i, t);
+ }
+ get result() {
+ return __privateGet(this, _t);
+ }
+ parse() {
+ for (__privateSet(this, _n, v(__privateGet(this, _i), true)); __privateGet(this, _e) < __privateGet(this, _n).length; __privateSet(this, _e, __privateGet(this, _e) + __privateGet(this, _s))) {
+ if (__privateSet(this, _s, 1), __privateGet(this, _n)[__privateGet(this, _e)].type === "END") {
+ if (__privateGet(this, _o) === 0) {
+ __privateMethod(this, _H_instances, b_fn).call(this), __privateMethod(this, _H_instances, f_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 9, 1) : __privateMethod(this, _H_instances, h_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 8, 1) : __privateMethod(this, _H_instances, r_fn).call(this, 7, 0);
+ continue;
+ } else if (__privateGet(this, _o) === 2) {
+ __privateMethod(this, _H_instances, u_fn).call(this, 5);
+ continue;
+ }
+ __privateMethod(this, _H_instances, r_fn).call(this, 10, 0);
+ break;
+ }
+ if (__privateGet(this, _d) > 0) if (__privateMethod(this, _H_instances, A_fn).call(this)) __privateSet(this, _d, __privateGet(this, _d) - 1);
+ else continue;
+ if (__privateMethod(this, _H_instances, T_fn).call(this)) {
+ __privateSet(this, _d, __privateGet(this, _d) + 1);
+ continue;
+ }
+ switch (__privateGet(this, _o)) {
+ case 0:
+ __privateMethod(this, _H_instances, P_fn).call(this) && __privateMethod(this, _H_instances, u_fn).call(this, 1);
+ break;
+ case 1:
+ if (__privateMethod(this, _H_instances, P_fn).call(this)) {
+ __privateMethod(this, _H_instances, C_fn).call(this);
+ let t = 7, r = 1;
+ __privateMethod(this, _H_instances, E_fn).call(this) ? (t = 2, r = 3) : __privateGet(this, _g) && (t = 2), __privateMethod(this, _H_instances, r_fn).call(this, t, r);
+ }
+ break;
+ case 2:
+ __privateMethod(this, _H_instances, S_fn).call(this) ? __privateMethod(this, _H_instances, u_fn).call(this, 3) : (__privateMethod(this, _H_instances, x_fn).call(this) || __privateMethod(this, _H_instances, h_fn).call(this) || __privateMethod(this, _H_instances, f_fn).call(this)) && __privateMethod(this, _H_instances, u_fn).call(this, 5);
+ break;
+ case 3:
+ __privateMethod(this, _H_instances, O_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 4, 1) : __privateMethod(this, _H_instances, S_fn).call(this) && __privateMethod(this, _H_instances, r_fn).call(this, 5, 1);
+ break;
+ case 4:
+ __privateMethod(this, _H_instances, S_fn).call(this) && __privateMethod(this, _H_instances, r_fn).call(this, 5, 1);
+ break;
+ case 5:
+ __privateMethod(this, _H_instances, y_fn).call(this) ? __privateSet(this, _p, __privateGet(this, _p) + 1) : __privateMethod(this, _H_instances, w_fn).call(this) && __privateSet(this, _p, __privateGet(this, _p) - 1), __privateMethod(this, _H_instances, k_fn).call(this) && !__privateGet(this, _p) ? __privateMethod(this, _H_instances, r_fn).call(this, 6, 1) : __privateMethod(this, _H_instances, x_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 7, 0) : __privateMethod(this, _H_instances, h_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 8, 1) : __privateMethod(this, _H_instances, f_fn).call(this) && __privateMethod(this, _H_instances, r_fn).call(this, 9, 1);
+ break;
+ case 6:
+ __privateMethod(this, _H_instances, x_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 7, 0) : __privateMethod(this, _H_instances, h_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 8, 1) : __privateMethod(this, _H_instances, f_fn).call(this) && __privateMethod(this, _H_instances, r_fn).call(this, 9, 1);
+ break;
+ case 7:
+ __privateMethod(this, _H_instances, h_fn).call(this) ? __privateMethod(this, _H_instances, r_fn).call(this, 8, 1) : __privateMethod(this, _H_instances, f_fn).call(this) && __privateMethod(this, _H_instances, r_fn).call(this, 9, 1);
+ break;
+ case 8:
+ __privateMethod(this, _H_instances, f_fn).call(this) && __privateMethod(this, _H_instances, r_fn).call(this, 9, 1);
+ break;
+ case 9:
+ break;
+ case 10:
+ break;
+ }
+ }
+ __privateGet(this, _t).hostname !== void 0 && __privateGet(this, _t).port === void 0 && (__privateGet(this, _t).port = "");
+ }
+ }, _i = new WeakMap(), _n = new WeakMap(), _t = new WeakMap(), _e = new WeakMap(), _s = new WeakMap(), _l = new WeakMap(), _o = new WeakMap(), _d = new WeakMap(), _p = new WeakMap(), _g = new WeakMap(), _H_instances = new WeakSet(), r_fn = function(t, r) {
+ var _a3, _b, _c, _d2, _e3, _f;
+ switch (__privateGet(this, _o)) {
+ case 0:
+ break;
+ case 1:
+ __privateGet(this, _t).protocol = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 2:
+ break;
+ case 3:
+ __privateGet(this, _t).username = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 4:
+ __privateGet(this, _t).password = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 5:
+ __privateGet(this, _t).hostname = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 6:
+ __privateGet(this, _t).port = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 7:
+ __privateGet(this, _t).pathname = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 8:
+ __privateGet(this, _t).search = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 9:
+ __privateGet(this, _t).hash = __privateMethod(this, _H_instances, c_fn).call(this);
+ break;
+ case 10:
+ break;
+ }
+ __privateGet(this, _o) !== 0 && t !== 10 && ([1, 2, 3, 4].includes(__privateGet(this, _o)) && [6, 7, 8, 9].includes(t) && ((_b = (_a3 = __privateGet(this, _t)).hostname) != null ? _b : _a3.hostname = ""), [1, 2, 3, 4, 5, 6].includes(__privateGet(this, _o)) && [8, 9].includes(t) && ((_d2 = (_c = __privateGet(this, _t)).pathname) != null ? _d2 : _c.pathname = __privateGet(this, _g) ? "/" : ""), [1, 2, 3, 4, 5, 6, 7].includes(__privateGet(this, _o)) && t === 9 && ((_f = (_e3 = __privateGet(this, _t)).search) != null ? _f : _e3.search = "")), __privateMethod(this, _H_instances, R_fn).call(this, t, r);
+ }, R_fn = function(t, r) {
+ __privateSet(this, _o, t), __privateSet(this, _l, __privateGet(this, _e) + r), __privateSet(this, _e, __privateGet(this, _e) + r), __privateSet(this, _s, 0);
+ }, b_fn = function() {
+ __privateSet(this, _e, __privateGet(this, _l)), __privateSet(this, _s, 0);
+ }, u_fn = function(t) {
+ __privateMethod(this, _H_instances, b_fn).call(this), __privateSet(this, _o, t);
+ }, m_fn = function(t) {
+ return t < 0 && (t = __privateGet(this, _n).length - t), t < __privateGet(this, _n).length ? __privateGet(this, _n)[t] : __privateGet(this, _n)[__privateGet(this, _n).length - 1];
+ }, a_fn = function(t, r) {
+ let n = __privateMethod(this, _H_instances, m_fn).call(this, t);
+ return n.value === r && (n.type === "CHAR" || n.type === "ESCAPED_CHAR" || n.type === "INVALID_CHAR");
+ }, P_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), ":");
+ }, E_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e) + 1, "/") && __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e) + 2, "/");
+ }, S_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), "@");
+ }, O_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), ":");
+ }, k_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), ":");
+ }, x_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), "/");
+ }, h_fn = function() {
+ if (__privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), "?")) return true;
+ if (__privateGet(this, _n)[__privateGet(this, _e)].value !== "?") return false;
+ let t = __privateMethod(this, _H_instances, m_fn).call(this, __privateGet(this, _e) - 1);
+ return t.type !== "NAME" && t.type !== "REGEX" && t.type !== "CLOSE" && t.type !== "ASTERISK";
+ }, f_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), "#");
+ }, T_fn = function() {
+ return __privateGet(this, _n)[__privateGet(this, _e)].type == "OPEN";
+ }, A_fn = function() {
+ return __privateGet(this, _n)[__privateGet(this, _e)].type == "CLOSE";
+ }, y_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), "[");
+ }, w_fn = function() {
+ return __privateMethod(this, _H_instances, a_fn).call(this, __privateGet(this, _e), "]");
+ }, c_fn = function() {
+ let t = __privateGet(this, _n)[__privateGet(this, _e)], r = __privateMethod(this, _H_instances, m_fn).call(this, __privateGet(this, _l)).index;
+ return __privateGet(this, _i).substring(r, t.index);
+ }, C_fn = function() {
+ let t = {};
+ Object.assign(t, x), t.encodePart = y;
+ let r = Z(__privateMethod(this, _H_instances, c_fn).call(this), void 0, t);
+ __privateSet(this, _g, N(r));
+ }, _a);
+ var G = ["protocol", "username", "password", "hostname", "port", "pathname", "search", "hash"];
+ var E = "*";
+ function ge(e, t) {
+ if (typeof e != "string") throw new TypeError("parameter 1 is not of type 'string'.");
+ let r = new URL(e, t);
+ return { protocol: r.protocol.substring(0, r.protocol.length - 1), username: r.username, password: r.password, hostname: r.hostname, port: r.port, pathname: r.pathname, search: r.search !== "" ? r.search.substring(1, r.search.length) : void 0, hash: r.hash !== "" ? r.hash.substring(1, r.hash.length) : void 0 };
+ }
+ function b(e, t) {
+ return t ? C(e) : e;
+ }
+ function w(e, t, r) {
+ let n;
+ if (typeof t.baseURL == "string") try {
+ n = new URL(t.baseURL), t.protocol === void 0 && (e.protocol = b(n.protocol.substring(0, n.protocol.length - 1), r)), !r && t.protocol === void 0 && t.hostname === void 0 && t.port === void 0 && t.username === void 0 && (e.username = b(n.username, r)), !r && t.protocol === void 0 && t.hostname === void 0 && t.port === void 0 && t.username === void 0 && t.password === void 0 && (e.password = b(n.password, r)), t.protocol === void 0 && t.hostname === void 0 && (e.hostname = b(n.hostname, r)), t.protocol === void 0 && t.hostname === void 0 && t.port === void 0 && (e.port = b(n.port, r)), t.protocol === void 0 && t.hostname === void 0 && t.port === void 0 && t.pathname === void 0 && (e.pathname = b(n.pathname, r)), t.protocol === void 0 && t.hostname === void 0 && t.port === void 0 && t.pathname === void 0 && t.search === void 0 && (e.search = b(n.search.substring(1, n.search.length), r)), t.protocol === void 0 && t.hostname === void 0 && t.port === void 0 && t.pathname === void 0 && t.search === void 0 && t.hash === void 0 && (e.hash = b(n.hash.substring(1, n.hash.length), r));
+ } catch {
+ throw new TypeError(`invalid baseURL '${t.baseURL}'.`);
+ }
+ if (typeof t.protocol == "string" && (e.protocol = ce(t.protocol, r)), typeof t.username == "string" && (e.username = ie(t.username, r)), typeof t.password == "string" && (e.password = se(t.password, r)), typeof t.hostname == "string" && (e.hostname = ne(t.hostname, r)), typeof t.port == "string" && (e.port = oe(t.port, e.protocol, r)), typeof t.pathname == "string") {
+ if (e.pathname = t.pathname, n && !J(e.pathname, r)) {
+ let o = n.pathname.lastIndexOf("/");
+ o >= 0 && (e.pathname = b(n.pathname.substring(0, o + 1), r) + e.pathname);
+ }
+ e.pathname = ae(e.pathname, e.protocol, r);
+ }
+ return typeof t.search == "string" && (e.search = re(t.search, r)), typeof t.hash == "string" && (e.hash = te(t.hash, r)), e;
+ }
+ function C(e) {
+ return e.replace(/([+*?:{}()\\])/g, "\\$1");
+ }
+ function Oe(e) {
+ return e.replace(/([.+*?^${}()[\]|/\\])/g, "\\$1");
+ }
+ function ke(e, t) {
+ var _a3, _b, _c, _d2, _e3, _f;
+ (_a3 = t.delimiter) != null ? _a3 : t.delimiter = "/#?", (_b = t.prefixes) != null ? _b : t.prefixes = "./", (_c = t.sensitive) != null ? _c : t.sensitive = false, (_d2 = t.strict) != null ? _d2 : t.strict = false, (_e3 = t.end) != null ? _e3 : t.end = true, (_f = t.start) != null ? _f : t.start = true, t.endsWith = "";
+ let r = ".*", n = `[^${Oe(t.delimiter)}]+?`, o = /[$_\u200C\u200D\p{ID_Continue}]/u, c = "";
+ for (let l = 0; l < e.length; ++l) {
+ let s = e[l];
+ if (s.type === 3) {
+ if (s.modifier === 3) {
+ c += C(s.value);
+ continue;
+ }
+ c += `{${C(s.value)}}${k(s.modifier)}`;
+ continue;
+ }
+ let i = s.hasCustomName(), a = !!s.suffix.length || !!s.prefix.length && (s.prefix.length !== 1 || !t.prefixes.includes(s.prefix)), f = l > 0 ? e[l - 1] : null, d = l < e.length - 1 ? e[l + 1] : null;
+ if (!a && i && s.type === 1 && s.modifier === 3 && d && !d.prefix.length && !d.suffix.length) if (d.type === 3) {
+ let T = d.value.length > 0 ? d.value[0] : "";
+ a = o.test(T);
+ } else a = !d.hasCustomName();
+ if (!a && !s.prefix.length && f && f.type === 3) {
+ let T = f.value[f.value.length - 1];
+ a = t.prefixes.includes(T);
+ }
+ a && (c += "{"), c += C(s.prefix), i && (c += `:${s.name}`), s.type === 2 ? c += `(${s.value})` : s.type === 1 ? i || (c += `(${n})`) : s.type === 0 && (!i && (!f || f.type === 3 || f.modifier !== 3 || a || s.prefix !== "") ? c += "*" : c += `(${r})`), s.type === 1 && i && s.suffix.length && o.test(s.suffix[0]) && (c += "\\"), c += C(s.suffix), a && (c += "}"), s.modifier !== 3 && (c += k(s.modifier));
+ }
+ return c;
+ }
+ var _i2, _n2, _t2, _e2, _s2, _l2, _a2;
+ var me = (_a2 = class {
+ constructor(t = {}, r, n) {
+ __privateAdd(this, _i2);
+ __privateAdd(this, _n2, {});
+ __privateAdd(this, _t2, {});
+ __privateAdd(this, _e2, {});
+ __privateAdd(this, _s2, {});
+ __privateAdd(this, _l2, false);
+ try {
+ let o;
+ if (typeof r == "string" ? o = r : n = r, typeof t == "string") {
+ let i = new H(t);
+ if (i.parse(), t = i.result, o === void 0 && typeof t.protocol != "string") throw new TypeError("A base URL must be provided for a relative constructor string.");
+ t.baseURL = o;
+ } else {
+ if (!t || typeof t != "object") throw new TypeError("parameter 1 is not of type 'string' and cannot convert to dictionary.");
+ if (o) throw new TypeError("parameter 1 is not of type 'string'.");
+ }
+ typeof n > "u" && (n = { ignoreCase: false });
+ let c = { ignoreCase: n.ignoreCase === true }, l = { pathname: E, protocol: E, username: E, password: E, hostname: E, port: E, search: E, hash: E };
+ __privateSet(this, _i2, w(l, t, true)), _(__privateGet(this, _i2).protocol) === __privateGet(this, _i2).port && (__privateGet(this, _i2).port = "");
+ let s;
+ for (s of G) {
+ if (!(s in __privateGet(this, _i2))) continue;
+ let i = {}, a = __privateGet(this, _i2)[s];
+ switch (__privateGet(this, _t2)[s] = [], s) {
+ case "protocol":
+ Object.assign(i, x), i.encodePart = y;
+ break;
+ case "username":
+ Object.assign(i, x), i.encodePart = le;
+ break;
+ case "password":
+ Object.assign(i, x), i.encodePart = fe;
+ break;
+ case "hostname":
+ Object.assign(i, B), W(a) ? i.encodePart = j : i.encodePart = z;
+ break;
+ case "port":
+ Object.assign(i, x), i.encodePart = K;
+ break;
+ case "pathname":
+ N(__privateGet(this, _n2).protocol) ? (Object.assign(i, q, c), i.encodePart = he) : (Object.assign(i, x, c), i.encodePart = ue);
+ break;
+ case "search":
+ Object.assign(i, x, c), i.encodePart = de;
+ break;
+ case "hash":
+ Object.assign(i, x, c), i.encodePart = pe;
+ break;
+ }
+ try {
+ __privateGet(this, _s2)[s] = D(a, i), __privateGet(this, _n2)[s] = F(__privateGet(this, _s2)[s], __privateGet(this, _t2)[s], i), __privateGet(this, _e2)[s] = ke(__privateGet(this, _s2)[s], i), __privateSet(this, _l2, __privateGet(this, _l2) || __privateGet(this, _s2)[s].some((f) => f.type === 2));
+ } catch {
+ throw new TypeError(`invalid ${s} pattern '${__privateGet(this, _i2)[s]}'.`);
+ }
+ }
+ } catch (o) {
+ throw new TypeError(`Failed to construct 'URLPattern': ${o.message}`);
+ }
+ }
+ test(t = {}, r) {
+ let n = { pathname: "", protocol: "", username: "", password: "", hostname: "", port: "", search: "", hash: "" };
+ if (typeof t != "string" && r) throw new TypeError("parameter 1 is not of type 'string'.");
+ if (typeof t > "u") return false;
+ try {
+ typeof t == "object" ? n = w(n, t, false) : n = w(n, ge(t, r), false);
+ } catch {
+ return false;
+ }
+ let o;
+ for (o of G) if (!__privateGet(this, _n2)[o].exec(n[o])) return false;
+ return true;
+ }
+ exec(t = {}, r) {
+ var _a3;
+ let n = { pathname: "", protocol: "", username: "", password: "", hostname: "", port: "", search: "", hash: "" };
+ if (typeof t != "string" && r) throw new TypeError("parameter 1 is not of type 'string'.");
+ if (typeof t > "u") return;
+ try {
+ typeof t == "object" ? n = w(n, t, false) : n = w(n, ge(t, r), false);
+ } catch {
+ return null;
+ }
+ let o = {};
+ r ? o.inputs = [t, r] : o.inputs = [t];
+ let c;
+ for (c of G) {
+ let l = __privateGet(this, _n2)[c].exec(n[c]);
+ if (!l) return null;
+ let s = {};
+ for (let [i, a] of __privateGet(this, _t2)[c].entries()) if (typeof a == "string" || typeof a == "number") {
+ let f = l[i + 1];
+ s[a] = f;
+ }
+ o[c] = { input: (_a3 = n[c]) != null ? _a3 : "", groups: s };
+ }
+ return o;
+ }
+ static compareComponent(t, r, n) {
+ let o = (i, a) => {
+ for (let f of ["type", "modifier", "prefix", "value", "suffix"]) {
+ if (i[f] < a[f]) return -1;
+ if (i[f] === a[f]) continue;
+ return 1;
+ }
+ return 0;
+ }, c = new R(3, "", "", "", "", 3), l = new R(0, "", "", "", "", 3), s = (i, a) => {
+ var _a3, _b;
+ let f = 0;
+ for (; f < Math.min(i.length, a.length); ++f) {
+ let d = o(i[f], a[f]);
+ if (d) return d;
+ }
+ return i.length === a.length ? 0 : o((_a3 = i[f]) != null ? _a3 : c, (_b = a[f]) != null ? _b : c);
+ };
+ return !__privateGet(r, _e2)[t] && !__privateGet(n, _e2)[t] ? 0 : __privateGet(r, _e2)[t] && !__privateGet(n, _e2)[t] ? s(__privateGet(r, _s2)[t], [l]) : !__privateGet(r, _e2)[t] && __privateGet(n, _e2)[t] ? s([l], __privateGet(n, _s2)[t]) : s(__privateGet(r, _s2)[t], __privateGet(n, _s2)[t]);
+ }
+ get protocol() {
+ return __privateGet(this, _e2).protocol;
+ }
+ get username() {
+ return __privateGet(this, _e2).username;
+ }
+ get password() {
+ return __privateGet(this, _e2).password;
+ }
+ get hostname() {
+ return __privateGet(this, _e2).hostname;
+ }
+ get port() {
+ return __privateGet(this, _e2).port;
+ }
+ get pathname() {
+ return __privateGet(this, _e2).pathname;
+ }
+ get search() {
+ return __privateGet(this, _e2).search;
+ }
+ get hash() {
+ return __privateGet(this, _e2).hash;
+ }
+ get hasRegExpGroups() {
+ return __privateGet(this, _l2);
+ }
+ }, _i2 = new WeakMap(), _n2 = new WeakMap(), _t2 = new WeakMap(), _e2 = new WeakMap(), _s2 = new WeakMap(), _l2 = new WeakMap(), _a2);
+
+ // node_modules/urlpattern-polyfill/index.js
+ if (!globalThis.URLPattern) {
+ globalThis.URLPattern = me;
+ }
+
+ // src/scrapers/scraper.ts
+ var Scraper = class {
+ };
+
+ // src/scrapers/yakaboo-book.ts
+ var LANGUAGE_TRANSLATIONS = {
+ "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430": "Ukrainian",
+ "\u0410\u043D\u0433\u043B\u0456\u0439\u0441\u044C\u043A\u0430": "English",
+ "\u0420\u043E\u0441\u0456\u0439\u0441\u044C\u043A\u0430": "Russian"
+ };
+ var YakabooBookScraper = class extends Scraper {
+ constructor() {
+ super(...arguments);
+ // https://yakaboo.ua/ua/stories-of-your-life-and-others.html
+ this.pattern = new URLPattern({
+ hostname: "www.yakaboo.ua",
+ pathname: "/ua/*"
+ });
+ this.scrape = async () => {
+ var _a3, _b;
+ const coverURL = getEl(".gallery [aria-hidden=false] img", "cover image").src;
+ const title = getEl(".base-product__title h1", "title").innerText.substring("\u041A\u043D\u0438\u0433\u0430 ".length).trim();
+ (_a3 = getEl(".description__btn")) == null ? void 0 : _a3.click();
+ const description = getEl(".description__content", "description").innerText;
+ const expandAttrsBtn = getEl(".main__chars button.ui-btn-nav", "expand attributes button");
+ expandAttrsBtn.scrollIntoView();
+ expandAttrsBtn.click();
+ await waitForFunction(
+ () => {
+ var _a4, _b2;
+ return (_b2 = (_a4 = document.querySelector(".main__chars button.ui-btn-nav")) == null ? void 0 : _a4.innerText.includes("\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438")) != null ? _b2 : false;
+ },
+ "collapse attributes button"
+ );
+ const table = getTable(document, ".product-chars .chars .char", "\n");
+ const authors = table["\u0410\u0432\u0442\u043E\u0440"] || "";
+ const language = (_b = LANGUAGE_TRANSLATIONS[table["\u041C\u043E\u0432\u0430"] || ""]) != null ? _b : "";
+ const publicationDate = table["\u0420\u0456\u043A \u0432\u0438\u0434\u0430\u043D\u043D\u044F"] || "";
+ const translators = table["\u041F\u0435\u0440\u0435\u043A\u043B\u0430\u0434\u0430\u0447"] || "";
+ const publisher = table["\u0412\u0438\u0434\u0430\u0432\u043D\u0438\u0446\u0442\u0432\u043E"] || "";
+ const pages = Number.parseInt(table["\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A"] || "", 10);
+ return {
+ typeName: "YakabooBook",
+ coverURL,
+ title,
+ authors,
+ publicationDate,
+ description,
+ translators,
+ publisher,
+ pages,
+ language
+ };
+ };
+ }
+ };
+
+ // src/scrapers/steam-game.ts
+ var SteamGameScraper = class extends Scraper {
+ constructor() {
+ super(...arguments);
+ // https://store.steampowered.com/app/814380/Sekiro_Shadows_Die_Twice__GOTY_Edition/
+ this.pattern = new URLPattern({
+ hostname: "store.steampowered.com",
+ pathname: "/app/*"
+ });
+ this.scrape = () => {
+ const coverURL = getEl(".game_header_image_full", "cover image").src;
+ const name = getEl("#appHubAppName", "game name").innerText;
+ const releaseDate = getEl(".release_date .date", "release date").innerText;
+ const developers = getListStr(document, "#developers_list a");
+ getEl("#game_area_description h2", "description header").remove();
+ const description = getEl("#game_area_description", "description").innerText;
+ return {
+ typeName: "SteamGame",
+ coverURL,
+ name,
+ releaseDate,
+ developers,
+ description
+ };
+ };
+ }
+ };
+
+ // src/scrapers/myanimelist-anime.ts
+ var MyAnimeListAnimeScraper = class extends Scraper {
+ constructor() {
+ super(...arguments);
+ // https://myanimelist.net/anime/30276/One_Punch_Man
+ this.pattern = new URLPattern({
+ hostname: "myanimelist.net",
+ pathname: "/anime/*"
+ });
+ this.scrape = () => {
+ var _a3, _b;
+ const engTitle = (_a3 = getEl(".title-english")) == null ? void 0 : _a3.innerText;
+ const title = engTitle || ((_b = getEl(".title-name")) == null ? void 0 : _b.innerText) || "";
+ const coverURL = getEl(".leftside img", "cover image").dataset.src || "";
+ const metadata = getTable(document, ".leftside .spaceit_pad");
+ const releaseDate = metadata.Aired || "";
+ const creators = metadata.Studios || "";
+ const duration = metadata.Duration || "";
+ const description = getEl("[itemprop=description]", "description").innerText;
+ const related = getTable(document, ".anime_detail_related_anime tr");
+ if (related.Prequel) {
+ throw new Error("Can't import an anime: it has a prequel. Start from the first season.");
+ }
+ return {
+ typeName: "MyAnimeListAnime",
+ title,
+ coverURL,
+ releaseDate,
+ creators,
+ duration,
+ description
+ };
+ };
+ }
+ };
+
+ // src/scrapers/imdb-film.ts
+ var IMDBFilmScraper = class extends Scraper {
+ constructor() {
+ super(...arguments);
+ // https://www.imdb.com/title/tt0133093/
+ this.pattern = new URLPattern({
+ hostname: "www.imdb.com",
+ pathname: "/title/*"
+ });
+ this.scrape = async () => {
+ var _a3, _b, _c;
+ for (const loaderEl of document.querySelectorAll("[data-testid=storyline-loader]")) {
+ loaderEl.scrollIntoView();
+ await waitForTimeout(400);
+ }
+ await waitForFunction(
+ () => document.querySelector("[data-testid=storyline-loader]") === null,
+ "wait until loader is gone"
+ );
+ const metadata = getListValues(document, "h1[data-testid=hero__pageTitle]~.ipc-inline-list li");
+ while (metadata.length < 4) {
+ metadata.unshift("");
+ }
+ const filmType = metadata[0].toLowerCase();
+ const isSeries = filmType.includes("series");
+ const isMiniSeries = isSeries && filmType.includes("mini");
+ const title = (await waitForSelector(document, "h1[data-testid=hero__pageTitle]", "title")).innerText;
+ const originalLanguage = getEl(
+ "[data-testid=title-details-languages] ul li a",
+ "original language"
+ ).innerText;
+ const countriesOfOrigin = getListStr(document, "[data-testid=title-details-origin] ul li a");
+ const coverURL = getEl(
+ "[data-testid=hero-media__poster] img",
+ "cover image"
+ ).src;
+ const summaryEl = await waitForSelector(
+ document,
+ "[data-testid=storyline-plot-summary]",
+ "description"
+ );
+ (_a3 = getEl(summaryEl, "div>span")) == null ? void 0 : _a3.remove();
+ const description = getEl(summaryEl, "div", "description").innerText;
+ const releaseDate = (_b = metadata[1]) != null ? _b : "";
+ let duration = (_c = metadata[3]) != null ? _c : "";
+ const creators = [];
+ const cast = [];
+ const creditsEls = getAll(document, "[data-testid=title-pc-principal-credit]");
+ let seasons = void 0;
+ let episodes = void 0;
+ if (isSeries) {
+ seasons = Number.parseInt(
+ getEl(
+ "[data-testid=episodes-browse-episodes] >:nth-child(2) >:nth-child(2)",
+ "seasons count"
+ ).innerText,
+ 10
+ );
+ episodes = Number.parseInt(
+ getEl("[data-testid=episodes-header] .ipc-title__subtext", "episodes count").innerText,
+ 10
+ );
+ creators.push(...getListValues(creditsEls[0], ":scope ul li a"));
+ cast.push(...getListValues(creditsEls[1], ":scope ul li a"));
+ } else {
+ creators.push(...getListValues(creditsEls[0], ":scope ul li a"));
+ creators.push(...getListValues(creditsEls[1], ":scope ul li a"));
+ cast.push(...getListValues(creditsEls[2], ":scope ul li a"));
+ }
+ if (isMiniSeries) {
+ duration = "";
+ }
+ const chips = getListValues(document, ".ipc-chip__text").map((item) => item.toLowerCase());
+ const isAnime = chips.includes("anime");
+ if (isAnime) {
+ creators.length = 0;
+ cast.length = 0;
+ }
+ const isAnimation = chips.includes("animation");
+ if (isAnimation) {
+ cast.length = 0;
+ }
+ return {
+ typeName: "IMDBFilm",
+ title,
+ coverURL,
+ releaseDate,
+ originalLanguage,
+ countriesOfOrigin,
+ creators: uniqArr(creators).join(", "),
+ cast: uniqArr(cast).join(", "),
+ seasons,
+ episodes,
+ duration,
+ description
+ };
+ };
+ }
+ };
+
+ // src/scrapers/any-image.ts
+ var ImageScraper = class extends Scraper {
+ constructor() {
+ super(...arguments);
+ this.pattern = new URLPattern({
+ pathname: "/*.:filetype(jpg|png)"
+ });
+ this.scrape = () => ({
+ typeName: "Image",
+ imageURL: location.href
+ });
+ }
+ };
+
+ // src/scrapers/index.ts
+ var SCRAPERS = [
+ new YakabooBookScraper(),
+ new SteamGameScraper(),
+ new MyAnimeListAnimeScraper(),
+ new IMDBFilmScraper(),
+ new ImageScraper()
+ ];
+
+ // src/scraper-ui.html
+ var scraper_ui_default = '
\n \n\n Results: 0\n\n \n\n \n
\n';
+
+ // src/browser-scraper.ts
+ var ScrapingDoneEvent = class extends CustomEvent {
+ constructor() {
+ super("scraping-done");
+ }
+ };
+ var BrowserScraper = class {
+ constructor() {
+ this.results = [];
+ }
+ injectScraperUI() {
+ document.body.insertAdjacentHTML("afterbegin", scraper_ui_default);
+ document.getElementById("_scraper-ui-btn-scrape").addEventListener("click", () => void this.scrape());
+ document.getElementById("_scraper-ui-btn-done").addEventListener("click", () => {
+ document.body.dispatchEvent(new ScrapingDoneEvent());
+ });
+ }
+ async scrape() {
+ var _a3, _b;
+ const result = {
+ url: location.href
+ };
+ for (const scraper of SCRAPERS) {
+ if (!scraper.pattern.test(window.location.href)) {
+ continue;
+ }
+ try {
+ const data = await scraper.scrape();
+ console.info(`scraper ${scraper.constructor.name} succeeded`);
+ result.scraperName = scraper.constructor.name;
+ result.data = data;
+ break;
+ } catch (e) {
+ console.error(`scraper ${scraper.constructor.name} failed:`, e);
+ result.scraperName = scraper.constructor.name;
+ result.error = (_b = (_a3 = e.stack) == null ? void 0 : _a3.toString()) != null ? _b : "";
+ this._addResult(result);
+ throw e;
+ }
+ }
+ this._addResult(result);
+ return result;
+ }
+ _addResult(result) {
+ this.results.push(result);
+ const counterEl = document.querySelector("#_scraper-results-counter span");
+ if (counterEl) {
+ counterEl.innerHTML = this.results.length.toString();
+ }
+ }
+ };
+
+ // src/index.ts
+ function initScraper() {
+ window._scraper = new BrowserScraper();
+ window._scraper.injectScraperUI();
+ }
+ if (window.GM_registerMenuCommand) {
+ window.GM_registerMenuCommand("Run scraper", initScraper);
+ } else {
+ initScraper();
+ }
+})();
+//# sourceMappingURL=scraper.user.js.map
diff --git a/docs/scraper.user.js.map b/docs/scraper.user.js.map
new file mode 100644
index 0000000..584835a
--- /dev/null
+++ b/docs/scraper.user.js.map
@@ -0,0 +1,7 @@
+{
+ "version": 3,
+ "sources": ["../src/utils.ts", "../node_modules/urlpattern-polyfill/dist/urlpattern.js", "../node_modules/urlpattern-polyfill/index.js", "../src/scrapers/scraper.ts", "../src/scrapers/yakaboo-book.ts", "../src/scrapers/steam-game.ts", "../src/scrapers/myanimelist-anime.ts", "../src/scrapers/imdb-film.ts", "../src/scrapers/any-image.ts", "../src/scrapers/index.ts", "../src/scraper-ui.html", "../src/browser-scraper.ts", "../src/index.ts"],
+ "sourcesContent": ["type ObjValue = string | number | boolean | null | undefined;\nexport type Obj = Record;\n\nexport function uniqArr(arr: T[]): T[] {\n const result: T[] = [];\n\n for (const item of arr) {\n if (!result.includes(item)) {\n result.push(item);\n }\n }\n\n return result;\n}\n\nexport const waitForTimeout = (timeoutMs: number) =>\n new Promise((resolve) => setTimeout(resolve, timeoutMs));\n\nexport const waitForFunction = async (\n callback: () => boolean,\n description: string,\n timeoutMs = 30000,\n): Promise => {\n if (timeoutMs === 0) {\n throw new Error('timeoutMs must be positive number');\n }\n\n const ATTEMPT_TIMEOUT_MS = 500;\n const maxAttempts = Math.ceil(timeoutMs / ATTEMPT_TIMEOUT_MS);\n\n let attempt = 1;\n\n while (attempt <= maxAttempts) {\n if (callback()) {\n return;\n }\n\n if (attempt < maxAttempts) {\n await waitForTimeout(ATTEMPT_TIMEOUT_MS);\n }\n\n attempt += 1;\n }\n\n throw new Error(`waitForFunction: \"${description}\" timed out`);\n};\n\nexport const waitForSelector = async (\n el: HTMLElement | Document,\n selector: string,\n description: string,\n timeoutMs = 30000,\n): Promise => {\n await waitForFunction(() => !!el.querySelector(selector), description, timeoutMs);\n\n return getEl(selector, description);\n};\n\ntype GetEl = {\n (selector: string): T | null;\n (selector: string, description: string): T;\n (root: HTMLElement, selector: string): T | null;\n (root: HTMLElement, selector: string, description: string): T;\n};\n\nexport const getEl: GetEl = (\n arg1: string | HTMLElement | Document,\n arg2?: string,\n arg3?: string,\n): T | null => {\n let selector: string;\n let root: HTMLElement | Document = document;\n let description: string | undefined = undefined;\n\n if (typeof arg1 === 'string') {\n selector = arg1;\n description = arg2;\n } else {\n root = arg1;\n\n if (typeof arg2 !== 'string') {\n throw new Error('expected second argument to be a string');\n }\n selector = arg2;\n\n description = arg3;\n }\n const el = root.querySelector(selector);\n\n if (!el) {\n if (description !== undefined) {\n throw new Error(`can't find '${description}' using selector '${selector}'`);\n }\n\n return el;\n }\n\n return el as T;\n};\n\nexport const getAll = (\n root: HTMLElement | Document,\n selector: string,\n): T[] => {\n const results = Array.from(root.querySelectorAll(selector));\n\n return results as T[];\n};\n\nexport type ArrayElement =\n ArrayType extends readonly (infer ElementType)[] ? ElementType : never;\n\nexport const getSelectionString = (el: HTMLElement): string => {\n const selection = window.getSelection();\n if (!selection) {\n throw new Error('selection is missing');\n }\n\n const range = document.createRange();\n range.selectNodeContents(el);\n selection.removeAllRanges();\n selection.addRange(range);\n\n const selectionStr = selection.toString();\n\n selection.removeAllRanges();\n\n return selectionStr;\n};\n\nexport function getListValues(el: HTMLElement | Document | undefined, selector: string): string[] {\n const items = Array.from(el?.querySelectorAll(selector) ?? [])\n .map((el) => el.innerText.trim())\n .filter((item) => item.length > 0);\n\n return uniqArr(items);\n}\n\nexport function getTable(\n el: HTMLElement | Document,\n rowSelector: string,\n split = ':',\n): Obj {\n const items = getListValues(el, rowSelector);\n\n const table = Object.fromEntries(\n items.map(\n (item) => item.split(split).map((value) => value.trim()) as [string, string | undefined],\n ),\n );\n\n return table;\n}\n\nexport const getListStr = (el: HTMLElement | Document, selector: string): string => {\n const values = getListValues(el, selector);\n\n return values.join(', ');\n};\n\nexport function scrollToBottom() {\n const scrollingElement = document.scrollingElement || document.body;\n scrollingElement.scrollTop = scrollingElement.scrollHeight;\n}\n", "var R=class{type=3;name=\"\";prefix=\"\";value=\"\";suffix=\"\";modifier=3;constructor(t,r,n,o,c,l){this.type=t,this.name=r,this.prefix=n,this.value=o,this.suffix=c,this.modifier=l}hasCustomName(){return this.name!==\"\"&&typeof this.name!=\"number\"}},be=/[$_\\p{ID_Start}]/u,Pe=/[$_\\u200C\\u200D\\p{ID_Continue}]/u,M=\".*\";function Re(e,t){return(t?/^[\\x00-\\xFF]*$/:/^[\\x00-\\x7F]*$/).test(e)}function v(e,t=!1){let r=[],n=0;for(;n{if(la(\"OTHER_MODIFIER\")??a(\"ASTERISK\"),d=h=>{let u=a(h);if(u!==void 0)return u;let{type:p,index:A}=r[l];throw new TypeError(`Unexpected ${p} at ${A}, expected ${h}`)},T=()=>{let h=\"\",u;for(;u=a(\"CHAR\")??a(\"ESCAPED_CHAR\");)h+=u;return h},Se=h=>h,L=t.encodePart||Se,I=\"\",U=h=>{I+=h},$=()=>{I.length&&(o.push(new R(3,\"\",\"\",L(I),\"\",3)),I=\"\")},V=(h,u,p,A,Y)=>{let g=3;switch(Y){case\"?\":g=1;break;case\"*\":g=0;break;case\"+\":g=2;break}if(!u&&!p&&g===3){U(h);return}if($(),!u&&!p){if(!h)return;o.push(new R(3,\"\",\"\",L(h),\"\",g));return}let m;p?p===\"*\"?m=M:m=p:m=n;let O=2;m===n?(O=1,m=\"\"):m===M&&(O=0,m=\"\");let P;if(u?P=u:p&&(P=c++),i.has(P))throw new TypeError(`Duplicate name '${P}'.`);i.add(P),o.push(new R(O,P,L(h),m,L(A),g))};for(;l-1)}return l||(n+=`(?=${c}|${o})`),new RegExp(n,X(r))}var x={delimiter:\"\",prefixes:\"\",sensitive:!0,strict:!0},B={delimiter:\".\",prefixes:\"\",sensitive:!0,strict:!0},q={delimiter:\"/\",prefixes:\"/\",sensitive:!0,strict:!0};function J(e,t){return e.length?e[0]===\"/\"?!0:!t||e.length<2?!1:(e[0]==\"\\\\\"||e[0]==\"{\")&&e[1]==\"/\":!1}function Q(e,t){return e.startsWith(t)?e.substring(t.length,e.length):e}function Ee(e,t){return e.endsWith(t)?e.substr(0,e.length-t.length):e}function W(e){return!e||e.length<2?!1:e[0]===\"[\"||(e[0]===\"\\\\\"||e[0]===\"{\")&&e[1]===\"[\"}var ee=[\"ftp\",\"file\",\"http\",\"https\",\"ws\",\"wss\"];function N(e){if(!e)return!0;for(let t of ee)if(e.test(t))return!0;return!1}function te(e,t){if(e=Q(e,\"#\"),t||e===\"\")return e;let r=new URL(\"https://example.com\");return r.hash=e,r.hash?r.hash.substring(1,r.hash.length):\"\"}function re(e,t){if(e=Q(e,\"?\"),t||e===\"\")return e;let r=new URL(\"https://example.com\");return r.search=e,r.search?r.search.substring(1,r.search.length):\"\"}function ne(e,t){return t||e===\"\"?e:W(e)?j(e):z(e)}function se(e,t){if(t||e===\"\")return e;let r=new URL(\"https://example.com\");return r.password=e,r.password}function ie(e,t){if(t||e===\"\")return e;let r=new URL(\"https://example.com\");return r.username=e,r.username}function ae(e,t,r){if(r||e===\"\")return e;if(t&&!ee.includes(t))return new URL(`${t}:${e}`).pathname;let n=e[0]==\"/\";return e=new URL(n?e:\"/-\"+e,\"https://example.com\").pathname,n||(e=e.substring(2,e.length)),e}function oe(e,t,r){return _(t)===e&&(e=\"\"),r||e===\"\"?e:K(e)}function ce(e,t){return e=Ee(e,\":\"),t||e===\"\"?e:y(e)}function _(e){switch(e){case\"ws\":case\"http\":return\"80\";case\"wws\":case\"https\":return\"443\";case\"ftp\":return\"21\";default:return\"\"}}function y(e){if(e===\"\")return e;if(/^[-+.A-Za-z0-9]*$/.test(e))return e.toLowerCase();throw new TypeError(`Invalid protocol '${e}'.`)}function le(e){if(e===\"\")return e;let t=new URL(\"https://example.com\");return t.username=e,t.username}function fe(e){if(e===\"\")return e;let t=new URL(\"https://example.com\");return t.password=e,t.password}function z(e){if(e===\"\")return e;if(/[\\t\\n\\r #%/:<>?@[\\]^\\\\|]/g.test(e))throw new TypeError(`Invalid hostname '${e}'`);let t=new URL(\"https://example.com\");return t.hostname=e,t.hostname}function j(e){if(e===\"\")return e;if(/[^0-9a-fA-F[\\]:]/g.test(e))throw new TypeError(`Invalid IPv6 hostname '${e}'`);return e.toLowerCase()}function K(e){if(e===\"\"||/^[0-9]*$/.test(e)&&parseInt(e)<=65535)return e;throw new TypeError(`Invalid port '${e}'.`)}function he(e){if(e===\"\")return e;let t=new URL(\"https://example.com\");return t.pathname=e[0]!==\"/\"?\"/-\"+e:e,e[0]!==\"/\"?t.pathname.substring(2,t.pathname.length):t.pathname}function ue(e){return e===\"\"?e:new URL(`data:${e}`).pathname}function de(e){if(e===\"\")return e;let t=new URL(\"https://example.com\");return t.search=e,t.search.substring(1,t.search.length)}function pe(e){if(e===\"\")return e;let t=new URL(\"https://example.com\");return t.hash=e,t.hash.substring(1,t.hash.length)}var H=class{#i;#n=[];#t={};#e=0;#s=1;#l=0;#o=0;#d=0;#p=0;#g=!1;constructor(t){this.#i=t}get result(){return this.#t}parse(){for(this.#n=v(this.#i,!0);this.#e0)if(this.#A())this.#d-=1;else continue;if(this.#T()){this.#d+=1;continue}switch(this.#o){case 0:this.#P()&&this.#u(1);break;case 1:if(this.#P()){this.#C();let t=7,r=1;this.#E()?(t=2,r=3):this.#g&&(t=2),this.#r(t,r)}break;case 2:this.#S()?this.#u(3):(this.#x()||this.#h()||this.#f())&&this.#u(5);break;case 3:this.#O()?this.#r(4,1):this.#S()&&this.#r(5,1);break;case 4:this.#S()&&this.#r(5,1);break;case 5:this.#y()?this.#p+=1:this.#w()&&(this.#p-=1),this.#k()&&!this.#p?this.#r(6,1):this.#x()?this.#r(7,0):this.#h()?this.#r(8,1):this.#f()&&this.#r(9,1);break;case 6:this.#x()?this.#r(7,0):this.#h()?this.#r(8,1):this.#f()&&this.#r(9,1);break;case 7:this.#h()?this.#r(8,1):this.#f()&&this.#r(9,1);break;case 8:this.#f()&&this.#r(9,1);break;case 9:break;case 10:break}}this.#t.hostname!==void 0&&this.#t.port===void 0&&(this.#t.port=\"\")}#r(t,r){switch(this.#o){case 0:break;case 1:this.#t.protocol=this.#c();break;case 2:break;case 3:this.#t.username=this.#c();break;case 4:this.#t.password=this.#c();break;case 5:this.#t.hostname=this.#c();break;case 6:this.#t.port=this.#c();break;case 7:this.#t.pathname=this.#c();break;case 8:this.#t.search=this.#c();break;case 9:this.#t.hash=this.#c();break;case 10:break}this.#o!==0&&t!==10&&([1,2,3,4].includes(this.#o)&&[6,7,8,9].includes(t)&&(this.#t.hostname??=\"\"),[1,2,3,4,5,6].includes(this.#o)&&[8,9].includes(t)&&(this.#t.pathname??=this.#g?\"/\":\"\"),[1,2,3,4,5,6,7].includes(this.#o)&&t===9&&(this.#t.search??=\"\")),this.#R(t,r)}#R(t,r){this.#o=t,this.#l=this.#e+r,this.#e+=r,this.#s=0}#b(){this.#e=this.#l,this.#s=0}#u(t){this.#b(),this.#o=t}#m(t){return t<0&&(t=this.#n.length-t),t=0&&(e.pathname=b(n.pathname.substring(0,o+1),r)+e.pathname)}e.pathname=ae(e.pathname,e.protocol,r)}return typeof t.search==\"string\"&&(e.search=re(t.search,r)),typeof t.hash==\"string\"&&(e.hash=te(t.hash,r)),e}function C(e){return e.replace(/([+*?:{}()\\\\])/g,\"\\\\$1\")}function Oe(e){return e.replace(/([.+*?^${}()[\\]|/\\\\])/g,\"\\\\$1\")}function ke(e,t){t.delimiter??=\"/#?\",t.prefixes??=\"./\",t.sensitive??=!1,t.strict??=!1,t.end??=!0,t.start??=!0,t.endsWith=\"\";let r=\".*\",n=`[^${Oe(t.delimiter)}]+?`,o=/[$_\\u200C\\u200D\\p{ID_Continue}]/u,c=\"\";for(let l=0;l0?e[l-1]:null,d=l0?d.value[0]:\"\";a=o.test(T)}else a=!d.hasCustomName();if(!a&&!s.prefix.length&&f&&f.type===3){let T=f.value[f.value.length-1];a=t.prefixes.includes(T)}a&&(c+=\"{\"),c+=C(s.prefix),i&&(c+=`:${s.name}`),s.type===2?c+=`(${s.value})`:s.type===1?i||(c+=`(${n})`):s.type===0&&(!i&&(!f||f.type===3||f.modifier!==3||a||s.prefix!==\"\")?c+=\"*\":c+=`(${r})`),s.type===1&&i&&s.suffix.length&&o.test(s.suffix[0])&&(c+=\"\\\\\"),c+=C(s.suffix),a&&(c+=\"}\"),s.modifier!==3&&(c+=k(s.modifier))}return c}var me=class{#i;#n={};#t={};#e={};#s={};#l=!1;constructor(t={},r,n){try{let o;if(typeof r==\"string\"?o=r:n=r,typeof t==\"string\"){let i=new H(t);if(i.parse(),t=i.result,o===void 0&&typeof t.protocol!=\"string\")throw new TypeError(\"A base URL must be provided for a relative constructor string.\");t.baseURL=o}else{if(!t||typeof t!=\"object\")throw new TypeError(\"parameter 1 is not of type 'string' and cannot convert to dictionary.\");if(o)throw new TypeError(\"parameter 1 is not of type 'string'.\")}typeof n>\"u\"&&(n={ignoreCase:!1});let c={ignoreCase:n.ignoreCase===!0},l={pathname:E,protocol:E,username:E,password:E,hostname:E,port:E,search:E,hash:E};this.#i=w(l,t,!0),_(this.#i.protocol)===this.#i.port&&(this.#i.port=\"\");let s;for(s of G){if(!(s in this.#i))continue;let i={},a=this.#i[s];switch(this.#t[s]=[],s){case\"protocol\":Object.assign(i,x),i.encodePart=y;break;case\"username\":Object.assign(i,x),i.encodePart=le;break;case\"password\":Object.assign(i,x),i.encodePart=fe;break;case\"hostname\":Object.assign(i,B),W(a)?i.encodePart=j:i.encodePart=z;break;case\"port\":Object.assign(i,x),i.encodePart=K;break;case\"pathname\":N(this.#n.protocol)?(Object.assign(i,q,c),i.encodePart=he):(Object.assign(i,x,c),i.encodePart=ue);break;case\"search\":Object.assign(i,x,c),i.encodePart=de;break;case\"hash\":Object.assign(i,x,c),i.encodePart=pe;break}try{this.#s[s]=D(a,i),this.#n[s]=F(this.#s[s],this.#t[s],i),this.#e[s]=ke(this.#s[s],i),this.#l=this.#l||this.#s[s].some(f=>f.type===2)}catch{throw new TypeError(`invalid ${s} pattern '${this.#i[s]}'.`)}}}catch(o){throw new TypeError(`Failed to construct 'URLPattern': ${o.message}`)}}test(t={},r){let n={pathname:\"\",protocol:\"\",username:\"\",password:\"\",hostname:\"\",port:\"\",search:\"\",hash:\"\"};if(typeof t!=\"string\"&&r)throw new TypeError(\"parameter 1 is not of type 'string'.\");if(typeof t>\"u\")return!1;try{typeof t==\"object\"?n=w(n,t,!1):n=w(n,ge(t,r),!1)}catch{return!1}let o;for(o of G)if(!this.#n[o].exec(n[o]))return!1;return!0}exec(t={},r){let n={pathname:\"\",protocol:\"\",username:\"\",password:\"\",hostname:\"\",port:\"\",search:\"\",hash:\"\"};if(typeof t!=\"string\"&&r)throw new TypeError(\"parameter 1 is not of type 'string'.\");if(typeof t>\"u\")return;try{typeof t==\"object\"?n=w(n,t,!1):n=w(n,ge(t,r),!1)}catch{return null}let o={};r?o.inputs=[t,r]:o.inputs=[t];let c;for(c of G){let l=this.#n[c].exec(n[c]);if(!l)return null;let s={};for(let[i,a]of this.#t[c].entries())if(typeof a==\"string\"||typeof a==\"number\"){let f=l[i+1];s[a]=f}o[c]={input:n[c]??\"\",groups:s}}return o}static compareComponent(t,r,n){let o=(i,a)=>{for(let f of[\"type\",\"modifier\",\"prefix\",\"value\",\"suffix\"]){if(i[f]{let f=0;for(;f {\n abstract readonly pattern: URLPattern;\n\n abstract readonly scrape: (() => Data) | (() => Promise);\n}\n\nexport type ExtractScraperGeneric = Type extends Scraper ? X : never;\n", "import { getEl, getTable, Obj, waitForFunction } from '../utils';\nimport { Scraper } from './scraper';\n\nconst LANGUAGE_TRANSLATIONS: Obj = {\n '\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430': 'Ukrainian',\n '\u0410\u043D\u0433\u043B\u0456\u0439\u0441\u044C\u043A\u0430': 'English',\n '\u0420\u043E\u0441\u0456\u0439\u0441\u044C\u043A\u0430': 'Russian',\n};\n\nexport type YakabooBook = {\n typeName: 'YakabooBook';\n coverURL: string;\n title: string;\n authors: string;\n publicationDate: string;\n description: string;\n translators: string;\n publisher: string;\n pages: number;\n language: string;\n};\n\nexport class YakabooBookScraper extends Scraper<'YakabooBook', YakabooBook> {\n // https://yakaboo.ua/ua/stories-of-your-life-and-others.html\n readonly pattern = new URLPattern({\n hostname: 'www.yakaboo.ua',\n pathname: '/ua/*',\n });\n\n readonly scrape = async (): Promise => {\n const coverURL = getEl('.gallery [aria-hidden=false] img', 'cover image').src;\n const title = getEl('.base-product__title h1', 'title')\n .innerText.substring('\u041A\u043D\u0438\u0433\u0430 '.length) // remove the prefix that Yakaboo adds to all titles\n .trim();\n\n // expand description if button is present\n getEl('.description__btn')?.click();\n\n const description = getEl('.description__content', 'description').innerText;\n\n const expandAttrsBtn = getEl('.main__chars button.ui-btn-nav', 'expand attributes button');\n expandAttrsBtn.scrollIntoView();\n expandAttrsBtn.click();\n await waitForFunction(\n () =>\n document\n .querySelector('.main__chars button.ui-btn-nav')\n ?.innerText.includes('\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438') ?? false,\n 'collapse attributes button',\n );\n\n const table = getTable(document, '.product-chars .chars .char', '\\n');\n\n const authors = table['\u0410\u0432\u0442\u043E\u0440'] || '';\n\n const language = LANGUAGE_TRANSLATIONS[table['\u041C\u043E\u0432\u0430'] || ''] ?? '';\n\n const publicationDate = table['\u0420\u0456\u043A \u0432\u0438\u0434\u0430\u043D\u043D\u044F'] || '';\n const translators = table['\u041F\u0435\u0440\u0435\u043A\u043B\u0430\u0434\u0430\u0447'] || '';\n const publisher = table['\u0412\u0438\u0434\u0430\u0432\u043D\u0438\u0446\u0442\u0432\u043E'] || '';\n const pages = Number.parseInt(table['\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u0442\u043E\u0440\u0456\u043D\u043E\u043A'] || '', 10);\n\n return {\n typeName: 'YakabooBook',\n coverURL,\n title,\n authors,\n publicationDate,\n description,\n translators,\n publisher,\n pages,\n language,\n };\n };\n}\n", "import { getEl, getListStr } from '../utils';\nimport { Scraper } from './scraper';\n\ntype SteamGame = {\n typeName: 'SteamGame';\n coverURL: string;\n name: string;\n releaseDate: string;\n developers: string;\n description: string;\n};\n\nexport class SteamGameScraper extends Scraper<'SteamGame', SteamGame> {\n // https://store.steampowered.com/app/814380/Sekiro_Shadows_Die_Twice__GOTY_Edition/\n readonly pattern = new URLPattern({\n hostname: 'store.steampowered.com',\n pathname: '/app/*',\n });\n\n readonly scrape = (): SteamGame => {\n const coverURL = getEl('.game_header_image_full', 'cover image').src;\n const name = getEl('#appHubAppName', 'game name').innerText;\n const releaseDate = getEl('.release_date .date', 'release date').innerText;\n const developers = getListStr(document, '#developers_list a');\n\n // remove \"About this game\"\n getEl('#game_area_description h2', 'description header').remove();\n\n const description = getEl('#game_area_description', 'description').innerText;\n\n return {\n typeName: 'SteamGame',\n coverURL,\n name,\n releaseDate,\n developers,\n description,\n };\n };\n}\n", "import { getEl, getTable } from '../utils';\nimport { Scraper } from './scraper';\n\nexport type MyAnimeListAnime = {\n typeName: 'MyAnimeListAnime';\n title: string;\n coverURL: string;\n releaseDate: string;\n creators: string;\n duration: string;\n description: string;\n};\n\nexport class MyAnimeListAnimeScraper extends Scraper<'MyAnimeListAnime', MyAnimeListAnime> {\n // https://myanimelist.net/anime/30276/One_Punch_Man\n readonly pattern = new URLPattern({\n hostname: 'myanimelist.net',\n pathname: '/anime/*',\n });\n\n readonly scrape = (): MyAnimeListAnime => {\n const engTitle = getEl('.title-english')?.innerText;\n\n const title = engTitle || getEl('.title-name')?.innerText || '';\n\n const coverURL = getEl('.leftside img', 'cover image').dataset.src || '';\n\n const metadata = getTable(document, '.leftside .spaceit_pad');\n const releaseDate = metadata.Aired || '';\n const creators = metadata.Studios || '';\n const duration = metadata.Duration || '';\n\n const description = getEl('[itemprop=description]', 'description').innerText;\n\n const related = getTable(document, '.anime_detail_related_anime tr');\n if (related.Prequel) {\n throw new Error(\"Can't import an anime: it has a prequel. Start from the first season.\");\n }\n\n return {\n typeName: 'MyAnimeListAnime',\n title,\n coverURL,\n releaseDate,\n creators,\n duration,\n description,\n };\n };\n}\n", "import {\n getAll,\n getEl,\n getListStr,\n getListValues,\n uniqArr,\n waitForFunction,\n waitForSelector,\n waitForTimeout,\n} from '../utils';\nimport { Scraper } from './scraper';\n\nexport type IMDBFilm = {\n typeName: 'IMDBFilm';\n title: string;\n coverURL: string;\n releaseDate: string;\n originalLanguage: string;\n countriesOfOrigin: string;\n creators: string;\n cast: string;\n seasons?: number;\n episodes?: number;\n duration: string;\n description: string;\n};\n\n// In general, its hard to scrape data from IMDB because page structure / information order\n// often changes based on content type (movie/series/short series etc.)\n\nexport class IMDBFilmScraper extends Scraper<'IMDBFilm', IMDBFilm> {\n // https://www.imdb.com/title/tt0133093/\n readonly pattern = new URLPattern({\n hostname: 'www.imdb.com',\n pathname: '/title/*',\n });\n\n readonly scrape = async (): Promise => {\n for (const loaderEl of document.querySelectorAll('[data-testid=storyline-loader]')) {\n loaderEl.scrollIntoView();\n await waitForTimeout(400);\n }\n\n await waitForFunction(\n () => document.querySelector('[data-testid=storyline-loader]') === null,\n 'wait until loader is gone',\n );\n\n const metadata = getListValues(document, 'h1[data-testid=hero__pageTitle]~.ipc-inline-list li');\n while (metadata.length < 4) {\n metadata.unshift('');\n }\n\n const filmType = metadata[0]!.toLowerCase();\n const isSeries = filmType.includes('series');\n const isMiniSeries = isSeries && filmType.includes('mini');\n\n const title = (await waitForSelector(document, 'h1[data-testid=hero__pageTitle]', 'title'))\n .innerText;\n const originalLanguage = getEl(\n '[data-testid=title-details-languages] ul li a',\n 'original language',\n ).innerText;\n const countriesOfOrigin = getListStr(document, '[data-testid=title-details-origin] ul li a');\n\n const coverURL = getEl(\n '[data-testid=hero-media__poster] img',\n 'cover image',\n ).src;\n\n const summaryEl = await waitForSelector(\n document,\n '[data-testid=storyline-plot-summary]',\n 'description',\n );\n // cleanup description if needed - remove nickname\n getEl(summaryEl, 'div>span')?.remove();\n\n const description = getEl(summaryEl, 'div', 'description').innerText;\n\n const releaseDate = metadata[1] ?? '';\n let duration = metadata[3] ?? '';\n\n const creators = [];\n const cast = [];\n const creditsEls = getAll(document, '[data-testid=title-pc-principal-credit]');\n\n let seasons: number | undefined = undefined;\n let episodes: number | undefined = undefined;\n if (isSeries) {\n seasons = Number.parseInt(\n getEl(\n '[data-testid=episodes-browse-episodes] >:nth-child(2) >:nth-child(2)',\n 'seasons count',\n ).innerText,\n 10,\n );\n episodes = Number.parseInt(\n getEl('[data-testid=episodes-header] .ipc-title__subtext', 'episodes count').innerText,\n 10,\n );\n\n creators.push(...getListValues(creditsEls[0], ':scope ul li a'));\n cast.push(...getListValues(creditsEls[1], ':scope ul li a'));\n } else {\n creators.push(...getListValues(creditsEls[0], ':scope ul li a'));\n creators.push(...getListValues(creditsEls[1], ':scope ul li a'));\n\n cast.push(...getListValues(creditsEls[2], ':scope ul li a'));\n }\n\n if (isMiniSeries) {\n // IMDB often shows total duration for miniseries instead of episode duration\n duration = '';\n }\n\n const chips = getListValues(document, '.ipc-chip__text').map((item) => item.toLowerCase());\n\n const isAnime = chips.includes('anime');\n if (isAnime) {\n creators.length = 0;\n cast.length = 0;\n }\n\n const isAnimation = chips.includes('animation');\n if (isAnimation) {\n cast.length = 0;\n }\n\n return {\n typeName: 'IMDBFilm',\n title,\n coverURL,\n releaseDate,\n originalLanguage,\n countriesOfOrigin,\n creators: uniqArr(creators).join(', '),\n cast: uniqArr(cast).join(', '),\n seasons,\n episodes,\n duration,\n description,\n };\n };\n}\n", "import { Scraper } from './scraper';\n\ntype Image = {\n typeName: 'Image';\n imageURL: string;\n};\n\nexport class ImageScraper extends Scraper<'Image', Image> {\n readonly pattern = new URLPattern({\n pathname: '/*.:filetype(jpg|png)',\n });\n\n readonly scrape = (): Image => ({\n typeName: 'Image',\n imageURL: location.href,\n });\n}\n", "import { ArrayElement } from '../utils';\nimport { ExtractScraperGeneric } from './scraper';\n\nimport { YakabooBookScraper } from './yakaboo-book';\nimport { SteamGameScraper } from './steam-game';\nimport { MyAnimeListAnimeScraper } from './myanimelist-anime';\nimport { IMDBFilmScraper } from './imdb-film';\nimport { ImageScraper } from './any-image';\n\nexport const SCRAPERS = [\n new YakabooBookScraper(),\n new SteamGameScraper(),\n new MyAnimeListAnimeScraper(),\n new IMDBFilmScraper(),\n new ImageScraper(),\n] as const;\n\nexport type ScrapedData = ExtractScraperGeneric>;\n", "\n \n\n Results: 0\n\n \n\n \n
\n", "import { ScrapedData, SCRAPERS } from './scrapers';\nimport scraperUIstr from './scraper-ui.html';\n\nexport class ScrapingDoneEvent extends CustomEvent {\n constructor() {\n super('scraping-done');\n }\n}\n\nexport type ScrapeResult = {\n url: string;\n\n scraperName?: string;\n\n data?: ScrapedData;\n error?: string;\n};\n\nexport class BrowserScraper {\n public results: ScrapeResult[] = [];\n\n injectScraperUI() {\n document.body.insertAdjacentHTML('afterbegin', scraperUIstr);\n\n document\n .getElementById('_scraper-ui-btn-scrape')!\n .addEventListener('click', () => void this.scrape());\n\n document.getElementById('_scraper-ui-btn-done')!.addEventListener('click', () => {\n document.body.dispatchEvent(new ScrapingDoneEvent());\n });\n }\n\n async scrape(): Promise {\n const result: ScrapeResult = {\n url: location.href,\n };\n\n for (const scraper of SCRAPERS) {\n if (!scraper.pattern.test(window.location.href)) {\n continue;\n }\n\n try {\n const data = await scraper.scrape();\n console.info(`scraper ${scraper.constructor.name} succeeded`);\n\n result.scraperName = scraper.constructor.name;\n result.data = data;\n\n break;\n } catch (e) {\n console.error(`scraper ${scraper.constructor.name} failed:`, e);\n\n result.scraperName = scraper.constructor.name;\n result.error = (e as Error).stack?.toString() ?? '';\n\n this._addResult(result);\n\n throw e;\n }\n }\n\n this._addResult(result);\n\n return result;\n }\n\n private _addResult(result: ScrapeResult) {\n this.results.push(result);\n\n const counterEl = document.querySelector('#_scraper-results-counter span');\n\n if (counterEl) {\n counterEl.innerHTML = this.results.length.toString();\n }\n }\n}\n", "import { BrowserScraper } from './browser-scraper';\n\ndeclare global {\n interface Window {\n _scraper: BrowserScraper;\n GM_registerMenuCommand?: (menuItem: string, cb: () => void) => void;\n }\n}\n\nfunction initScraper() {\n window._scraper = new BrowserScraper();\n window._scraper.injectScraperUI();\n}\n\nif (window.GM_registerMenuCommand) {\n window.GM_registerMenuCommand('Run scraper', initScraper);\n} else {\n initScraper();\n}\n"],
+ "mappings": "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",
+ "names": ["_a", "el", "_a", "_d", "_e", "_i", "_n", "_t", "_s", "_l", "_a", "_b", "_a", "_a", "_a"]
+}
diff --git a/package-lock.json b/package-lock.json
index 1644c9b..771b247 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "scraper",
- "version": "2.1.0",
+ "version": "2.2.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "scraper",
- "version": "2.1.0",
+ "version": "2.2.0",
"license": "GPL-3.0-or-later",
"dependencies": {
"chrono-node": "^2.3.9",
diff --git a/package.json b/package.json
index 3980607..8a661e8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "scraper",
- "version": "2.1.0",
+ "version": "2.2.0",
"description": "Scrape the data from the page you're on",
"main": "index.js",
"type": "module",