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",