reacto: images not called directly in routes

This commit is contained in:
Julien Froidefond
2025-02-17 08:17:31 +01:00
parent 50e583f58d
commit 4ae606ea09
6 changed files with 63 additions and 59 deletions

View File

@@ -1,5 +1,5 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { ImageService } from "@/lib/services/image.service"; import { BookService } from "@/lib/services/book.service";
export const dynamic = "force-dynamic"; export const dynamic = "force-dynamic";
@@ -8,16 +8,8 @@ export async function GET(
{ params }: { params: { bookId: string; pageNumber: string } } { params }: { params: { bookId: string; pageNumber: string } }
) { ) {
try { try {
const { buffer, contentType } = await ImageService.getImage( const response = await BookService.getPage(params.bookId, parseInt(params.pageNumber));
`books/${params.bookId}/pages/${params.pageNumber}` return response;
);
return new NextResponse(buffer, {
headers: {
"Content-Type": contentType || "image/jpeg",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
} catch (error) { } catch (error) {
console.error("Erreur lors de la récupération de la page du livre:", error); console.error("Erreur lors de la récupération de la page du livre:", error);
return new NextResponse("Erreur lors de la récupération de la page", { status: 500 }); return new NextResponse("Erreur lors de la récupération de la page", { status: 500 });

View File

@@ -1,16 +1,10 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { ImageService } from "@/lib/services/image.service"; import { BookService } from "@/lib/services/book.service";
export async function GET(request: NextRequest, { params }: { params: { bookId: string } }) { export async function GET(request: NextRequest, { params }: { params: { bookId: string } }) {
try { try {
const { buffer, contentType } = await ImageService.getImage(`books/${params.bookId}/thumbnail`); const response = await BookService.getThumbnail(params.bookId);
return response;
return new NextResponse(buffer, {
headers: {
"Content-Type": contentType || "image/jpeg",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
} catch (error) { } catch (error) {
console.error("Erreur lors de la récupération de la miniature du livre:", error); console.error("Erreur lors de la récupération de la miniature du livre:", error);
return new NextResponse("Erreur lors de la récupération de la miniature", { status: 500 }); return new NextResponse("Erreur lors de la récupération de la miniature", { status: 500 });

View File

@@ -1,39 +1,14 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { ImageService } from "@/lib/services/image.service";
import { SeriesService } from "@/lib/services/series.service"; import { SeriesService } from "@/lib/services/series.service";
export const dynamic = "force-dynamic"; export const dynamic = "force-dynamic";
export async function GET(request: NextRequest, { params }: { params: { seriesId: string } }) { export async function GET(request: NextRequest, { params }: { params: { seriesId: string } }) {
try { try {
// Récupérer l'ID du premier livre const response = await SeriesService.getFirstPage(params.seriesId);
const firstBookId = await SeriesService.getFirstBook(params.seriesId); return response;
// Récupérer la première page du premier livre
const { buffer, contentType } = await ImageService.getImage(`books/${firstBookId}/pages/1`);
return new NextResponse(buffer, {
headers: {
"Content-Type": contentType || "image/jpeg",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
} catch (error) { } catch (error) {
console.error("Erreur lors de la récupération de la première page de la série:", error); console.error("Erreur lors de la récupération de la première page de la série:", error);
return new NextResponse("Erreur lors de la récupération de l'image", { status: 500 });
// En cas d'erreur, on essaie de récupérer le thumbnail comme fallback
try {
const { buffer, contentType } = await ImageService.getImage(
`series/${params.seriesId}/thumbnail`
);
return new NextResponse(buffer, {
headers: {
"Content-Type": contentType || "image/jpeg",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
} catch (fallbackError) {
return new NextResponse("Erreur lors de la récupération de l'image", { status: 500 });
}
} }
} }

View File

@@ -1,18 +1,10 @@
import { NextRequest, NextResponse } from "next/server"; import { NextRequest, NextResponse } from "next/server";
import { ImageService } from "@/lib/services/image.service"; import { SeriesService } from "@/lib/services/series.service";
export async function GET(request: NextRequest, { params }: { params: { seriesId: string } }) { export async function GET(request: NextRequest, { params }: { params: { seriesId: string } }) {
try { try {
const { buffer, contentType } = await ImageService.getImage( const response = await SeriesService.getThumbnail(params.seriesId);
`series/${params.seriesId}/thumbnail` return response;
);
return new NextResponse(buffer, {
headers: {
"Content-Type": contentType || "image/jpeg",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
} catch (error) { } catch (error) {
console.error("Erreur lors de la récupération de la miniature de la série:", error); console.error("Erreur lors de la récupération de la miniature de la série:", error);
return new NextResponse("Erreur lors de la récupération de la miniature", { status: 500 }); return new NextResponse("Erreur lors de la récupération de la miniature", { status: 500 });

View File

@@ -98,6 +98,20 @@ export class BookService extends BaseApiService {
} }
} }
static async getThumbnail(bookId: string): Promise<Response> {
try {
const response = await ImageService.getImage(`books/${bookId}/thumbnail`);
return new Response(response.buffer, {
headers: {
"Content-Type": response.contentType || "image/jpeg",
"Cache-Control": "public, max-age=31536000, immutable",
},
});
} catch (error) {
throw this.handleError(error, "Impossible de récupérer la miniature du livre");
}
}
static getPageUrl(bookId: string, pageNumber: number): string { static getPageUrl(bookId: string, pageNumber: number): string {
return `/api/komga/images/books/${bookId}/pages/${pageNumber}`; return `/api/komga/images/books/${bookId}/pages/${pageNumber}`;
} }

View File

@@ -1,6 +1,8 @@
import { BaseApiService } from "./base-api.service"; import { BaseApiService } from "./base-api.service";
import { LibraryResponse } from "@/types/library"; import { LibraryResponse } from "@/types/library";
import { KomgaBook, KomgaSeries } from "@/types/komga"; import { KomgaBook, KomgaSeries } from "@/types/komga";
import { BookService } from "./book.service";
import { ImageService } from "./image.service";
export class SeriesService extends BaseApiService { export class SeriesService extends BaseApiService {
static async getSeries(seriesId: string): Promise<KomgaSeries> { static async getSeries(seriesId: string): Promise<KomgaSeries> {
@@ -73,4 +75,39 @@ export class SeriesService extends BaseApiService {
return this.handleError(error, "Impossible de récupérer le premier livre"); return this.handleError(error, "Impossible de récupérer le premier livre");
} }
} }
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");
}
}
}
static async getThumbnail(seriesId: string): Promise<Response> {
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 (error) {
throw this.handleError(error, "Impossible de récupérer la miniature de la série");
}
}
} }