Fix #658 again: content type for unscaled images set based on jaudiotagger output

Signed-off-by: Andrew DeMaria <lostonamountain@gmail.com>
master
Andrew DeMaria 7 years ago
parent 11ec30cd9f
commit b0aff38caf
No known key found for this signature in database
GPG Key ID: 0A3F5E91F8364EDF
  1. 44
      airsonic-main/src/main/java/org/airsonic/player/controller/CoverArtController.java
  2. 17
      airsonic-main/src/main/java/org/airsonic/player/service/metadata/JaudiotaggerParser.java

@ -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 {

@ -321,22 +321,7 @@ public class JaudiotaggerParser extends MetaDataParser {
} }
} }
/** public Artwork getArtwork(MediaFile file) throws Exception {
* Returns the cover art image data embedded in the given file.
*
* @param file The music file.
* @return The embedded cover art image data, or <code>null</code> if not available.
*/
public byte[] getImageData(MediaFile file) {
try {
return getArtwork(file).getBinaryData();
} catch (Throwable x) {
LOG.warn("Failed to find cover art tag in " + file, x);
return null;
}
}
private Artwork getArtwork(MediaFile file) throws Exception {
AudioFile audioFile = AudioFileIO.read(file.getFile()); AudioFile audioFile = AudioFileIO.read(file.getFile());
Tag tag = audioFile.getTag(); Tag tag = audioFile.getTag();
return tag == null ? null : tag.getFirstArtwork(); return tag == null ? null : tag.getFirstArtwork();

Loading…
Cancel
Save