diff options
Diffstat (limited to 'parser')
9 files changed, 106 insertions, 148 deletions
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<Chapter> parse(String jsonStr) { + try { + List<Chapter> 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/element/SimpleChapter.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/element/SimpleChapter.java deleted file mode 100644 index 069e49f09..000000000 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/element/SimpleChapter.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.danoeh.antennapod.parser.feed.element; - -import de.danoeh.antennapod.model.feed.Chapter; - -public class SimpleChapter extends Chapter { - public static final int CHAPTERTYPE_SIMPLECHAPTER = 0; - - public SimpleChapter(long start, String title, String link, String imageUrl) { - super(start, title, link, imageUrl); - } - - @Override - public int getChapterType() { - return CHAPTERTYPE_SIMPLECHAPTER; - } -} 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); } } diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java index e1912ed45..dd116e189 100644 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java @@ -2,8 +2,8 @@ package de.danoeh.antennapod.parser.feed.namespace; import android.util.Log; +import de.danoeh.antennapod.model.feed.Chapter; import de.danoeh.antennapod.parser.feed.HandlerState; -import de.danoeh.antennapod.parser.feed.element.SimpleChapter; import de.danoeh.antennapod.parser.feed.element.SyndElement; import de.danoeh.antennapod.parser.feed.util.DateUtils; import org.xml.sax.Attributes; @@ -37,7 +37,7 @@ public class SimpleChapters extends Namespace { String title = attributes.getValue(TITLE); String link = attributes.getValue(HREF); String imageUrl = attributes.getValue(IMAGE); - SimpleChapter chapter = new SimpleChapter(start, title, link, imageUrl); + Chapter chapter = new Chapter(start, title, link, imageUrl); currentItem.getChapters().add(chapter); } catch (NumberFormatException e) { Log.e(TAG, "Unable to read chapter", e); diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java index ac79432b5..62322e7b2 100644 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java +++ b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java @@ -50,7 +50,10 @@ public class ChapterReader extends ID3Reader { String elementId = readIsoStringNullTerminated(100); long startTime = readInt(); skipBytes(12); // Ignore end time, start offset, end offset - ID3Chapter chapter = new ID3Chapter(elementId, startTime); + + Chapter chapter = new Chapter(); + chapter.setStart(startTime); + chapter.setChapterId(elementId); // Read sub-frames while (getPosition() < chapterStartedPosition + frameHeader.getSize()) { diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ID3Chapter.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ID3Chapter.java deleted file mode 100644 index 5396025e9..000000000 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ID3Chapter.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.danoeh.antennapod.parser.media.id3; - -import de.danoeh.antennapod.model.feed.Chapter; - -public class ID3Chapter extends Chapter { - public static final int CHAPTERTYPE_ID3CHAPTER = 2; - - /** - * Identifies the chapter in its ID3 tag. This attribute does not have to be - * store in the DB and is only used for parsing. - */ - private String id3ID; - - public ID3Chapter(String id3ID, long start) { - super(start); - this.id3ID = id3ID; - } - - public ID3Chapter(long start, String title, String link, String imageUrl) { - super(start, title, link, imageUrl); - } - - @Override - public String toString() { - return "ID3Chapter [id3ID=" + id3ID + ", title=" + getTitle() + ", start=" - + getStart() + ", url=" + getLink() + "]"; - } - - @Override - public int getChapterType() { - return CHAPTERTYPE_ID3CHAPTER; - } -} diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapter.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapter.java deleted file mode 100644 index 88ee7fef9..000000000 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapter.java +++ /dev/null @@ -1,88 +0,0 @@ -package de.danoeh.antennapod.parser.media.vorbis; - -import java.util.concurrent.TimeUnit; - -import de.danoeh.antennapod.model.feed.Chapter; - -public class VorbisCommentChapter extends Chapter { - public static final int CHAPTERTYPE_VORBISCOMMENT_CHAPTER = 3; - - private static final int CHAPTERXXX_LENGTH = "chapterxxx".length(); - - private int vorbisCommentId; - - public VorbisCommentChapter(int vorbisCommentId) { - this.vorbisCommentId = vorbisCommentId; - } - - public VorbisCommentChapter(long start, String title, String link, String imageUrl) { - super(start, title, link, imageUrl); - } - - @Override - public String toString() { - return "VorbisCommentChapter [id=" + getId() + ", title=" + getTitle() - + ", link=" + getLink() + ", start=" + getStart() + "]"; - } - - public static long getStartTimeFromValue(String value) - throws VorbisCommentReaderException { - String[] parts = value.split(":"); - if (parts.length >= 3) { - try { - long hours = TimeUnit.MILLISECONDS.convert( - Long.parseLong(parts[0]), TimeUnit.HOURS); - long minutes = TimeUnit.MILLISECONDS.convert( - Long.parseLong(parts[1]), TimeUnit.MINUTES); - if (parts[2].contains("-->")) { - parts[2] = parts[2].substring(0, parts[2].indexOf("-->")); - } - long seconds = TimeUnit.MILLISECONDS.convert( - ((long) Float.parseFloat(parts[2])), TimeUnit.SECONDS); - return hours + minutes + seconds; - } catch (NumberFormatException e) { - throw new VorbisCommentReaderException(e); - } - } else { - throw new VorbisCommentReaderException("Invalid time string"); - } - } - - /** - * Return the id of a vorbiscomment chapter from a string like CHAPTERxxx* - * - * @return the id of the chapter key or -1 if the id couldn't be read. - * @throws VorbisCommentReaderException - * */ - public static int getIDFromKey(String key) throws VorbisCommentReaderException { - if (key.length() >= CHAPTERXXX_LENGTH) { // >= CHAPTERxxx - try { - String strId = key.substring(8, 10); - return Integer.parseInt(strId); - } catch (NumberFormatException e) { - throw new VorbisCommentReaderException(e); - } - } - throw new VorbisCommentReaderException("key is too short (" + key + ")"); - } - - /** - * Get the string that comes after 'CHAPTERxxx', for example 'name' or - * 'url'. - */ - public static String getAttributeTypeFromKey(String key) { - if (key.length() > CHAPTERXXX_LENGTH) { - return key.substring(CHAPTERXXX_LENGTH); - } - return null; - } - - @Override - public int getChapterType() { - return CHAPTERTYPE_VORBISCOMMENT_CHAPTER; - } - - public int getVorbisCommentId() { - return vorbisCommentId; - } -} diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java index 82455d180..e3b91a0e7 100644 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java +++ b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java @@ -4,6 +4,7 @@ import android.util.Log; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.model.feed.Chapter; import de.danoeh.antennapod.parser.media.BuildConfig; @@ -14,6 +15,7 @@ public class VorbisCommentChapterReader extends VorbisCommentReader { private static final String CHAPTER_KEY = "chapter\\d\\d\\d.*"; private static final String CHAPTER_ATTRIBUTE_TITLE = "name"; private static final String CHAPTER_ATTRIBUTE_LINK = "url"; + private static final int CHAPTERXXX_LENGTH = "chapterxxx".length(); private List<Chapter> chapters; @@ -41,14 +43,15 @@ public class VorbisCommentChapterReader extends VorbisCommentReader { if (BuildConfig.DEBUG) { Log.d(TAG, "Key: " + key + ", value: " + value); } - String attribute = VorbisCommentChapter.getAttributeTypeFromKey(key); - int id = VorbisCommentChapter.getIDFromKey(key); + String attribute = getAttributeTypeFromKey(key); + int id = getIdFromKey(key); Chapter chapter = getChapterById(id); if (attribute == null) { if (getChapterById(id) == null) { // new chapter - long start = VorbisCommentChapter.getStartTimeFromValue(value); - chapter = new VorbisCommentChapter(id); + long start = getStartTimeFromValue(value); + chapter = new Chapter(); + chapter.setChapterId("" + id); chapter.setStart(start); chapters.add(chapter); } else { @@ -80,13 +83,65 @@ public class VorbisCommentChapterReader extends VorbisCommentReader { private Chapter getChapterById(long id) { for (Chapter c : chapters) { - if (((VorbisCommentChapter) c).getVorbisCommentId() == id) { + if (("" + id).equals(c.getChapterId())) { return c; } } return null; } + public static long getStartTimeFromValue(String value) + throws VorbisCommentReaderException { + String[] parts = value.split(":"); + if (parts.length >= 3) { + try { + long hours = TimeUnit.MILLISECONDS.convert( + Long.parseLong(parts[0]), TimeUnit.HOURS); + long minutes = TimeUnit.MILLISECONDS.convert( + Long.parseLong(parts[1]), TimeUnit.MINUTES); + if (parts[2].contains("-->")) { + parts[2] = parts[2].substring(0, parts[2].indexOf("-->")); + } + long seconds = TimeUnit.MILLISECONDS.convert( + ((long) Float.parseFloat(parts[2])), TimeUnit.SECONDS); + return hours + minutes + seconds; + } catch (NumberFormatException e) { + throw new VorbisCommentReaderException(e); + } + } else { + throw new VorbisCommentReaderException("Invalid time string"); + } + } + + /** + * Return the id of a vorbiscomment chapter from a string like CHAPTERxxx* + * + * @return the id of the chapter key or -1 if the id couldn't be read. + * @throws VorbisCommentReaderException + * */ + private static int getIdFromKey(String key) throws VorbisCommentReaderException { + if (key.length() >= CHAPTERXXX_LENGTH) { // >= CHAPTERxxx + try { + String strId = key.substring(8, 10); + return Integer.parseInt(strId); + } catch (NumberFormatException e) { + throw new VorbisCommentReaderException(e); + } + } + throw new VorbisCommentReaderException("key is too short (" + key + ")"); + } + + /** + * Get the string that comes after 'CHAPTERxxx', for example 'name' or + * 'url'. + */ + private static String getAttributeTypeFromKey(String key) { + if (key.length() > CHAPTERXXX_LENGTH) { + return key.substring(CHAPTERXXX_LENGTH); + } + return null; + } + public List<Chapter> getChapters() { return chapters; } diff --git a/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java b/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java index f87764c7f..d7321f766 100644 --- a/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java +++ b/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java @@ -96,7 +96,7 @@ public class ChapterReaderTest { FrameHeader header = new FrameHeader(ChapterReader.FRAME_ID_TITLE, titleSubframeContent.length, (short) 0); CountingInputStream inputStream = new CountingInputStream(new ByteArrayInputStream(titleSubframeContent)); ChapterReader reader = new ChapterReader(inputStream); - Chapter chapter = new ID3Chapter("", 0); + Chapter chapter = new Chapter(); reader.readChapterSubFrame(header, chapter); assertEquals("A", chapter.getTitle()); |