This commit is contained in:
Michael Marcucci 2026-05-05 20:10:00 -07:00 committed by GitHub
commit 4330429fdd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 100 additions and 2 deletions

View file

@ -826,6 +826,7 @@ class BookScanner {
const metadataFilePath = Path.join(metadataPath, `metadata.${global.ServerSettings.metadataFileFormat}`)
const jsonObject = {
id: libraryItem.id,
tags: libraryItem.media.tags || [],
chapters: libraryItem.media.chapters?.map((c) => ({ ...c })) || [],
title: libraryItem.media.title,

View file

@ -14,6 +14,7 @@ const LibraryItemScanner = require('./LibraryItemScanner')
const LibraryScan = require('./LibraryScan')
const LibraryItemScanData = require('./LibraryItemScanData')
const Task = require('../objects/Task')
const abmetadataGenerator = require('../utils/generators/abmetadataGenerator')
class LibraryScanner {
constructor() {
@ -574,7 +575,7 @@ class LibraryScanner {
let updatedLibraryItemDetails = {}
if (!existingLibraryItem) {
const isSingleMedia = isSingleMediaFile(fileUpdateGroup, itemDir)
existingLibraryItem = (await findLibraryItemByItemToItemInoMatch(library.id, fullPath)) || (await findLibraryItemByItemToFileInoMatch(library.id, fullPath, isSingleMedia)) || (await findLibraryItemByFileToItemInoMatch(library.id, fullPath, isSingleMedia, fileUpdateGroup[itemDir]))
existingLibraryItem = (await findLibraryItemByItemToItemInoMatch(library.id, fullPath)) || (await findLibraryItemByItemToFileInoMatch(library.id, fullPath, isSingleMedia)) || (await findLibraryItemByFileToItemInoMatch(library.id, fullPath, isSingleMedia, fileUpdateGroup[itemDir])) || (await findLibraryItemByItemToMetadata(fullPath, isSingleMedia))
if (existingLibraryItem) {
// Update library item paths for scan
existingLibraryItem.path = fullPath
@ -709,3 +710,23 @@ async function findLibraryItemByFileToItemInoMatch(libraryId, fullPath, isSingle
if (existingLibraryItem) Logger.debug(`[LibraryScanner] Found library item with inode matching one of "${itemFileInos.join(',')}" at path "${existingLibraryItem.path}"`)
return existingLibraryItem
}
async function findLibraryItemByItemToMetadata(fullPath, isSingleMedia) {
if (isSingleMedia) return null
const metadataText = await fileUtils.readTextFile(Path.join(fullPath, 'metadata.json'))
if (!metadataText) return null
const abMetadata = abmetadataGenerator.parseJson(metadataText) || {}
// check if metadata id exists in the database
const existingLibraryItem = await Database.libraryItemModel.getExpandedById(abMetadata.id)
if (existingLibraryItem) {
Logger.debug(`[LibraryScanner] Found library item with metadata id matching one of "${abMetadata.id}" at path "${existingLibraryItem.path}"`)
for (const { metadata } of existingLibraryItem.getLibraryFiles())
if (await fs.pathExists(metadata.path)) {
Logger.debug(`[LibraryScanner] Conflicting library files exist "${metadata.path}"`)
return null
}
}
return existingLibraryItem
}

View file

@ -426,6 +426,7 @@ class PodcastScanner {
const metadataFilePath = Path.join(metadataPath, `metadata.${global.ServerSettings.metadataFileFormat}`)
const jsonObject = {
id: libraryItem.id,
tags: libraryItem.media.tags || [],
title: libraryItem.media.title,
author: libraryItem.media.author,