This commit is contained in:
korjik 2026-04-21 20:36:08 -07:00
parent 77206d90cb
commit 83fc6f0495
2 changed files with 45 additions and 15 deletions

View file

@ -240,12 +240,25 @@ class OpenAI {
return resultBooks.map((book) => { return resultBooks.map((book) => {
const seriesName = this.normalizeSeriesName(book.seriesName) const seriesName = this.normalizeSeriesName(book.seriesName)
const sequence = this.normalizeSequence(book.sequence) const sequence = this.normalizeSequence(book.sequence)
const reason = typeof book.reason === 'string' ? book.reason.trim() : ''
if (seriesName && !sequence) { if (seriesName && !sequence) {
throw new Error(`OpenAI returned a series without a valid sequence for "${book.id}"`) Logger.warn(`[OpenAI] Series "${seriesName}" for book "${book.id}" did not include a valid sequence - skipping assignment`)
return {
id: book.id,
seriesName: null,
sequence: null,
reason: reason ? `${reason} (skipped due to missing or invalid sequence)` : 'Skipped due to missing or invalid sequence'
}
} }
if (!seriesName && sequence) { if (!seriesName && sequence) {
throw new Error(`OpenAI returned a sequence without a series for "${book.id}"`) Logger.warn(`[OpenAI] Sequence "${sequence}" for book "${book.id}" did not include a series name - skipping assignment`)
return {
id: book.id,
seriesName: null,
sequence: null,
reason: reason ? `${reason} (skipped due to missing series name)` : 'Skipped due to missing series name'
}
} }
if (seriesName && sequence) { if (seriesName && sequence) {
@ -259,7 +272,7 @@ class OpenAI {
id: book.id, id: book.id,
seriesName: null, seriesName: null,
sequence: null, sequence: null,
reason: typeof book.reason === 'string' ? `${book.reason.trim()} (skipped due to duplicate inferred sequence)` : 'Skipped due to duplicate inferred sequence' reason: reason ? `${reason} (skipped due to duplicate inferred sequence)` : 'Skipped due to duplicate inferred sequence'
} }
} }
seriesSequences.get(key).add(sequence) seriesSequences.get(key).add(sequence)
@ -269,7 +282,7 @@ class OpenAI {
id: book.id, id: book.id,
seriesName, seriesName,
sequence, sequence,
reason: typeof book.reason === 'string' ? book.reason.trim() : '' reason
} }
}) })
} }

View file

@ -67,17 +67,34 @@ describe('OpenAI', () => {
expect(result[1].sequence).to.equal('1.5') expect(result[1].sequence).to.equal('1.5')
}) })
it('rejects a series assignment without sequence', () => { it('skips a series assignment without sequence', () => {
expect(() => const result = openAI.validateSeriesDetectionPayload(
openAI.validateSeriesDetectionPayload( {
{ books: [
books: [ { id: 'a', seriesName: 'Series Name', sequence: null, reason: 'folder match' }
{ id: 'a', seriesName: 'Series Name', sequence: null } ]
] },
}, [{ id: 'a' }]
[{ id: 'a' }] )
)
).to.throw('without a valid sequence') expect(result[0].seriesName).to.equal(null)
expect(result[0].sequence).to.equal(null)
expect(result[0].reason).to.contain('skipped due to missing or invalid sequence')
})
it('skips a sequence without series name', () => {
const result = openAI.validateSeriesDetectionPayload(
{
books: [
{ id: 'a', seriesName: null, sequence: '2', reason: 'sequence found' }
]
},
[{ id: 'a' }]
)
expect(result[0].seriesName).to.equal(null)
expect(result[0].sequence).to.equal(null)
expect(result[0].reason).to.contain('skipped due to missing series name')
}) })
}) })
}) })