summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2014-10-19 19:07:26 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2014-10-19 19:07:26 +0200
commiteff021c14962e7b89742b6097a4133ae841ecaf1 (patch)
tree97fcb8b4ef1afef2333da701b43c622ef982e362
parent3a1ced0301e5e9a3067967b0c83f49723d9d37b4 (diff)
downloadAntennaPod-eff021c14962e7b89742b6097a4133ae841ecaf1.zip
Added support for itunes:duration tag in feeds
Ported from AntennaPodSP
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java17
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java26
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java8
4 files changed, 54 insertions, 4 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java
index 4fe8e1aff..413a11f8e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java
@@ -1,12 +1,16 @@
package de.danoeh.antennapod.core.syndication.handler;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Stack;
+
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.syndication.namespace.Namespace;
import de.danoeh.antennapod.core.syndication.namespace.SyndElement;
-import java.util.*;
-
/**
* Contains all relevant information to describe the current state of a
* SyndHandler.
@@ -35,6 +39,11 @@ public class HandlerState {
*/
protected StringBuffer contentBuf;
+ /**
+ * Temporarily saved objects.
+ */
+ protected HashMap<String, Object> tempObjects;
+
public HandlerState(Feed feed) {
this.feed = feed;
alternateUrls = new LinkedHashMap<String, String>();
@@ -42,6 +51,7 @@ public class HandlerState {
tagstack = new Stack<SyndElement>();
namespaces = new HashMap<String, Namespace>();
defaultNamespaces = new Stack<Namespace>();
+ tempObjects = new HashMap<String, Object>();
}
public Feed getFeed() {
@@ -95,4 +105,7 @@ public class HandlerState {
alternateUrls.put(url, title);
}
+ public HashMap<String, Object> getTempObjects() {
+ return tempObjects;
+ }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java
index fb794d7e0..7f07b54f6 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java
@@ -4,6 +4,8 @@ import de.danoeh.antennapod.core.feed.FeedImage;
import de.danoeh.antennapod.core.syndication.handler.HandlerState;
import org.xml.sax.Attributes;
+import java.util.concurrent.TimeUnit;
+
public class NSITunes extends Namespace {
public static final String NSTAG = "itunes";
public static final String NSURI = "http://www.itunes.com/dtds/podcast-1.0.dtd";
@@ -13,6 +15,7 @@ public class NSITunes extends Namespace {
private static final String IMAGE_HREF = "href";
private static final String AUTHOR = "author";
+ public static final String DURATION = "duration";
@Override
@@ -25,10 +28,10 @@ public class NSITunes extends Namespace {
if (state.getCurrentItem() != null) {
// this is an items image
- image.setTitle(state.getCurrentItem().getTitle() + IMAGE_TITLE);
+ image.setTitle(state.getCurrentItem().getTitle()+IMAGE_TITLE);
state.getCurrentItem().setImage(image);
- } else {
+ } else {
// this is the feed image
if (state.getFeed().getImage() == null) {
state.getFeed().setImage(image);
@@ -44,6 +47,25 @@ public class NSITunes extends Namespace {
public void handleElementEnd(String localName, HandlerState state) {
if (localName.equals(AUTHOR)) {
state.getFeed().setAuthor(state.getContentBuf().toString());
+ } else if (localName.equals(DURATION)) {
+ String[] parts = state.getContentBuf().toString().split(":");
+ try {
+ int duration = 0;
+ if (parts.length == 2) {
+ duration += TimeUnit.MINUTES.toMillis(Long.valueOf(parts[0])) +
+ TimeUnit.SECONDS.toMillis(Long.valueOf(parts[1]));
+ } else if (parts.length >= 3) {
+ duration += TimeUnit.HOURS.toMillis(Long.valueOf(parts[0])) +
+ TimeUnit.MINUTES.toMillis(Long.valueOf(parts[1])) +
+ TimeUnit.SECONDS.toMillis(Long.valueOf(parts[2]));
+ } else {
+ return;
+ }
+
+ state.getTempObjects().put(DURATION, duration);
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
index c29741456..ba26dbac2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
@@ -85,6 +85,13 @@ public class NSRSS20 extends Namespace {
state.getCurrentItem().setTitle(
state.getCurrentItem().getDescription());
}
+
+ if (state.getTempObjects().containsKey(NSITunes.DURATION)) {
+ if (state.getCurrentItem().hasMedia()) {
+ state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION));
+ }
+ state.getTempObjects().remove(NSITunes.DURATION);
+ }
}
state.setCurrentItem(null);
} else if (state.getTagstack().size() >= 2
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java
index 61cb9ec65..3719e7103 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java
@@ -6,6 +6,7 @@ import de.danoeh.antennapod.core.feed.FeedImage;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.syndication.handler.HandlerState;
+import de.danoeh.antennapod.core.syndication.namespace.NSITunes;
import de.danoeh.antennapod.core.syndication.namespace.NSRSS20;
import de.danoeh.antennapod.core.syndication.namespace.Namespace;
import de.danoeh.antennapod.core.syndication.namespace.SyndElement;
@@ -128,6 +129,13 @@ public class NSAtom extends Namespace {
@Override
public void handleElementEnd(String localName, HandlerState state) {
if (localName.equals(ENTRY)) {
+ if (state.getCurrentItem() != null &&
+ state.getTempObjects().containsKey(NSITunes.DURATION)) {
+ if (state.getCurrentItem().hasMedia()) {
+ state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION));
+ }
+ state.getTempObjects().remove(NSITunes.DURATION);
+ }
state.setCurrentItem(null);
}