mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-04 05:10:11 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 01b59fae9d | |||
| 137e2b5607 |
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "readmeabook",
|
||||
"version": "1.1.2",
|
||||
"version": "1.1.3",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -100,15 +100,21 @@ export async function PATCH(
|
||||
},
|
||||
});
|
||||
|
||||
// Queue search job
|
||||
// Queue search job based on request type
|
||||
const { getJobQueueService } = await import('@/lib/services/job-queue.service');
|
||||
const jobQueue = getJobQueueService();
|
||||
await jobQueue.addSearchJob(id, {
|
||||
const audiobookData = {
|
||||
id: existingRequest.audiobook.id,
|
||||
title: existingRequest.audiobook.title,
|
||||
author: existingRequest.audiobook.author,
|
||||
asin: existingRequest.audiobook.audibleAsin || undefined,
|
||||
});
|
||||
};
|
||||
|
||||
if (existingRequest.type === 'ebook') {
|
||||
await jobQueue.addSearchEbookJob(id, audiobookData);
|
||||
} else {
|
||||
await jobQueue.addSearchJob(id, audiobookData);
|
||||
}
|
||||
|
||||
searchTriggered = true;
|
||||
logger.info(`Search triggered for request ${id} with custom terms`, { requestId: id });
|
||||
|
||||
@@ -260,6 +260,7 @@ export async function POST(
|
||||
parentRequestId: availableRequest?.id || null, // Link to parent if exists
|
||||
status: 'awaiting_approval',
|
||||
progress: 0,
|
||||
customSearchTerms: availableRequest?.customSearchTerms || null,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -292,6 +293,7 @@ export async function POST(
|
||||
parentRequestId: availableRequest?.id || null,
|
||||
status: 'pending',
|
||||
progress: 0,
|
||||
customSearchTerms: availableRequest?.customSearchTerms || null,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -252,6 +252,7 @@ export async function POST(
|
||||
status: 'awaiting_approval',
|
||||
progress: 0,
|
||||
selectedTorrent: selectedEbook as any,
|
||||
customSearchTerms: availableRequest?.customSearchTerms || null,
|
||||
},
|
||||
});
|
||||
logger.info(`Created ebook request ${ebookRequest.id}, awaiting approval`);
|
||||
@@ -296,6 +297,7 @@ export async function POST(
|
||||
parentRequestId: availableRequest?.id || null,
|
||||
status: 'searching',
|
||||
progress: 0,
|
||||
customSearchTerms: availableRequest?.customSearchTerms || null,
|
||||
},
|
||||
});
|
||||
logger.info(`Created new ebook request ${ebookRequest.id}`);
|
||||
|
||||
@@ -123,6 +123,7 @@ export async function POST(
|
||||
parentRequestId,
|
||||
status: 'pending',
|
||||
progress: 0,
|
||||
customSearchTerms: parentRequest.customSearchTerms,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -52,17 +52,32 @@ export async function POST(
|
||||
return NextResponse.json({ error: 'Ebook source not specified' }, { status: 400 });
|
||||
}
|
||||
|
||||
// Get the parent audiobook request
|
||||
const parentRequest = await prisma.request.findUnique({
|
||||
// Get the request - could be an audiobook request or an existing ebook request
|
||||
const foundRequest = await prisma.request.findUnique({
|
||||
where: { id: parentRequestId },
|
||||
include: { audiobook: true },
|
||||
});
|
||||
|
||||
if (!parentRequest) {
|
||||
if (!foundRequest) {
|
||||
return NextResponse.json({ error: 'Request not found' }, { status: 404 });
|
||||
}
|
||||
|
||||
if (parentRequest.type !== 'audiobook') {
|
||||
// If this is an ebook request, find the parent audiobook request
|
||||
let parentRequest;
|
||||
if (foundRequest.type === 'ebook') {
|
||||
if (!foundRequest.parentRequestId) {
|
||||
return NextResponse.json({ error: 'Ebook request has no parent audiobook request' }, { status: 400 });
|
||||
}
|
||||
parentRequest = await prisma.request.findUnique({
|
||||
where: { id: foundRequest.parentRequestId },
|
||||
include: { audiobook: true },
|
||||
});
|
||||
if (!parentRequest) {
|
||||
return NextResponse.json({ error: 'Parent audiobook request not found' }, { status: 404 });
|
||||
}
|
||||
} else if (foundRequest.type === 'audiobook') {
|
||||
parentRequest = foundRequest;
|
||||
} else {
|
||||
return NextResponse.json({ error: 'Can only select ebooks for audiobook requests' }, { status: 400 });
|
||||
}
|
||||
|
||||
@@ -74,13 +89,16 @@ export async function POST(
|
||||
}
|
||||
|
||||
// Check for existing ebook request
|
||||
let ebookRequest = await prisma.request.findFirst({
|
||||
where: {
|
||||
parentRequestId,
|
||||
type: 'ebook',
|
||||
deletedAt: null,
|
||||
},
|
||||
});
|
||||
// If we were given an ebook request ID directly, use that; otherwise search by parent
|
||||
let ebookRequest = foundRequest.type === 'ebook'
|
||||
? foundRequest
|
||||
: await prisma.request.findFirst({
|
||||
where: {
|
||||
parentRequestId: parentRequest.id,
|
||||
type: 'ebook',
|
||||
deletedAt: null,
|
||||
},
|
||||
});
|
||||
|
||||
if (ebookRequest && !['failed', 'awaiting_search', 'pending'].includes(ebookRequest.status)) {
|
||||
return NextResponse.json({
|
||||
@@ -109,9 +127,10 @@ export async function POST(
|
||||
userId: parentRequest.userId,
|
||||
audiobookId: parentRequest.audiobookId,
|
||||
type: 'ebook',
|
||||
parentRequestId,
|
||||
parentRequestId: parentRequest.id,
|
||||
status: 'searching',
|
||||
progress: 0,
|
||||
customSearchTerms: parentRequest.customSearchTerms,
|
||||
},
|
||||
});
|
||||
logger.info(`Created new ebook request ${ebookRequest.id}`);
|
||||
|
||||
@@ -36,16 +36,25 @@ export async function processSearchEbook(payload: SearchEbookPayload): Promise<a
|
||||
logger.info(`Processing ebook request ${requestId} for "${audiobook.title}"`);
|
||||
|
||||
try {
|
||||
// Update request status to searching
|
||||
await prisma.request.update({
|
||||
// Update request status to searching and fetch custom search terms
|
||||
const requestRecord = await prisma.request.update({
|
||||
where: { id: requestId },
|
||||
data: {
|
||||
status: 'searching',
|
||||
searchAttempts: { increment: 1 },
|
||||
updatedAt: new Date(),
|
||||
},
|
||||
select: { customSearchTerms: true },
|
||||
});
|
||||
|
||||
// Use custom search terms if set, otherwise use audiobook title
|
||||
const effectiveSearchTitle = requestRecord?.customSearchTerms || audiobook.title;
|
||||
const searchAudiobook = { ...audiobook, title: effectiveSearchTitle };
|
||||
|
||||
if (requestRecord?.customSearchTerms) {
|
||||
logger.info(`Using custom search terms: "${effectiveSearchTitle}" (original: "${audiobook.title}")`);
|
||||
}
|
||||
|
||||
// Get ebook configuration
|
||||
const configService = getConfigService();
|
||||
const preferredFormat = payloadFormat || await configService.get('ebook_sidecar_preferred_format') || 'epub';
|
||||
@@ -62,7 +71,7 @@ export async function processSearchEbook(payload: SearchEbookPayload): Promise<a
|
||||
// ========== STEP 1: Try Anna's Archive (if enabled) ==========
|
||||
if (annasArchiveEnabled) {
|
||||
logger.info(`Searching Anna's Archive...`);
|
||||
annasArchiveResult = await searchAnnasArchive(audiobook, preferredFormat, logger);
|
||||
annasArchiveResult = await searchAnnasArchive(searchAudiobook, preferredFormat, logger);
|
||||
|
||||
if (annasArchiveResult) {
|
||||
logger.info(`Found ebook via Anna's Archive (score: ${annasArchiveResult.score})`);
|
||||
@@ -74,7 +83,7 @@ export async function processSearchEbook(payload: SearchEbookPayload): Promise<a
|
||||
// ========== STEP 2: Try Indexer Search (if enabled and no Anna's Archive result) ==========
|
||||
if (!annasArchiveResult && indexerSearchEnabled) {
|
||||
logger.info(`Searching indexers...`);
|
||||
indexerResult = await searchIndexers(requestId, audiobook, preferredFormat, logger);
|
||||
indexerResult = await searchIndexers(requestId, searchAudiobook, preferredFormat, logger);
|
||||
|
||||
if (indexerResult) {
|
||||
logger.info(`Found ebook via indexer search (score: ${indexerResult.finalScore.toFixed(1)})`);
|
||||
|
||||
Reference in New Issue
Block a user