File size: 2,937 Bytes
8fce765
 
 
266b7fc
8fce765
 
 
 
 
b628664
8fce765
 
 
 
 
9fd8477
 
8fce765
 
9fd8477
 
 
8fce765
549506b
8fce765
9fd8477
8fce765
bacde8d
 
 
 
 
 
 
 
 
 
549506b
 
 
 
 
 
 
 
d7c9dd1
 
 
 
 
 
 
 
 
549506b
8fce765
 
 
ffd658d
 
8fce765
 
 
d7c9dd1
 
 
 
 
 
 
8fce765
 
929204e
9fd8477
ffd658d
 
 
 
8fce765
7ddbc0b
 
 
 
 
 
 
8fce765
 
 
9fd8477
8fce765
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/** @type {import('./$types').RequestHandler} */

import { json } from '@sveltejs/kit';
// import moment from 'moment';
import prisma from '$lib/prisma';

export async function POST({ request }) {
  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 response_models = await fetch(`https://huggingface.co/api/models?limit=200&filter=lora%2Cdiffusers&sort=createdAt&full=true&config=true`)
  const new_models = await response_models.json();
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  let index = 0;
  let model_saved = 0;

  for (const model of new_models) {
    if (index % 50 === 0) {
      await new Promise(resolve => setTimeout(resolve, 2000));
    }
    index++

    const existing_model = await prisma.model.findUnique({
      where: {
        id: model.id
      }
    })

    if (existing_model) {
      continue;
    }

    const hasImages = model?.siblings?.filter((sibling: Record<string, string>) => sibling?.rfilename.endsWith(".png") || sibling?.rfilename.endsWith(".jpeg") || sibling?.rfilename.endsWith(".jpg"))
    if (hasImages.length > 0) {
      model.image = hasImages[1]?.rfilename ? `https://huggingface.co/${model.id}/resolve/main/${hasImages[1]?.rfilename}` : `https://huggingface.co/${model.id}/resolve/main/${hasImages[0]?.rfilename}`
    } else {
      const hasReadme = model?.siblings?.find((sibling: Record<string, string>) => sibling?.rfilename === "README.md")
      if (hasReadme) {
        const readmeRes = await fetch(`https://huggingface.co/${model.id}/raw/main/README.md`)
        const readme = await readmeRes.text().catch(() => null)
        if (readme) {
          const imageRegex = /!\[.*\]\((.*)\)/
          let image = readme.match(imageRegex)?.[1]
      
          if (image) {
            image = image.replace(/&#x2F;/g, "/")
            if (image.startsWith("http")) model.image = image
            else model.image = `https://huggingface.co/${model.id}/resolve/main/${image.replace("./", "")}`
          }
        }
      }
    }

    const base_model = model.tags.find((tag: string) => tag.startsWith("base_model:"))?.split(":")[1] ?? null

    await prisma.model.create({
      data: {
        id: model.id,
        ...(
          model?.image?.startsWith("http") ? {
            image: model.image
          } : {
            image: undefined,
          }
        ),
        likes: model.likes,
        downloads: model.downloads,
        createdAt: model.createdAt,
        isPublic: false,
        ...(base_model ? {
          base_model: base_model
        } : {}
        )
      }
    })
    .then(() => {
      model_saved++
    })
    .catch((error) => {
      console.error(error)
    })
  }

  return json({
    message: `Successfully added ${model_saved} models`,
  })
}