summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/handler/SyndHandler.java24
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java37
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndDateUtils.java27
3 files changed, 83 insertions, 5 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/SyndHandler.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/SyndHandler.java
index 1dda24944..47503dee4 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/SyndHandler.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/SyndHandler.java
@@ -1,14 +1,23 @@
package de.danoeh.antennapod.core.syndication.handler;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
-import de.danoeh.antennapod.core.feed.Feed;
-import de.danoeh.antennapod.core.syndication.namespace.*;
-import de.danoeh.antennapod.core.syndication.namespace.atom.NSAtom;
+
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
+import de.danoeh.antennapod.core.BuildConfig;
+import de.danoeh.antennapod.core.feed.Feed;
+import de.danoeh.antennapod.core.syndication.namespace.NSContent;
+import de.danoeh.antennapod.core.syndication.namespace.NSDublinCore;
+import de.danoeh.antennapod.core.syndication.namespace.NSITunes;
+import de.danoeh.antennapod.core.syndication.namespace.NSMedia;
+import de.danoeh.antennapod.core.syndication.namespace.NSRSS20;
+import de.danoeh.antennapod.core.syndication.namespace.NSSimpleChapters;
+import de.danoeh.antennapod.core.syndication.namespace.Namespace;
+import de.danoeh.antennapod.core.syndication.namespace.SyndElement;
+import de.danoeh.antennapod.core.syndication.namespace.atom.NSAtom;
+
/** Superclass for all SAX Handlers which process Syndication formats */
public class SyndHandler extends DefaultHandler {
private static final String TAG = "SyndHandler";
@@ -100,7 +109,12 @@ public class SyndHandler extends DefaultHandler {
state.namespaces.put(uri, new NSMedia());
if (BuildConfig.DEBUG)
Log.d(TAG, "Recognized media namespace");
- }
+ } else if (uri.equals(NSDublinCore.NSURI)
+ && prefix.equals(NSDublinCore.NSTAG)) {
+ state.namespaces.put(uri, new NSDublinCore());
+ if (BuildConfig.DEBUG)
+ Log.d(TAG, "Recognized DublinCore namespace");
+ }
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java
new file mode 100644
index 000000000..099593eed
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java
@@ -0,0 +1,37 @@
+package de.danoeh.antennapod.core.syndication.namespace;
+
+import org.xml.sax.Attributes;
+
+import de.danoeh.antennapod.core.syndication.handler.HandlerState;
+import de.danoeh.antennapod.core.syndication.util.SyndDateUtils;
+
+public class NSDublinCore extends Namespace {
+ private static final String TAG = "NSDublinCore";
+ public static final String NSTAG = "dc";
+ public static final String NSURI = "http://purl.org/dc/elements/1.1/";
+
+ private static final String ITEM = "item";
+ private static final String DATE = "date";
+
+ @Override
+ public SyndElement handleElementStart(String localName, HandlerState state,
+ Attributes attributes) {
+ return new SyndElement(localName, this);
+ }
+
+ @Override
+ public void handleElementEnd(String localName, HandlerState state) {
+ if(state.getTagstack().size() >= 2
+ && state.getContentBuf() != null) {
+ String content = state.getContentBuf().toString();
+ SyndElement topElement = state.getTagstack().peek();
+ String top = topElement.getName();
+ SyndElement secondElement = state.getSecondTag();
+ String second = secondElement.getName();
+ if (top.equals(DATE) && second.equals(ITEM)) {
+ state.getCurrentItem().setPubDate(
+ SyndDateUtils.parseISO8601Date(content));
+ }
+ }
+ }
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndDateUtils.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndDateUtils.java
index 1ac389f08..a9929d7b1 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndDateUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndDateUtils.java
@@ -28,6 +28,8 @@ public class SyndDateUtils {
*/
public static final String RFC3339LOCAL = "yyyy-MM-dd'T'HH:mm:ssZ";
+ public static final String ISO8601_SHORT = "yyyy-MM-dd";
+
private static ThreadLocal<SimpleDateFormat> RFC822Formatter = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
@@ -44,6 +46,14 @@ public class SyndDateUtils {
};
+ private static ThreadLocal<SimpleDateFormat> ISO8601ShortFormatter = new ThreadLocal<SimpleDateFormat>() {
+ @Override
+ protected SimpleDateFormat initialValue() {
+ return new SimpleDateFormat(ISO8601_SHORT, Locale.US);
+ }
+
+ };
+
public static Date parseRFC822Date(String date) {
Date result = null;
if (date.contains("PDT")) {
@@ -123,6 +133,23 @@ public class SyndDateUtils {
}
+ public static Date parseISO8601Date(String date) {
+ if(date.length() > ISO8601_SHORT.length()) {
+ return parseRFC3339Date(date);
+ }
+ Date result = null;
+ if(date.length() == "YYYYMMDD".length()) {
+ date = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6,8);
+ }
+ SimpleDateFormat format = ISO8601ShortFormatter.get();
+ try {
+ result = format.parse(date);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
/**
* Takes a string of the form [HH:]MM:SS[.mmm] and converts it to
* milliseconds.