|  |  | @ -28,6 +28,8 @@ import org.airsonic.player.util.StringUtil; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.apache.commons.codec.digest.DigestUtils; |  |  |  | import org.apache.commons.codec.digest.DigestUtils; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.apache.commons.io.FilenameUtils; |  |  |  | import org.apache.commons.io.FilenameUtils; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.apache.commons.io.IOUtils; |  |  |  | import org.apache.commons.io.IOUtils; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import org.apache.commons.lang3.tuple.Pair; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import org.jaudiotagger.tag.images.Artwork; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.slf4j.Logger; |  |  |  | import org.slf4j.Logger; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.slf4j.LoggerFactory; |  |  |  | import org.slf4j.LoggerFactory; | 
			
		
	
		
		
			
				
					
					|  |  |  | import org.springframework.beans.factory.annotation.Autowired; |  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
			
		
	
	
		
		
			
				
					|  |  | @ -100,7 +102,7 @@ public class CoverArtController implements LastModified { | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { |  |  |  |     public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         CoverArtRequest coverArtRequest = createCoverArtRequest(request); |  |  |  |         CoverArtRequest coverArtRequest = createCoverArtRequest(request); | 
			
		
	
		
		
			
				
					
					|  |  |  | //        LOG.info("handleRequest - " + coverArtRequest);
 |  |  |  |         LOG.trace("handleRequest - " + coverArtRequest); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         Integer size = ServletRequestUtils.getIntParameter(request, "size"); |  |  |  |         Integer size = ServletRequestUtils.getIntParameter(request, "size"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // Send fallback image if no ID is given. (No need to cache it, since it will be cached in browser.)
 |  |  |  |         // Send fallback image if no ID is given. (No need to cache it, since it will be cached in browser.)
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -109,9 +111,10 @@ public class CoverArtController implements LastModified { | 
			
		
	
		
		
			
				
					
					|  |  |  |             return; |  |  |  |             return; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         try { | 
			
		
	
		
		
			
				
					
					|  |  |  |             // Optimize if no scaling is required.
 |  |  |  |             // Optimize if no scaling is required.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (size == null && coverArtRequest.getCoverArt() != null) { |  |  |  |             if (size == null && coverArtRequest.getCoverArt() != null) { | 
			
		
	
		
		
			
				
					
					|  |  |  | //            LOG.info("sendUnscaled - " + coverArtRequest);
 |  |  |  |                 LOG.trace("sendUnscaled - " + coverArtRequest); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 sendUnscaled(coverArtRequest, response); |  |  |  |                 sendUnscaled(coverArtRequest, response); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return; |  |  |  |                 return; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
	
		
		
			
				
					|  |  | @ -120,10 +123,10 @@ public class CoverArtController implements LastModified { | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (size == null) { |  |  |  |             if (size == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 size = CoverArtScheme.LARGE.getSize() * 2; |  |  |  |                 size = CoverArtScheme.LARGE.getSize() * 2; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             File cachedImage = getCachedImage(coverArtRequest, size); |  |  |  |             File cachedImage = getCachedImage(coverArtRequest, size); | 
			
		
	
		
		
			
				
					
					|  |  |  |             sendImage(cachedImage, response); |  |  |  |             sendImage(cachedImage, response); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } catch (IOException e) { |  |  |  |         } catch (Exception e) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             LOG.debug("Sending fallback as an exception was encountered during normal cover art processing", e); | 
			
		
	
		
		
			
				
					
					|  |  |  |             sendFallback(size, response); |  |  |  |             sendFallback(size, response); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -217,12 +220,11 @@ public class CoverArtController implements LastModified { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private void sendUnscaled(CoverArtRequest coverArtRequest, HttpServletResponse response) throws IOException { |  |  |  |     private void sendUnscaled(CoverArtRequest coverArtRequest, HttpServletResponse response) throws IOException { | 
			
		
	
		
		
			
				
					
					|  |  |  |         File file = coverArtRequest.getCoverArt(); |  |  |  |         File file = coverArtRequest.getCoverArt(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (!jaudiotaggerParser.isApplicable(file)) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             response.setContentType(StringUtil.getMimeType(FilenameUtils.getExtension(file.getName()))); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         InputStream in = null; |  |  |  |         InputStream in = null; | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |         try { | 
			
		
	
		
		
			
				
					
					|  |  |  |             in = getImageInputStream(file); |  |  |  |             Pair<InputStream, String> imageInputStreamWithType = getImageInputStreamWithType(file); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             in = imageInputStreamWithType.getLeft(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             response.setContentType(imageInputStreamWithType.getRight()); | 
			
		
	
		
		
			
				
					
					|  |  |  |             IOUtils.copy(in, response.getOutputStream()); |  |  |  |             IOUtils.copy(in, response.getOutputStream()); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } finally { |  |  |  |         } finally { | 
			
		
	
		
		
			
				
					
					|  |  |  |             IOUtils.closeQuietly(in); |  |  |  |             IOUtils.closeQuietly(in); | 
			
		
	
	
		
		
			
				
					|  |  | @ -273,12 +275,34 @@ public class CoverArtController implements LastModified { | 
			
		
	
		
		
			
				
					
					|  |  |  |      * the embedded album art is returned. |  |  |  |      * the embedded album art is returned. | 
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |      */ | 
			
		
	
		
		
			
				
					
					|  |  |  |     private InputStream getImageInputStream(File file) throws IOException { |  |  |  |     private InputStream getImageInputStream(File file) throws IOException { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return getImageInputStreamWithType(file).getLeft(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     /** | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * Returns an input stream to the image in the given file.  If the file is an audio file, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * the embedded album art is returned. In addition returns the mime type | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      */ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private Pair<InputStream, String> getImageInputStreamWithType(File file) throws IOException { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         InputStream is; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         String mimeType; | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (jaudiotaggerParser.isApplicable(file)) { |  |  |  |         if (jaudiotaggerParser.isApplicable(file)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             LOG.trace("Using Jaudio Tagger for reading artwork from {}", file); | 
			
		
	
		
		
			
				
					
					|  |  |  |             MediaFile mediaFile = mediaFileService.getMediaFile(file); |  |  |  |             MediaFile mediaFile = mediaFileService.getMediaFile(file); | 
			
		
	
		
		
			
				
					
					|  |  |  |             return new ByteArrayInputStream(jaudiotaggerParser.getImageData(mediaFile)); |  |  |  |             Artwork artwork; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             try { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 LOG.trace("Reading artwork from file {}", mediaFile); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 artwork = jaudiotaggerParser.getArtwork(mediaFile); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } catch (Exception e) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 LOG.debug("Could not read artwork from file {}", mediaFile); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 throw new RuntimeException(e); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             is = new ByteArrayInputStream(artwork.getBinaryData()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             mimeType = artwork.getMimeType(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } else { |  |  |  |         } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |             return new FileInputStream(file); |  |  |  |             is =  new FileInputStream(file); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             mimeType = StringUtil.getMimeType(FilenameUtils.getExtension(file.getName())); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return Pair.of(is, mimeType); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private InputStream getImageInputStreamForVideo(MediaFile mediaFile, int width, int height, int offset) throws Exception { |  |  |  |     private InputStream getImageInputStreamForVideo(MediaFile mediaFile, int width, int height, int offset) throws Exception { | 
			
		
	
	
		
		
			
				
					|  |  | 
 |