mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-05-13 06:51:29 +00:00
Add OpenAI series evaluation
This commit is contained in:
parent
5b2a788cfc
commit
77206d90cb
11 changed files with 1107 additions and 2 deletions
|
|
@ -2,11 +2,14 @@ const { Request, Response, NextFunction } = require('express')
|
|||
const Logger = require('../Logger')
|
||||
const SocketAuthority = require('../SocketAuthority')
|
||||
const Database = require('../Database')
|
||||
const OpenAI = require('../providers/OpenAI')
|
||||
|
||||
const RssFeedManager = require('../managers/RssFeedManager')
|
||||
|
||||
const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilters')
|
||||
|
||||
const openAI = new OpenAI()
|
||||
|
||||
/**
|
||||
* @typedef RequestUserObject
|
||||
* @property {import('../models/User')} user
|
||||
|
|
@ -86,6 +89,68 @@ class SeriesController {
|
|||
res.json(req.series.toOldJSON())
|
||||
}
|
||||
|
||||
/**
|
||||
* POST: /api/series/:id/organize-story-order
|
||||
*
|
||||
* @param {SeriesControllerRequest} req
|
||||
* @param {Response} res
|
||||
*/
|
||||
async organizeStoryOrder(req, res) {
|
||||
if (!openAI.isConfigured) {
|
||||
return res.status(400).send('OpenAI is not configured')
|
||||
}
|
||||
|
||||
if (!req.libraryItemsInSeries.length) {
|
||||
return res.status(400).send('No books found in this series')
|
||||
}
|
||||
|
||||
try {
|
||||
const seriesOrder = await openAI.getSeriesOrder(req.series, req.libraryItemsInSeries)
|
||||
const sequenceByLibraryItemId = new Map(seriesOrder.map((book) => [book.id, book.sequence]))
|
||||
|
||||
const updatedItems = []
|
||||
Logger.info(`[SeriesController] AI story-order evaluation returned ${seriesOrder.length} books for series "${req.series.name}"`)
|
||||
for (const libraryItem of req.libraryItemsInSeries) {
|
||||
const nextSequence = sequenceByLibraryItemId.get(libraryItem.id)
|
||||
if (!nextSequence) continue
|
||||
|
||||
Logger.info(`[SeriesController] AI story-order applying "${libraryItem.media.title}" (${libraryItem.id}) -> sequence "${nextSequence}" in series "${req.series.name}"`)
|
||||
|
||||
const seriesPayload = libraryItem.media.series.map((series) => ({
|
||||
id: series.id,
|
||||
name: series.name,
|
||||
sequence: series.id === req.series.id ? nextSequence : series.bookSeries?.sequence || null
|
||||
}))
|
||||
|
||||
const seriesUpdate = await libraryItem.media.updateSeriesFromRequest(seriesPayload, libraryItem.libraryId)
|
||||
if (!seriesUpdate?.hasUpdates) {
|
||||
Logger.info(`[SeriesController] AI story-order found no change for "${libraryItem.media.title}" (${libraryItem.id})`)
|
||||
continue
|
||||
}
|
||||
|
||||
libraryItem.changed('updatedAt', true)
|
||||
await libraryItem.save()
|
||||
await libraryItem.saveMetadataFile()
|
||||
updatedItems.push(libraryItem)
|
||||
SocketAuthority.libraryItemEmitter('item_updated', libraryItem)
|
||||
}
|
||||
|
||||
if (updatedItems.length) {
|
||||
SocketAuthority.emitter('series_updated', req.series.toOldJSON())
|
||||
}
|
||||
|
||||
Logger.info(`[SeriesController] AI story-order completed for series "${req.series.name}" - updated=${updatedItems.length}, total=${req.libraryItemsInSeries.length}`)
|
||||
|
||||
res.json({
|
||||
updated: updatedItems.length,
|
||||
total: req.libraryItemsInSeries.length
|
||||
})
|
||||
} catch (error) {
|
||||
Logger.error(`[SeriesController] Failed to organize story order for "${req.series.name}"`, error)
|
||||
res.status(500).send(error.message || 'Failed to organize story order')
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {RequestWithUser} req
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue