mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Update:Get all user playlists for library API endpoint performance improvement #2852
This commit is contained in:
		
							parent
							
								
									94400f7794
								
							
						
					
					
						commit
						1576164218
					
				@ -512,8 +512,7 @@ class LibraryController {
 | 
			
		||||
   * @param {*} res
 | 
			
		||||
   */
 | 
			
		||||
  async getUserPlaylistsForLibrary(req, res) {
 | 
			
		||||
    let playlistsForUser = await Database.playlistModel.getPlaylistsForUserAndLibrary(req.user.id, req.library.id)
 | 
			
		||||
    playlistsForUser = await Promise.all(playlistsForUser.map(async (p) => p.getOldJsonExpanded()))
 | 
			
		||||
    let playlistsForUser = await Database.playlistModel.getOldPlaylistsForUserAndLibrary(req.user.id, req.library.id)
 | 
			
		||||
 | 
			
		||||
    const payload = {
 | 
			
		||||
      results: [],
 | 
			
		||||
 | 
			
		||||
@ -43,12 +43,14 @@ class Playlist extends Model {
 | 
			
		||||
      },
 | 
			
		||||
      order: [['playlistMediaItems', 'order', 'ASC']]
 | 
			
		||||
    })
 | 
			
		||||
    return playlists.map(p => this.getOldPlaylist(p))
 | 
			
		||||
    return playlists.map((p) => this.getOldPlaylist(p))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getOldPlaylist(playlistExpanded) {
 | 
			
		||||
    const items = playlistExpanded.playlistMediaItems.map(pmi => {
 | 
			
		||||
      const libraryItemId = pmi.mediaItem?.podcast?.libraryItem?.id || pmi.mediaItem?.libraryItem?.id || null
 | 
			
		||||
    const items = playlistExpanded.playlistMediaItems
 | 
			
		||||
      .map((pmi) => {
 | 
			
		||||
        const mediaItem = pmi.mediaItem || pmi.dataValues?.mediaItem
 | 
			
		||||
        const libraryItemId = mediaItem?.podcast?.libraryItem?.id || mediaItem?.libraryItem?.id || null
 | 
			
		||||
        if (!libraryItemId) {
 | 
			
		||||
          Logger.error(`[Playlist] Invalid playlist media item - No library item id found`, JSON.stringify(pmi, null, 2))
 | 
			
		||||
          return null
 | 
			
		||||
@ -57,7 +59,8 @@ class Playlist extends Model {
 | 
			
		||||
          episodeId: pmi.mediaItemType === 'podcastEpisode' ? pmi.mediaItemId : '',
 | 
			
		||||
          libraryItemId
 | 
			
		||||
        }
 | 
			
		||||
    }).filter(pmi => pmi)
 | 
			
		||||
      })
 | 
			
		||||
      .filter((pmi) => pmi)
 | 
			
		||||
 | 
			
		||||
    return new oldPlaylist({
 | 
			
		||||
      id: playlistExpanded.id,
 | 
			
		||||
@ -77,7 +80,8 @@ class Playlist extends Model {
 | 
			
		||||
   * @returns {Promise<object>} oldPlaylist.toJSONExpanded
 | 
			
		||||
   */
 | 
			
		||||
  async getOldJsonExpanded(include) {
 | 
			
		||||
    this.playlistMediaItems = await this.getPlaylistMediaItems({
 | 
			
		||||
    this.playlistMediaItems =
 | 
			
		||||
      (await this.getPlaylistMediaItems({
 | 
			
		||||
        include: [
 | 
			
		||||
          {
 | 
			
		||||
            model: this.sequelize.models.book,
 | 
			
		||||
@ -92,10 +96,10 @@ class Playlist extends Model {
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        order: [['order', 'ASC']]
 | 
			
		||||
    }) || []
 | 
			
		||||
      })) || []
 | 
			
		||||
 | 
			
		||||
    const oldPlaylist = this.sequelize.models.playlist.getOldPlaylist(this)
 | 
			
		||||
    const libraryItemIds = oldPlaylist.items.map(i => i.libraryItemId)
 | 
			
		||||
    const libraryItemIds = oldPlaylist.items.map((i) => i.libraryItemId)
 | 
			
		||||
 | 
			
		||||
    let libraryItems = await this.sequelize.models.libraryItem.getAllOldLibraryItems({
 | 
			
		||||
      id: libraryItemIds
 | 
			
		||||
@ -167,12 +171,13 @@ class Playlist extends Model {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Get playlists for user and optionally for library
 | 
			
		||||
   * Get old playlists for user and optionally for library
 | 
			
		||||
   *
 | 
			
		||||
   * @param {string} userId
 | 
			
		||||
   * @param {[string]} libraryId optional
 | 
			
		||||
   * @returns {Promise<Playlist[]>}
 | 
			
		||||
   * @param {string} [libraryId]
 | 
			
		||||
   * @returns {Promise<oldPlaylist[]>}
 | 
			
		||||
   */
 | 
			
		||||
  static async getPlaylistsForUserAndLibrary(userId, libraryId = null) {
 | 
			
		||||
  static async getOldPlaylistsForUserAndLibrary(userId, libraryId = null) {
 | 
			
		||||
    if (!userId && !libraryId) return []
 | 
			
		||||
    const whereQuery = {}
 | 
			
		||||
    if (userId) {
 | 
			
		||||
@ -181,7 +186,7 @@ class Playlist extends Model {
 | 
			
		||||
    if (libraryId) {
 | 
			
		||||
      whereQuery.libraryId = libraryId
 | 
			
		||||
    }
 | 
			
		||||
    const playlists = await this.findAll({
 | 
			
		||||
    const playlistsExpanded = await this.findAll({
 | 
			
		||||
      where: whereQuery,
 | 
			
		||||
      include: {
 | 
			
		||||
        model: this.sequelize.models.playlistMediaItem,
 | 
			
		||||
@ -204,7 +209,37 @@ class Playlist extends Model {
 | 
			
		||||
        ['playlistMediaItems', 'order', 'ASC']
 | 
			
		||||
      ]
 | 
			
		||||
    })
 | 
			
		||||
    return playlists
 | 
			
		||||
 | 
			
		||||
    const oldPlaylists = []
 | 
			
		||||
    for (const playlistExpanded of playlistsExpanded) {
 | 
			
		||||
      const oldPlaylist = this.getOldPlaylist(playlistExpanded)
 | 
			
		||||
      const libraryItems = []
 | 
			
		||||
      for (const pmi of playlistExpanded.playlistMediaItems) {
 | 
			
		||||
        let mediaItem = pmi.mediaItem || pmi.dataValues.mediaItem
 | 
			
		||||
 | 
			
		||||
        if (!mediaItem) {
 | 
			
		||||
          Logger.error(`[Playlist] Invalid playlist media item - No media item found`, JSON.stringify(mediaItem, null, 2))
 | 
			
		||||
          continue
 | 
			
		||||
        }
 | 
			
		||||
        let libraryItem = mediaItem.libraryItem || mediaItem.podcast?.libraryItem
 | 
			
		||||
 | 
			
		||||
        if (mediaItem.podcast) {
 | 
			
		||||
          libraryItem.media = mediaItem.podcast
 | 
			
		||||
          libraryItem.media.podcastEpisodes = [mediaItem]
 | 
			
		||||
          delete mediaItem.podcast.libraryItem
 | 
			
		||||
        } else {
 | 
			
		||||
          libraryItem.media = mediaItem
 | 
			
		||||
          delete mediaItem.libraryItem
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const oldLibraryItem = this.sequelize.models.libraryItem.getOldLibraryItem(libraryItem)
 | 
			
		||||
        libraryItems.push(oldLibraryItem)
 | 
			
		||||
      }
 | 
			
		||||
      const oldPlaylistJson = oldPlaylist.toJSONExpanded(libraryItems)
 | 
			
		||||
      oldPlaylists.push(oldPlaylistJson)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return oldPlaylists
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@ -263,9 +298,9 @@ class Playlist extends Model {
 | 
			
		||||
    const playlists = []
 | 
			
		||||
    for (const playlistMediaItem of playlistMediaItemsExpanded) {
 | 
			
		||||
      const playlist = playlistMediaItem.playlist
 | 
			
		||||
      if (playlists.some(p => p.id === playlist.id)) continue
 | 
			
		||||
      if (playlists.some((p) => p.id === playlist.id)) continue
 | 
			
		||||
 | 
			
		||||
      playlist.playlistMediaItems = playlist.playlistMediaItems.map(pmi => {
 | 
			
		||||
      playlist.playlistMediaItems = playlist.playlistMediaItems.map((pmi) => {
 | 
			
		||||
        if (pmi.mediaItemType === 'book' && pmi.book !== undefined) {
 | 
			
		||||
          pmi.mediaItem = pmi.book
 | 
			
		||||
          pmi.dataValues.mediaItem = pmi.dataValues.book
 | 
			
		||||
@ -289,7 +324,8 @@ class Playlist extends Model {
 | 
			
		||||
   * @param {import('../Database').sequelize} sequelize
 | 
			
		||||
   */
 | 
			
		||||
  static init(sequelize) {
 | 
			
		||||
    super.init({
 | 
			
		||||
    super.init(
 | 
			
		||||
      {
 | 
			
		||||
        id: {
 | 
			
		||||
          type: DataTypes.UUID,
 | 
			
		||||
          defaultValue: DataTypes.UUIDV4,
 | 
			
		||||
@ -297,10 +333,12 @@ class Playlist extends Model {
 | 
			
		||||
        },
 | 
			
		||||
        name: DataTypes.STRING,
 | 
			
		||||
        description: DataTypes.TEXT
 | 
			
		||||
    }, {
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        sequelize,
 | 
			
		||||
        modelName: 'playlist'
 | 
			
		||||
    })
 | 
			
		||||
      }
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    const { library, user } = sequelize.models
 | 
			
		||||
    library.hasMany(Playlist)
 | 
			
		||||
@ -311,14 +349,14 @@ class Playlist extends Model {
 | 
			
		||||
    })
 | 
			
		||||
    Playlist.belongsTo(user)
 | 
			
		||||
 | 
			
		||||
    Playlist.addHook('afterFind', findResult => {
 | 
			
		||||
    Playlist.addHook('afterFind', (findResult) => {
 | 
			
		||||
      if (!findResult) return
 | 
			
		||||
 | 
			
		||||
      if (!Array.isArray(findResult)) findResult = [findResult]
 | 
			
		||||
 | 
			
		||||
      for (const instance of findResult) {
 | 
			
		||||
        if (instance.playlistMediaItems?.length) {
 | 
			
		||||
          instance.playlistMediaItems = instance.playlistMediaItems.map(pmi => {
 | 
			
		||||
          instance.playlistMediaItems = instance.playlistMediaItems.map((pmi) => {
 | 
			
		||||
            if (pmi.mediaItemType === 'book' && pmi.book !== undefined) {
 | 
			
		||||
              pmi.mediaItem = pmi.book
 | 
			
		||||
              pmi.dataValues.mediaItem = pmi.dataValues.book
 | 
			
		||||
@ -334,7 +372,6 @@ class Playlist extends Model {
 | 
			
		||||
            return pmi
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user