diff options
Diffstat (limited to 'src/de/danoeh/antennapod/util')
-rw-r--r-- | src/de/danoeh/antennapod/util/ChapterUtils.java | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/de/danoeh/antennapod/util/ChapterUtils.java b/src/de/danoeh/antennapod/util/ChapterUtils.java index bf88d8fd1..3131b9e9a 100644 --- a/src/de/danoeh/antennapod/util/ChapterUtils.java +++ b/src/de/danoeh/antennapod/util/ChapterUtils.java @@ -3,6 +3,7 @@ package de.danoeh.antennapod.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; @@ -10,6 +11,8 @@ import java.net.URL; import java.util.Collections; import java.util.List; +import org.apache.commons.io.IOUtils; + import android.util.Log; import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.feed.Chapter; @@ -18,6 +21,8 @@ import de.danoeh.antennapod.feed.FeedMedia; 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.vorbiscommentreader.VorbisCommentChapterReader; +import de.danoeh.antennapod.util.vorbiscommentreader.VorbisCommentReaderException; /** Utility class for getting chapter data from media files. */ public class ChapterUtils { @@ -131,6 +136,72 @@ public class ChapterUtils { } } + public static void readOggChaptersFromMediaDownloadUrl(FeedItem item) { + final FeedMedia media = item.getMedia(); + if (media != null && media.getDownload_url() != null) { + InputStream input = null; + try { + URL url = new URL(media.getDownload_url()); + input = url.openStream(); + if (input != null) { + readOggChaptersFromInputStream(item, input); + } + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(input); + } + } + } + + public static void readOggChaptersFromMediaFileUrl(FeedItem item) { + final FeedMedia media = item.getMedia(); + if (media != null && media.getFile_url() != null) { + File source = new File(media.getFile_url()); + if (source.exists()) { + InputStream input = null; + try { + input = new BufferedInputStream(new FileInputStream(source)); + readOggChaptersFromInputStream(item, input); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(input); + } + } + } + } + + private static void readOggChaptersFromInputStream(FeedItem item, + InputStream input) { + if (AppConfig.DEBUG) + Log.d(TAG, + "Trying to read chapters from item with title " + + item.getTitle()); + try { + VorbisCommentChapterReader reader = new VorbisCommentChapterReader(); + reader.readInputStream(input); + List<Chapter> chapters = reader.getChapters(); + if (chapters != null) { + Collections.sort(chapters, new ChapterStartTimeComparator()); + processChapters(chapters, item); + if (chaptersValid(chapters)) { + item.setChapters(chapters); + Log.i(TAG, "Chapters loaded"); + } else { + Log.e(TAG, "Chapter data was invalid"); + } + } else { + Log.i(TAG, + "ChapterReader could not find any Ogg vorbis chapters"); + } + } catch (VorbisCommentReaderException e) { + e.printStackTrace(); + } + } + /** Makes sure that chapter does a title and an item attribute. */ private static void processChapters(List<Chapter> chapters, FeedItem item) { for (int i = 0; i < chapters.size(); i++) { |