From c376be44dd14132dafe49e311714b637e3af61fd Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Tue, 25 Jan 2022 21:55:38 +0100 Subject: [PATCH] When mime type is octet-stream, guess from the file name --- .../parser/feed/namespace/Atom.java | 9 +++----- .../parser/feed/namespace/Media.java | 22 ++++++++----------- .../parser/feed/namespace/Rss20.java | 11 +++------- .../parser/feed/util/SyndTypeUtils.java | 21 +++++++++++++++--- 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Atom.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Atom.java index ef802c355..7e2f00607 100644 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Atom.java +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Atom.java @@ -92,14 +92,11 @@ public class Atom extends Namespace { Log.d(TAG, "Length attribute could not be parsed."); } String type = attributes.getValue(LINK_TYPE); - - if (type == null) { - type = SyndTypeUtils.getMimeTypeFromUrl(href); - } + String mimeType = SyndTypeUtils.getMimeType(type, href); FeedItem currItem = state.getCurrentItem(); - if (SyndTypeUtils.enclosureTypeValid(type) && currItem != null && !currItem.hasMedia()) { - currItem.setMedia(new FeedMedia(currItem, href, size, type)); + if (SyndTypeUtils.isMediaFile(mimeType) && currItem != null && !currItem.hasMedia()) { + currItem.setMedia(new FeedMedia(currItem, href, size, mimeType)); } } else if (LINK_REL_PAYMENT.equals(rel)) { state.getCurrentItem().setPaymentLink(href); diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Media.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Media.java index f480a0417..29d7d7999 100644 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Media.java +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Media.java @@ -49,27 +49,23 @@ public class Media extends Namespace { boolean validTypeMedia = false; boolean validTypeImage = false; boolean isDefault = "true".equals(defaultStr); - String guessedType = SyndTypeUtils.getMimeTypeFromUrl(url); + String mimeType = SyndTypeUtils.getMimeType(type, url); if (MEDIUM_AUDIO.equals(medium)) { validTypeMedia = true; - type = "audio/*"; + mimeType = "audio/*"; } else if (MEDIUM_VIDEO.equals(medium)) { validTypeMedia = true; - type = "video/*"; - } else if (MEDIUM_IMAGE.equals(medium) && (guessedType == null - || (!guessedType.startsWith("audio/") && !guessedType.startsWith("video/")))) { + mimeType = "video/*"; + } else if (MEDIUM_IMAGE.equals(medium) && (mimeType == null + || (!mimeType.startsWith("audio/") && !mimeType.startsWith("video/")))) { // Apparently, some publishers explicitly specify the audio file as an image validTypeImage = true; - type = "image/*"; + mimeType = "image/*"; } else { - if (type == null) { - type = guessedType; - } - - if (SyndTypeUtils.enclosureTypeValid(type)) { + if (SyndTypeUtils.isMediaFile(mimeType)) { validTypeMedia = true; - } else if (SyndTypeUtils.imageTypeValid(type)) { + } else if (SyndTypeUtils.isImageFile(mimeType)) { validTypeImage = true; } } @@ -94,7 +90,7 @@ public class Media extends Namespace { Log.e(TAG, "Duration \"" + durationStr + "\" could not be parsed"); } } - FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type); + FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, mimeType); if (durationMs > 0) { media.setDuration(durationMs); } diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Rss20.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Rss20.java index a39e1b5b7..ad5eb9de8 100644 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Rss20.java +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Rss20.java @@ -48,16 +48,11 @@ public class Rss20 extends Namespace { } else if (ENCLOSURE.equals(localName) && ITEM.equals(state.getTagstack().peek().getName())) { String type = attributes.getValue(ENC_TYPE); String url = attributes.getValue(ENC_URL); - - boolean validType = SyndTypeUtils.enclosureTypeValid(type); - if (!validType) { - type = SyndTypeUtils.getMimeTypeFromUrl(url); - validType = SyndTypeUtils.enclosureTypeValid(type); - } + String mimeType = SyndTypeUtils.getMimeType(type, url); boolean validUrl = !TextUtils.isEmpty(url); if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null - && validType && validUrl) { + && SyndTypeUtils.isMediaFile(mimeType) && validUrl) { long size = 0; try { size = Long.parseLong(attributes.getValue(ENC_LEN)); @@ -68,7 +63,7 @@ public class Rss20 extends Namespace { } catch (NumberFormatException e) { Log.d(TAG, "Length attribute could not be parsed."); } - FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type); + FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, mimeType); state.getCurrentItem().setMedia(media); } } diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/util/SyndTypeUtils.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/util/SyndTypeUtils.java index 2e6cf864f..dfd7801a5 100644 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/util/SyndTypeUtils.java +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/util/SyndTypeUtils.java @@ -1,17 +1,32 @@ package de.danoeh.antennapod.parser.feed.util; import android.webkit.MimeTypeMap; +import androidx.annotation.Nullable; import org.apache.commons.io.FilenameUtils; /** * Utility class for handling MIME-Types of enclosures. * */ public class SyndTypeUtils { + public static final String OCTET_STREAM = "application/octet-stream"; + private SyndTypeUtils() { } - public static boolean enclosureTypeValid(String type) { + @Nullable + public static String getMimeType(@Nullable String type, @Nullable String filename) { + if (isMediaFile(type) && !OCTET_STREAM.equals(type)) { + return type; + } + String filenameType = SyndTypeUtils.getMimeTypeFromUrl(filename); + if (isMediaFile(filenameType)) { + return filenameType; + } + return type; + } + + public static boolean isMediaFile(String type) { if (type == null) { return false; } else { @@ -22,7 +37,7 @@ public class SyndTypeUtils { } } - public static boolean imageTypeValid(String type) { + public static boolean isImageFile(String type) { if (type == null) { return false; } else { @@ -34,7 +49,7 @@ public class SyndTypeUtils { * Should be used if mime-type of enclosure tag is not supported. This * method will return the mime-type of the file extension. */ - public static String getMimeTypeFromUrl(String url) { + private static String getMimeTypeFromUrl(String url) { if (url == null) { return null; }