summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2022-01-25 21:55:38 +0100
committerByteHamster <info@bytehamster.com>2022-01-25 21:55:38 +0100
commitc376be44dd14132dafe49e311714b637e3af61fd (patch)
treeb1155768bf39c516953fa77fb60dcfa91a10f3a2
parent2524fa0f7605ded2139f3ec6d4337383e6f3006d (diff)
downloadantennapod-c376be44dd14132dafe49e311714b637e3af61fd.zip
When mime type is octet-stream, guess from the file name
-rw-r--r--parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Atom.java9
-rw-r--r--parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Media.java22
-rw-r--r--parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/Rss20.java11
-rw-r--r--parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/util/SyndTypeUtils.java21
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;
}