beatsaber-bot-core 0.2.0-rc.7 → 0.2.0-rc.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cmd/deprecated/tmp.js +7 -3
- package/dist/cjs/cmd/deprecated/tmp.js.map +1 -1
- package/dist/cjs/infra/support/render/index.js +5 -6
- package/dist/cjs/infra/support/render/index.js.map +1 -1
- package/dist/cjs/infra/support/render/puppeteer.js +2 -2
- package/dist/cjs/infra/support/render/puppeteer.js.map +1 -1
- package/dist/cjs/service/render/index.js +1 -1
- package/dist/cjs/service/render/index.js.map +1 -1
- package/dist/cjs/service/render/interfaces.js.map +1 -1
- package/dist/esm/cmd/deprecated/tmp.js +7 -3
- package/dist/esm/cmd/deprecated/tmp.js.map +1 -1
- package/dist/esm/infra/support/render/index.js +5 -7
- package/dist/esm/infra/support/render/index.js.map +1 -1
- package/dist/esm/infra/support/render/puppeteer.js +2 -2
- package/dist/esm/infra/support/render/puppeteer.js.map +1 -1
- package/dist/esm/service/render/index.js +1 -1
- package/dist/esm/service/render/index.js.map +1 -1
- package/dist/types/cmd/bind/bind-beatleader.d.ts +1 -1
- package/dist/types/cmd/bind/bind-beatsaver.d.ts +1 -1
- package/dist/types/cmd/bind/bind-id-beatleader.d.ts +1 -1
- package/dist/types/cmd/bind/bind-id-beatsaver.d.ts +1 -1
- package/dist/types/cmd/bind/bind-scoresaber.d.ts +1 -1
- package/dist/types/cmd/bind/index.d.ts +1 -1
- package/dist/types/cmd/bsmap/id-search.d.ts +1 -1
- package/dist/types/cmd/bsmap/key-search.d.ts +1 -1
- package/dist/types/cmd/bsmap/latest.d.ts +1 -1
- package/dist/types/cmd/deprecated/tmp.d.ts +1 -1
- package/dist/types/cmd/index.d.ts +1 -1
- package/dist/types/cmd/rank.d.ts +1 -1
- package/dist/types/cmd/score.d.ts +1 -1
- package/dist/types/cmd/subscribe/beatleader.d.ts +1 -1
- package/dist/types/cmd/subscribe/beatsaver.d.ts +1 -1
- package/dist/types/cmd/subscribe/id-beatleader-score.d.ts +1 -1
- package/dist/types/cmd/subscribe/id-beatsaver-mapper.d.ts +1 -1
- package/dist/types/cmd/subscribe/index.d.ts +1 -1
- package/dist/types/cmd/subscribe/subjoin.d.ts +1 -1
- package/dist/types/cmd/subscribe/subleave.d.ts +1 -1
- package/dist/types/cmd/subscribe/unsubscribe.d.ts +1 -1
- package/dist/types/{index-BwvAwgCV.d.ts → index-Dagy_c8G.d.ts} +7 -6
- package/dist/types/index.d.ts +3 -3
- package/dist/types/infra/index.d.ts +1 -1
- package/dist/types/infra/support/render/index.d.ts +1 -1
- package/dist/types/interface/cmd/builder.d.ts +1 -1
- package/dist/types/interface/cmd/type.d.ts +1 -1
- package/dist/types/interface/index.d.ts +1 -1
- package/dist/types/schedules/index.d.ts +3 -3
- package/dist/types/schedules/interface.d.ts +1 -1
- package/dist/types/schedules/temp.d.ts +1 -1
- package/dist/types/service/index.d.ts +1 -1
- package/dist/types/service/render/index.d.ts +1 -1
- package/dist/types/service/render/interfaces.d.ts +2 -2
- package/dist/types/ws/beatleader.d.ts +1 -1
- package/dist/types/ws/beatsaver.d.ts +1 -1
- package/dist/types/ws/index.d.ts +1 -1
- package/dist/types/ws/scoresaber.d.ts +1 -1
- package/package.json +1 -1
@@ -44,13 +44,17 @@ var import_builder = require("../../interface/cmd/builder");
|
|
44
44
|
var tmp_default = () => new import_builder.CommandBuilder().setName("lb").addAlias("/lb").addAlias("bblb").addAlias("\u4E50\u56E2\u65B0\u8D5B\u5B63").addAlias("\u4E50\u56E2\u699C\u5355").setExecutor((c) => __async(null, null, function* () {
|
45
45
|
const [hit, score] = yield Promise.all([
|
46
46
|
c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/hitcnt", {
|
47
|
+
selector: "#render-result",
|
47
48
|
onRenderStart: () => {
|
48
49
|
c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u780D\u51FB\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
|
49
50
|
}
|
50
51
|
}),
|
51
|
-
c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/score", {
|
52
|
-
|
53
|
-
|
52
|
+
c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/score", {
|
53
|
+
selector: "#render-result",
|
54
|
+
onRenderStart: () => {
|
55
|
+
c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u5206\u6570\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
|
56
|
+
}
|
57
|
+
})
|
54
58
|
]);
|
55
59
|
c.session.sendImgBuffer(hit, "image/png");
|
56
60
|
c.session.sendImgBuffer(score, "image/png");
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/cmd/deprecated/tmp.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\n\nexport default () =>\n new CommandBuilder()\n .setName('lb')\n .addAlias('/lb')\n .addAlias('bblb')\n .addAlias('乐团新赛季')\n .addAlias('乐团榜单')\n .setExecutor(async (c) => {\n const [hit, score] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n onRenderStart:() => {\n c.session.sendQueued('开始渲染砍击榜了,请耐心等待 10s')\n }
|
1
|
+
{"version":3,"sources":["../../../../src/cmd/deprecated/tmp.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\n\nexport default () =>\n new CommandBuilder()\n .setName('lb')\n .addAlias('/lb')\n .addAlias('bblb')\n .addAlias('乐团新赛季')\n .addAlias('乐团榜单')\n .setExecutor(async (c) => {\n const [hit, score] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n onRenderStart:() => {\n c.session.sendQueued('开始渲染砍击榜了,请耐心等待 10s')\n },\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n onRenderStart: () => {\n c.session.sendQueued('开始渲染分数榜了,请耐心等待 10s')\n }\n }),\n ])\n c.session.sendImgBuffer(hit, 'image/png')\n c.session.sendImgBuffer(score, 'image/png')\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA6B;AAE7B,IAAO,cAAQ,MACb,IAAI,8BAAe,EAChB,QAAQ,IAAI,EACZ,SAAS,KAAK,EACd,SAAS,MAAM,EACf,SAAS,gCAAO,EAChB,SAAS,0BAAM,EACf,YAAY,CAAO,MAAM;AACxB,QAAM,CAAC,KAAK,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACrC,EAAE,SAAS,OAAO,UAAU,wCAAwC;AAAA,MAClE,UAAU;AAAA,MACV,eAAc,MAAM;AAClB,UAAE,QAAQ,WAAW,0FAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,IACD,EAAE,SAAS,OAAO,UAAU,uCAAuC;AAAA,MACjE,UAAU;AAAA,MACV,eAAe,MAAM;AACnB,UAAE,QAAQ,WAAW,0FAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,IAAE,QAAQ,cAAc,KAAK,WAAW;AACxC,IAAE,QAAQ,cAAc,OAAO,WAAW;AAC5C,EAAC;","names":[]}
|
@@ -56,6 +56,7 @@ var __async = (__this, __arguments, generator) => {
|
|
56
56
|
var render_exports = {};
|
57
57
|
__export(render_exports, {
|
58
58
|
CFBrowserRendering: () => CFBrowserRendering,
|
59
|
+
PuppeteerOptions: () => import_puppeteer.RenderOptions,
|
59
60
|
PuppeteerRendering: () => PuppeteerRendering,
|
60
61
|
RemoteBrowserGetter: () => RemoteBrowserGetter,
|
61
62
|
getImageRender: () => getImageRender
|
@@ -79,12 +80,9 @@ class CFBrowserRendering {
|
|
79
80
|
return this.f.post("/browser-rendering/screenshot", {
|
80
81
|
responseType: "arrayBuffer",
|
81
82
|
body: __spreadProps(__spreadValues({}, body), {
|
82
|
-
"screenshotOptions": {
|
83
|
-
"omitBackground": true
|
84
|
-
},
|
85
83
|
"viewport": {
|
86
|
-
"width":
|
87
|
-
"height":
|
84
|
+
"width": 3840,
|
85
|
+
"height": 2160,
|
88
86
|
"deviceScaleFactor": 2
|
89
87
|
},
|
90
88
|
"gotoOptions": {
|
@@ -118,7 +116,7 @@ class PuppeteerRendering {
|
|
118
116
|
}
|
119
117
|
url2img(html, opt) {
|
120
118
|
return __async(this, null, function* () {
|
121
|
-
return (0, import_puppeteer.
|
119
|
+
return (0, import_puppeteer.url2imgBuffer)(this.browserGetter, html, opt);
|
122
120
|
});
|
123
121
|
}
|
124
122
|
}
|
@@ -146,6 +144,7 @@ const getImageRender = (cfg) => {
|
|
146
144
|
// Annotate the CommonJS export names for ESM import in node:
|
147
145
|
0 && (module.exports = {
|
148
146
|
CFBrowserRendering,
|
147
|
+
PuppeteerOptions,
|
149
148
|
PuppeteerRendering,
|
150
149
|
RemoteBrowserGetter,
|
151
150
|
getImageRender
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../../src/infra/support/render/index.ts"],"sourcesContent":["import {html2imgBuffer, RenderOptions} from \"./puppeteer\";\nimport {Browser, Puppeteer} from \"puppeteer-core\";\nimport {Fetch} from \"@/infra/support/fetch\";\
|
1
|
+
{"version":3,"sources":["../../../../../src/infra/support/render/index.ts"],"sourcesContent":["import {html2imgBuffer, RenderOptions, url2imgBuffer} from \"./puppeteer\";\nimport {Browser, Puppeteer} from \"puppeteer-core\";\nimport {Fetch} from \"@/infra/support/fetch\";\nexport {RenderOptions as PuppeteerOptions}\nexport interface ImageRender {\n html2img: (html: string, opt: RenderOptions) => Promise<Buffer>\n url2img: (url: string, opt: RenderOptions) => Promise<Buffer>\n}\n\nexport type RenderConfig = {\n mode: 'cf' | 'puppeteer'\n puppeteerURL?: string\n defaultWaitTimeout?: number\n waitTimeout?: number\n cfAccountId?: string,\n cfAPIKey?: string,\n}\n\nexport class CFBrowserRendering implements ImageRender {\n f: Fetch\n constructor(private accountId: string, private cfAPIKey: string) {\n this.f = new Fetch()\n .baseUrl(`https://api.cloudflare.com/client/v4/accounts/${accountId}`)\n .extend({\n headers: {\n Authorization: `Bearer ${cfAPIKey}`\n },\n })\n }\n private post(body) {\n return this.f.post('/browser-rendering/screenshot', {\n responseType: 'arrayBuffer',\n body: {\n ...body,\n \"viewport\": {\n \"width\": 3840,\n \"height\": 2160,\n \"deviceScaleFactor\": 2,\n },\n \"gotoOptions\": {\n \"waitUntil\": \"networkidle0\",\n \"timeout\": 30000\n },\n }\n })\n }\n\n\n\n async html2img (html: string, opt: RenderOptions) {\n const buf = await this.post({html: html, ...opt})\n return Buffer.from(buf)\n }\n async url2img (url: string, opt: RenderOptions) {\n const buf = await this.post({url: url, ...opt})\n return Buffer.from(buf)\n }\n}\n\nexport class PuppeteerRendering implements ImageRender {\n constructor(private browserGetter: () => Promise<Browser>) {\n }\n async html2img (html: string, opt: RenderOptions) {\n return html2imgBuffer(this.browserGetter, html, opt)\n }\n async url2img (html: string, opt: RenderOptions) {\n return url2imgBuffer(this.browserGetter, html, opt)\n }\n}\n\n\nexport const RemoteBrowserGetter = (addr: string) => {\n const p = new Puppeteer()\n let opt = {}\n if(addr.startsWith('ws')) {\n opt = { browserWSEndpoint: addr }\n }else if(addr.startsWith('http')) {\n opt = { browserURL: addr }\n }\n return () => p.connect(opt)\n}\n\n\nexport const getImageRender = (cfg: RenderConfig & {browserGetter?: () => Promise<Browser>}) => {\n if(cfg.mode === 'cf') {\n return new CFBrowserRendering(cfg.cfAccountId, cfg.cfAPIKey)\n }\n if(cfg.puppeteerURL) {\n return new PuppeteerRendering(RemoteBrowserGetter(cfg.puppeteerURL))\n }\n if(cfg.browserGetter) {\n return new PuppeteerRendering(cfg.browserGetter)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA2D;AAC3D,4BAAiC;AACjC,mBAAoB;AAgBb,MAAM,mBAA0C;AAAA,EAErD,YAAoB,WAA2B,UAAkB;AAA7C;AAA2B;AAD/C;AAEE,SAAK,IAAI,IAAI,mBAAM,EAChB,QAAQ,iDAAiD,SAAS,EAAE,EACpE,OAAO;AAAA,MACN,SAAS;AAAA,QACP,eAAe,UAAU,QAAQ;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EACQ,KAAK,MAAM;AACjB,WAAO,KAAK,EAAE,KAAK,iCAAiC;AAAA,MAClD,cAAc;AAAA,MACd,MAAM,iCACD,OADC;AAAA,QAEJ,YAAY;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB;AAAA,QACA,eAAe;AAAA,UACb,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAIM,SAAU,MAAc,KAAoB;AAAA;AAChD,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,QAAe,IAAI;AAChD,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AAAA,EACM,QAAS,KAAa,KAAoB;AAAA;AAC9C,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,OAAa,IAAI;AAC9C,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AACF;AAEO,MAAM,mBAA0C;AAAA,EACrD,YAAoB,eAAuC;AAAvC;AAAA,EACpB;AAAA,EACM,SAAU,MAAc,KAAoB;AAAA;AAChD,iBAAO,iCAAe,KAAK,eAAe,MAAM,GAAG;AAAA,IACrD;AAAA;AAAA,EACM,QAAS,MAAc,KAAoB;AAAA;AAC/C,iBAAO,gCAAc,KAAK,eAAe,MAAM,GAAG;AAAA,IACpD;AAAA;AACF;AAGO,MAAM,sBAAsB,CAAC,SAAiB;AACnD,QAAM,IAAI,IAAI,gCAAU;AACxB,MAAI,MAAM,CAAC;AACX,MAAG,KAAK,WAAW,IAAI,GAAG;AACxB,UAAM,EAAE,mBAAmB,KAAK;AAAA,EAClC,WAAS,KAAK,WAAW,MAAM,GAAG;AAChC,UAAM,EAAE,YAAY,KAAK;AAAA,EAC3B;AACA,SAAO,MAAM,EAAE,QAAQ,GAAG;AAC5B;AAGO,MAAM,iBAAiB,CAAC,QAAiE;AAC9F,MAAG,IAAI,SAAS,MAAM;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa,IAAI,QAAQ;AAAA,EAC7D;AACA,MAAG,IAAI,cAAc;AACnB,WAAO,IAAI,mBAAmB,oBAAoB,IAAI,YAAY,CAAC;AAAA,EACrE;AACA,MAAG,IAAI,eAAe;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa;AAAA,EACjD;AACF;","names":[]}
|
@@ -105,7 +105,7 @@ function html2imgBuffer(browser, html, options) {
|
|
105
105
|
options,
|
106
106
|
(page) => page.setContent(html, { waitUntil: "networkidle0" }),
|
107
107
|
{ fullPage: true },
|
108
|
-
{ width:
|
108
|
+
{ width: 3840, height: 2160, deviceScaleFactor: 2 }
|
109
109
|
);
|
110
110
|
});
|
111
111
|
}
|
@@ -116,7 +116,7 @@ function url2imgBuffer(browser, url, options) {
|
|
116
116
|
options,
|
117
117
|
(page) => page.goto(url, { waitUntil: "networkidle0" }),
|
118
118
|
{ fullPage: false },
|
119
|
-
{ width:
|
119
|
+
{ width: 3840, height: 2160, deviceScaleFactor: 2 },
|
120
120
|
`page: ${url}`
|
121
121
|
);
|
122
122
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../../src/infra/support/render/puppeteer.ts"],"sourcesContent":["import type {Browser, Page, ScreenshotOptions, Viewport} from 'puppeteer-core';\n\n/**\n * Extends Puppeteer's ScreenshotOptions to include an optional viewport setting\n * and a selector for element-specific screenshots.\n */\nexport interface RenderOptions extends ScreenshotOptions {\n /**\n * Sets the viewport of the page.\n */\n viewport?: Viewport;\n /**\n * A CSS selector for an element to screenshot. If provided, the output\n * will be a screenshot of just this element.\n */\n selector?: string;\n /**\n * The maximum time in milliseconds to wait for the selector to appear.\n * If the element is not found within this time, an error will be thrown.\n * Defaults to Puppeteer's default (usually 30000ms).\n */\n timeout?: number;\n}\n\n/**\n * Core rendering function that handles the common logic for taking a screenshot.\n * It's designed to be called by the public-facing wrapper functions.\n * @private\n */\nasync function _renderPageToBuffer(\n browser: Browser | (() => Promise<Browser>),\n options: RenderOptions | undefined,\n loadContent: (page: Page) => Promise<any>,\n defaultScreenshotOptions: ScreenshotOptions,\n defaultViewport: Viewport,\n errorContext?: string,\n): Promise<Buffer> {\n let page: Page | undefined;\n try {\n let b : Browser\n if(typeof browser === \"function\") {\n b = await browser()\n }\n page = await b.newPage();\n\n const viewport = options?.viewport ?? defaultViewport;\n await page.setViewport(viewport);\n\n // The content loading strategy is passed in as a callback.\n await loadContent(page);\n\n const {viewport: _, selector, timeout, ...screenshotOptions} = options || {};\n\n if (selector) {\n const element = await page.waitForSelector(selector, {timeout});\n if (!element) {\n const timeoutMsg = `within the ${timeout || 'default'}ms timeout.`;\n const contextMsg = errorContext ? ` on ${errorContext}` : '';\n throw new Error(`Could not find element with selector: \"${selector}\"${contextMsg} ${timeoutMsg}`);\n }\n return Buffer.from(await element.screenshot(screenshotOptions));\n }\n\n return Buffer.from(await page.screenshot({\n ...defaultScreenshotOptions,\n ...screenshotOptions,\n }))\n } finally {\n if (page) {\n await page.close();\n }\n }\n}\n\n/**\n * Renders an HTML string into an image buffer using a provided Puppeteer browser instance.\n *\n * @param browser The active Puppeteer Browser instance.\n * @param html The HTML content to render.\n * @param options Configuration for the rendering process.\n * @returns A Promise that resolves to a Buffer containing the screenshot image.\n */\nexport async function html2imgBuffer(\n browser: Browser | (() => Promise<Browser>),\n html: string,\n options?: RenderOptions,\n): Promise<Buffer> {\n return _renderPageToBuffer(\n browser,\n options,\n (page) => page.setContent(html, {waitUntil: 'networkidle0'}),\n {fullPage: true},\n {width:
|
1
|
+
{"version":3,"sources":["../../../../../src/infra/support/render/puppeteer.ts"],"sourcesContent":["import type {Browser, Page, ScreenshotOptions, Viewport} from 'puppeteer-core';\n\n/**\n * Extends Puppeteer's ScreenshotOptions to include an optional viewport setting\n * and a selector for element-specific screenshots.\n */\nexport interface RenderOptions extends ScreenshotOptions {\n /**\n * Sets the viewport of the page.\n */\n viewport?: Viewport;\n /**\n * A CSS selector for an element to screenshot. If provided, the output\n * will be a screenshot of just this element.\n */\n selector?: string;\n /**\n * The maximum time in milliseconds to wait for the selector to appear.\n * If the element is not found within this time, an error will be thrown.\n * Defaults to Puppeteer's default (usually 30000ms).\n */\n timeout?: number;\n}\n\n/**\n * Core rendering function that handles the common logic for taking a screenshot.\n * It's designed to be called by the public-facing wrapper functions.\n * @private\n */\nasync function _renderPageToBuffer(\n browser: Browser | (() => Promise<Browser>),\n options: RenderOptions | undefined,\n loadContent: (page: Page) => Promise<any>,\n defaultScreenshotOptions: ScreenshotOptions,\n defaultViewport: Viewport,\n errorContext?: string,\n): Promise<Buffer> {\n let page: Page | undefined;\n try {\n let b : Browser\n if(typeof browser === \"function\") {\n b = await browser()\n }\n page = await b.newPage();\n\n const viewport = options?.viewport ?? defaultViewport;\n await page.setViewport(viewport);\n\n // The content loading strategy is passed in as a callback.\n await loadContent(page);\n\n const {viewport: _, selector, timeout, ...screenshotOptions} = options || {};\n\n if (selector) {\n const element = await page.waitForSelector(selector, {timeout});\n if (!element) {\n const timeoutMsg = `within the ${timeout || 'default'}ms timeout.`;\n const contextMsg = errorContext ? ` on ${errorContext}` : '';\n throw new Error(`Could not find element with selector: \"${selector}\"${contextMsg} ${timeoutMsg}`);\n }\n return Buffer.from(await element.screenshot(screenshotOptions));\n }\n\n return Buffer.from(await page.screenshot({\n ...defaultScreenshotOptions,\n ...screenshotOptions,\n }))\n } finally {\n if (page) {\n await page.close();\n }\n }\n}\n\n/**\n * Renders an HTML string into an image buffer using a provided Puppeteer browser instance.\n *\n * @param browser The active Puppeteer Browser instance.\n * @param html The HTML content to render.\n * @param options Configuration for the rendering process.\n * @returns A Promise that resolves to a Buffer containing the screenshot image.\n */\nexport async function html2imgBuffer(\n browser: Browser | (() => Promise<Browser>),\n html: string,\n options?: RenderOptions,\n): Promise<Buffer> {\n return _renderPageToBuffer(\n browser,\n options,\n (page) => page.setContent(html, {waitUntil: 'networkidle0'}),\n {fullPage: true},\n {width: 3840, height: 2160, deviceScaleFactor: 2},\n );\n}\n\n/**\n * Captures a screenshot of a given URL and returns it as an image buffer.\n *\n * @param browser The active Puppeteer Browser instance.\n * @param url The URL of the webpage to capture.\n * @param options Configuration for the rendering process.\n * @returns A Promise that resolves to a Buffer containing the screenshot image.\n */\nexport async function url2imgBuffer(\n browser: Browser | (() => Promise<Browser>),\n url: string,\n options?: RenderOptions,\n): Promise<Buffer> {\n return _renderPageToBuffer(\n browser,\n options,\n (page) => page.goto(url, {waitUntil: 'networkidle0'}),\n {fullPage: false},\n {width: 3840, height: 2160, deviceScaleFactor: 2},\n `page: ${url}`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BA,SAAe,oBACb,SACA,SACA,aACA,0BACA,iBACA,cACiB;AAAA;AApCnB;AAqCE,QAAI;AACJ,QAAI;AACF,UAAI;AACJ,UAAG,OAAO,YAAY,YAAY;AAChC,YAAI,MAAM,QAAQ;AAAA,MACpB;AACA,aAAO,MAAM,EAAE,QAAQ;AAEvB,YAAM,YAAW,wCAAS,aAAT,YAAqB;AACtC,YAAM,KAAK,YAAY,QAAQ;AAG/B,YAAM,YAAY,IAAI;AAEtB,YAA+D,gBAAW,CAAC,GAApE,YAAU,GAAG,UAAU,QAnDlC,IAmDmE,IAArB,8BAAqB,IAArB,CAAnC,YAAa,YAAU;AAE9B,UAAI,UAAU;AACZ,cAAM,UAAU,MAAM,KAAK,gBAAgB,UAAU,EAAC,QAAO,CAAC;AAC9D,YAAI,CAAC,SAAS;AACZ,gBAAM,aAAa,cAAc,WAAW,SAAS;AACrD,gBAAM,aAAa,eAAe,OAAO,YAAY,KAAK;AAC1D,gBAAM,IAAI,MAAM,0CAA0C,QAAQ,IAAI,UAAU,IAAI,UAAU,EAAE;AAAA,QAClG;AACA,eAAO,OAAO,KAAK,MAAM,QAAQ,WAAW,iBAAiB,CAAC;AAAA,MAChE;AAEA,aAAO,OAAO,KAAK,MAAM,KAAK,WAAW,kCACpC,2BACA,kBACJ,CAAC;AAAA,IACJ,UAAE;AACA,UAAI,MAAM;AACR,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAUA,SAAsB,eACpB,SACA,MACA,SACiB;AAAA;AACjB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,CAAC,SAAS,KAAK,WAAW,MAAM,EAAC,WAAW,eAAc,CAAC;AAAA,MAC3D,EAAC,UAAU,KAAI;AAAA,MACf,EAAC,OAAO,MAAM,QAAQ,MAAM,mBAAmB,EAAC;AAAA,IAClD;AAAA,EACF;AAAA;AAUA,SAAsB,cACpB,SACA,KACA,SACiB;AAAA;AACjB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,CAAC,SAAS,KAAK,KAAK,KAAK,EAAC,WAAW,eAAc,CAAC;AAAA,MACpD,EAAC,UAAU,MAAK;AAAA,MAChB,EAAC,OAAO,MAAM,QAAQ,MAAM,mBAAmB,EAAC;AAAA,MAChD,SAAS,GAAG;AAAA,IACd;AAAA,EACF;AAAA;","names":[]}
|
@@ -143,7 +143,7 @@ class RenderService {
|
|
143
143
|
}
|
144
144
|
renderUrl(url, renderOption) {
|
145
145
|
return __async(this, null, function* () {
|
146
|
-
return this.imageRender.url2img(url,
|
146
|
+
return this.imageRender.url2img(url, renderOption);
|
147
147
|
});
|
148
148
|
}
|
149
149
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/service/render/index.ts"],"sourcesContent":["import {IRenderService, RenderOption} from './interfaces'\nimport { getHtml } from '@/components'\nimport { PuppeteerError, TimeoutError } from 'puppeteer-core'\nimport { Platform } from '@/interface'\nimport {getBLPlayerComp, getBLRankScoreComp, getBSMapComp, getSSPlayerComp} from '@/components/pages'\nimport {preferenceKey} from \"@/service/preference\";\nimport {ImageRenderError, RequestError} from \"@/infra/errors\";\nimport createQrcode from \"@/components/utils/qrcode\";\nimport {APIService} from \"@/service/api\";\nimport {BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport {ImageRender} from \"@/infra/support/render\";\n\n\nconst getPreferenceKey = (platform: string) => {\n return platform == Platform.SS\n ? preferenceKey.ssProfileRenderImg.key\n : preferenceKey.blProfileRenderImg.key\n}\n\nexport class RenderService implements IRenderService {\n constructor(\n private api: APIService,\n private imageRender: ImageRender\n ) {}\n async renderRank(\n accountId: string,\n platform: Platform,\n renderOpts?: RenderOption\n ) {\n try {\n let bg = (await renderOpts?.userPreference?.get<string>(getPreferenceKey(platform)))\n bg = bg || 'https://www.loliapi.com/acg/pc/'\n let html: string\n if (platform == Platform.BL) {\n const { scores, userInfo } = await this.api.getBLPlayerScoresWithUserInfo(accountId)\n html = getHtml(getBLPlayerComp(scores, userInfo, bg))\n } else {\n const { scores, userInfo } = await this.api.getSSPlayerRecentScoreWithUserInfo(accountId)\n html = getHtml(getSSPlayerComp(scores, userInfo, bg))\n }\n return this.imageRender.html2img(html, {selector: '#render-result', ...renderOpts})\n }catch (e) {\n if (e instanceof TimeoutError || e instanceof PuppeteerError) {\n throw new ImageRenderError()\n }\n throw e\n }\n }\n\n async renderScore(\n scoreId: string,\n renderOpts?: RenderOption\n ) {\n const bg = (await renderOpts?.userPreference?.get<string>(preferenceKey.blScoreImg.key))\n ?? 'https://www.loliapi.com/acg/pc/'\n try {\n const { score, statistic, bsor, bsMap } =\n await this.api.getScoreAndBSMapByScoreId(scoreId)\n\n const { aroundScores, regionTopScores, difficulties } =\n await this.api.getAroundScoreAndRegionScoreByRankAndPage(\n score.leaderboardId,\n score.rank,\n score.player.country\n )\n return this.imageRender.html2img(\n getHtml(getBLRankScoreComp(score, aroundScores, regionTopScores, difficulties, bsMap, statistic, bsor, bg)),\n {selector: '#render-result', ...renderOpts}\n )\n }catch (e) {\n if (e instanceof RequestError) {\n throw e\n }\n throw new ImageRenderError()\n }\n }\n\n async renderMapById(\n mapId: string,\n renderOption: RenderOption\n ) {\n const map = await this.api.BeatSaver.searchMapById(mapId)\n return this.renderMap(map, renderOption)\n }\n\n async renderMap(\n bsMap: BSMap,\n renderOption?: RenderOption\n ) {\n const previewQrUrl = await createQrcode(`https://allpoland.github.io/ArcViewer/?id=${bsMap.id}`)\n const bsMapQrUrl = await createQrcode(`https://beatsaver.com/maps/${bsMap.id}`)\n return this.imageRender.html2img(\n getHtml(getBSMapComp(bsMap, bsMapQrUrl, previewQrUrl)), {selector: '#render-result', ...renderOption}\n )\n }\n\n async renderUrl(url: string, renderOption?: RenderOption) {\n return this.imageRender.url2img(url,
|
1
|
+
{"version":3,"sources":["../../../../src/service/render/index.ts"],"sourcesContent":["import {IRenderService, RenderOption} from './interfaces'\nimport { getHtml } from '@/components'\nimport { PuppeteerError, TimeoutError } from 'puppeteer-core'\nimport { Platform } from '@/interface'\nimport {getBLPlayerComp, getBLRankScoreComp, getBSMapComp, getSSPlayerComp} from '@/components/pages'\nimport {preferenceKey} from \"@/service/preference\";\nimport {ImageRenderError, RequestError} from \"@/infra/errors\";\nimport createQrcode from \"@/components/utils/qrcode\";\nimport {APIService} from \"@/service/api\";\nimport {BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport {ImageRender} from \"@/infra/support/render\";\n\n\nconst getPreferenceKey = (platform: string) => {\n return platform == Platform.SS\n ? preferenceKey.ssProfileRenderImg.key\n : preferenceKey.blProfileRenderImg.key\n}\n\nexport class RenderService implements IRenderService {\n constructor(\n private api: APIService,\n private imageRender: ImageRender\n ) {}\n async renderRank(\n accountId: string,\n platform: Platform,\n renderOpts?: RenderOption\n ) {\n try {\n let bg = (await renderOpts?.userPreference?.get<string>(getPreferenceKey(platform)))\n bg = bg || 'https://www.loliapi.com/acg/pc/'\n let html: string\n if (platform == Platform.BL) {\n const { scores, userInfo } = await this.api.getBLPlayerScoresWithUserInfo(accountId)\n html = getHtml(getBLPlayerComp(scores, userInfo, bg))\n } else {\n const { scores, userInfo } = await this.api.getSSPlayerRecentScoreWithUserInfo(accountId)\n html = getHtml(getSSPlayerComp(scores, userInfo, bg))\n }\n return this.imageRender.html2img(html, {selector: '#render-result', ...renderOpts})\n }catch (e) {\n if (e instanceof TimeoutError || e instanceof PuppeteerError) {\n throw new ImageRenderError()\n }\n throw e\n }\n }\n\n async renderScore(\n scoreId: string,\n renderOpts?: RenderOption\n ) {\n const bg = (await renderOpts?.userPreference?.get<string>(preferenceKey.blScoreImg.key))\n ?? 'https://www.loliapi.com/acg/pc/'\n try {\n const { score, statistic, bsor, bsMap } =\n await this.api.getScoreAndBSMapByScoreId(scoreId)\n\n const { aroundScores, regionTopScores, difficulties } =\n await this.api.getAroundScoreAndRegionScoreByRankAndPage(\n score.leaderboardId,\n score.rank,\n score.player.country\n )\n return this.imageRender.html2img(\n getHtml(getBLRankScoreComp(score, aroundScores, regionTopScores, difficulties, bsMap, statistic, bsor, bg)),\n {selector: '#render-result', ...renderOpts}\n )\n }catch (e) {\n if (e instanceof RequestError) {\n throw e\n }\n throw new ImageRenderError()\n }\n }\n\n async renderMapById(\n mapId: string,\n renderOption: RenderOption\n ) {\n const map = await this.api.BeatSaver.searchMapById(mapId)\n return this.renderMap(map, renderOption)\n }\n\n async renderMap(\n bsMap: BSMap,\n renderOption?: RenderOption\n ) {\n const previewQrUrl = await createQrcode(`https://allpoland.github.io/ArcViewer/?id=${bsMap.id}`)\n const bsMapQrUrl = await createQrcode(`https://beatsaver.com/maps/${bsMap.id}`)\n return this.imageRender.html2img(\n getHtml(getBSMapComp(bsMap, bsMapQrUrl, previewQrUrl)), {selector: '#render-result', ...renderOption}\n )\n }\n\n async renderUrl(url: string, renderOption?: RenderOption) {\n return this.imageRender.url2img(url, renderOption)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAAwB;AACxB,4BAA6C;AAC7C,uBAAyB;AACzB,mBAAiF;AACjF,wBAA4B;AAC5B,oBAA6C;AAC7C,oBAAyB;AAMzB,MAAM,mBAAmB,CAAC,aAAqB;AAC7C,SAAO,YAAY,0BAAS,KACxB,gCAAc,mBAAmB,MACjC,gCAAc,mBAAmB;AACvC;AAEO,MAAM,cAAwC;AAAA,EACnD,YACU,KACA,aACR;AAFQ;AACA;AAAA,EACP;AAAA,EACG,WACJ,WACA,UACA,YACA;AAAA;AA5BJ;AA6BI,UAAI;AACF,YAAI,KAAM,OAAM,8CAAY,mBAAZ,mBAA4B,IAAY,iBAAiB,QAAQ;AACjF,aAAK,MAAM;AACX,YAAI;AACJ,YAAI,YAAY,0BAAS,IAAI;AAC3B,gBAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK,IAAI,8BAA8B,SAAS;AACnF,qBAAO,+BAAQ,8BAAgB,QAAQ,UAAU,EAAE,CAAC;AAAA,QACtD,OAAO;AACL,gBAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK,IAAI,mCAAmC,SAAS;AACxF,qBAAO,+BAAQ,8BAAgB,QAAQ,UAAU,EAAE,CAAC;AAAA,QACtD;AACA,eAAO,KAAK,YAAY,SAAS,MAAM,iBAAC,UAAU,oBAAqB,WAAW;AAAA,MACpF,SAAQ,GAAG;AACT,YAAI,aAAa,sCAAgB,aAAa,sCAAgB;AAC5D,gBAAM,IAAI,+BAAiB;AAAA,QAC7B;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA,EAEM,YACJ,SACA,YACA;AAAA;AApDJ;AAqDI,YAAM,MAAM,YAAM,8CAAY,mBAAZ,mBAA4B,IAAY,gCAAc,WAAW,SAAvE,YACP;AACL,UAAI;AACF,cAAM,EAAE,OAAO,WAAW,MAAM,MAAM,IACpC,MAAM,KAAK,IAAI,0BAA0B,OAAO;AAElD,cAAM,EAAE,cAAc,iBAAiB,aAAa,IAClD,MAAM,KAAK,IAAI;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,QACf;AACF,eAAO,KAAK,YAAY;AAAA,cACtB,+BAAQ,iCAAmB,OAAO,cAAc,iBAAiB,cAAc,OAAO,WAAW,MAAM,EAAE,CAAC;AAAA,UAC1G,iBAAC,UAAU,oBAAqB;AAAA,QAClC;AAAA,MACF,SAAQ,GAAG;AACT,YAAI,aAAa,4BAAc;AAC7B,gBAAM;AAAA,QACR;AACA,cAAM,IAAI,+BAAiB;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA,EAEM,cACJ,OACA,cACA;AAAA;AACA,YAAM,MAAM,MAAM,KAAK,IAAI,UAAU,cAAc,KAAK;AACxD,aAAO,KAAK,UAAU,KAAK,YAAY;AAAA,IACzC;AAAA;AAAA,EAEM,UACJ,OACA,cACA;AAAA;AACA,YAAM,eAAe,UAAM,cAAAA,SAAa,6CAA6C,MAAM,EAAE,EAAE;AAC/F,YAAM,aAAa,UAAM,cAAAA,SAAa,8BAA8B,MAAM,EAAE,EAAE;AAC9E,aAAO,KAAK,YAAY;AAAA,YACtB,+BAAQ,2BAAa,OAAO,YAAY,YAAY,CAAC;AAAA,QAAG,iBAAC,UAAU,oBAAqB;AAAA,MAC1F;AAAA,IACF;AAAA;AAAA,EAEM,UAAU,KAAa,cAA6B;AAAA;AACxD,aAAO,KAAK,YAAY,QAAQ,KAAK,YAAY;AAAA,IACnD;AAAA;AACF;","names":["createQrcode"]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/service/render/interfaces.ts"],"sourcesContent":["import type { Platform } from '@/interface'\nimport {UserPreferenceStore} from \"@/service/preference\";\nimport {BSMap} from \"@/service/api/interfaces/beatsaver\";\
|
1
|
+
{"version":3,"sources":["../../../../src/service/render/interfaces.ts"],"sourcesContent":["import type { Platform } from '@/interface'\nimport {UserPreferenceStore} from \"@/service/preference\";\nimport {BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport { PuppeteerOptions } from '@/infra/support/render'\nexport type RenderOption = RenderOptions & PuppeteerOptions\n\ntype RenderOptions = {\n userPreference?: UserPreferenceStore,\n onRenderStart?: () => void,\n onRenderError?: (e) => void\n}\n\nexport interface IRenderService {\n renderRank(accountId: string, platform: Platform, renderOpts?: RenderOption): Promise<Buffer>\n renderScore(scoreId: string, renderOpts?: RenderOption): Promise<Buffer>\n renderMapById(mapId: string, renderOpts?: RenderOption): Promise<Buffer>\n renderMap(bsMap: BSMap, renderOpts?: RenderOption): Promise<Buffer>\n renderUrl(url: string, renderOpts?: RenderOption): Promise<Buffer>\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
@@ -22,13 +22,17 @@ import { CommandBuilder } from "../../interface/cmd/builder";
|
|
22
22
|
var tmp_default = () => new CommandBuilder().setName("lb").addAlias("/lb").addAlias("bblb").addAlias("\u4E50\u56E2\u65B0\u8D5B\u5B63").addAlias("\u4E50\u56E2\u699C\u5355").setExecutor((c) => __async(null, null, function* () {
|
23
23
|
const [hit, score] = yield Promise.all([
|
24
24
|
c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/hitcnt", {
|
25
|
+
selector: "#render-result",
|
25
26
|
onRenderStart: () => {
|
26
27
|
c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u780D\u51FB\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
|
27
28
|
}
|
28
29
|
}),
|
29
|
-
c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/score", {
|
30
|
-
|
31
|
-
|
30
|
+
c.services.render.renderUrl("https://aiobs.ktlab.io/tmp/lb/score", {
|
31
|
+
selector: "#render-result",
|
32
|
+
onRenderStart: () => {
|
33
|
+
c.session.sendQueued("\u5F00\u59CB\u6E32\u67D3\u5206\u6570\u699C\u4E86\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85 10s");
|
34
|
+
}
|
35
|
+
})
|
32
36
|
]);
|
33
37
|
c.session.sendImgBuffer(hit, "image/png");
|
34
38
|
c.session.sendImgBuffer(score, "image/png");
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/cmd/deprecated/tmp.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\n\nexport default () =>\n new CommandBuilder()\n .setName('lb')\n .addAlias('/lb')\n .addAlias('bblb')\n .addAlias('乐团新赛季')\n .addAlias('乐团榜单')\n .setExecutor(async (c) => {\n const [hit, score] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n onRenderStart:() => {\n c.session.sendQueued('开始渲染砍击榜了,请耐心等待 10s')\n }
|
1
|
+
{"version":3,"sources":["../../../../src/cmd/deprecated/tmp.ts"],"sourcesContent":["import {CommandBuilder} from \"@/interface/cmd/builder\";\n\nexport default () =>\n new CommandBuilder()\n .setName('lb')\n .addAlias('/lb')\n .addAlias('bblb')\n .addAlias('乐团新赛季')\n .addAlias('乐团榜单')\n .setExecutor(async (c) => {\n const [hit, score] = await Promise.all([\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/hitcnt', {\n selector: '#render-result',\n onRenderStart:() => {\n c.session.sendQueued('开始渲染砍击榜了,请耐心等待 10s')\n },\n }),\n c.services.render.renderUrl('https://aiobs.ktlab.io/tmp/lb/score', {\n selector: '#render-result',\n onRenderStart: () => {\n c.session.sendQueued('开始渲染分数榜了,请耐心等待 10s')\n }\n }),\n ])\n c.session.sendImgBuffer(hit, 'image/png')\n c.session.sendImgBuffer(score, 'image/png')\n })\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAQ,sBAAqB;AAE7B,IAAO,cAAQ,MACb,IAAI,eAAe,EAChB,QAAQ,IAAI,EACZ,SAAS,KAAK,EACd,SAAS,MAAM,EACf,SAAS,gCAAO,EAChB,SAAS,0BAAM,EACf,YAAY,CAAO,MAAM;AACxB,QAAM,CAAC,KAAK,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACrC,EAAE,SAAS,OAAO,UAAU,wCAAwC;AAAA,MAClE,UAAU;AAAA,MACV,eAAc,MAAM;AAClB,UAAE,QAAQ,WAAW,0FAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,IACD,EAAE,SAAS,OAAO,UAAU,uCAAuC;AAAA,MACjE,UAAU;AAAA,MACV,eAAe,MAAM;AACnB,UAAE,QAAQ,WAAW,0FAAoB;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,IAAE,QAAQ,cAAc,KAAK,WAAW;AACxC,IAAE,QAAQ,cAAc,OAAO,WAAW;AAC5C,EAAC;","names":[]}
|
@@ -38,7 +38,7 @@ var __async = (__this, __arguments, generator) => {
|
|
38
38
|
step((generator = generator.apply(__this, __arguments)).next());
|
39
39
|
});
|
40
40
|
};
|
41
|
-
import { html2imgBuffer } from "./puppeteer";
|
41
|
+
import { html2imgBuffer, RenderOptions, url2imgBuffer } from "./puppeteer";
|
42
42
|
import { Puppeteer } from "puppeteer-core";
|
43
43
|
import { Fetch } from "../../../infra/support/fetch";
|
44
44
|
class CFBrowserRendering {
|
@@ -56,12 +56,9 @@ class CFBrowserRendering {
|
|
56
56
|
return this.f.post("/browser-rendering/screenshot", {
|
57
57
|
responseType: "arrayBuffer",
|
58
58
|
body: __spreadProps(__spreadValues({}, body), {
|
59
|
-
"screenshotOptions": {
|
60
|
-
"omitBackground": true
|
61
|
-
},
|
62
59
|
"viewport": {
|
63
|
-
"width":
|
64
|
-
"height":
|
60
|
+
"width": 3840,
|
61
|
+
"height": 2160,
|
65
62
|
"deviceScaleFactor": 2
|
66
63
|
},
|
67
64
|
"gotoOptions": {
|
@@ -95,7 +92,7 @@ class PuppeteerRendering {
|
|
95
92
|
}
|
96
93
|
url2img(html, opt) {
|
97
94
|
return __async(this, null, function* () {
|
98
|
-
return
|
95
|
+
return url2imgBuffer(this.browserGetter, html, opt);
|
99
96
|
});
|
100
97
|
}
|
101
98
|
}
|
@@ -122,6 +119,7 @@ const getImageRender = (cfg) => {
|
|
122
119
|
};
|
123
120
|
export {
|
124
121
|
CFBrowserRendering,
|
122
|
+
RenderOptions as PuppeteerOptions,
|
125
123
|
PuppeteerRendering,
|
126
124
|
RemoteBrowserGetter,
|
127
125
|
getImageRender
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../../src/infra/support/render/index.ts"],"sourcesContent":["import {html2imgBuffer, RenderOptions} from \"./puppeteer\";\nimport {Browser, Puppeteer} from \"puppeteer-core\";\nimport {Fetch} from \"@/infra/support/fetch\";\
|
1
|
+
{"version":3,"sources":["../../../../../src/infra/support/render/index.ts"],"sourcesContent":["import {html2imgBuffer, RenderOptions, url2imgBuffer} from \"./puppeteer\";\nimport {Browser, Puppeteer} from \"puppeteer-core\";\nimport {Fetch} from \"@/infra/support/fetch\";\nexport {RenderOptions as PuppeteerOptions}\nexport interface ImageRender {\n html2img: (html: string, opt: RenderOptions) => Promise<Buffer>\n url2img: (url: string, opt: RenderOptions) => Promise<Buffer>\n}\n\nexport type RenderConfig = {\n mode: 'cf' | 'puppeteer'\n puppeteerURL?: string\n defaultWaitTimeout?: number\n waitTimeout?: number\n cfAccountId?: string,\n cfAPIKey?: string,\n}\n\nexport class CFBrowserRendering implements ImageRender {\n f: Fetch\n constructor(private accountId: string, private cfAPIKey: string) {\n this.f = new Fetch()\n .baseUrl(`https://api.cloudflare.com/client/v4/accounts/${accountId}`)\n .extend({\n headers: {\n Authorization: `Bearer ${cfAPIKey}`\n },\n })\n }\n private post(body) {\n return this.f.post('/browser-rendering/screenshot', {\n responseType: 'arrayBuffer',\n body: {\n ...body,\n \"viewport\": {\n \"width\": 3840,\n \"height\": 2160,\n \"deviceScaleFactor\": 2,\n },\n \"gotoOptions\": {\n \"waitUntil\": \"networkidle0\",\n \"timeout\": 30000\n },\n }\n })\n }\n\n\n\n async html2img (html: string, opt: RenderOptions) {\n const buf = await this.post({html: html, ...opt})\n return Buffer.from(buf)\n }\n async url2img (url: string, opt: RenderOptions) {\n const buf = await this.post({url: url, ...opt})\n return Buffer.from(buf)\n }\n}\n\nexport class PuppeteerRendering implements ImageRender {\n constructor(private browserGetter: () => Promise<Browser>) {\n }\n async html2img (html: string, opt: RenderOptions) {\n return html2imgBuffer(this.browserGetter, html, opt)\n }\n async url2img (html: string, opt: RenderOptions) {\n return url2imgBuffer(this.browserGetter, html, opt)\n }\n}\n\n\nexport const RemoteBrowserGetter = (addr: string) => {\n const p = new Puppeteer()\n let opt = {}\n if(addr.startsWith('ws')) {\n opt = { browserWSEndpoint: addr }\n }else if(addr.startsWith('http')) {\n opt = { browserURL: addr }\n }\n return () => p.connect(opt)\n}\n\n\nexport const getImageRender = (cfg: RenderConfig & {browserGetter?: () => Promise<Browser>}) => {\n if(cfg.mode === 'cf') {\n return new CFBrowserRendering(cfg.cfAccountId, cfg.cfAPIKey)\n }\n if(cfg.puppeteerURL) {\n return new PuppeteerRendering(RemoteBrowserGetter(cfg.puppeteerURL))\n }\n if(cfg.browserGetter) {\n return new PuppeteerRendering(cfg.browserGetter)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAQ,gBAAgB,eAAe,qBAAoB;AAC3D,SAAiB,iBAAgB;AACjC,SAAQ,aAAY;AAgBb,MAAM,mBAA0C;AAAA,EAErD,YAAoB,WAA2B,UAAkB;AAA7C;AAA2B;AAD/C;AAEE,SAAK,IAAI,IAAI,MAAM,EAChB,QAAQ,iDAAiD,SAAS,EAAE,EACpE,OAAO;AAAA,MACN,SAAS;AAAA,QACP,eAAe,UAAU,QAAQ;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EACQ,KAAK,MAAM;AACjB,WAAO,KAAK,EAAE,KAAK,iCAAiC;AAAA,MAClD,cAAc;AAAA,MACd,MAAM,iCACD,OADC;AAAA,QAEJ,YAAY;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB;AAAA,QACA,eAAe;AAAA,UACb,aAAa;AAAA,UACb,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAIM,SAAU,MAAc,KAAoB;AAAA;AAChD,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,QAAe,IAAI;AAChD,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AAAA,EACM,QAAS,KAAa,KAAoB;AAAA;AAC9C,YAAM,MAAM,MAAM,KAAK,KAAK,iBAAC,OAAa,IAAI;AAC9C,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA;AACF;AAEO,MAAM,mBAA0C;AAAA,EACrD,YAAoB,eAAuC;AAAvC;AAAA,EACpB;AAAA,EACM,SAAU,MAAc,KAAoB;AAAA;AAChD,aAAO,eAAe,KAAK,eAAe,MAAM,GAAG;AAAA,IACrD;AAAA;AAAA,EACM,QAAS,MAAc,KAAoB;AAAA;AAC/C,aAAO,cAAc,KAAK,eAAe,MAAM,GAAG;AAAA,IACpD;AAAA;AACF;AAGO,MAAM,sBAAsB,CAAC,SAAiB;AACnD,QAAM,IAAI,IAAI,UAAU;AACxB,MAAI,MAAM,CAAC;AACX,MAAG,KAAK,WAAW,IAAI,GAAG;AACxB,UAAM,EAAE,mBAAmB,KAAK;AAAA,EAClC,WAAS,KAAK,WAAW,MAAM,GAAG;AAChC,UAAM,EAAE,YAAY,KAAK;AAAA,EAC3B;AACA,SAAO,MAAM,EAAE,QAAQ,GAAG;AAC5B;AAGO,MAAM,iBAAiB,CAAC,QAAiE;AAC9F,MAAG,IAAI,SAAS,MAAM;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa,IAAI,QAAQ;AAAA,EAC7D;AACA,MAAG,IAAI,cAAc;AACnB,WAAO,IAAI,mBAAmB,oBAAoB,IAAI,YAAY,CAAC;AAAA,EACrE;AACA,MAAG,IAAI,eAAe;AACpB,WAAO,IAAI,mBAAmB,IAAI,aAAa;AAAA,EACjD;AACF;","names":[]}
|
@@ -84,7 +84,7 @@ function html2imgBuffer(browser, html, options) {
|
|
84
84
|
options,
|
85
85
|
(page) => page.setContent(html, { waitUntil: "networkidle0" }),
|
86
86
|
{ fullPage: true },
|
87
|
-
{ width:
|
87
|
+
{ width: 3840, height: 2160, deviceScaleFactor: 2 }
|
88
88
|
);
|
89
89
|
});
|
90
90
|
}
|
@@ -95,7 +95,7 @@ function url2imgBuffer(browser, url, options) {
|
|
95
95
|
options,
|
96
96
|
(page) => page.goto(url, { waitUntil: "networkidle0" }),
|
97
97
|
{ fullPage: false },
|
98
|
-
{ width:
|
98
|
+
{ width: 3840, height: 2160, deviceScaleFactor: 2 },
|
99
99
|
`page: ${url}`
|
100
100
|
);
|
101
101
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../../src/infra/support/render/puppeteer.ts"],"sourcesContent":["import type {Browser, Page, ScreenshotOptions, Viewport} from 'puppeteer-core';\n\n/**\n * Extends Puppeteer's ScreenshotOptions to include an optional viewport setting\n * and a selector for element-specific screenshots.\n */\nexport interface RenderOptions extends ScreenshotOptions {\n /**\n * Sets the viewport of the page.\n */\n viewport?: Viewport;\n /**\n * A CSS selector for an element to screenshot. If provided, the output\n * will be a screenshot of just this element.\n */\n selector?: string;\n /**\n * The maximum time in milliseconds to wait for the selector to appear.\n * If the element is not found within this time, an error will be thrown.\n * Defaults to Puppeteer's default (usually 30000ms).\n */\n timeout?: number;\n}\n\n/**\n * Core rendering function that handles the common logic for taking a screenshot.\n * It's designed to be called by the public-facing wrapper functions.\n * @private\n */\nasync function _renderPageToBuffer(\n browser: Browser | (() => Promise<Browser>),\n options: RenderOptions | undefined,\n loadContent: (page: Page) => Promise<any>,\n defaultScreenshotOptions: ScreenshotOptions,\n defaultViewport: Viewport,\n errorContext?: string,\n): Promise<Buffer> {\n let page: Page | undefined;\n try {\n let b : Browser\n if(typeof browser === \"function\") {\n b = await browser()\n }\n page = await b.newPage();\n\n const viewport = options?.viewport ?? defaultViewport;\n await page.setViewport(viewport);\n\n // The content loading strategy is passed in as a callback.\n await loadContent(page);\n\n const {viewport: _, selector, timeout, ...screenshotOptions} = options || {};\n\n if (selector) {\n const element = await page.waitForSelector(selector, {timeout});\n if (!element) {\n const timeoutMsg = `within the ${timeout || 'default'}ms timeout.`;\n const contextMsg = errorContext ? ` on ${errorContext}` : '';\n throw new Error(`Could not find element with selector: \"${selector}\"${contextMsg} ${timeoutMsg}`);\n }\n return Buffer.from(await element.screenshot(screenshotOptions));\n }\n\n return Buffer.from(await page.screenshot({\n ...defaultScreenshotOptions,\n ...screenshotOptions,\n }))\n } finally {\n if (page) {\n await page.close();\n }\n }\n}\n\n/**\n * Renders an HTML string into an image buffer using a provided Puppeteer browser instance.\n *\n * @param browser The active Puppeteer Browser instance.\n * @param html The HTML content to render.\n * @param options Configuration for the rendering process.\n * @returns A Promise that resolves to a Buffer containing the screenshot image.\n */\nexport async function html2imgBuffer(\n browser: Browser | (() => Promise<Browser>),\n html: string,\n options?: RenderOptions,\n): Promise<Buffer> {\n return _renderPageToBuffer(\n browser,\n options,\n (page) => page.setContent(html, {waitUntil: 'networkidle0'}),\n {fullPage: true},\n {width:
|
1
|
+
{"version":3,"sources":["../../../../../src/infra/support/render/puppeteer.ts"],"sourcesContent":["import type {Browser, Page, ScreenshotOptions, Viewport} from 'puppeteer-core';\n\n/**\n * Extends Puppeteer's ScreenshotOptions to include an optional viewport setting\n * and a selector for element-specific screenshots.\n */\nexport interface RenderOptions extends ScreenshotOptions {\n /**\n * Sets the viewport of the page.\n */\n viewport?: Viewport;\n /**\n * A CSS selector for an element to screenshot. If provided, the output\n * will be a screenshot of just this element.\n */\n selector?: string;\n /**\n * The maximum time in milliseconds to wait for the selector to appear.\n * If the element is not found within this time, an error will be thrown.\n * Defaults to Puppeteer's default (usually 30000ms).\n */\n timeout?: number;\n}\n\n/**\n * Core rendering function that handles the common logic for taking a screenshot.\n * It's designed to be called by the public-facing wrapper functions.\n * @private\n */\nasync function _renderPageToBuffer(\n browser: Browser | (() => Promise<Browser>),\n options: RenderOptions | undefined,\n loadContent: (page: Page) => Promise<any>,\n defaultScreenshotOptions: ScreenshotOptions,\n defaultViewport: Viewport,\n errorContext?: string,\n): Promise<Buffer> {\n let page: Page | undefined;\n try {\n let b : Browser\n if(typeof browser === \"function\") {\n b = await browser()\n }\n page = await b.newPage();\n\n const viewport = options?.viewport ?? defaultViewport;\n await page.setViewport(viewport);\n\n // The content loading strategy is passed in as a callback.\n await loadContent(page);\n\n const {viewport: _, selector, timeout, ...screenshotOptions} = options || {};\n\n if (selector) {\n const element = await page.waitForSelector(selector, {timeout});\n if (!element) {\n const timeoutMsg = `within the ${timeout || 'default'}ms timeout.`;\n const contextMsg = errorContext ? ` on ${errorContext}` : '';\n throw new Error(`Could not find element with selector: \"${selector}\"${contextMsg} ${timeoutMsg}`);\n }\n return Buffer.from(await element.screenshot(screenshotOptions));\n }\n\n return Buffer.from(await page.screenshot({\n ...defaultScreenshotOptions,\n ...screenshotOptions,\n }))\n } finally {\n if (page) {\n await page.close();\n }\n }\n}\n\n/**\n * Renders an HTML string into an image buffer using a provided Puppeteer browser instance.\n *\n * @param browser The active Puppeteer Browser instance.\n * @param html The HTML content to render.\n * @param options Configuration for the rendering process.\n * @returns A Promise that resolves to a Buffer containing the screenshot image.\n */\nexport async function html2imgBuffer(\n browser: Browser | (() => Promise<Browser>),\n html: string,\n options?: RenderOptions,\n): Promise<Buffer> {\n return _renderPageToBuffer(\n browser,\n options,\n (page) => page.setContent(html, {waitUntil: 'networkidle0'}),\n {fullPage: true},\n {width: 3840, height: 2160, deviceScaleFactor: 2},\n );\n}\n\n/**\n * Captures a screenshot of a given URL and returns it as an image buffer.\n *\n * @param browser The active Puppeteer Browser instance.\n * @param url The URL of the webpage to capture.\n * @param options Configuration for the rendering process.\n * @returns A Promise that resolves to a Buffer containing the screenshot image.\n */\nexport async function url2imgBuffer(\n browser: Browser | (() => Promise<Browser>),\n url: string,\n options?: RenderOptions,\n): Promise<Buffer> {\n return _renderPageToBuffer(\n browser,\n options,\n (page) => page.goto(url, {waitUntil: 'networkidle0'}),\n {fullPage: false},\n {width: 3840, height: 2160, deviceScaleFactor: 2},\n `page: ${url}`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAe,oBACb,SACA,SACA,aACA,0BACA,iBACA,cACiB;AAAA;AApCnB;AAqCE,QAAI;AACJ,QAAI;AACF,UAAI;AACJ,UAAG,OAAO,YAAY,YAAY;AAChC,YAAI,MAAM,QAAQ;AAAA,MACpB;AACA,aAAO,MAAM,EAAE,QAAQ;AAEvB,YAAM,YAAW,wCAAS,aAAT,YAAqB;AACtC,YAAM,KAAK,YAAY,QAAQ;AAG/B,YAAM,YAAY,IAAI;AAEtB,YAA+D,gBAAW,CAAC,GAApE,YAAU,GAAG,UAAU,QAnDlC,IAmDmE,IAArB,8BAAqB,IAArB,CAAnC,YAAa,YAAU;AAE9B,UAAI,UAAU;AACZ,cAAM,UAAU,MAAM,KAAK,gBAAgB,UAAU,EAAC,QAAO,CAAC;AAC9D,YAAI,CAAC,SAAS;AACZ,gBAAM,aAAa,cAAc,WAAW,SAAS;AACrD,gBAAM,aAAa,eAAe,OAAO,YAAY,KAAK;AAC1D,gBAAM,IAAI,MAAM,0CAA0C,QAAQ,IAAI,UAAU,IAAI,UAAU,EAAE;AAAA,QAClG;AACA,eAAO,OAAO,KAAK,MAAM,QAAQ,WAAW,iBAAiB,CAAC;AAAA,MAChE;AAEA,aAAO,OAAO,KAAK,MAAM,KAAK,WAAW,kCACpC,2BACA,kBACJ,CAAC;AAAA,IACJ,UAAE;AACA,UAAI,MAAM;AACR,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA;AAUA,SAAsB,eACpB,SACA,MACA,SACiB;AAAA;AACjB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,CAAC,SAAS,KAAK,WAAW,MAAM,EAAC,WAAW,eAAc,CAAC;AAAA,MAC3D,EAAC,UAAU,KAAI;AAAA,MACf,EAAC,OAAO,MAAM,QAAQ,MAAM,mBAAmB,EAAC;AAAA,IAClD;AAAA,EACF;AAAA;AAUA,SAAsB,cACpB,SACA,KACA,SACiB;AAAA;AACjB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,CAAC,SAAS,KAAK,KAAK,KAAK,EAAC,WAAW,eAAc,CAAC;AAAA,MACpD,EAAC,UAAU,MAAK;AAAA,MAChB,EAAC,OAAO,MAAM,QAAQ,MAAM,mBAAmB,EAAC;AAAA,MAChD,SAAS,GAAG;AAAA,IACd;AAAA,EACF;AAAA;","names":[]}
|
@@ -113,7 +113,7 @@ class RenderService {
|
|
113
113
|
}
|
114
114
|
renderUrl(url, renderOption) {
|
115
115
|
return __async(this, null, function* () {
|
116
|
-
return this.imageRender.url2img(url,
|
116
|
+
return this.imageRender.url2img(url, renderOption);
|
117
117
|
});
|
118
118
|
}
|
119
119
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/service/render/index.ts"],"sourcesContent":["import {IRenderService, RenderOption} from './interfaces'\nimport { getHtml } from '@/components'\nimport { PuppeteerError, TimeoutError } from 'puppeteer-core'\nimport { Platform } from '@/interface'\nimport {getBLPlayerComp, getBLRankScoreComp, getBSMapComp, getSSPlayerComp} from '@/components/pages'\nimport {preferenceKey} from \"@/service/preference\";\nimport {ImageRenderError, RequestError} from \"@/infra/errors\";\nimport createQrcode from \"@/components/utils/qrcode\";\nimport {APIService} from \"@/service/api\";\nimport {BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport {ImageRender} from \"@/infra/support/render\";\n\n\nconst getPreferenceKey = (platform: string) => {\n return platform == Platform.SS\n ? preferenceKey.ssProfileRenderImg.key\n : preferenceKey.blProfileRenderImg.key\n}\n\nexport class RenderService implements IRenderService {\n constructor(\n private api: APIService,\n private imageRender: ImageRender\n ) {}\n async renderRank(\n accountId: string,\n platform: Platform,\n renderOpts?: RenderOption\n ) {\n try {\n let bg = (await renderOpts?.userPreference?.get<string>(getPreferenceKey(platform)))\n bg = bg || 'https://www.loliapi.com/acg/pc/'\n let html: string\n if (platform == Platform.BL) {\n const { scores, userInfo } = await this.api.getBLPlayerScoresWithUserInfo(accountId)\n html = getHtml(getBLPlayerComp(scores, userInfo, bg))\n } else {\n const { scores, userInfo } = await this.api.getSSPlayerRecentScoreWithUserInfo(accountId)\n html = getHtml(getSSPlayerComp(scores, userInfo, bg))\n }\n return this.imageRender.html2img(html, {selector: '#render-result', ...renderOpts})\n }catch (e) {\n if (e instanceof TimeoutError || e instanceof PuppeteerError) {\n throw new ImageRenderError()\n }\n throw e\n }\n }\n\n async renderScore(\n scoreId: string,\n renderOpts?: RenderOption\n ) {\n const bg = (await renderOpts?.userPreference?.get<string>(preferenceKey.blScoreImg.key))\n ?? 'https://www.loliapi.com/acg/pc/'\n try {\n const { score, statistic, bsor, bsMap } =\n await this.api.getScoreAndBSMapByScoreId(scoreId)\n\n const { aroundScores, regionTopScores, difficulties } =\n await this.api.getAroundScoreAndRegionScoreByRankAndPage(\n score.leaderboardId,\n score.rank,\n score.player.country\n )\n return this.imageRender.html2img(\n getHtml(getBLRankScoreComp(score, aroundScores, regionTopScores, difficulties, bsMap, statistic, bsor, bg)),\n {selector: '#render-result', ...renderOpts}\n )\n }catch (e) {\n if (e instanceof RequestError) {\n throw e\n }\n throw new ImageRenderError()\n }\n }\n\n async renderMapById(\n mapId: string,\n renderOption: RenderOption\n ) {\n const map = await this.api.BeatSaver.searchMapById(mapId)\n return this.renderMap(map, renderOption)\n }\n\n async renderMap(\n bsMap: BSMap,\n renderOption?: RenderOption\n ) {\n const previewQrUrl = await createQrcode(`https://allpoland.github.io/ArcViewer/?id=${bsMap.id}`)\n const bsMapQrUrl = await createQrcode(`https://beatsaver.com/maps/${bsMap.id}`)\n return this.imageRender.html2img(\n getHtml(getBSMapComp(bsMap, bsMapQrUrl, previewQrUrl)), {selector: '#render-result', ...renderOption}\n )\n }\n\n async renderUrl(url: string, renderOption?: RenderOption) {\n return this.imageRender.url2img(url,
|
1
|
+
{"version":3,"sources":["../../../../src/service/render/index.ts"],"sourcesContent":["import {IRenderService, RenderOption} from './interfaces'\nimport { getHtml } from '@/components'\nimport { PuppeteerError, TimeoutError } from 'puppeteer-core'\nimport { Platform } from '@/interface'\nimport {getBLPlayerComp, getBLRankScoreComp, getBSMapComp, getSSPlayerComp} from '@/components/pages'\nimport {preferenceKey} from \"@/service/preference\";\nimport {ImageRenderError, RequestError} from \"@/infra/errors\";\nimport createQrcode from \"@/components/utils/qrcode\";\nimport {APIService} from \"@/service/api\";\nimport {BSMap} from \"@/service/api/interfaces/beatsaver\";\nimport {ImageRender} from \"@/infra/support/render\";\n\n\nconst getPreferenceKey = (platform: string) => {\n return platform == Platform.SS\n ? preferenceKey.ssProfileRenderImg.key\n : preferenceKey.blProfileRenderImg.key\n}\n\nexport class RenderService implements IRenderService {\n constructor(\n private api: APIService,\n private imageRender: ImageRender\n ) {}\n async renderRank(\n accountId: string,\n platform: Platform,\n renderOpts?: RenderOption\n ) {\n try {\n let bg = (await renderOpts?.userPreference?.get<string>(getPreferenceKey(platform)))\n bg = bg || 'https://www.loliapi.com/acg/pc/'\n let html: string\n if (platform == Platform.BL) {\n const { scores, userInfo } = await this.api.getBLPlayerScoresWithUserInfo(accountId)\n html = getHtml(getBLPlayerComp(scores, userInfo, bg))\n } else {\n const { scores, userInfo } = await this.api.getSSPlayerRecentScoreWithUserInfo(accountId)\n html = getHtml(getSSPlayerComp(scores, userInfo, bg))\n }\n return this.imageRender.html2img(html, {selector: '#render-result', ...renderOpts})\n }catch (e) {\n if (e instanceof TimeoutError || e instanceof PuppeteerError) {\n throw new ImageRenderError()\n }\n throw e\n }\n }\n\n async renderScore(\n scoreId: string,\n renderOpts?: RenderOption\n ) {\n const bg = (await renderOpts?.userPreference?.get<string>(preferenceKey.blScoreImg.key))\n ?? 'https://www.loliapi.com/acg/pc/'\n try {\n const { score, statistic, bsor, bsMap } =\n await this.api.getScoreAndBSMapByScoreId(scoreId)\n\n const { aroundScores, regionTopScores, difficulties } =\n await this.api.getAroundScoreAndRegionScoreByRankAndPage(\n score.leaderboardId,\n score.rank,\n score.player.country\n )\n return this.imageRender.html2img(\n getHtml(getBLRankScoreComp(score, aroundScores, regionTopScores, difficulties, bsMap, statistic, bsor, bg)),\n {selector: '#render-result', ...renderOpts}\n )\n }catch (e) {\n if (e instanceof RequestError) {\n throw e\n }\n throw new ImageRenderError()\n }\n }\n\n async renderMapById(\n mapId: string,\n renderOption: RenderOption\n ) {\n const map = await this.api.BeatSaver.searchMapById(mapId)\n return this.renderMap(map, renderOption)\n }\n\n async renderMap(\n bsMap: BSMap,\n renderOption?: RenderOption\n ) {\n const previewQrUrl = await createQrcode(`https://allpoland.github.io/ArcViewer/?id=${bsMap.id}`)\n const bsMapQrUrl = await createQrcode(`https://beatsaver.com/maps/${bsMap.id}`)\n return this.imageRender.html2img(\n getHtml(getBSMapComp(bsMap, bsMapQrUrl, previewQrUrl)), {selector: '#render-result', ...renderOption}\n )\n }\n\n async renderUrl(url: string, renderOption?: RenderOption) {\n return this.imageRender.url2img(url, renderOption)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,eAAe;AACxB,SAAS,gBAAgB,oBAAoB;AAC7C,SAAS,gBAAgB;AACzB,SAAQ,iBAAiB,oBAAoB,cAAc,uBAAsB;AACjF,SAAQ,qBAAoB;AAC5B,SAAQ,kBAAkB,oBAAmB;AAC7C,OAAO,kBAAkB;AAMzB,MAAM,mBAAmB,CAAC,aAAqB;AAC7C,SAAO,YAAY,SAAS,KACxB,cAAc,mBAAmB,MACjC,cAAc,mBAAmB;AACvC;AAEO,MAAM,cAAwC;AAAA,EACnD,YACU,KACA,aACR;AAFQ;AACA;AAAA,EACP;AAAA,EACG,WACJ,WACA,UACA,YACA;AAAA;AA5BJ;AA6BI,UAAI;AACF,YAAI,KAAM,OAAM,8CAAY,mBAAZ,mBAA4B,IAAY,iBAAiB,QAAQ;AACjF,aAAK,MAAM;AACX,YAAI;AACJ,YAAI,YAAY,SAAS,IAAI;AAC3B,gBAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK,IAAI,8BAA8B,SAAS;AACnF,iBAAO,QAAQ,gBAAgB,QAAQ,UAAU,EAAE,CAAC;AAAA,QACtD,OAAO;AACL,gBAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,KAAK,IAAI,mCAAmC,SAAS;AACxF,iBAAO,QAAQ,gBAAgB,QAAQ,UAAU,EAAE,CAAC;AAAA,QACtD;AACA,eAAO,KAAK,YAAY,SAAS,MAAM,iBAAC,UAAU,oBAAqB,WAAW;AAAA,MACpF,SAAQ,GAAG;AACT,YAAI,aAAa,gBAAgB,aAAa,gBAAgB;AAC5D,gBAAM,IAAI,iBAAiB;AAAA,QAC7B;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA,EAEM,YACJ,SACA,YACA;AAAA;AApDJ;AAqDI,YAAM,MAAM,YAAM,8CAAY,mBAAZ,mBAA4B,IAAY,cAAc,WAAW,SAAvE,YACP;AACL,UAAI;AACF,cAAM,EAAE,OAAO,WAAW,MAAM,MAAM,IACpC,MAAM,KAAK,IAAI,0BAA0B,OAAO;AAElD,cAAM,EAAE,cAAc,iBAAiB,aAAa,IAClD,MAAM,KAAK,IAAI;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,QACf;AACF,eAAO,KAAK,YAAY;AAAA,UACtB,QAAQ,mBAAmB,OAAO,cAAc,iBAAiB,cAAc,OAAO,WAAW,MAAM,EAAE,CAAC;AAAA,UAC1G,iBAAC,UAAU,oBAAqB;AAAA,QAClC;AAAA,MACF,SAAQ,GAAG;AACT,YAAI,aAAa,cAAc;AAC7B,gBAAM;AAAA,QACR;AACA,cAAM,IAAI,iBAAiB;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA,EAEM,cACJ,OACA,cACA;AAAA;AACA,YAAM,MAAM,MAAM,KAAK,IAAI,UAAU,cAAc,KAAK;AACxD,aAAO,KAAK,UAAU,KAAK,YAAY;AAAA,IACzC;AAAA;AAAA,EAEM,UACJ,OACA,cACA;AAAA;AACA,YAAM,eAAe,MAAM,aAAa,6CAA6C,MAAM,EAAE,EAAE;AAC/F,YAAM,aAAa,MAAM,aAAa,8BAA8B,MAAM,EAAE,EAAE;AAC9E,aAAO,KAAK,YAAY;AAAA,QACtB,QAAQ,aAAa,OAAO,YAAY,YAAY,CAAC;AAAA,QAAG,iBAAC,UAAU,oBAAqB;AAAA,MAC1F;AAAA,IACF;AAAA;AAAA,EAEM,UAAU,KAAa,cAA6B;AAAA;AACxD,aAAO,KAAK,YAAY,QAAQ,KAAK,YAAY;AAAA,IACnD;AAAA;AACF;","names":[]}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
package/dist/types/cmd/rank.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../index-Dagy_c8G.js';
|
2
2
|
import '../interface/db/index.js';
|
3
3
|
import '../interface/db/models.js';
|
4
4
|
import '../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../index-Dagy_c8G.js';
|
2
2
|
import '../interface/db/index.js';
|
3
3
|
import '../interface/db/models.js';
|
4
4
|
import '../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-
|
1
|
+
import { d as CmdAlias, c as CmdOption, a as CmdContext, E as Extend } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../../interface/db/index.js';
|
3
3
|
import '../../interface/db/models.js';
|
4
4
|
import '../../interface/logger.js';
|
@@ -6,19 +6,20 @@ import { APIService } from './service/api/index.js';
|
|
6
6
|
import './interface/db/models.js';
|
7
7
|
import { UserPreferenceStore } from './service/preference.js';
|
8
8
|
import { BSMap } from './service/api/interfaces/beatsaver/bsmap.js';
|
9
|
+
import { RenderOptions as RenderOptions$1 } from './infra/support/render/puppeteer.js';
|
9
10
|
|
10
|
-
type RenderOption = RenderOptions;
|
11
|
+
type RenderOption = RenderOptions & RenderOptions$1;
|
11
12
|
type RenderOptions = {
|
12
13
|
userPreference?: UserPreferenceStore;
|
13
14
|
onRenderStart?: () => void;
|
14
15
|
onRenderError?: (e: any) => void;
|
15
16
|
};
|
16
17
|
interface IRenderService {
|
17
|
-
renderRank(accountId: string, platform: Platform, renderOpts?:
|
18
|
-
renderScore(scoreId: string, renderOpts?:
|
19
|
-
renderMapById(mapId: string, renderOpts?:
|
20
|
-
renderMap(bsMap: BSMap, renderOpts?:
|
21
|
-
renderUrl(url: string, renderOpts?:
|
18
|
+
renderRank(accountId: string, platform: Platform, renderOpts?: RenderOption): Promise<Buffer>;
|
19
|
+
renderScore(scoreId: string, renderOpts?: RenderOption): Promise<Buffer>;
|
20
|
+
renderMapById(mapId: string, renderOpts?: RenderOption): Promise<Buffer>;
|
21
|
+
renderMap(bsMap: BSMap, renderOpts?: RenderOption): Promise<Buffer>;
|
22
|
+
renderUrl(url: string, renderOpts?: RenderOption): Promise<Buffer>;
|
22
23
|
}
|
23
24
|
|
24
25
|
type Services<T> = {
|
package/dist/types/index.d.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import { ScheduleTaskCtx } from './schedules/interface.js';
|
2
|
-
import { C as Command } from './index-
|
3
|
-
export { d as CmdAlias, a as CmdContext, b as CmdExecutor, c as CmdOption, E as Extend, O as OptionType, P as Platform, S as Services, p as parsePlatform } from './index-
|
2
|
+
import { C as Command } from './index-Dagy_c8G.js';
|
3
|
+
export { d as CmdAlias, a as CmdContext, b as CmdExecutor, c as CmdOption, E as Extend, O as OptionType, P as Platform, S as Services, p as parsePlatform } from './index-Dagy_c8G.js';
|
4
4
|
import { Config } from './config.js';
|
5
5
|
export { getScheduleTasks } from './schedules/index.js';
|
6
6
|
export { botCommands } from './cmd/index.js';
|
@@ -15,6 +15,7 @@ export { RelateAccount, RelateChannelInfo, Subscribe, SubscribeMember, UserPrefe
|
|
15
15
|
export { DB, SubDetailWithGroupRes, SubInfoRes, SubWithGroupRes } from './interface/db/index.js';
|
16
16
|
export { Logger } from './interface/logger.js';
|
17
17
|
export { BotService, Session } from './interface/bot.js';
|
18
|
+
export { RenderOptions as PuppeteerOptions } from './infra/support/render/puppeteer.js';
|
18
19
|
import './service/api/index.js';
|
19
20
|
import './service/api/interfaces/scoresaber/item.js';
|
20
21
|
import './service/api/interfaces/scoresaber/user.js';
|
@@ -38,7 +39,6 @@ import './service/preference.js';
|
|
38
39
|
import './infra/s3/index.js';
|
39
40
|
import './service/render/index.js';
|
40
41
|
import './service/api/interfaces/beatsaver/ws.js';
|
41
|
-
import './infra/support/render/puppeteer.js';
|
42
42
|
import 'puppeteer-core';
|
43
43
|
|
44
44
|
declare const getBot: <T>(config: Config) => {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
export { CFBrowserRendering, ImageRender, PuppeteerRendering, RemoteBrowserGetter, RenderConfig, getImageRender } from './support/render/index.js';
|
2
2
|
export { tran } from './i18n/index.js';
|
3
|
-
|
3
|
+
export { RenderOptions as PuppeteerOptions } from './support/render/puppeteer.js';
|
4
4
|
import 'puppeteer-core';
|
5
5
|
import './support/fetch/ofetch.js';
|
6
6
|
import 'ofetch';
|
@@ -35,4 +35,4 @@ declare const getImageRender: (cfg: RenderConfig & {
|
|
35
35
|
browserGetter?: () => Promise<Browser>;
|
36
36
|
}) => CFBrowserRendering | PuppeteerRendering;
|
37
37
|
|
38
|
-
export { CFBrowserRendering, type ImageRender, PuppeteerRendering, RemoteBrowserGetter, type RenderConfig, getImageRender };
|
38
|
+
export { CFBrowserRendering, type ImageRender, RenderOptions as PuppeteerOptions, PuppeteerRendering, RemoteBrowserGetter, type RenderConfig, getImageRender };
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { E as Extend, O as OptionType, b as CmdExecutor, d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-
|
1
|
+
import { E as Extend, O as OptionType, b as CmdExecutor, d as CmdAlias, c as CmdOption, a as CmdContext } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../db/index.js';
|
3
3
|
import '../db/models.js';
|
4
4
|
import '../logger.js';
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import '../../config.js';
|
2
2
|
import '../logger.js';
|
3
3
|
import '../bot.js';
|
4
|
-
export { d as CmdAlias, a as CmdContext, b as CmdExecutor, c as CmdOption, C as Command, E as Extend, O as OptionType } from '../../index-
|
4
|
+
export { d as CmdAlias, a as CmdContext, b as CmdExecutor, c as CmdOption, C as Command, E as Extend, O as OptionType } from '../../index-Dagy_c8G.js';
|
5
5
|
import '../../infra/s3/index.js';
|
6
6
|
import '../../infra/support/render/index.js';
|
7
7
|
import '../../infra/support/render/puppeteer.js';
|
@@ -1,7 +1,7 @@
|
|
1
1
|
export { DB, SubDetailWithGroupRes, SubInfoRes, SubWithGroupRes } from './db/index.js';
|
2
2
|
export { Logger } from './logger.js';
|
3
3
|
export { BotService, Session } from './bot.js';
|
4
|
-
export { d as CmdAlias, a as CmdContext, b as CmdExecutor, c as CmdOption, C as Command, E as Extend, O as OptionType, P as Platform, p as parsePlatform } from '../index-
|
4
|
+
export { d as CmdAlias, a as CmdContext, b as CmdExecutor, c as CmdOption, C as Command, E as Extend, O as OptionType, P as Platform, p as parsePlatform } from '../index-Dagy_c8G.js';
|
5
5
|
export { RelateAccount, RelateChannelInfo, Subscribe, SubscribeMember, UserPreference } from './db/models.js';
|
6
6
|
import '../config.js';
|
7
7
|
import '../infra/s3/index.js';
|
@@ -3,7 +3,7 @@ import { Config } from '../config.js';
|
|
3
3
|
import '../interface/logger.js';
|
4
4
|
import '../interface/bot.js';
|
5
5
|
import '../interface/db/models.js';
|
6
|
-
import '../index-
|
6
|
+
import '../index-Dagy_c8G.js';
|
7
7
|
import '../interface/db/index.js';
|
8
8
|
import '../service/api/index.js';
|
9
9
|
import '../service/api/interfaces/scoresaber/item.js';
|
@@ -25,10 +25,10 @@ import '../service/api/interfaces/beatsaver/bsmap.js';
|
|
25
25
|
import '../service/api/interfaces/beatsaver/resp.js';
|
26
26
|
import '../service/api/interfaces/beatsaver/user.js';
|
27
27
|
import '../service/preference.js';
|
28
|
-
import '../infra/s3/index.js';
|
29
|
-
import '../infra/support/render/index.js';
|
30
28
|
import '../infra/support/render/puppeteer.js';
|
31
29
|
import 'puppeteer-core';
|
30
|
+
import '../infra/s3/index.js';
|
31
|
+
import '../infra/support/render/index.js';
|
32
32
|
|
33
33
|
declare const getScheduleTasks: (config: Config) => {
|
34
34
|
name: string;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { Config } from '../config.js';
|
2
2
|
import { Logger } from '../interface/logger.js';
|
3
3
|
import { BotService, Session } from '../interface/bot.js';
|
4
|
-
import { S as Services } from '../index-
|
4
|
+
import { S as Services } from '../index-Dagy_c8G.js';
|
5
5
|
import '../infra/s3/index.js';
|
6
6
|
import '../infra/support/render/index.js';
|
7
7
|
import '../infra/support/render/puppeteer.js';
|
@@ -9,7 +9,7 @@ import 'ofetch';
|
|
9
9
|
import '../interface/logger.js';
|
10
10
|
import '../interface/bot.js';
|
11
11
|
import '../interface/db/models.js';
|
12
|
-
import '../index-
|
12
|
+
import '../index-Dagy_c8G.js';
|
13
13
|
import '../interface/db/index.js';
|
14
14
|
import '../service/api/index.js';
|
15
15
|
import '../service/api/interfaces/scoresaber/item.js';
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import './api/index.js';
|
2
2
|
import '../interface/db/index.js';
|
3
|
-
export { S as Services } from '../index-
|
3
|
+
export { S as Services } from '../index-Dagy_c8G.js';
|
4
4
|
import './api/interfaces/scoresaber/item.js';
|
5
5
|
import './api/interfaces/scoresaber/user.js';
|
6
6
|
import './api/interfaces/beatleader/score.js';
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { I as IRenderService, P as Platform, R as RenderOption } from '../../index-
|
1
|
+
import { I as IRenderService, P as Platform, R as RenderOption } from '../../index-Dagy_c8G.js';
|
2
2
|
import { APIService } from '../api/index.js';
|
3
3
|
import { BSMap } from '../api/interfaces/beatsaver/bsmap.js';
|
4
4
|
import { ImageRender } from '../../infra/support/render/index.js';
|
@@ -1,6 +1,7 @@
|
|
1
|
-
export { I as IRenderService, R as RenderOption } from '../../index-
|
1
|
+
export { I as IRenderService, R as RenderOption } from '../../index-Dagy_c8G.js';
|
2
2
|
import '../preference.js';
|
3
3
|
import '../api/interfaces/beatsaver/bsmap.js';
|
4
|
+
import '../../infra/support/render/puppeteer.js';
|
4
5
|
import '../../interface/db/index.js';
|
5
6
|
import '../../interface/db/models.js';
|
6
7
|
import '../../interface/logger.js';
|
@@ -8,7 +9,6 @@ import '../../interface/bot.js';
|
|
8
9
|
import '../../config.js';
|
9
10
|
import '../../infra/s3/index.js';
|
10
11
|
import '../../infra/support/render/index.js';
|
11
|
-
import '../../infra/support/render/puppeteer.js';
|
12
12
|
import 'puppeteer-core';
|
13
13
|
import '../../infra/support/fetch/ofetch.js';
|
14
14
|
import 'ofetch';
|
@@ -11,7 +11,7 @@ import 'puppeteer-core';
|
|
11
11
|
import '../infra/support/fetch/ofetch.js';
|
12
12
|
import 'ofetch';
|
13
13
|
import '../interface/db/models.js';
|
14
|
-
import '../index-
|
14
|
+
import '../index-Dagy_c8G.js';
|
15
15
|
import '../service/api/index.js';
|
16
16
|
import '../service/api/interfaces/scoresaber/item.js';
|
17
17
|
import '../service/api/interfaces/scoresaber/user.js';
|
@@ -13,7 +13,7 @@ import '../infra/support/fetch/ofetch.js';
|
|
13
13
|
import 'ofetch';
|
14
14
|
import '../interface/db/models.js';
|
15
15
|
import '../service/api/interfaces/beatsaver/bsmap.js';
|
16
|
-
import '../index-
|
16
|
+
import '../index-Dagy_c8G.js';
|
17
17
|
import '../service/api/index.js';
|
18
18
|
import '../service/api/interfaces/scoresaber/item.js';
|
19
19
|
import '../service/api/interfaces/scoresaber/user.js';
|
package/dist/types/ws/index.d.ts
CHANGED
@@ -14,7 +14,7 @@ import '../interface/db/index.js';
|
|
14
14
|
import '../interface/db/models.js';
|
15
15
|
import '../interface/bot.js';
|
16
16
|
import '../service/render/index.js';
|
17
|
-
import '../index-
|
17
|
+
import '../index-Dagy_c8G.js';
|
18
18
|
import '../service/api/index.js';
|
19
19
|
import '../service/api/interfaces/scoresaber/item.js';
|
20
20
|
import '../service/api/interfaces/scoresaber/user.js';
|
@@ -11,7 +11,7 @@ import 'puppeteer-core';
|
|
11
11
|
import '../infra/support/fetch/ofetch.js';
|
12
12
|
import 'ofetch';
|
13
13
|
import '../interface/db/models.js';
|
14
|
-
import '../index-
|
14
|
+
import '../index-Dagy_c8G.js';
|
15
15
|
import '../service/api/index.js';
|
16
16
|
import '../service/api/interfaces/scoresaber/item.js';
|
17
17
|
import '../service/api/interfaces/scoresaber/user.js';
|