feat: pref for image quality

This commit is contained in:
Julien Froidefond
2025-02-17 08:31:44 +01:00
parent 4ae606ea09
commit 5c1138f287
12 changed files with 391 additions and 22 deletions

View File

@@ -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) {

View 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,
};
}
}

View File

@@ -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");
}
}