mirror of
https://github.com/CaramelFur/Picsur.git
synced 2025-11-06 20:25:40 +01:00
store original
This commit is contained in:
@@ -9,7 +9,6 @@ import {
|
|||||||
import { AsyncFailable, Fail } from 'picsur-shared/dist/types';
|
import { AsyncFailable, Fail } from 'picsur-shared/dist/types';
|
||||||
import { QOIColorSpace, QOIdecode, QOIencode } from 'qoi-img';
|
import { QOIColorSpace, QOIdecode, QOIencode } from 'qoi-img';
|
||||||
import sharp from 'sharp';
|
import sharp from 'sharp';
|
||||||
import { UsrPreferenceService } from '../../collections/preference-db/usr-preference-db.service';
|
|
||||||
|
|
||||||
interface ProcessResult {
|
interface ProcessResult {
|
||||||
image: Buffer;
|
image: Buffer;
|
||||||
@@ -18,8 +17,6 @@ interface ProcessResult {
|
|||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ImageProcessorService {
|
export class ImageProcessorService {
|
||||||
constructor(private readonly userPref: UsrPreferenceService) {}
|
|
||||||
|
|
||||||
public async process(
|
public async process(
|
||||||
image: Buffer,
|
image: Buffer,
|
||||||
mime: FullMime,
|
mime: FullMime,
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { fileTypeFromBuffer, FileTypeResult } from 'file-type';
|
import { fileTypeFromBuffer, FileTypeResult } from 'file-type';
|
||||||
import { FullMime } from 'picsur-shared/dist/dto/mimes.dto';
|
import { FullMime } from 'picsur-shared/dist/dto/mimes.dto';
|
||||||
|
import { UsrPreference } from 'picsur-shared/dist/dto/usr-preferences.dto';
|
||||||
import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types';
|
import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types';
|
||||||
import { ParseMime } from 'picsur-shared/dist/util/parse-mime';
|
import { ParseMime } from 'picsur-shared/dist/util/parse-mime';
|
||||||
import { IsQOI } from 'qoi-img';
|
import { IsQOI } from 'qoi-img';
|
||||||
import { ImageDBService } from '../../collections/image-db/image-db.service';
|
import { ImageDBService } from '../../collections/image-db/image-db.service';
|
||||||
import { ImageFileDBService } from '../../collections/image-db/image-file-db.service';
|
import { ImageFileDBService } from '../../collections/image-db/image-file-db.service';
|
||||||
|
import { UsrPreferenceService } from '../../collections/preference-db/usr-preference-db.service';
|
||||||
import { ImageFileType } from '../../models/constants/image-file-types.const';
|
import { ImageFileType } from '../../models/constants/image-file-types.const';
|
||||||
import { EImageFileBackend } from '../../models/entities/image-file.entity';
|
import { EImageFileBackend } from '../../models/entities/image-file.entity';
|
||||||
import { EImageBackend } from '../../models/entities/image.entity';
|
import { EImageBackend } from '../../models/entities/image.entity';
|
||||||
@@ -21,6 +23,7 @@ export class ImageManagerService {
|
|||||||
private readonly imagesService: ImageDBService,
|
private readonly imagesService: ImageDBService,
|
||||||
private readonly imageFilesService: ImageFileDBService,
|
private readonly imageFilesService: ImageFileDBService,
|
||||||
private readonly processService: ImageProcessorService,
|
private readonly processService: ImageProcessorService,
|
||||||
|
private readonly userPref: UsrPreferenceService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public async retrieveInfo(id: string): AsyncFailable<EImageBackend> {
|
public async retrieveInfo(id: string): AsyncFailable<EImageBackend> {
|
||||||
@@ -40,6 +43,14 @@ export class ImageManagerService {
|
|||||||
const fullMime = await this.getFullMimeFromBuffer(image);
|
const fullMime = await this.getFullMimeFromBuffer(image);
|
||||||
if (HasFailed(fullMime)) return fullMime;
|
if (HasFailed(fullMime)) return fullMime;
|
||||||
|
|
||||||
|
// Check if need to save orignal
|
||||||
|
const keepOriginal = await this.userPref.getBooleanPreference(
|
||||||
|
userid,
|
||||||
|
UsrPreference.KeepOriginal,
|
||||||
|
);
|
||||||
|
if (HasFailed(keepOriginal)) return keepOriginal;
|
||||||
|
|
||||||
|
// Process
|
||||||
const processResult = await this.processService.process(
|
const processResult = await this.processService.process(
|
||||||
image,
|
image,
|
||||||
fullMime,
|
fullMime,
|
||||||
@@ -47,6 +58,7 @@ export class ImageManagerService {
|
|||||||
);
|
);
|
||||||
if (HasFailed(processResult)) return processResult;
|
if (HasFailed(processResult)) return processResult;
|
||||||
|
|
||||||
|
// Save processed to db
|
||||||
const imageEntity = await this.imagesService.create();
|
const imageEntity = await this.imagesService.create();
|
||||||
if (HasFailed(imageEntity)) return imageEntity;
|
if (HasFailed(imageEntity)) return imageEntity;
|
||||||
|
|
||||||
@@ -58,15 +70,15 @@ export class ImageManagerService {
|
|||||||
);
|
);
|
||||||
if (HasFailed(imageFileEntity)) return imageFileEntity;
|
if (HasFailed(imageFileEntity)) return imageFileEntity;
|
||||||
|
|
||||||
// // nothing happens right now
|
if (keepOriginal) {
|
||||||
// const keepOriginal = await this.userPref.getBooleanPreference(
|
const originalFileEntity = await this.imageFilesService.setFile(
|
||||||
// userid,
|
imageEntity.id,
|
||||||
// UsrPreference.KeepOriginal,
|
ImageFileType.ORIGINAL,
|
||||||
// );
|
image,
|
||||||
// if (HasFailed(keepOriginal)) return keepOriginal;
|
fullMime.mime,
|
||||||
|
);
|
||||||
// if (keepOriginal) {
|
if (HasFailed(originalFileEntity)) return originalFileEntity;
|
||||||
// }
|
}
|
||||||
|
|
||||||
return imageEntity;
|
return imageEntity;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { ApiResponseSchema } from 'picsur-shared/dist/dto/api/api.dto';
|
import { ApiResponseSchema } from 'picsur-shared/dist/dto/api/api.dto';
|
||||||
import { MimeExt } from 'picsur-shared/dist/dto/mimes.dto';
|
import { Mime2Ext } from 'picsur-shared/dist/dto/mimes.dto';
|
||||||
import { AsyncFailable, Fail, HasFailed } from 'picsur-shared/dist/types';
|
import { AsyncFailable, Fail, HasFailed } from 'picsur-shared/dist/types';
|
||||||
import { ZodDtoStatic } from 'picsur-shared/dist/util/create-zod-dto';
|
import { ZodDtoStatic } from 'picsur-shared/dist/util/create-zod-dto';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
@@ -130,7 +130,7 @@ export class ApiService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const mimeTypeExt = MimeExt(mimeType);
|
const mimeTypeExt = Mime2Ext(mimeType);
|
||||||
if (mimeTypeExt !== undefined && !name.endsWith(mimeTypeExt)) {
|
if (mimeTypeExt !== undefined && !name.endsWith(mimeTypeExt)) {
|
||||||
name += '.' + mimeTypeExt;
|
name += '.' + mimeTypeExt;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export interface FullMime {
|
|||||||
type: SupportedMimeCategory;
|
type: SupportedMimeCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MimeExtMap: {
|
export const Mime2ExtMap: {
|
||||||
[key in ImageMime | AnimMime]: string;
|
[key in ImageMime | AnimMime]: string;
|
||||||
} = {
|
} = {
|
||||||
[ImageMime.JPEG]: 'jpg',
|
[ImageMime.JPEG]: 'jpg',
|
||||||
@@ -47,6 +47,14 @@ export const MimeExtMap: {
|
|||||||
[AnimMime.GIF]: 'gif',
|
[AnimMime.GIF]: 'gif',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const MimeExt = (mime: string): string | undefined => {
|
export const Ext2MimeMap: {
|
||||||
return MimeExtMap[mime as ImageMime | AnimMime];
|
[key: string]: string;
|
||||||
}
|
} = Object.fromEntries(Object.entries(Mime2ExtMap).map(([k, v]) => [v, k]));
|
||||||
|
|
||||||
|
export const Mime2Ext = (mime: string): string | undefined => {
|
||||||
|
return Mime2ExtMap[mime as ImageMime | AnimMime];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Ext2Mime = (ext: string): string | undefined => {
|
||||||
|
return Ext2MimeMap[ext];
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user