New data model removing media entity for books

This commit is contained in:
advplyr 2022-03-26 11:59:34 -05:00
parent 920ca683b9
commit 3150822117
44 changed files with 733 additions and 798 deletions

View file

@ -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
}

View file

@ -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

View file

@ -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