mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Update Series and Author model to be library specific
This commit is contained in:
		
							parent
							
								
									1d13d0a553
								
							
						
					
					
						commit
						0ac63b2678
					
				@ -271,12 +271,16 @@ export default {
 | 
				
			|||||||
      let filterValue = null
 | 
					      let filterValue = null
 | 
				
			||||||
      if (parts.length > 1) {
 | 
					      if (parts.length > 1) {
 | 
				
			||||||
        const decoded = this.$decode(parts[1])
 | 
					        const decoded = this.$decode(parts[1])
 | 
				
			||||||
        if (decoded.startsWith('aut_')) {
 | 
					        if (parts[0] === 'authors') {
 | 
				
			||||||
          const author = this.authors.find((au) => au.id == decoded)
 | 
					          const author = this.authors.find((au) => au.id == decoded)
 | 
				
			||||||
          if (author) filterValue = author.name
 | 
					          if (author) filterValue = author.name
 | 
				
			||||||
        } else if (decoded.startsWith('ser_')) {
 | 
					        } else if (parts[0] === 'series') {
 | 
				
			||||||
          const series = this.series.find((se) => se.id == decoded)
 | 
					          if (decoded === 'no-series') {
 | 
				
			||||||
          if (series) filterValue = series.name
 | 
					            filterValue = this.$strings.MessageNoSeries
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            const series = this.series.find((se) => se.id == decoded)
 | 
				
			||||||
 | 
					            if (series) filterValue = series.name
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          filterValue = decoded
 | 
					          filterValue = decoded
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -105,7 +105,7 @@ class LibraryItemController {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Book specific
 | 
					    // Book specific
 | 
				
			||||||
    if (libraryItem.isBook) {
 | 
					    if (libraryItem.isBook) {
 | 
				
			||||||
      await this.createAuthorsAndSeriesForItemUpdate(mediaPayload)
 | 
					      await this.createAuthorsAndSeriesForItemUpdate(mediaPayload, libraryItem.libraryId)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Podcast specific
 | 
					    // Podcast specific
 | 
				
			||||||
@ -342,7 +342,7 @@ class LibraryItemController {
 | 
				
			|||||||
      var libraryItem = Database.libraryItems.find(_li => _li.id === updatePayloads[i].id)
 | 
					      var libraryItem = Database.libraryItems.find(_li => _li.id === updatePayloads[i].id)
 | 
				
			||||||
      if (!libraryItem) return null
 | 
					      if (!libraryItem) return null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      await this.createAuthorsAndSeriesForItemUpdate(mediaPayload)
 | 
					      await this.createAuthorsAndSeriesForItemUpdate(mediaPayload, libraryItem.libraryId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var hasUpdates = libraryItem.media.update(mediaPayload)
 | 
					      var hasUpdates = libraryItem.media.update(mediaPayload)
 | 
				
			||||||
      if (hasUpdates) {
 | 
					      if (hasUpdates) {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ class SeriesController {
 | 
				
			|||||||
   * /api/series/:id
 | 
					   * /api/series/:id
 | 
				
			||||||
   * 
 | 
					   * 
 | 
				
			||||||
   * TODO: Update mobile app to use /api/libraries/:id/series/:seriesId API route instead
 | 
					   * TODO: Update mobile app to use /api/libraries/:id/series/:seriesId API route instead
 | 
				
			||||||
   * Series are not library specific so we need to know what the library id is 
 | 
					   * Series are not library specific so we need to know what the library id is
 | 
				
			||||||
   * 
 | 
					   * 
 | 
				
			||||||
   * @param {*} req 
 | 
					   * @param {*} req 
 | 
				
			||||||
   * @param {*} res 
 | 
					   * @param {*} res 
 | 
				
			||||||
 | 
				
			|||||||
@ -74,5 +74,9 @@ module.exports = (sequelize) => {
 | 
				
			|||||||
    modelName: 'author'
 | 
					    modelName: 'author'
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const { library } = sequelize.models
 | 
				
			||||||
 | 
					  library.hasMany(Author)
 | 
				
			||||||
 | 
					  Author.belongsTo(library)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return Author
 | 
					  return Author
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -68,5 +68,9 @@ module.exports = (sequelize) => {
 | 
				
			|||||||
    modelName: 'series'
 | 
					    modelName: 'series'
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const { library } = sequelize.models
 | 
				
			||||||
 | 
					  library.hasMany(Series)
 | 
				
			||||||
 | 
					  Series.belongsTo(library)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return Series
 | 
					  return Series
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -11,6 +11,7 @@ class Author {
 | 
				
			|||||||
    this.imagePath = null
 | 
					    this.imagePath = null
 | 
				
			||||||
    this.addedAt = null
 | 
					    this.addedAt = null
 | 
				
			||||||
    this.updatedAt = null
 | 
					    this.updatedAt = null
 | 
				
			||||||
 | 
					    this.libraryId = null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (author) {
 | 
					    if (author) {
 | 
				
			||||||
      this.construct(author)
 | 
					      this.construct(author)
 | 
				
			||||||
@ -25,6 +26,7 @@ class Author {
 | 
				
			|||||||
    this.imagePath = author.imagePath
 | 
					    this.imagePath = author.imagePath
 | 
				
			||||||
    this.addedAt = author.addedAt
 | 
					    this.addedAt = author.addedAt
 | 
				
			||||||
    this.updatedAt = author.updatedAt
 | 
					    this.updatedAt = author.updatedAt
 | 
				
			||||||
 | 
					    this.libraryId = author.libraryId
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  toJSON() {
 | 
					  toJSON() {
 | 
				
			||||||
@ -35,7 +37,8 @@ class Author {
 | 
				
			|||||||
      description: this.description,
 | 
					      description: this.description,
 | 
				
			||||||
      imagePath: this.imagePath,
 | 
					      imagePath: this.imagePath,
 | 
				
			||||||
      addedAt: this.addedAt,
 | 
					      addedAt: this.addedAt,
 | 
				
			||||||
      updatedAt: this.updatedAt
 | 
					      updatedAt: this.updatedAt,
 | 
				
			||||||
 | 
					      libraryId: this.libraryId
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -52,7 +55,7 @@ class Author {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setData(data) {
 | 
					  setData(data, libraryId) {
 | 
				
			||||||
    this.id = uuidv4()
 | 
					    this.id = uuidv4()
 | 
				
			||||||
    this.name = data.name
 | 
					    this.name = data.name
 | 
				
			||||||
    this.description = data.description || null
 | 
					    this.description = data.description || null
 | 
				
			||||||
@ -60,6 +63,7 @@ class Author {
 | 
				
			|||||||
    this.imagePath = data.imagePath || null
 | 
					    this.imagePath = data.imagePath || null
 | 
				
			||||||
    this.addedAt = Date.now()
 | 
					    this.addedAt = Date.now()
 | 
				
			||||||
    this.updatedAt = Date.now()
 | 
					    this.updatedAt = Date.now()
 | 
				
			||||||
 | 
					    this.libraryId = libraryId
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  update(payload) {
 | 
					  update(payload) {
 | 
				
			||||||
 | 
				
			|||||||
@ -7,6 +7,7 @@ class Series {
 | 
				
			|||||||
    this.description = null
 | 
					    this.description = null
 | 
				
			||||||
    this.addedAt = null
 | 
					    this.addedAt = null
 | 
				
			||||||
    this.updatedAt = null
 | 
					    this.updatedAt = null
 | 
				
			||||||
 | 
					    this.libraryId = null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (series) {
 | 
					    if (series) {
 | 
				
			||||||
      this.construct(series)
 | 
					      this.construct(series)
 | 
				
			||||||
@ -19,6 +20,7 @@ class Series {
 | 
				
			|||||||
    this.description = series.description || null
 | 
					    this.description = series.description || null
 | 
				
			||||||
    this.addedAt = series.addedAt
 | 
					    this.addedAt = series.addedAt
 | 
				
			||||||
    this.updatedAt = series.updatedAt
 | 
					    this.updatedAt = series.updatedAt
 | 
				
			||||||
 | 
					    this.libraryId = series.libraryId
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  toJSON() {
 | 
					  toJSON() {
 | 
				
			||||||
@ -27,7 +29,8 @@ class Series {
 | 
				
			|||||||
      name: this.name,
 | 
					      name: this.name,
 | 
				
			||||||
      description: this.description,
 | 
					      description: this.description,
 | 
				
			||||||
      addedAt: this.addedAt,
 | 
					      addedAt: this.addedAt,
 | 
				
			||||||
      updatedAt: this.updatedAt
 | 
					      updatedAt: this.updatedAt,
 | 
				
			||||||
 | 
					      libraryId: this.libraryId
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -39,12 +42,13 @@ class Series {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setData(data) {
 | 
					  setData(data, libraryId) {
 | 
				
			||||||
    this.id = uuidv4()
 | 
					    this.id = uuidv4()
 | 
				
			||||||
    this.name = data.name
 | 
					    this.name = data.name
 | 
				
			||||||
    this.description = data.description || null
 | 
					    this.description = data.description || null
 | 
				
			||||||
    this.addedAt = Date.now()
 | 
					    this.addedAt = Date.now()
 | 
				
			||||||
    this.updatedAt = Date.now()
 | 
					    this.updatedAt = Date.now()
 | 
				
			||||||
 | 
					    this.libraryId = libraryId
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  update(series) {
 | 
					  update(series) {
 | 
				
			||||||
 | 
				
			|||||||
@ -519,7 +519,7 @@ class ApiRouter {
 | 
				
			|||||||
    return listeningStats
 | 
					    return listeningStats
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async createAuthorsAndSeriesForItemUpdate(mediaPayload) {
 | 
					  async createAuthorsAndSeriesForItemUpdate(mediaPayload, libraryId) {
 | 
				
			||||||
    if (mediaPayload.metadata) {
 | 
					    if (mediaPayload.metadata) {
 | 
				
			||||||
      const mediaMetadata = mediaPayload.metadata
 | 
					      const mediaMetadata = mediaPayload.metadata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -534,10 +534,10 @@ class ApiRouter {
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if (!mediaMetadata.authors[i].id || mediaMetadata.authors[i].id.startsWith('new')) {
 | 
					          if (!mediaMetadata.authors[i].id || mediaMetadata.authors[i].id.startsWith('new')) {
 | 
				
			||||||
            let author = Database.authors.find(au => au.checkNameEquals(authorName))
 | 
					            let author = Database.authors.find(au => au.libraryId === libraryId && au.checkNameEquals(authorName))
 | 
				
			||||||
            if (!author) {
 | 
					            if (!author) {
 | 
				
			||||||
              author = new Author()
 | 
					              author = new Author()
 | 
				
			||||||
              author.setData(mediaMetadata.authors[i])
 | 
					              author.setData(mediaMetadata.authors[i], libraryId)
 | 
				
			||||||
              Logger.debug(`[ApiRouter] Created new author "${author.name}"`)
 | 
					              Logger.debug(`[ApiRouter] Created new author "${author.name}"`)
 | 
				
			||||||
              newAuthors.push(author)
 | 
					              newAuthors.push(author)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -563,10 +563,10 @@ class ApiRouter {
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if (!mediaMetadata.series[i].id || mediaMetadata.series[i].id.startsWith('new')) {
 | 
					          if (!mediaMetadata.series[i].id || mediaMetadata.series[i].id.startsWith('new')) {
 | 
				
			||||||
            let seriesItem = Database.series.find(se => se.checkNameEquals(seriesName))
 | 
					            let seriesItem = Database.series.find(se => se.libraryId === libraryId && se.checkNameEquals(seriesName))
 | 
				
			||||||
            if (!seriesItem) {
 | 
					            if (!seriesItem) {
 | 
				
			||||||
              seriesItem = new Series()
 | 
					              seriesItem = new Series()
 | 
				
			||||||
              seriesItem.setData(mediaMetadata.series[i])
 | 
					              seriesItem.setData(mediaMetadata.series[i], libraryId)
 | 
				
			||||||
              Logger.debug(`[ApiRouter] Created new series "${seriesItem.name}"`)
 | 
					              Logger.debug(`[ApiRouter] Created new series "${seriesItem.name}"`)
 | 
				
			||||||
              newSeries.push(seriesItem)
 | 
					              newSeries.push(seriesItem)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -477,13 +477,13 @@ class Scanner {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Create or match all new authors and series
 | 
					    // Create or match all new authors and series
 | 
				
			||||||
    if (libraryItem.media.metadata.authors.some(au => au.id.startsWith('new'))) {
 | 
					    if (libraryItem.media.metadata.authors.some(au => au.id.startsWith('new'))) {
 | 
				
			||||||
      var newAuthors = []
 | 
					      const newAuthors = []
 | 
				
			||||||
      libraryItem.media.metadata.authors = libraryItem.media.metadata.authors.map((tempMinAuthor) => {
 | 
					      libraryItem.media.metadata.authors = libraryItem.media.metadata.authors.map((tempMinAuthor) => {
 | 
				
			||||||
        var _author = Database.authors.find(au => au.checkNameEquals(tempMinAuthor.name))
 | 
					        let _author = Database.authors.find(au => au.libraryId === libraryItem.libraryId && au.checkNameEquals(tempMinAuthor.name))
 | 
				
			||||||
        if (!_author) _author = newAuthors.find(au => au.checkNameEquals(tempMinAuthor.name)) // Check new unsaved authors
 | 
					        if (!_author) _author = newAuthors.find(au => au.libraryId === libraryItem.libraryId && au.checkNameEquals(tempMinAuthor.name)) // Check new unsaved authors
 | 
				
			||||||
        if (!_author) { // Must create new author
 | 
					        if (!_author) { // Must create new author
 | 
				
			||||||
          _author = new Author()
 | 
					          _author = new Author()
 | 
				
			||||||
          _author.setData(tempMinAuthor)
 | 
					          _author.setData(tempMinAuthor, libraryItem.libraryId)
 | 
				
			||||||
          newAuthors.push(_author)
 | 
					          newAuthors.push(_author)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -498,13 +498,13 @@ class Scanner {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (libraryItem.media.metadata.series.some(se => se.id.startsWith('new'))) {
 | 
					    if (libraryItem.media.metadata.series.some(se => se.id.startsWith('new'))) {
 | 
				
			||||||
      var newSeries = []
 | 
					      const newSeries = []
 | 
				
			||||||
      libraryItem.media.metadata.series = libraryItem.media.metadata.series.map((tempMinSeries) => {
 | 
					      libraryItem.media.metadata.series = libraryItem.media.metadata.series.map((tempMinSeries) => {
 | 
				
			||||||
        var _series = Database.series.find(se => se.checkNameEquals(tempMinSeries.name))
 | 
					        let _series = Database.series.find(se => se.libraryId === libraryItem.libraryId && se.checkNameEquals(tempMinSeries.name))
 | 
				
			||||||
        if (!_series) _series = newSeries.find(se => se.checkNameEquals(tempMinSeries.name)) // Check new unsaved series
 | 
					        if (!_series) _series = newSeries.find(se => se.libraryId === libraryItem.libraryId && se.checkNameEquals(tempMinSeries.name)) // Check new unsaved series
 | 
				
			||||||
        if (!_series) { // Must create new series
 | 
					        if (!_series) { // Must create new series
 | 
				
			||||||
          _series = new Series()
 | 
					          _series = new Series()
 | 
				
			||||||
          _series.setData(tempMinSeries)
 | 
					          _series.setData(tempMinSeries, libraryItem.libraryId)
 | 
				
			||||||
          newSeries.push(_series)
 | 
					          newSeries.push(_series)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
@ -877,12 +877,11 @@ class Scanner {
 | 
				
			|||||||
        matchData.author = matchData.author.split(',').map(au => au.trim()).filter(au => !!au)
 | 
					        matchData.author = matchData.author.split(',').map(au => au.trim()).filter(au => !!au)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      const authorPayload = []
 | 
					      const authorPayload = []
 | 
				
			||||||
      for (let index = 0; index < matchData.author.length; index++) {
 | 
					      for (const authorName of matchData.author) {
 | 
				
			||||||
        const authorName = matchData.author[index]
 | 
					        let author = Database.authors.find(au => au.libraryId === libraryItem.libraryId && au.checkNameEquals(authorName))
 | 
				
			||||||
        var author = Database.authors.find(au => au.checkNameEquals(authorName))
 | 
					 | 
				
			||||||
        if (!author) {
 | 
					        if (!author) {
 | 
				
			||||||
          author = new Author()
 | 
					          author = new Author()
 | 
				
			||||||
          author.setData({ name: authorName })
 | 
					          author.setData({ name: authorName }, libraryItem.libraryId)
 | 
				
			||||||
          await Database.createAuthor(author)
 | 
					          await Database.createAuthor(author)
 | 
				
			||||||
          SocketAuthority.emitter('author_added', author.toJSON())
 | 
					          SocketAuthority.emitter('author_added', author.toJSON())
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -895,12 +894,11 @@ class Scanner {
 | 
				
			|||||||
    if (matchData.series && (!libraryItem.media.metadata.seriesName || options.overrideDetails)) {
 | 
					    if (matchData.series && (!libraryItem.media.metadata.seriesName || options.overrideDetails)) {
 | 
				
			||||||
      if (!Array.isArray(matchData.series)) matchData.series = [{ series: matchData.series, sequence: matchData.sequence }]
 | 
					      if (!Array.isArray(matchData.series)) matchData.series = [{ series: matchData.series, sequence: matchData.sequence }]
 | 
				
			||||||
      const seriesPayload = []
 | 
					      const seriesPayload = []
 | 
				
			||||||
      for (let index = 0; index < matchData.series.length; index++) {
 | 
					      for (const seriesMatchItem of matchData.series) {
 | 
				
			||||||
        const seriesMatchItem = matchData.series[index]
 | 
					        let seriesItem = Database.series.find(se => se.libraryId === libraryItem.libraryId && se.checkNameEquals(seriesMatchItem.series))
 | 
				
			||||||
        var seriesItem = Database.series.find(au => au.checkNameEquals(seriesMatchItem.series))
 | 
					 | 
				
			||||||
        if (!seriesItem) {
 | 
					        if (!seriesItem) {
 | 
				
			||||||
          seriesItem = new Series()
 | 
					          seriesItem = new Series()
 | 
				
			||||||
          seriesItem.setData({ name: seriesMatchItem.series })
 | 
					          seriesItem.setData({ name: seriesMatchItem.series }, libraryItem.libraryId)
 | 
				
			||||||
          await Database.createSeries(seriesItem)
 | 
					          await Database.createSeries(seriesItem)
 | 
				
			||||||
          SocketAuthority.emitter('series_added', seriesItem.toJSON())
 | 
					          SocketAuthority.emitter('series_added', seriesItem.toJSON())
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -9,8 +9,8 @@ const oldDbIdMap = {
 | 
				
			|||||||
  libraries: {},
 | 
					  libraries: {},
 | 
				
			||||||
  libraryFolders: {},
 | 
					  libraryFolders: {},
 | 
				
			||||||
  libraryItems: {},
 | 
					  libraryItems: {},
 | 
				
			||||||
  authors: {},
 | 
					  authors: {}, // key is (new) library id with another map of author ids
 | 
				
			||||||
  series: {},
 | 
					  series: {}, // key is (new) library id with another map of series ids
 | 
				
			||||||
  collections: {},
 | 
					  collections: {},
 | 
				
			||||||
  podcastEpisodes: {},
 | 
					  podcastEpisodes: {},
 | 
				
			||||||
  books: {}, // key is library item id
 | 
					  books: {}, // key is library item id
 | 
				
			||||||
@ -98,10 +98,10 @@ function migrateBook(oldLibraryItem, LibraryItem) {
 | 
				
			|||||||
  // Migrate BookAuthors
 | 
					  // Migrate BookAuthors
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  for (const oldBookAuthor of oldBook.metadata.authors) {
 | 
					  for (const oldBookAuthor of oldBook.metadata.authors) {
 | 
				
			||||||
    if (oldDbIdMap.authors[oldBookAuthor.id]) {
 | 
					    if (oldDbIdMap.authors[LibraryItem.libraryId][oldBookAuthor.id]) {
 | 
				
			||||||
      newRecords.bookAuthor.push({
 | 
					      newRecords.bookAuthor.push({
 | 
				
			||||||
        id: uuidv4(),
 | 
					        id: uuidv4(),
 | 
				
			||||||
        authorId: oldDbIdMap.authors[oldBookAuthor.id],
 | 
					        authorId: oldDbIdMap.authors[LibraryItem.libraryId][oldBookAuthor.id],
 | 
				
			||||||
        bookId: Book.id
 | 
					        bookId: Book.id
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
@ -113,11 +113,11 @@ function migrateBook(oldLibraryItem, LibraryItem) {
 | 
				
			|||||||
  // Migrate BookSeries
 | 
					  // Migrate BookSeries
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  for (const oldBookSeries of oldBook.metadata.series) {
 | 
					  for (const oldBookSeries of oldBook.metadata.series) {
 | 
				
			||||||
    if (oldDbIdMap.series[oldBookSeries.id]) {
 | 
					    if (oldDbIdMap.series[LibraryItem.libraryId][oldBookSeries.id]) {
 | 
				
			||||||
      const BookSeries = {
 | 
					      const BookSeries = {
 | 
				
			||||||
        id: uuidv4(),
 | 
					        id: uuidv4(),
 | 
				
			||||||
        sequence: oldBookSeries.sequence,
 | 
					        sequence: oldBookSeries.sequence,
 | 
				
			||||||
        seriesId: oldDbIdMap.series[oldBookSeries.id],
 | 
					        seriesId: oldDbIdMap.series[LibraryItem.libraryId][oldBookSeries.id],
 | 
				
			||||||
        bookId: Book.id
 | 
					        bookId: Book.id
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      newRecords.bookSeries.push(BookSeries)
 | 
					      newRecords.bookSeries.push(BookSeries)
 | 
				
			||||||
@ -297,33 +297,66 @@ function migrateLibraries(oldLibraries) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function migrateAuthors(oldAuthors) {
 | 
					function migrateAuthors(oldAuthors, oldLibraryItems) {
 | 
				
			||||||
  for (const oldAuthor of oldAuthors) {
 | 
					  for (const oldAuthor of oldAuthors) {
 | 
				
			||||||
    const Author = {
 | 
					    // Get an array of NEW library ids that have this author
 | 
				
			||||||
      id: uuidv4(),
 | 
					    const librariesWithThisAuthor = [...new Set(oldLibraryItems.map(li => {
 | 
				
			||||||
      name: oldAuthor.name,
 | 
					      if (!li.media.metadata.authors?.some(au => au.id === oldAuthor.id)) return null
 | 
				
			||||||
      asin: oldAuthor.asin || null,
 | 
					      if (!oldDbIdMap.libraries[li.libraryId]) {
 | 
				
			||||||
      description: oldAuthor.description,
 | 
					        Logger.warn(`[dbMigration] Authors library id ${li.libraryId} was not migrated`)
 | 
				
			||||||
      imagePath: oldAuthor.imagePath,
 | 
					      }
 | 
				
			||||||
      createdAt: oldAuthor.addedAt || Date.now(),
 | 
					      return oldDbIdMap.libraries[li.libraryId]
 | 
				
			||||||
      updatedAt: oldAuthor.updatedAt || Date.now()
 | 
					    }).filter(lid => lid))]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!librariesWithThisAuthor.length) {
 | 
				
			||||||
 | 
					      Logger.error(`[dbMigration] Author ${oldAuthor.name} was not found in any libraries`)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const libraryId of librariesWithThisAuthor) {
 | 
				
			||||||
 | 
					      const Author = {
 | 
				
			||||||
 | 
					        id: uuidv4(),
 | 
				
			||||||
 | 
					        name: oldAuthor.name,
 | 
				
			||||||
 | 
					        asin: oldAuthor.asin || null,
 | 
				
			||||||
 | 
					        description: oldAuthor.description,
 | 
				
			||||||
 | 
					        imagePath: oldAuthor.imagePath,
 | 
				
			||||||
 | 
					        createdAt: oldAuthor.addedAt || Date.now(),
 | 
				
			||||||
 | 
					        updatedAt: oldAuthor.updatedAt || Date.now(),
 | 
				
			||||||
 | 
					        libraryId
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (!oldDbIdMap.authors[libraryId]) oldDbIdMap.authors[libraryId] = {}
 | 
				
			||||||
 | 
					      oldDbIdMap.authors[libraryId][oldAuthor.id] = Author.id
 | 
				
			||||||
 | 
					      newRecords.author.push(Author)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    oldDbIdMap.authors[oldAuthor.id] = Author.id
 | 
					 | 
				
			||||||
    newRecords.author.push(Author)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function migrateSeries(oldSerieses) {
 | 
					function migrateSeries(oldSerieses, oldLibraryItems) {
 | 
				
			||||||
 | 
					  // Originaly series were shared between libraries if they had the same name
 | 
				
			||||||
 | 
					  // Series will be separate between libraries
 | 
				
			||||||
  for (const oldSeries of oldSerieses) {
 | 
					  for (const oldSeries of oldSerieses) {
 | 
				
			||||||
    const Series = {
 | 
					    // Get an array of NEW library ids that have this series
 | 
				
			||||||
      id: uuidv4(),
 | 
					    const librariesWithThisSeries = [...new Set(oldLibraryItems.map(li => {
 | 
				
			||||||
      name: oldSeries.name,
 | 
					      if (!li.media.metadata.series?.some(se => se.id === oldSeries.id)) return null
 | 
				
			||||||
      description: oldSeries.description || null,
 | 
					      return oldDbIdMap.libraries[li.libraryId]
 | 
				
			||||||
      createdAt: oldSeries.addedAt || Date.now(),
 | 
					    }).filter(lid => lid))]
 | 
				
			||||||
      updatedAt: oldSeries.updatedAt || Date.now()
 | 
					
 | 
				
			||||||
 | 
					    if (!librariesWithThisSeries.length) {
 | 
				
			||||||
 | 
					      Logger.error(`[dbMigration] Series ${oldSeries.name} was not found in any libraries`)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const libraryId of librariesWithThisSeries) {
 | 
				
			||||||
 | 
					      const Series = {
 | 
				
			||||||
 | 
					        id: uuidv4(),
 | 
				
			||||||
 | 
					        name: oldSeries.name,
 | 
				
			||||||
 | 
					        description: oldSeries.description || null,
 | 
				
			||||||
 | 
					        createdAt: oldSeries.addedAt || Date.now(),
 | 
				
			||||||
 | 
					        updatedAt: oldSeries.updatedAt || Date.now(),
 | 
				
			||||||
 | 
					        libraryId
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (!oldDbIdMap.series[libraryId]) oldDbIdMap.series[libraryId] = {}
 | 
				
			||||||
 | 
					      oldDbIdMap.series[libraryId][oldSeries.id] = Series.id
 | 
				
			||||||
 | 
					      newRecords.series.push(Series)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    oldDbIdMap.series[oldSeries.id] = Series.id
 | 
					 | 
				
			||||||
    newRecords.series.push(Series)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -615,7 +648,14 @@ function migrateFeeds(oldFeeds) {
 | 
				
			|||||||
    } else if (oldFeed.entityType === 'libraryItem') {
 | 
					    } else if (oldFeed.entityType === 'libraryItem') {
 | 
				
			||||||
      entityId = oldDbIdMap.libraryItems[oldFeed.entityId]
 | 
					      entityId = oldDbIdMap.libraryItems[oldFeed.entityId]
 | 
				
			||||||
    } else if (oldFeed.entityType === 'series') {
 | 
					    } else if (oldFeed.entityType === 'series') {
 | 
				
			||||||
      entityId = oldDbIdMap.series[oldFeed.entityId]
 | 
					      // Series were split to be per library
 | 
				
			||||||
 | 
					      // This will use the first series it finds
 | 
				
			||||||
 | 
					      for (const libraryId in oldDbIdMap.series) {
 | 
				
			||||||
 | 
					        if (oldDbIdMap.series[libraryId][oldFeed.entityId]) {
 | 
				
			||||||
 | 
					          entityId = oldDbIdMap.series[libraryId][oldFeed.entityId]
 | 
				
			||||||
 | 
					          break
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!entityId) {
 | 
					    if (!entityId) {
 | 
				
			||||||
@ -719,9 +759,9 @@ module.exports.migrate = async (DatabaseModels) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  const start = Date.now()
 | 
					  const start = Date.now()
 | 
				
			||||||
  migrateSettings(data.settings)
 | 
					  migrateSettings(data.settings)
 | 
				
			||||||
  migrateAuthors(data.authors)
 | 
					 | 
				
			||||||
  migrateSeries(data.series)
 | 
					 | 
				
			||||||
  migrateLibraries(data.libraries)
 | 
					  migrateLibraries(data.libraries)
 | 
				
			||||||
 | 
					  migrateAuthors(data.authors, data.libraryItems)
 | 
				
			||||||
 | 
					  migrateSeries(data.series, data.libraryItems)
 | 
				
			||||||
  migrateLibraryItems(data.libraryItems)
 | 
					  migrateLibraryItems(data.libraryItems)
 | 
				
			||||||
  migrateUsers(data.users)
 | 
					  migrateUsers(data.users)
 | 
				
			||||||
  migrateSessions(data.sessions)
 | 
					  migrateSessions(data.sessions)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user