import got from "got"; import config from "../../config"; import delay from "../../util/delay"; import PostDatabase from "../../services/postDatabase"; export const dedupeDb = new PostDatabase("e926dedupe.json", 100); export interface GetPostQuery { tags: readonly string[]; maxPage: number; } export interface Post { id: number; file: { url: string; }; sources: readonly string[]; tags: { general: readonly string[]; species: readonly string[]; character: readonly string[]; copyright: readonly string[]; artist: readonly string[]; invalid: readonly string[]; lore: readonly string[]; meta: readonly string[]; }; } export const client = got.extend({ headers: { "User-Agent": config.e621.userAgent, }, }); export async function getPostById(id: number) { const response = await client .get("https://e926.net/posts.json", { searchParams: { tags: `id:${id}`, }, }) .json<{ posts: readonly Post[] }>(); if (!response.posts.length) { throw new Error("No posts received"); } return response.posts[0]; } export async function getRandomPost(query: GetPostQuery): Promise { const page = Math.floor(Math.random() * (query.maxPage - 1)) + 1; const response = await client .get("https://e926.net/posts.json", { searchParams: { limit: 75, page, tags: query.tags.join(" "), }, }) .json<{ posts: readonly Post[] }>(); if (!response.posts.length) { throw new Error("No posts received"); } const postIndex = Math.floor(Math.random() * response.posts.length); const post = response.posts[postIndex]; const isDupe = await dedupeDb.insertIfNotExists({ provider: "e926", id: post.id }); if (isDupe) { await delay(1000); return getRandomPost(query); } return post; }