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 tempObjects; + public HandlerState(Feed feed) { this.feed = feed; alternateUrls = new LinkedHashMap(); @@ -42,6 +51,7 @@ public class HandlerState { tagstack = new Stack(); namespaces = new HashMap(); defaultNamespaces = new Stack(); + tempObjects = new HashMap(); } public Feed getFeed() { @@ -95,4 +105,7 @@ public class HandlerState { alternateUrls.put(url, title); } + public HashMap 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); }