fe-middleware/src/services/ImageService.ts

44 lines
1.5 KiB
TypeScript
Raw Normal View History

2024-03-28 11:43:24 +00:00
import GelbooruServiceResponse from "../types/GelbooruServiceResponse";
import Image from "../types/Image";
import BotApiService from "./BotApiService";
import GelbooruApiService from "./GelbooruApiService";
class ImageService {
postsQueue: Image[] = [];
2024-03-28 11:43:24 +00:00
async get(): Promise<Image> {
while (this.postsQueue.length === 0) {
const validPosts = await this.getNewValidImages();
this.postsQueue = validPosts;
}
return this.postsQueue.pop() as Image;
}
2024-03-28 15:52:39 +00:00
2024-03-28 11:43:24 +00:00
private async getNewValidImages(): Promise<Image[]> {
const gelbooruResponse: GelbooruServiceResponse = await GelbooruApiService.get();
const posts = gelbooruResponse.posts;
const botResponse = await BotApiService.getAll();
const imagesUrls = botResponse.images.map(image => image.url);
const validPosts = Promise.all(posts
2024-03-28 11:43:24 +00:00
.filter(post => !imagesUrls.some(url => url === post.url))
.map(async (post): Promise<Image> => {
const imageData = await this.urlToImageData(post.url);
const encodedImage = this.imageToBase64(imageData);
return { url: post.url, tags: post.tags, content: encodedImage };
}));
2024-03-28 11:43:24 +00:00
return validPosts;
}
private async urlToImageData(url: string): Promise<string> {
return await (await fetch(url)).text();
}
private imageToBase64(imageData: string): string {
return Buffer.from(imageData, "binary").toString("base64");
}
2024-03-28 11:43:24 +00:00
}
export default new ImageService();