mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-12-28 06:39:39 +00:00
New data model removing media entity for books
This commit is contained in:
parent
920ca683b9
commit
3150822117
44 changed files with 733 additions and 798 deletions
|
|
@ -169,12 +169,11 @@ class AudioFileScanner {
|
|||
if (existingAF) {
|
||||
if (existingAF.updateFromScan) existingAF.updateFromScan(audioFiles[i])
|
||||
} else {
|
||||
libraryItem.media.addAudioFileToAudiobook(audioFiles[i])
|
||||
libraryItem.media.addAudioFile(audioFiles[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: support for multiple audiobooks in a book item will need to pass an audiobook variant name here
|
||||
async scanAudioFiles(audioLibraryFiles, scanData, libraryItem, preferAudioMetadata, libraryScan = null) {
|
||||
var hasUpdated = false
|
||||
|
||||
|
|
@ -189,14 +188,14 @@ class AudioFileScanner {
|
|||
return !libraryItem.media.findFileWithInode(af.ino)
|
||||
})
|
||||
|
||||
// Adding audio files to book media
|
||||
// Book: Adding audio files to book media
|
||||
if (libraryItem.mediaType === 'book') {
|
||||
if (newAudioFiles.length) {
|
||||
// Single Track Audiobooks
|
||||
if (totalAudioFilesToInclude === 1) {
|
||||
var af = audioScanResult.audioFiles[0]
|
||||
af.index = 1
|
||||
libraryItem.media.addAudioFileToAudiobook(af)
|
||||
libraryItem.media.addAudioFile(af)
|
||||
hasUpdated = true
|
||||
} else {
|
||||
this.runSmartTrackOrder(libraryItem, audioScanResult.audioFiles)
|
||||
|
|
@ -221,12 +220,7 @@ class AudioFileScanner {
|
|||
}
|
||||
|
||||
if (hasUpdated) {
|
||||
if (!libraryItem.media.audiobooks.length) {
|
||||
Logger.error(`[AudioFileScanner] Updates were made but library item has no audiobooks`, libraryItem)
|
||||
} else {
|
||||
var audiobook = libraryItem.media.audiobooks[0]
|
||||
audiobook.rebuildTracks()
|
||||
}
|
||||
libraryItem.media.rebuildTracks()
|
||||
}
|
||||
} // End Book media type
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,32 +0,0 @@
|
|||
const AuthorFinder = require('../finders/AuthorFinder')
|
||||
|
||||
class AuthorScanner {
|
||||
constructor(db) {
|
||||
this.db = db
|
||||
this.authorFinder = new AuthorFinder()
|
||||
}
|
||||
|
||||
getUniqueAuthors() {
|
||||
var authorFls = this.db.audiobooks.map(b => b.book.authorFL)
|
||||
var authors = []
|
||||
authorFls.forEach((auth) => {
|
||||
authors = authors.concat(auth.split(', ').map(a => a.trim()))
|
||||
})
|
||||
return [...new Set(authors)]
|
||||
}
|
||||
|
||||
async scanAuthors() {
|
||||
var authors = this.getUniqueAuthors()
|
||||
for (let i = 0; i < authors.length; i++) {
|
||||
var authorName = authors[i]
|
||||
var author = await this.authorFinder.getAuthorByName(authorName)
|
||||
if (!author) {
|
||||
return res.status(500).send('Failed to create author')
|
||||
}
|
||||
|
||||
await this.db.insertEntity('author', author)
|
||||
this.emitter('author_added', author.toJSON())
|
||||
}
|
||||
}
|
||||
}
|
||||
module.exports = AuthorScanner
|
||||
|
|
@ -613,37 +613,38 @@ class Scanner {
|
|||
return false
|
||||
}
|
||||
|
||||
// TODO: Redo metadata
|
||||
async saveMetadata(audiobookId) {
|
||||
if (audiobookId) {
|
||||
var audiobook = this.db.audiobooks.find(ab => ab.id === audiobookId)
|
||||
if (!audiobook) {
|
||||
return {
|
||||
error: 'Audiobook not found'
|
||||
}
|
||||
}
|
||||
var savedPath = await audiobook.writeNfoFile()
|
||||
return {
|
||||
audiobookId,
|
||||
audiobookTitle: audiobook.title,
|
||||
savedPath
|
||||
}
|
||||
} else {
|
||||
var response = {
|
||||
success: 0,
|
||||
failed: 0
|
||||
}
|
||||
for (let i = 0; i < this.db.audiobooks.length; i++) {
|
||||
var audiobook = this.db.audiobooks[i]
|
||||
var savedPath = await audiobook.writeNfoFile()
|
||||
if (savedPath) {
|
||||
Logger.info(`[Scanner] Saved metadata nfo ${savedPath}`)
|
||||
response.success++
|
||||
} else {
|
||||
response.failed++
|
||||
}
|
||||
}
|
||||
return response
|
||||
}
|
||||
// if (audiobookId) {
|
||||
// var audiobook = this.db.audiobooks.find(ab => ab.id === audiobookId)
|
||||
// if (!audiobook) {
|
||||
// return {
|
||||
// error: 'Audiobook not found'
|
||||
// }
|
||||
// }
|
||||
// var savedPath = await audiobook.writeNfoFile()
|
||||
// return {
|
||||
// audiobookId,
|
||||
// audiobookTitle: audiobook.title,
|
||||
// savedPath
|
||||
// }
|
||||
// } else {
|
||||
// var response = {
|
||||
// success: 0,
|
||||
// failed: 0
|
||||
// }
|
||||
// for (let i = 0; i < this.db.audiobooks.length; i++) {
|
||||
// var audiobook = this.db.audiobooks[i]
|
||||
// var savedPath = await audiobook.writeNfoFile()
|
||||
// if (savedPath) {
|
||||
// Logger.info(`[Scanner] Saved metadata nfo ${savedPath}`)
|
||||
// response.success++
|
||||
// } else {
|
||||
// response.failed++
|
||||
// }
|
||||
// }
|
||||
// return response
|
||||
// }
|
||||
}
|
||||
|
||||
async quickMatchBook(libraryItem, options = {}) {
|
||||
|
|
@ -728,48 +729,49 @@ class Scanner {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: Redo quick match full library
|
||||
async matchLibraryBooks(library) {
|
||||
if (this.isLibraryScanning(library.id)) {
|
||||
Logger.error(`[Scanner] Already scanning ${library.id}`)
|
||||
return
|
||||
}
|
||||
// if (this.isLibraryScanning(library.id)) {
|
||||
// Logger.error(`[Scanner] Already scanning ${library.id}`)
|
||||
// return
|
||||
// }
|
||||
|
||||
const provider = library.provider || 'google'
|
||||
var audiobooksInLibrary = this.db.audiobooks.filter(ab => ab.libraryId === library.id)
|
||||
if (!audiobooksInLibrary.length) {
|
||||
return
|
||||
}
|
||||
// const provider = library.provider || 'google'
|
||||
// var audiobooksInLibrary = this.db.audiobooks.filter(ab => ab.libraryId === library.id)
|
||||
// if (!audiobooksInLibrary.length) {
|
||||
// return
|
||||
// }
|
||||
|
||||
var libraryScan = new LibraryScan()
|
||||
libraryScan.setData(library, null, 'match')
|
||||
this.librariesScanning.push(libraryScan.getScanEmitData)
|
||||
this.emitter('scan_start', libraryScan.getScanEmitData)
|
||||
// var libraryScan = new LibraryScan()
|
||||
// libraryScan.setData(library, null, 'match')
|
||||
// this.librariesScanning.push(libraryScan.getScanEmitData)
|
||||
// this.emitter('scan_start', libraryScan.getScanEmitData)
|
||||
|
||||
Logger.info(`[Scanner] Starting library match books scan ${libraryScan.id} for ${libraryScan.libraryName}`)
|
||||
// Logger.info(`[Scanner] Starting library match books scan ${libraryScan.id} for ${libraryScan.libraryName}`)
|
||||
|
||||
for (let i = 0; i < audiobooksInLibrary.length; i++) {
|
||||
var audiobook = audiobooksInLibrary[i]
|
||||
Logger.debug(`[Scanner] Quick matching "${audiobook.title}" (${i + 1} of ${audiobooksInLibrary.length})`)
|
||||
var result = await this.quickMatchBook(audiobook, { provider })
|
||||
if (result.warning) {
|
||||
Logger.warn(`[Scanner] Match warning ${result.warning} for audiobook "${audiobook.title}"`)
|
||||
} else if (result.updated) {
|
||||
libraryScan.resultsUpdated++
|
||||
}
|
||||
// for (let i = 0; i < audiobooksInLibrary.length; i++) {
|
||||
// var audiobook = audiobooksInLibrary[i]
|
||||
// Logger.debug(`[Scanner] Quick matching "${audiobook.title}" (${i + 1} of ${audiobooksInLibrary.length})`)
|
||||
// var result = await this.quickMatchBook(audiobook, { provider })
|
||||
// if (result.warning) {
|
||||
// Logger.warn(`[Scanner] Match warning ${result.warning} for audiobook "${audiobook.title}"`)
|
||||
// } else if (result.updated) {
|
||||
// libraryScan.resultsUpdated++
|
||||
// }
|
||||
|
||||
if (this.cancelLibraryScan[libraryScan.libraryId]) {
|
||||
Logger.info(`[Scanner] Library match scan canceled for "${libraryScan.libraryName}"`)
|
||||
delete this.cancelLibraryScan[libraryScan.libraryId]
|
||||
var scanData = libraryScan.getScanEmitData
|
||||
scanData.results = false
|
||||
this.emitter('scan_complete', scanData)
|
||||
this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id)
|
||||
return
|
||||
}
|
||||
}
|
||||
// if (this.cancelLibraryScan[libraryScan.libraryId]) {
|
||||
// Logger.info(`[Scanner] Library match scan canceled for "${libraryScan.libraryName}"`)
|
||||
// delete this.cancelLibraryScan[libraryScan.libraryId]
|
||||
// var scanData = libraryScan.getScanEmitData
|
||||
// scanData.results = false
|
||||
// this.emitter('scan_complete', scanData)
|
||||
// this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id)
|
||||
// return
|
||||
// }
|
||||
// }
|
||||
|
||||
this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id)
|
||||
this.emitter('scan_complete', libraryScan.getScanEmitData)
|
||||
// this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id)
|
||||
// this.emitter('scan_complete', libraryScan.getScanEmitData)
|
||||
}
|
||||
}
|
||||
module.exports = Scanner
|
||||
Loading…
Add table
Add a link
Reference in a new issue