summaryrefslogtreecommitdiff
path: root/src/de/danoeh/antennapod
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/danoeh/antennapod')
-rw-r--r--src/de/danoeh/antennapod/feed/MP4Chapter.java27
-rw-r--r--src/de/danoeh/antennapod/storage/DBReader.java3
-rw-r--r--src/de/danoeh/antennapod/util/ChapterUtils.java32
3 files changed, 62 insertions, 0 deletions
diff --git a/src/de/danoeh/antennapod/feed/MP4Chapter.java b/src/de/danoeh/antennapod/feed/MP4Chapter.java
new file mode 100644
index 000000000..a5e1df393
--- /dev/null
+++ b/src/de/danoeh/antennapod/feed/MP4Chapter.java
@@ -0,0 +1,27 @@
+package de.danoeh.antennapod.feed;
+
+import wseemann.media.FFmpegChapter;
+
+/**
+ * Represents a chapter contained in a MP4 file.
+ */
+public class MP4Chapter extends Chapter {
+ public static final int CHAPTERTYPE_MP4CHAPTER = 4;
+
+ /**
+ * Construct a MP4Chapter from an FFmpegChapter.
+ */
+ public MP4Chapter(FFmpegChapter ch) {
+ this.start = ch.getStart();
+ this.title = ch.getTitle();
+ }
+
+ public MP4Chapter(long start, String title, FeedItem item, String link) {
+ super(start, title, item, link);
+ }
+
+ @Override
+ public int getChapterType() {
+ return CHAPTERTYPE_MP4CHAPTER;
+ }
+}
diff --git a/src/de/danoeh/antennapod/storage/DBReader.java b/src/de/danoeh/antennapod/storage/DBReader.java
index e49ea4f83..0924c30ec 100644
--- a/src/de/danoeh/antennapod/storage/DBReader.java
+++ b/src/de/danoeh/antennapod/storage/DBReader.java
@@ -262,6 +262,9 @@ public final class DBReader {
chapter = new VorbisCommentChapter(start,
title, item, link);
break;
+ case MP4Chapter.CHAPTERTYPE_MP4CHAPTER:
+ chapter = new MP4Chapter(start, title, item, link);
+ break;
}
if (chapter != null) {
chapter.setId(chapterCursor
diff --git a/src/de/danoeh/antennapod/util/ChapterUtils.java b/src/de/danoeh/antennapod/util/ChapterUtils.java
index 9e1c50674..4a953703a 100644
--- a/src/de/danoeh/antennapod/util/ChapterUtils.java
+++ b/src/de/danoeh/antennapod/util/ChapterUtils.java
@@ -3,17 +3,22 @@ package de.danoeh.antennapod.util;
import android.util.Log;
import de.danoeh.antennapod.BuildConfig;
import de.danoeh.antennapod.feed.Chapter;
+import de.danoeh.antennapod.feed.MP4Chapter;
import de.danoeh.antennapod.util.comparator.ChapterStartTimeComparator;
import de.danoeh.antennapod.util.id3reader.ChapterReader;
import de.danoeh.antennapod.util.id3reader.ID3ReaderException;
import de.danoeh.antennapod.util.playback.Playable;
import de.danoeh.antennapod.util.vorbiscommentreader.VorbisCommentChapterReader;
import de.danoeh.antennapod.util.vorbiscommentreader.VorbisCommentReaderException;
+import wseemann.media.FFmpegChapter;
+import wseemann.media.FFmpegMediaMetadataRetriever;
+
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -190,6 +195,30 @@ public class ChapterUtils {
}
}
+ private static void readMP4ChaptersFromFileUrl(Playable p) {
+ if (!FFmpegMediaMetadataRetriever.LIB_AVAILABLE) {
+ if (BuildConfig.DEBUG) Log.d(TAG, "FFmpegMediaMetadataRetriever not available on this architecture");
+ return;
+ }
+ if (BuildConfig.DEBUG) Log.d(TAG, "Trying to read mp4 chapters from file " + p.getEpisodeTitle());
+
+ FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
+ retriever.setDataSource(p.getLocalMediaUrl());
+ FFmpegChapter[] res = retriever.getChapters();
+ retriever.release();
+ if (res != null) {
+ List<Chapter> chapters = new ArrayList<Chapter>();
+ for (FFmpegChapter fFmpegChapter : res) {
+ chapters.add(new MP4Chapter(fFmpegChapter));
+ }
+ Collections.sort(chapters, new ChapterStartTimeComparator());
+ processChapters(chapters, p);
+ p.setChapters(chapters);
+ } else {
+ if (BuildConfig.DEBUG) Log.d(TAG, "No mp4 chapters found in " + p.getEpisodeTitle());
+ }
+ }
+
/** Makes sure that chapter does a title and an item attribute. */
private static void processChapters(List<Chapter> chapters, Playable p) {
for (int i = 0; i < chapters.size(); i++) {
@@ -254,6 +283,9 @@ public class ChapterUtils {
if (media.getChapters() == null) {
ChapterUtils.readOggChaptersFromPlayableFileUrl(media);
}
+ if (media.getChapters() == null) {
+ ChapterUtils.readMP4ChaptersFromFileUrl(media);
+ }
} else {
Log.e(TAG, "Could not load chapters from file url: local file not available");
}