From 1a1bf02e8a73a3f7a05ced5c850c23fceb2629f0 Mon Sep 17 00:00:00 2001 From: Tony Tam <149837+tonytamsf@users.noreply.github.com> Date: Sun, 6 Mar 2022 07:09:09 -0800 Subject: Support for podcast 2.0 chapters (#5630) --- .../parser/feed/PodcastIndexChapterParser.java | 31 ++++++++++++++++++++++ .../parser/feed/namespace/PodcastIndex.java | 10 +++++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/PodcastIndexChapterParser.java (limited to 'parser/feed/src/main/java/de') diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/PodcastIndexChapterParser.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/PodcastIndexChapterParser.java new file mode 100644 index 000000000..5dcc18b14 --- /dev/null +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/PodcastIndexChapterParser.java @@ -0,0 +1,31 @@ +package de.danoeh.antennapod.parser.feed; + +import de.danoeh.antennapod.model.feed.Chapter; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class PodcastIndexChapterParser { + public static List parse(String jsonStr) { + try { + List chapters = new ArrayList<>(); + JSONObject obj = new JSONObject(jsonStr); + JSONArray objChapters = obj.getJSONArray("chapters"); + for (int i = 0; i < objChapters.length(); i++) { + JSONObject jsonObject = objChapters.getJSONObject(i); + int startTime = jsonObject.optInt("startTime", 0); + String title = jsonObject.optString("title"); + String link = jsonObject.optString("url"); + String img = jsonObject.optString("img"); + chapters.add(new Chapter(startTime * 1000L, title, link, img)); + } + return chapters; + } catch (JSONException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/PodcastIndex.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/PodcastIndex.java index 1d4a91192..1f543a5ae 100644 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/PodcastIndex.java +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/PodcastIndex.java @@ -1,8 +1,8 @@ package de.danoeh.antennapod.parser.feed.namespace; +import android.text.TextUtils; import de.danoeh.antennapod.parser.feed.HandlerState; import de.danoeh.antennapod.parser.feed.element.SyndElement; -import org.jsoup.helper.StringUtil; import org.xml.sax.Attributes; import de.danoeh.antennapod.model.feed.FeedFunding; @@ -13,6 +13,7 @@ public class PodcastIndex extends Namespace { public static final String NSURI2 = "https://podcastindex.org/namespace/1.0"; private static final String URL = "url"; private static final String FUNDING = "funding"; + private static final String CHAPTERS = "chapters"; @Override public SyndElement handleElementStart(String localName, HandlerState state, @@ -22,6 +23,11 @@ public class PodcastIndex extends Namespace { FeedFunding funding = new FeedFunding(href, ""); state.setCurrentFunding(funding); state.getFeed().addPayment(state.getCurrentFunding()); + } else if (CHAPTERS.equals(localName)) { + String href = attributes.getValue(URL); + if (!TextUtils.isEmpty(href)) { + state.getCurrentItem().setPodcastIndexChapterUrl(href); + } } return new SyndElement(localName, this); } @@ -32,7 +38,7 @@ public class PodcastIndex extends Namespace { return; } String content = state.getContentBuf().toString(); - if (FUNDING.equals(localName) && state.getCurrentFunding() != null && !StringUtil.isBlank(content)) { + if (FUNDING.equals(localName) && state.getCurrentFunding() != null && !TextUtils.isEmpty(content)) { state.getCurrentFunding().setContent(content); } } -- cgit v1.2.3