Skip to content

Commit

Permalink
fix: 🐛 【Core】EagleApp 中导入图片,并勾选使用已存在的图片,NSFW检测结果会被覆盖
Browse files Browse the repository at this point in the history
Closes: #90
  • Loading branch information
meetqy committed Mar 22, 2023
1 parent 6bc87bf commit d46010f
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 55 deletions.
75 changes: 75 additions & 0 deletions packages/transform-eagle/lib/image/getPrismaParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { Prisma, Image, Tag } from "@raopics/prisma-client";
import _ from "lodash";

const _NSFWTags = ["Drawing", "Hentai", "Neutral", "Porn", "Sexy"];

function getPrismaParams(
data: EagleUse.Image,
oldData: Image & {
tags: Tag[];
}
): [Prisma.ImageCreateInput, boolean] {
// 是否有需要 disconnect 的标签
let disconnect = false;

let tags = {},
folders = {};

if (data.folders) {
folders = {
connect: data.folders.map((folder) => ({ id: folder })),
};
}

if (data.tags) {
tags = {
connectOrCreate: data.tags.map((tag) => ({
where: { id: tag },
create: { id: tag, name: tag },
})),
};

if (oldData && oldData.tags) {
// 【Core】EagleApp 中导入图片,已经存在,并勾选使用已存在的图片,NSFW检测结果会被覆盖。 #90
// https://github.com/rao-pics/core/issues/90
oldData.tags.forEach(({ id }) => {
if (_NSFWTags.includes(id)) {
tags["connectOrCreate"].push({
where: { id },
create: { id, name: id },
});
}
});

// 标签 从 a => b
// 1.需要 disconnect a
// 2.如果 a 标签所关联的图片数量小于1 需要删除
const disconnectTags = _.difference(
oldData.tags.map((tag) => tag.id),
data.tags as string[]
).filter((item) => !_NSFWTags.includes(item));

if (disconnectTags.length > 0) {
tags["disconnect"] = disconnectTags.map((tag) => ({ id: tag }));
disconnect = true;
}
}
}

// 浮点数只能用string来存储
if (data.ext.toLocaleLowerCase() === "mp4") {
data.duration = data.duration.toString();
}

return [
{
...data,
tags,
folders,
palettes: JSON.stringify(data.palettes),
},
disconnect,
];
}

export default getPrismaParams;
61 changes: 6 additions & 55 deletions packages/transform-eagle/lib/image/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import * as chokidar from "chokidar";
import { join } from "path";
import * as _ from "lodash";
import { readJsonSync, statSync } from "fs-extra";
import { getPrisma, Image, Prisma, Tag } from "@raopics/prisma-client";
import { getPrisma } from "@raopics/prisma-client";
import { logger } from "@raopics/utils";
import ProgressBar from "progress";
import TagPrisma from "../tag";
import { getNSFWMetadata } from "./nsfw";
import { trigger } from "../trigger";
import getPrismaParams from "./getPrismaParams";

// 防抖 需要延迟的毫秒数
const _wait = 3000;
Expand Down Expand Up @@ -70,58 +71,6 @@ const PendingFiles: {
},
};

function getPrismaParams(
data: EagleUse.Image,
oldData: Image & {
tags: Tag[];
}
): Prisma.ImageCreateInput {
let tags = {},
folders = {};

if (data.folders) {
folders = {
connect: data.folders.map((folder) => ({ id: folder })),
};
}

if (data.tags) {
tags = {
connectOrCreate: data.tags.map((tag) => ({
where: { id: tag },
create: { id: tag, name: tag },
})),
};

// 标签 从 a => b
// 1.需要 disconnect a
// 2.如果 a 标签所关联的图片数量小于1 需要删除
if (oldData && oldData.tags) {
const disconnectTags = _.difference(
oldData.tags.map((tag) => tag.id),
data.tags as string[]
);

if (disconnectTags.length > 0) {
tags["disconnect"] = disconnectTags.map((tag) => ({ id: tag }));
isDisconnect.tag = true;
}
}
}

// 浮点数只能用string来存储
if (data.ext.toLocaleLowerCase() === "mp4") {
data.duration = data.duration.toString();
}

return {
...data,
tags,
folders,
palettes: JSON.stringify(data.palettes),
};
}

const handleImage = async () => {
const prisma = getPrisma();
if (PendingFiles.value.size < 1) return;
Expand Down Expand Up @@ -186,7 +135,8 @@ const handleImage = async () => {
},
});

let data = getPrismaParams({ ...metadata, metadataMTime: mtime }, image);
let [data, disconnect] = getPrismaParams({ ...metadata, metadataMTime: mtime }, image);
isDisconnect.tag = disconnect;

// 新增
if (!image) {
Expand All @@ -197,7 +147,8 @@ const handleImage = async () => {
metadata = await getNSFWMetadata(metadata, file);
}

data = getPrismaParams({ ...metadata, metadataMTime: mtime }, image);
[data, disconnect] = getPrismaParams({ ...metadata, metadataMTime: mtime }, image);
isDisconnect.tag = disconnect;
}

// 使用upsert
Expand Down

0 comments on commit d46010f

Please sign in to comment.