mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-03-19 00:18:34 +01:00
Fix handling of file moves from root folder to sub folder and back
This commit is contained in:
parent
1bee082720
commit
68276fe30b
@ -56,7 +56,7 @@ class LibraryItemScanner {
|
|||||||
|
|
||||||
const libraryItemPath = updateLibraryItemDetails?.path || fileUtils.filePathToPOSIX(libraryItem.path)
|
const libraryItemPath = updateLibraryItemDetails?.path || fileUtils.filePathToPOSIX(libraryItem.path)
|
||||||
const folder = library.libraryFolders[0]
|
const folder = library.libraryFolders[0]
|
||||||
const libraryItemScanData = await this.getLibraryItemScanData(libraryItemPath, library, folder, false)
|
const libraryItemScanData = await this.getLibraryItemScanData(libraryItemPath, library, folder, updateLibraryItemDetails?.isFile || false)
|
||||||
|
|
||||||
let libraryItemDataUpdated = await libraryItemScanData.checkLibraryItemData(libraryItem, scanLogger)
|
let libraryItemDataUpdated = await libraryItemScanData.checkLibraryItemData(libraryItem, scanLogger)
|
||||||
|
|
||||||
|
@ -154,7 +154,11 @@ class LibraryScanner {
|
|||||||
let libraryItemData = libraryItemDataFound.find(lid => lid.path === existingLibraryItem.path)
|
let libraryItemData = libraryItemDataFound.find(lid => lid.path === existingLibraryItem.path)
|
||||||
if (!libraryItemData) {
|
if (!libraryItemData) {
|
||||||
// Fallback to finding matching library item with matching inode value
|
// Fallback to finding matching library item with matching inode value
|
||||||
libraryItemData = libraryItemDataFound.find(lid => lid.ino === existingLibraryItem.ino)
|
libraryItemData = libraryItemDataFound.find(lid =>
|
||||||
|
ItemToItemInoMatch(lid, existingLibraryItem) ||
|
||||||
|
ItemToFileInoMatch(lid, existingLibraryItem) ||
|
||||||
|
ItemToFileInoMatch(existingLibraryItem, lid)
|
||||||
|
)
|
||||||
if (libraryItemData) {
|
if (libraryItemData) {
|
||||||
libraryScan.addLog(LogLevel.INFO, `Library item with path "${existingLibraryItem.path}" was not found, but library item inode "${existingLibraryItem.ino}" was found at path "${libraryItemData.path}"`)
|
libraryScan.addLog(LogLevel.INFO, `Library item with path "${existingLibraryItem.path}" was not found, but library item inode "${existingLibraryItem.ino}" was found at path "${libraryItemData.path}"`)
|
||||||
}
|
}
|
||||||
@ -522,23 +526,25 @@ class LibraryScanner {
|
|||||||
|
|
||||||
// Check if book dir group is already an item
|
// Check if book dir group is already an item
|
||||||
let existingLibraryItem = await Database.libraryItemModel.findOneOld({
|
let existingLibraryItem = await Database.libraryItemModel.findOneOld({
|
||||||
|
libraryId: library.id,
|
||||||
path: potentialChildDirs
|
path: potentialChildDirs
|
||||||
})
|
})
|
||||||
|
|
||||||
let updatedLibraryItemDetails = {}
|
let updatedLibraryItemDetails = {}
|
||||||
if (!existingLibraryItem) {
|
if (!existingLibraryItem) {
|
||||||
const dirIno = await fileUtils.getIno(fullPath)
|
const isSingleMedia = isSingleMediaFile(fileUpdateGroup, itemDir)
|
||||||
existingLibraryItem = await Database.libraryItemModel.findOneOld({
|
existingLibraryItem =
|
||||||
ino: dirIno
|
await findLibraryItemByItemToItemInoMatch(library.id, fullPath) ||
|
||||||
})
|
await findLibraryItemByItemToFileInoMatch(library.id, fullPath, isSingleMedia) ||
|
||||||
|
await findLibraryItemByFileToItemInoMatch(library.id, fullPath, isSingleMedia, fileUpdateGroup[itemDir])
|
||||||
if (existingLibraryItem) {
|
if (existingLibraryItem) {
|
||||||
Logger.debug(`[LibraryScanner] scanFolderUpdates: Library item found by inode value=${dirIno}. "${existingLibraryItem.relPath} => ${itemDir}"`)
|
|
||||||
// Update library item paths for scan
|
// Update library item paths for scan
|
||||||
existingLibraryItem.path = fullPath
|
existingLibraryItem.path = fullPath
|
||||||
existingLibraryItem.relPath = itemDir
|
existingLibraryItem.relPath = itemDir
|
||||||
updatedLibraryItemDetails.path = fullPath
|
updatedLibraryItemDetails.path = fullPath
|
||||||
updatedLibraryItemDetails.relPath = itemDir
|
updatedLibraryItemDetails.relPath = itemDir
|
||||||
updatedLibraryItemDetails.libraryFolderId = folder.id
|
updatedLibraryItemDetails.libraryFolderId = folder.id
|
||||||
|
updatedLibraryItemDetails.isFile = isSingleMedia
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (existingLibraryItem) {
|
if (existingLibraryItem) {
|
||||||
@ -555,7 +561,6 @@ class LibraryScanner {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scan library item for updates
|
// Scan library item for updates
|
||||||
Logger.debug(`[LibraryScanner] Folder update for relative path "${itemDir}" is in library item "${existingLibraryItem.media.metadata.title}" - scan for updates`)
|
Logger.debug(`[LibraryScanner] Folder update for relative path "${itemDir}" is in library item "${existingLibraryItem.media.metadata.title}" - scan for updates`)
|
||||||
itemGroupingResults[itemDir] = await LibraryItemScanner.scanLibraryItem(existingLibraryItem.id, updatedLibraryItemDetails)
|
itemGroupingResults[itemDir] = await LibraryItemScanner.scanLibraryItem(existingLibraryItem.id, updatedLibraryItemDetails)
|
||||||
@ -595,6 +600,14 @@ class LibraryScanner {
|
|||||||
}
|
}
|
||||||
module.exports = new LibraryScanner()
|
module.exports = new LibraryScanner()
|
||||||
|
|
||||||
|
function ItemToFileInoMatch(libraryItem1, libraryItem2) {
|
||||||
|
return libraryItem1.isFile && libraryItem2.libraryFiles.some(lf => lf.ino === libraryItem1.ino)
|
||||||
|
}
|
||||||
|
|
||||||
|
function ItemToItemInoMatch(libraryItem1, libraryItem2) {
|
||||||
|
return libraryItem1.ino === libraryItem2.ino
|
||||||
|
}
|
||||||
|
|
||||||
function hasAudioFiles(fileUpdateGroup, itemDir) {
|
function hasAudioFiles(fileUpdateGroup, itemDir) {
|
||||||
return isSingleMediaFile(fileUpdateGroup, itemDir) ?
|
return isSingleMediaFile(fileUpdateGroup, itemDir) ?
|
||||||
scanUtils.checkFilepathIsAudioFile(fileUpdateGroup[itemDir]) :
|
scanUtils.checkFilepathIsAudioFile(fileUpdateGroup[itemDir]) :
|
||||||
@ -604,3 +617,51 @@ function hasAudioFiles(fileUpdateGroup, itemDir) {
|
|||||||
function isSingleMediaFile(fileUpdateGroup, itemDir) {
|
function isSingleMediaFile(fileUpdateGroup, itemDir) {
|
||||||
return itemDir === fileUpdateGroup[itemDir]
|
return itemDir === fileUpdateGroup[itemDir]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function findLibraryItemByItemToItemInoMatch(libraryId, fullPath) {
|
||||||
|
const ino = await fileUtils.getIno(fullPath)
|
||||||
|
if (!ino) return null
|
||||||
|
const existingLibraryItem = await Database.libraryItemModel.findOneOld({
|
||||||
|
libraryId: libraryId,
|
||||||
|
ino: ino
|
||||||
|
})
|
||||||
|
if (existingLibraryItem)
|
||||||
|
Logger.debug(`[LibraryScanner] Found library item with matching inode "${ino}" at path "${existingLibraryItem.path}"`)
|
||||||
|
return existingLibraryItem
|
||||||
|
}
|
||||||
|
|
||||||
|
async function findLibraryItemByItemToFileInoMatch(libraryId, fullPath, isSingleMedia) {
|
||||||
|
if (!isSingleMedia) return null
|
||||||
|
// check if it was moved from another folder by comparing the ino to the library files
|
||||||
|
const ino = await fileUtils.getIno(fullPath)
|
||||||
|
if (!ino) return null
|
||||||
|
const existingLibraryItem = await Database.libraryItemModel.findOneOld({
|
||||||
|
libraryId: libraryId,
|
||||||
|
libraryFiles: {
|
||||||
|
[ sequelize.Op.substring ]: ino
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (existingLibraryItem)
|
||||||
|
Logger.debug(`[LibraryScanner] Found library item with a library file matching inode "${ino}" at path "${existingLibraryItem.path}"`)
|
||||||
|
return existingLibraryItem
|
||||||
|
}
|
||||||
|
|
||||||
|
async function findLibraryItemByFileToItemInoMatch(libraryId, fullPath, isSingleMedia, itemFiles) {
|
||||||
|
if (isSingleMedia) return null
|
||||||
|
// check if it was moved from the root folder by comparing the ino to the ino of the scanned files
|
||||||
|
let itemFileInos = []
|
||||||
|
for (const itemFile of itemFiles) {
|
||||||
|
const ino = await fileUtils.getIno(Path.posix.join(fullPath, itemFile))
|
||||||
|
if (ino) itemFileInos.push(ino)
|
||||||
|
}
|
||||||
|
if (!itemFileInos.length) return null
|
||||||
|
const existingLibraryItem = await Database.libraryItemModel.findOneOld({
|
||||||
|
libraryId: libraryId,
|
||||||
|
ino: {
|
||||||
|
[ sequelize.Op.in ] : itemFileInos
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (existingLibraryItem)
|
||||||
|
Logger.debug(`[LibraryScanner] Found library item with inode matching one of "${itemFileInos.join(',')}" at path "${existingLibraryItem.path}"`)
|
||||||
|
return existingLibraryItem
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user