feat: pref for image quality
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { BaseApiService } from "./base-api.service";
|
||||
import { KomgaBook } from "@/types/komga";
|
||||
import { ImageService } from "./image.service";
|
||||
import { PreferencesService } from "./preferences.service";
|
||||
|
||||
export class BookService extends BaseApiService {
|
||||
static async getBook(bookId: string): Promise<{ book: KomgaBook; pages: number[] }> {
|
||||
@@ -66,6 +67,14 @@ export class BookService extends BaseApiService {
|
||||
|
||||
static async getPage(bookId: string, pageNumber: number): Promise<Response> {
|
||||
try {
|
||||
// Récupérer les préférences de l'utilisateur
|
||||
const preferences = await PreferencesService.getPreferences();
|
||||
|
||||
// Si l'utilisateur préfère les vignettes, utiliser getPageThumbnail
|
||||
if (preferences.showThumbnails) {
|
||||
return this.getPageThumbnail(bookId, pageNumber);
|
||||
}
|
||||
|
||||
// Ajuster le numéro de page pour l'API Komga (zero-based)
|
||||
const adjustedPageNumber = pageNumber - 1;
|
||||
const response = await ImageService.getImage(
|
||||
@@ -91,6 +100,7 @@ export class BookService extends BaseApiService {
|
||||
return new Response(response.buffer, {
|
||||
headers: {
|
||||
"Content-Type": response.contentType || "image/jpeg",
|
||||
"Cache-Control": "public, max-age=31536000, immutable",
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
|
||||
65
src/lib/services/preferences.service.ts
Normal file
65
src/lib/services/preferences.service.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import { cookies } from "next/headers";
|
||||
import connectDB from "@/lib/mongodb";
|
||||
import { PreferencesModel } from "@/lib/models/preferences.model";
|
||||
|
||||
interface User {
|
||||
id: string;
|
||||
email: string;
|
||||
}
|
||||
|
||||
export interface UserPreferences {
|
||||
showThumbnails: boolean;
|
||||
}
|
||||
|
||||
export class PreferencesService {
|
||||
private static async getCurrentUser(): Promise<User> {
|
||||
const userCookie = cookies().get("stripUser");
|
||||
|
||||
if (!userCookie) {
|
||||
throw new Error("Utilisateur non authentifié");
|
||||
}
|
||||
|
||||
try {
|
||||
return JSON.parse(atob(userCookie.value));
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la récupération de l'utilisateur depuis le cookie:", error);
|
||||
throw new Error("Utilisateur non authentifié");
|
||||
}
|
||||
}
|
||||
|
||||
static async getPreferences(): Promise<UserPreferences> {
|
||||
await connectDB();
|
||||
const user = await this.getCurrentUser();
|
||||
|
||||
const preferences = await PreferencesModel.findOne({ userId: user.id });
|
||||
if (!preferences) {
|
||||
// Créer les préférences par défaut si elles n'existent pas
|
||||
const defaultPreferences = await PreferencesModel.create({
|
||||
userId: user.id,
|
||||
showThumbnails: false,
|
||||
});
|
||||
return {
|
||||
showThumbnails: defaultPreferences.showThumbnails,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
showThumbnails: preferences.showThumbnails,
|
||||
};
|
||||
}
|
||||
|
||||
static async updatePreferences(preferences: Partial<UserPreferences>): Promise<UserPreferences> {
|
||||
await connectDB();
|
||||
const user = await this.getCurrentUser();
|
||||
|
||||
const updatedPreferences = await PreferencesModel.findOneAndUpdate(
|
||||
{ userId: user.id },
|
||||
{ $set: preferences },
|
||||
{ new: true, upsert: true }
|
||||
);
|
||||
|
||||
return {
|
||||
showThumbnails: updatedPreferences.showThumbnails,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import { LibraryResponse } from "@/types/library";
|
||||
import { KomgaBook, KomgaSeries } from "@/types/komga";
|
||||
import { BookService } from "./book.service";
|
||||
import { ImageService } from "./image.service";
|
||||
import { PreferencesService } from "./preferences.service";
|
||||
|
||||
export class SeriesService extends BaseApiService {
|
||||
static async getSeries(seriesId: string): Promise<KomgaSeries> {
|
||||
@@ -78,22 +79,20 @@ export class SeriesService extends BaseApiService {
|
||||
|
||||
static async getFirstPage(seriesId: string): Promise<Response> {
|
||||
try {
|
||||
// Récupérer l'ID du premier livre
|
||||
const firstBookId = await this.getFirstBook(seriesId);
|
||||
return await BookService.getPage(firstBookId, 1);
|
||||
} catch (error) {
|
||||
// En cas d'erreur, on essaie de récupérer le thumbnail comme fallback
|
||||
try {
|
||||
const response = await ImageService.getImage(`series/${seriesId}/thumbnail`);
|
||||
return new Response(response.buffer, {
|
||||
headers: {
|
||||
"Content-Type": response.contentType || "image/jpeg",
|
||||
"Cache-Control": "public, max-age=31536000, immutable",
|
||||
},
|
||||
});
|
||||
} catch (fallbackError) {
|
||||
throw this.handleError(fallbackError, "Impossible de récupérer l'image de la série");
|
||||
// Récupérer les préférences de l'utilisateur
|
||||
const preferences = await PreferencesService.getPreferences();
|
||||
|
||||
// Si l'utilisateur préfère les vignettes, utiliser getThumbnail
|
||||
if (preferences.showThumbnails) {
|
||||
return this.getThumbnail(seriesId);
|
||||
}
|
||||
|
||||
// Sinon, récupérer la première page
|
||||
const firstBookId = await this.getFirstBook(seriesId);
|
||||
const response = await BookService.getPage(firstBookId, 1);
|
||||
return response;
|
||||
} catch (error) {
|
||||
throw this.handleError(error, "Impossible de récupérer la première page");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user