mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-11-04 03:17:00 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const { DataTypes, Model } = require('sequelize')
 | 
						|
const Logger = require('../Logger')
 | 
						|
 | 
						|
module.exports = (sequelize) => {
 | 
						|
  class Book extends Model {
 | 
						|
    static getOldBook(libraryItemExpanded) {
 | 
						|
      const bookExpanded = libraryItemExpanded.media
 | 
						|
      let authors = []
 | 
						|
      if (bookExpanded.authors?.length) {
 | 
						|
        authors = bookExpanded.authors.map(au => {
 | 
						|
          return {
 | 
						|
            id: au.id,
 | 
						|
            name: au.name
 | 
						|
          }
 | 
						|
        })
 | 
						|
      } else if (bookExpanded.bookAuthors?.length) {
 | 
						|
        authors = bookExpanded.bookAuthors.map(ba => {
 | 
						|
          if (ba.author) {
 | 
						|
            return {
 | 
						|
              id: ba.author.id,
 | 
						|
              name: ba.author.name
 | 
						|
            }
 | 
						|
          } else {
 | 
						|
            Logger.error(`[Book] Invalid bookExpanded bookAuthors: no author`, ba)
 | 
						|
            return null
 | 
						|
          }
 | 
						|
        }).filter(a => a)
 | 
						|
      }
 | 
						|
 | 
						|
      let series = []
 | 
						|
      if (bookExpanded.series?.length) {
 | 
						|
        series = bookExpanded.series.map(se => {
 | 
						|
          return {
 | 
						|
            id: se.id,
 | 
						|
            name: se.name,
 | 
						|
            sequence: se.bookSeries.sequence
 | 
						|
          }
 | 
						|
        })
 | 
						|
      } else if (bookExpanded.bookSeries?.length) {
 | 
						|
        series = bookExpanded.bookSeries.map(bs => {
 | 
						|
          if (bs.series) {
 | 
						|
            return {
 | 
						|
              id: bs.series.id,
 | 
						|
              name: bs.series.name,
 | 
						|
              sequence: bs.sequence
 | 
						|
            }
 | 
						|
          } else {
 | 
						|
            Logger.error(`[Book] Invalid bookExpanded bookSeries: no series`, bs)
 | 
						|
            return null
 | 
						|
          }
 | 
						|
        }).filter(s => s)
 | 
						|
      }
 | 
						|
 | 
						|
      return {
 | 
						|
        id: bookExpanded.id,
 | 
						|
        libraryItemId: libraryItemExpanded.id,
 | 
						|
        coverPath: bookExpanded.coverPath,
 | 
						|
        tags: bookExpanded.tags,
 | 
						|
        audioFiles: bookExpanded.audioFiles,
 | 
						|
        chapters: bookExpanded.chapters,
 | 
						|
        ebookFile: bookExpanded.ebookFile,
 | 
						|
        metadata: {
 | 
						|
          title: bookExpanded.title,
 | 
						|
          subtitle: bookExpanded.subtitle,
 | 
						|
          authors: authors,
 | 
						|
          narrators: bookExpanded.narrators,
 | 
						|
          series: series,
 | 
						|
          genres: bookExpanded.genres,
 | 
						|
          publishedYear: bookExpanded.publishedYear,
 | 
						|
          publishedDate: bookExpanded.publishedDate,
 | 
						|
          publisher: bookExpanded.publisher,
 | 
						|
          description: bookExpanded.description,
 | 
						|
          isbn: bookExpanded.isbn,
 | 
						|
          asin: bookExpanded.asin,
 | 
						|
          language: bookExpanded.language,
 | 
						|
          explicit: bookExpanded.explicit,
 | 
						|
          abridged: bookExpanded.abridged
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param {object} oldBook 
 | 
						|
     * @returns {boolean} true if updated
 | 
						|
     */
 | 
						|
    static saveFromOld(oldBook) {
 | 
						|
      const book = this.getFromOld(oldBook)
 | 
						|
      return this.update(book, {
 | 
						|
        where: {
 | 
						|
          id: book.id
 | 
						|
        }
 | 
						|
      }).then(result => result[0] > 0).catch((error) => {
 | 
						|
        Logger.error(`[Book] Failed to save book ${book.id}`, error)
 | 
						|
        return false
 | 
						|
      })
 | 
						|
    }
 | 
						|
 | 
						|
    static getFromOld(oldBook) {
 | 
						|
      return {
 | 
						|
        id: oldBook.id,
 | 
						|
        title: oldBook.metadata.title,
 | 
						|
        titleIgnorePrefix: oldBook.metadata.titleIgnorePrefix,
 | 
						|
        subtitle: oldBook.metadata.subtitle,
 | 
						|
        publishedYear: oldBook.metadata.publishedYear,
 | 
						|
        publishedDate: oldBook.metadata.publishedDate,
 | 
						|
        publisher: oldBook.metadata.publisher,
 | 
						|
        description: oldBook.metadata.description,
 | 
						|
        isbn: oldBook.metadata.isbn,
 | 
						|
        asin: oldBook.metadata.asin,
 | 
						|
        language: oldBook.metadata.language,
 | 
						|
        explicit: !!oldBook.metadata.explicit,
 | 
						|
        abridged: !!oldBook.metadata.abridged,
 | 
						|
        narrators: oldBook.metadata.narrators,
 | 
						|
        ebookFile: oldBook.ebookFile?.toJSON() || null,
 | 
						|
        coverPath: oldBook.coverPath,
 | 
						|
        duration: oldBook.duration,
 | 
						|
        audioFiles: oldBook.audioFiles?.map(af => af.toJSON()) || [],
 | 
						|
        chapters: oldBook.chapters,
 | 
						|
        tags: oldBook.tags,
 | 
						|
        genres: oldBook.metadata.genres
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  Book.init({
 | 
						|
    id: {
 | 
						|
      type: DataTypes.UUID,
 | 
						|
      defaultValue: DataTypes.UUIDV4,
 | 
						|
      primaryKey: true
 | 
						|
    },
 | 
						|
    title: DataTypes.STRING,
 | 
						|
    titleIgnorePrefix: DataTypes.STRING,
 | 
						|
    subtitle: DataTypes.STRING,
 | 
						|
    publishedYear: DataTypes.STRING,
 | 
						|
    publishedDate: DataTypes.STRING,
 | 
						|
    publisher: DataTypes.STRING,
 | 
						|
    description: DataTypes.TEXT,
 | 
						|
    isbn: DataTypes.STRING,
 | 
						|
    asin: DataTypes.STRING,
 | 
						|
    language: DataTypes.STRING,
 | 
						|
    explicit: DataTypes.BOOLEAN,
 | 
						|
    abridged: DataTypes.BOOLEAN,
 | 
						|
    coverPath: DataTypes.STRING,
 | 
						|
    duration: DataTypes.FLOAT,
 | 
						|
 | 
						|
    narrators: DataTypes.JSON,
 | 
						|
    audioFiles: DataTypes.JSON,
 | 
						|
    ebookFile: DataTypes.JSON,
 | 
						|
    chapters: DataTypes.JSON,
 | 
						|
    tags: DataTypes.JSON,
 | 
						|
    genres: DataTypes.JSON
 | 
						|
  }, {
 | 
						|
    sequelize,
 | 
						|
    modelName: 'book'
 | 
						|
  })
 | 
						|
 | 
						|
  return Book
 | 
						|
} |