{"version":3,"file":"index.mjs","sources":["../src/h.ts","../src/util.ts","../src/api.ts"],"sourcesContent":["export interface IQDBClientConfig {\n    baseDomain: string,\n    similarityPass: number\n    userAgent: string,\n    fetchOptions?: RequestInit\n}\n/**'www'search all libs */\nexport type IQDB_SEARCH_LIBRARY_2D = 'danbooru' | 'konachan' | 'yandere' | 'gelbooru' | 'sankaku' | 'e-shuushuu' | 'zerochan' | 'anime-pictures' | 'www'\n/**cosplay, asian models, idols.'3d' search all libs.*/\nexport type IQDB_SEARCH_LIBRARY_3D = '3d' | '3dbooru' | 'idol'\nexport interface IQDB_SEARCH_OPTIONS_GENERAL {\n    forcegray?: boolean\n    fileName?: string\n}\nexport type IQDB_SEARCH_OPTIONS_2D = ({\n    lib: Exclude<IQDB_SEARCH_LIBRARY_2D, 'www'>,\n    service?: undefined\n} | {\n    lib: 'www',\n    service?: Array<IQDBLibs_2D>\n}) & IQDB_SEARCH_OPTIONS_GENERAL\nexport type IQDB_SEARCH_OPTIONS_3D = ({\n    lib: Exclude<IQDB_SEARCH_LIBRARY_3D, '3d'>,\n    service?: undefined\n} | {\n    lib: '3d',\n    service?: Array<IQDBLibs_3D>\n}) & IQDB_SEARCH_OPTIONS_GENERAL\nexport type IQDB_SEARCH_OPTIONS_ALL = IQDB_SEARCH_OPTIONS_2D | IQDB_SEARCH_OPTIONS_3D\n\nexport enum IQDBLibs_2D {\n    danbooru = 1,\n    konachan = 2,\n    'yande.re' = 3,\n    gelbooru = 4,\n    'sankaku channel' = 5,\n    'e-shuushuu' = 6,\n    zerochan = 11,\n    'anime-picture' = 13\n}\nexport enum IQDBLibs_3D {\n    '3dbooru' = 7,\n    'idol' = 9\n}\nexport type IQDB_RESULT_TYPE = 'Safe' | 'Ero' | 'Explicit' | string","import { Size } from \"./api\"\nimport { IQDB_RESULT_TYPE } from \"./h\"\n\nexport function parseSimilarity(txt: string): number | null {\n    const result = txt.match(/(-?\\d+\\.?\\d*)(%?)/)\n    if (result) {\n        return (result[2] == undefined || result[2] == '') ? parseFloat(result[1]) : parseFloat(result[1]) / 100\n    } else {\n        return null//couldn't parse similarity\n    }\n}\nexport function parseSizeAndType(txt: string): { size: Size, type: IQDB_RESULT_TYPE } | string {\n    const result = txt.match(/(\\d+)×(\\d+)(?: \\[([A-z]*)\\])?/)\n    if (result) {\n        return {\n            size: {\n                width: parseInt(result[1]),\n                height: parseInt(result[2])\n            },\n            type: result[3]\n        }\n    } else {\n        return txt\n    }\n}\nconst availCharset = '0123456789abcdefghijklmnopqrstuvwxyz@ABCDEFGHIJKLMNOPQRSTUVWXYZ_'\nconst availCharsetLen = availCharset.length\nexport function getRandomName() {\n    const length = 5 + (Math.random() * 10 | 0)\n    let str = ''\n    for (let i = 0; i < length; i++) {\n        str += availCharset[Math.random() * availCharsetLen | 0]\n    }\n    return str + '.jpg'\n}\n\nexport async function asyncIterableToArray<T>(asyncIterable: AsyncIterable<T>): Promise<Array<T>> {\n    const result = []\n    for await (const item of asyncIterable) {\n        result.push(item)\n    }\n    return result\n}","import { parseSimilarity, parseSizeAndType, getRandomName, asyncIterableToArray } from \"./util\"\nimport { load } from 'cheerio'\nimport { IQDB_SEARCH_OPTIONS_ALL, IQDBClientConfig, IQDBLibs_2D, IQDBLibs_3D, IQDB_RESULT_TYPE } from \"./h\"\nimport { Readable } from 'stream'\nexport interface Size {\n    width: number\n    height: number\n}\nexport type IQDBSearchResultItem = {\n    head: string,\n    img: string,\n    name?: string,\n    sourceUrl?: string,\n    source?: string[],\n    /**\n     * number between 0 and 1 or null if no similarity provided\n     */\n    similarity: number | null\n} & ({\n    size?: Size,\n    type?: IQDB_RESULT_TYPE\n} | { sizeAndType: string })\nexport type SearchPicResult = SearchPicResultWithError |\n{\n    /**是否找到满足相似度的结果 */\n    ok: boolean,\n    /**返回数据 */\n    data: IQDBSearchResultItem[]\n    /**在哪些库做了搜索 */\n    service: Array<IQDBLibs_2D | IQDBLibs_3D>\n}\nexport interface SearchPicResultWithError {\n    /**是否找到满足相似度的结果 */\n    ok: false,\n    /**是否发生错误 */\n    err?: string\n    data?: IQDBSearchResultItem[]\n}\nexport const defaultConfig: IQDBClientConfig = {\n    baseDomain: 'iqdb.org',\n    similarityPass: 0.6,\n    userAgent: 'node',\n}\nfunction _addToForm(form: FormData, libs: Array<IQDBLibs_2D | IQDBLibs_3D>) {\n    for (const lib of libs) {\n        form.append('service[]', lib.toString())\n    }\n}\n\n/**\n *\n * @param body 服务器返回的body\n * @param noSource 指示结果中是否应该有source字段\n * @returns\n */\nexport function parseResult(body: string, similarityPass: number, noSource?: boolean) {\n    const $ = load(body)\n    let ok = false\n    const err = $('.err')\n    if (err.length > 0) {\n        return {\n            ok: false,\n            err: err.text()\n        } as SearchPicResultWithError\n    }\n    const service = $('input[type=checkbox][name=\"service[]\"][checked]').toArray()\n        .map(element => {\n            const value = parseInt(element.attribs.value)\n            const name = IQDBLibs_2D[value] || IQDBLibs_3D[value]\n            if (!name) console.warn('Unknown lib: ' + value)\n            return value\n        })\n    const data: Array<IQDBSearchResultItem> = $('#pages').children('div').toArray()\n        .map((page): IQDBSearchResultItem => {\n            const rows = $(page).find('tr')\n            const head = $(rows[0]).text()\n            if (head == 'Your image') {\n                const sizeAndType = parseSizeAndType($(rows[3]).text())\n                return {\n                    head,\n                    img: $(rows[1]).find('img').attr('src'),\n                    name: $(rows[2]).text(),\n                    // no similarity for your own image\n                    similarity: null,\n                    ...typeof sizeAndType == 'object' ? sizeAndType : { sizeAndType }\n                }\n            } else if (head == 'No relevant matches') {\n                return\n            } else {\n                let similarity: number,\n                    sizeAndType: string | { size: Size; type: string },\n                    source: string[]\n                if (noSource) {\n                    similarity = parseSimilarity($(rows[3]).text())\n                    sizeAndType = parseSizeAndType($(rows[2]).text())\n                } else {\n                    similarity = parseSimilarity($(rows[4]).text())\n                    sizeAndType = parseSizeAndType($(rows[3]).text())\n                    source = $(rows[2]).text().split(' ')\n                }\n                if (similarity >= similarityPass) ok = true\n                const imgBox = $(rows[1]).find('a')\n\n                return {\n                    head,\n                    sourceUrl: imgBox.attr('href'),\n                    similarity,\n                    img: imgBox.find('img').attr('src'),\n                    ...typeof sizeAndType == 'object' ? sizeAndType : { sizeAndType },\n                    source,\n                }\n            }\n        })\n        .filter(item => item != undefined)\n    return {\n        ok,\n        data,\n        service\n    }\n}\nexport function makeSearchFunc(config: IQDBClientConfig) {\n    return async function searchPic(pic: string | Buffer | Readable, { lib, forcegray, service: libs, fileName }: IQDB_SEARCH_OPTIONS_ALL): Promise<SearchPicResult> {\n        const isMultiLib = (lib == 'www' || lib == '3d')\n        const form = new FormData()\n        if (typeof pic == 'string') { form.append('url', pic) }\n        else if (pic instanceof Buffer) { form.append('file', new Blob([pic]), fileName || getRandomName()) }\n        else if (pic instanceof Readable) { form.append('file', new Blob(await asyncIterableToArray(pic)), fileName || getRandomName()) }\n        else throw new TypeError('expect string | Buffer | Readable')\n        if (isMultiLib && libs) _addToForm(form, libs)\n        if (forcegray) form.append('forcegray', 'true')\n        const resp = await fetch(`https://${lib}.${config.baseDomain}`,\n            {\n                method: 'POST',\n                body: form,\n                headers: {\n                    'User-Agent': config.userAgent\n                },\n                ...config.fetchOptions\n            })\n        if (resp.ok) {\n            return parseResult(await resp.text(), config.similarityPass, !isMultiLib)\n        } else {\n            return {\n                ok: false,\n                err: 'HTTP ' + resp.status\n            } as SearchPicResultWithError\n        }\n    }\n}\nconst searchPic = makeSearchFunc(defaultConfig)\nexport default searchPic\n"],"names":["IQDBLibs_2D","IQDBLibs_3D","parseSimilarity","txt","result","match","undefined","parseFloat","parseSizeAndType","size","width","parseInt","height","type","availCharset","availCharsetLen","length","getRandomName","Math","random","str","i","asyncIterableToArray","asyncIterable","item","push","defaultConfig","baseDomain","similarityPass","userAgent","_addToForm","form","libs","lib","append","toString","parseResult","body","noSource","$","load","ok","err","text","service","toArray","map","element","value","attribs","name","console","warn","data","children","page","rows","find","head","sizeAndType","img","attr","similarity","source","split","imgBox","sourceUrl","filter","makeSearchFunc","config","searchPic","pic","forcegray","fileName","isMultiLib","FormData","Buffer","Blob","Readable","TypeError","resp","fetch","method","headers","fetchOptions","status"],"mappings":"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"}