mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-11-03 19:07:00 -05:00 
			
		
		
		
	No db access for author image if in disk cache
This commit is contained in:
		
							parent
							
								
									654b1d6b34
								
							
						
					
					
						commit
						3bc2941445
					
				@ -381,16 +381,23 @@ class AuthorController {
 | 
			
		||||
   */
 | 
			
		||||
  async getImage(req, res) {
 | 
			
		||||
    const {
 | 
			
		||||
      query: { width, height, format, raw },
 | 
			
		||||
      author
 | 
			
		||||
      query: { width, height, format, raw }
 | 
			
		||||
    } = req
 | 
			
		||||
 | 
			
		||||
    if (!author.imagePath || !(await fs.pathExists(author.imagePath))) {
 | 
			
		||||
      Logger.warn(`[AuthorController] Author "${author.name}" has invalid imagePath: ${author.imagePath}`)
 | 
			
		||||
      return res.sendStatus(404)
 | 
			
		||||
    }
 | 
			
		||||
    const authorId = req.params.id
 | 
			
		||||
 | 
			
		||||
    if (raw) {
 | 
			
		||||
      const author = await Database.authorModel.findByPk(authorId)
 | 
			
		||||
      if (!author) {
 | 
			
		||||
        Logger.warn(`[AuthorController] Author "${authorId}" not found`)
 | 
			
		||||
        return res.sendStatus(404)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!author.imagePath || !(await fs.pathExists(author.imagePath))) {
 | 
			
		||||
        Logger.warn(`[AuthorController] Author "${author.name}" has invalid imagePath: ${author.imagePath}`)
 | 
			
		||||
        return res.sendStatus(404)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return res.sendFile(author.imagePath)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -399,7 +406,7 @@ class AuthorController {
 | 
			
		||||
      height: height ? parseInt(height) : null,
 | 
			
		||||
      width: width ? parseInt(width) : null
 | 
			
		||||
    }
 | 
			
		||||
    return CacheManager.handleAuthorCache(res, author, options)
 | 
			
		||||
    return CacheManager.handleAuthorCache(res, authorId, options)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 | 
			
		||||
@ -134,22 +134,22 @@ class CacheManager {
 | 
			
		||||
  /**
 | 
			
		||||
   *
 | 
			
		||||
   * @param {import('express').Response} res
 | 
			
		||||
   * @param {import('../models/Author')} author
 | 
			
		||||
   * @param {String} authorId
 | 
			
		||||
   * @param {{ format?: string, width?: number, height?: number }} options
 | 
			
		||||
   * @returns
 | 
			
		||||
   */
 | 
			
		||||
  async handleAuthorCache(res, author, options = {}) {
 | 
			
		||||
  async handleAuthorCache(res, authorId, options = {}) {
 | 
			
		||||
    const format = options.format || 'webp'
 | 
			
		||||
    const width = options.width || 400
 | 
			
		||||
    const height = options.height || null
 | 
			
		||||
 | 
			
		||||
    res.type(`image/${format}`)
 | 
			
		||||
 | 
			
		||||
    var path = Path.join(this.ImageCachePath, `${author.id}_${width}${height ? `x${height}` : ''}`) + '.' + format
 | 
			
		||||
    var cachePath = Path.join(this.ImageCachePath, `${authorId}_${width}${height ? `x${height}` : ''}`) + '.' + format
 | 
			
		||||
 | 
			
		||||
    // Cache exists
 | 
			
		||||
    if (await fs.pathExists(path)) {
 | 
			
		||||
      const r = fs.createReadStream(path)
 | 
			
		||||
    if (await fs.pathExists(cachePath)) {
 | 
			
		||||
      const r = fs.createReadStream(cachePath)
 | 
			
		||||
      const ps = new stream.PassThrough()
 | 
			
		||||
      stream.pipeline(r, ps, (err) => {
 | 
			
		||||
        if (err) {
 | 
			
		||||
@ -160,7 +160,12 @@ class CacheManager {
 | 
			
		||||
      return ps.pipe(res)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let writtenFile = await resizeImage(author.imagePath, path, width, height)
 | 
			
		||||
    const author = await Database.authorModel.findByPk(authorId)
 | 
			
		||||
    if (!author || !author.imagePath || !(await fs.pathExists(author.imagePath))) {
 | 
			
		||||
      return res.sendStatus(404)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let writtenFile = await resizeImage(author.imagePath, cachePath, width, height)
 | 
			
		||||
    if (!writtenFile) return res.sendStatus(500)
 | 
			
		||||
 | 
			
		||||
    var readStream = fs.createReadStream(writtenFile)
 | 
			
		||||
 | 
			
		||||
@ -216,7 +216,7 @@ class ApiRouter {
 | 
			
		||||
    this.router.patch('/authors/:id', AuthorController.middleware.bind(this), AuthorController.update.bind(this))
 | 
			
		||||
    this.router.delete('/authors/:id', AuthorController.middleware.bind(this), AuthorController.delete.bind(this))
 | 
			
		||||
    this.router.post('/authors/:id/match', AuthorController.middleware.bind(this), AuthorController.match.bind(this))
 | 
			
		||||
    this.router.get('/authors/:id/image', AuthorController.middleware.bind(this), AuthorController.getImage.bind(this))
 | 
			
		||||
    this.router.get('/authors/:id/image', AuthorController.getImage.bind(this))
 | 
			
		||||
    this.router.post('/authors/:id/image', AuthorController.middleware.bind(this), AuthorController.uploadImage.bind(this))
 | 
			
		||||
    this.router.delete('/authors/:id/image', AuthorController.middleware.bind(this), AuthorController.deleteImage.bind(this))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user