import axios from 'axios' import FormData from 'form-data' import fs from 'fs' import path from 'path' const API = 'https://api.unwatermark.ai/api/web/unblurimage/v1/image-unblur-v2' const baseHeaders = { 'product-code': '067003', 'product-serial': 'q637zn', 'Referer': 'https://unblurimage.ai/', 'accept-language': 'id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7', 'cache-control': 'no-cache', 'pragma': 'no-cache', } async function createJob(filePath) { const form = new FormData() form.append('original_image_file', fs.createReadStream(filePath), path.basename(filePath)) const { data } = await axios.post(`${API}/create-job`, form, { headers: { ...baseHeaders, ...form.getHeaders() }, }) if (!data.result?.job_id) throw new Error(data.message?.en ?? 'create-job failed') return data.result.job_id } async function pollJob(jobId, interval = 3000, maxAttempts = 30) { for (let i = 0; i < maxAttempts; i++) { const { data } = await axios.get(`${API}/get-job/${jobId}`, { headers: { ...baseHeaders, 'content-type': 'application/json; charset=UTF-8' }, }) if (data.result.status === 1) return data.result if (data.result.status === 2) throw new Error(data.message?.en ?? 'job failed') await new Promise(r => setTimeout(r, interval)) } throw new Error('polling timeout') } async function unblur(filePath) { const jobId = await createJob(filePath) const result = await pollJob(jobId) return { job_id: result.job_id, input_url: result.input_url, output_url: result.output_url, credits_cost: result.credits_cost, remaining_free_times: result.remaining_free_times, } } export { unblur } const [, , filePath] = process.argv if (filePath) { unblur(filePath) .then(r => console.log(JSON.stringify(r, null, 2))) .catch(e => { console.error(JSON.stringify({ error: e.message }, null, 2)) process.exit(1) }) }