diff options
Diffstat (limited to 'src/de/danoeh')
-rw-r--r-- | src/de/danoeh/antennapod/feed/MP4Chapter.java | 27 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/storage/DBReader.java | 3 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/util/ChapterUtils.java | 32 |
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"); } |