enzostvs's picture
enzostvs HF Staff
update metadata
7fb1583
raw
history blame
6.56 kB
import { json, type RequestEvent } from '@sveltejs/kit';
import puppeteer from 'puppeteer';
import { promises } from 'fs';
import { randomUUID } from 'crypto';
import prisma from '$lib/prisma';
import { tokenIsAvailable } from '$lib/utils';
/** @type {import('./$types').RequestHandler} */
export async function GET({ url, params } : RequestEvent) {
const id = params.id?.replace("@", "/")
const full = Boolean(url.searchParams.get('full')) ?? false
const metadata = Boolean(url.searchParams.get('metadata')) ?? false
const model = await prisma.model.findFirst({
where: {
id,
},
select: full ? {
id: true,
likes: true,
downloads: true,
image: true,
instance_prompt: true,
metadata: true,
base_model: true,
isPublic: true,
gallery: {
select: {
id: true,
prompt: true,
image: true,
createdAt: true,
},
where: {
isPublic: true
},
orderBy: {
createdAt: 'desc'
},
take: 10
},
comments: {
select: {
id: true,
createdAt: true,
text: true,
user: {
select: {
id: true,
name: true,
sub: true,
picture: true,
preferred_username: true,
}
}
}
}
} : {
instance_prompt: true,
image: true,
id: true,
metadata: true,
isPublic: true,
gallery: {
select: {
image: true,
},
where: {
isPublic: true
},
orderBy: {
createdAt: 'desc'
},
take: 1
},
}
})
if (!model) {
return json({
error: {
token: "Model params is required"
}
}, { status: 401 })
}
let infos: Record<string, string | string[]> = {};
if (full) {
const hf_model_request = await fetch(`https://huggingface.co/api/models/${id}`, {
headers: {
"Authorization": `Bearer ${process.env.SECRET_HF_TOKEN}`
}
})
const hf_model_response = await hf_model_request.json();
infos = {
base_model: hf_model_response?.cardData?.base_model,
license: hf_model_response?.cardData?.license,
tags: hf_model_response?.cardData?.tags,
}
}
// get puppeteer screenshot
if (!model.metadata && metadata && model?.isPublic) {
const browser = await puppeteer.launch({
headless: true,
defaultViewport: {
width: 1920,
height: 1080,
},
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
],
ignoreDefaultArgs: ['--disable-extensions']
}).catch((err) => console.error(err))
if (browser) {
const page = await browser.newPage();
await page.goto("https://" + process.env.SPACE_HOST?.split(",")[0] + '/metadata/models/' + model.id, {
waitUntil: 'networkidle0',
});
const buffer = await page.screenshot({
type: 'png',
});
const dir = await promises.opendir(process?.env?.PUBLIC_FILE_UPLOAD_DIR as string).catch(() => null)
if (!dir) await promises.mkdir(process?.env?.PUBLIC_FILE_UPLOAD_DIR as string)
const file_name_formatted = randomUUID() + "_" + "metadata" + model.id.replace("/", "-") + ".png"
await promises.writeFile(`${process.env.PUBLIC_FILE_UPLOAD_DIR}/${file_name_formatted}`, buffer)
await prisma.model.update({
where: {
id,
},
data: {
metadata: file_name_formatted
}
})
await browser.close();
}
}
return json({
model: {
...model,
infos
}
})
}
export async function POST({ params, cookies, fetch } : RequestEvent) {
const token = cookies.get('hf_access_token')
if (!token) {
return json({
error: {
token: "Token is required"
}
}, { status: 401 })
}
const user = await tokenIsAvailable(token)
if (!user || !process.env.SECRET_HF_ADMIN?.includes(user.sub)) {
return json({
error: {
token: "Wrong castle fam :^)"
}
}, { status: 401 })
}
const id = params.id?.replace("@", "/")
const model = await prisma.model.findFirst({
where: {
id,
}
})
if (!model) {
return json({
error: {
token: "Model not found"
}
}, { status: 404 })
}
const data = await fetch(`https://huggingface.co/api/models/${model.id}`)
const hf_model = await data.json()
const base_model = hf_model.tags.find((tag: string) => tag.startsWith("base_model:"))?.split(":")[1] ?? null
await prisma.model.update({
where: {
id,
},
data: {
isPublic: true,
instance_prompt: hf_model?.cardData?.instance_prompt,
...(base_model ? {
base_model: base_model
} : {}
)
}
})
return json({
success: true
})
}
export async function DELETE({ params, cookies } : RequestEvent) {
const token = cookies.get('hf_access_token')
if (!token) {
return json({
error: {
token: "Token is required"
}
}, { status: 401 })
}
const user = await tokenIsAvailable(token)
if (!user || !process.env.SECRET_HF_ADMIN?.includes(user.sub)) {
return json({
error: {
token: "Wrong castle fam :^)"
}
}, { status: 401 })
}
const id = params.id?.replace("@", "/")
const model = await prisma.model.findFirst({
where: {
id,
}
})
if (!model) {
return json({
error: {
token: "Model not found"
}
}, { status: 404 })
}
await prisma.model.update({
where: {
id,
},
data: {
isPublic: false,
}
})
return json({
success: true
})
}
export async function PATCH({ request, params } : RequestEvent) {
const headers = Object.fromEntries(request.headers.entries());
if (headers["x-hf-token"] !== process.env.SECRET_HF_TOKEN) {
return Response.json({
message: "Wrong castle fam :^)"
}, { status: 401 });
}
const id = params.id?.replace("@", "/")
const model = await prisma.model.findFirst({
where: {
id,
}
})
if (!model) {
return json({
error: {
token: "Model not found"
}
}, { status: 404 })
}
const body = await request.json()
await prisma.model.update({
where: {
id,
},
data: {
...body
}
})
return json({
success: true
})
}