| | import puppeteer from "puppeteer" |
| |
|
| | import { sleep } from "./sleep.mts" |
| | import { ImageSegment } from "../types.mts" |
| | import { downloadImageAsBase64 } from "./downloadFileAsBase64.mts" |
| | import { resizeBase64Image } from "./resizeBase64Image.mts" |
| |
|
| | |
| | const instances: string[] = [ |
| | `${process.env.VC_SEGMENTATION_MODULE_SPACE_API_URL_1 || ""}`, |
| | `${process.env.VC_SEGMENTATION_MODULE_SPACE_API_URL_2 || ""}`, |
| | |
| | ] |
| |
|
| | |
| |
|
| | |
| | |
| | export async function segmentImage( |
| | inputImageFilePath: string, |
| | actionnables: string[], |
| | width: number, |
| | height: number, |
| | ): Promise<{ |
| | pngInBase64: string |
| | segments: ImageSegment[] |
| | }> { |
| |
|
| | console.log(`segmenting image..`) |
| |
|
| | const instance = instances.shift() |
| | instances.push(instance) |
| |
|
| | const browser = await puppeteer.launch({ |
| | headless: true, |
| | protocolTimeout: 40000, |
| | }) |
| |
|
| | try { |
| | const page = await browser.newPage() |
| | await page.goto(instance, { waitUntil: 'networkidle2' }) |
| | |
| | await new Promise(r => setTimeout(r, 3000)) |
| |
|
| | const fileField = await page.$('input[type="file"]') |
| |
|
| | |
| | await fileField.uploadFile(inputImageFilePath) |
| |
|
| | const firstTextarea = await page.$('textarea[data-testid="textbox"]') |
| |
|
| | const conceptsToDetect = actionnables.join(" . ") |
| | await firstTextarea.type(conceptsToDetect) |
| |
|
| | |
| | const submitButton = await page.$('button.lg') |
| |
|
| | await sleep(300) |
| |
|
| | |
| | await submitButton.click() |
| |
|
| | await page.waitForSelector('img[data-testid="detailed-image"]', { |
| | timeout: 40000, |
| | }) |
| |
|
| | const maskUrl = await page.$$eval('img[data-testid="detailed-image"]', el => el.map(x => x.getAttribute("src"))[0]) |
| |
|
| | let segments: ImageSegment[] = [] |
| | |
| | try { |
| | segments = JSON.parse(await page.$$eval('textarea', el => el.map(x => x.value)[1])) |
| | } catch (err) { |
| | console.log(`failed to parse JSON: ${err}`) |
| | segments = [] |
| | } |
| |
|
| | |
| | |
| |
|
| | const rawPngInBase64 = await downloadImageAsBase64(maskUrl) |
| |
|
| | const pngInBase64 = await resizeBase64Image(rawPngInBase64, width, height) |
| |
|
| | return { |
| | pngInBase64, |
| | segments, |
| | } |
| | } catch (err) { |
| | throw err |
| | } finally { |
| | await browser.close() |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |