diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2012-09-21 19:46:08 +0200 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2012-09-21 19:46:08 +0200 |
commit | 48292609f6586fbb85ed59a4a46a5e23e49fba61 (patch) | |
tree | 38c122820301e6bfafb7c4029d520ad2f1c1d405 /src/de/danoeh/antennapod/util | |
parent | 0eb841db4b2c340c5c5200e5fb655482ee98cfc6 (diff) | |
download | AntennaPod-48292609f6586fbb85ed59a4a46a5e23e49fba61.zip |
MediaHandler now reads id3 chapters
Diffstat (limited to 'src/de/danoeh/antennapod/util')
4 files changed, 129 insertions, 6 deletions
diff --git a/src/de/danoeh/antennapod/util/ChapterUtils.java b/src/de/danoeh/antennapod/util/ChapterUtils.java new file mode 100644 index 000000000..dd9dbce5a --- /dev/null +++ b/src/de/danoeh/antennapod/util/ChapterUtils.java @@ -0,0 +1,97 @@ +package de.danoeh.antennapod.util; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import android.util.Log; +import de.danoeh.antennapod.AppConfig; +import de.danoeh.antennapod.feed.Chapter; +import de.danoeh.antennapod.feed.FeedItem; +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; + +/** Utility class for getting chapter data from media files. */ +public class ChapterUtils { + private static final String TAG = "ChapterUtils"; + + private ChapterUtils() { + } + + public static void readID3ChaptersFromFeedItem(FeedItem item) { + if (AppConfig.DEBUG) + Log.d(TAG, "Reading id3 chapters from item " + item.getTitle()); + final FeedMedia media = item.getMedia(); + if (media != null && media.isDownloaded() + && media.getFile_url() != null) { + File source = new File(media.getFile_url()); + if (source.exists()) { + ChapterReader reader = new ChapterReader(); + InputStream in = null; + + try { + in = new BufferedInputStream(new FileInputStream(source)); + reader.readInputStream(in); + List<Chapter> chapters = reader.getChapters(); + + if (chapters != null) { + Collections.sort(chapters, new ChapterStartTimeComparator()); + processChapters(chapters, item); + if (chaptersValid(chapters)) { + item.setChapters(chapters); + } else { + Log.e(TAG, "Chapter data was invalid"); + } + } else { + Log.i(TAG, "ChapterReader could not find any ID3 chapters"); + } + } catch (IOException e) { + e.printStackTrace(); + } catch (ID3ReaderException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } else { + Log.e(TAG, "Unable to read id3 chapters: Source doesn't exist"); + } + } + } + + /** 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++) { + Chapter c = chapters.get(i); + if (c.getTitle() == null) { + c.setTitle(Integer.toString(i)); + } + c.setItem(item); + } + } + + private static boolean chaptersValid(List<Chapter> chapters) { + for (Chapter c : chapters) { + if (c.getTitle() == null) { + return false; + } + if (c.getStart() < 0) { + return false; + } + } + return true; + } + +} diff --git a/src/de/danoeh/antennapod/util/PlaybackController.java b/src/de/danoeh/antennapod/util/PlaybackController.java index 0253eba02..417c6d576 100644 --- a/src/de/danoeh/antennapod/util/PlaybackController.java +++ b/src/de/danoeh/antennapod/util/PlaybackController.java @@ -26,6 +26,7 @@ import android.widget.TextView; import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.PodcastApp; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.feed.Chapter; import de.danoeh.antennapod.feed.FeedMedia; import de.danoeh.antennapod.feed.SimpleChapter; import de.danoeh.antennapod.service.PlaybackService; @@ -549,7 +550,7 @@ public abstract class PlaybackController { } } - public void seekToChapter(SimpleChapter chapter) { + public void seekToChapter(Chapter chapter) { if (playbackService != null) { playbackService.seekToChapter(chapter); } diff --git a/src/de/danoeh/antennapod/util/comparator/ChapterStartTimeComparator.java b/src/de/danoeh/antennapod/util/comparator/ChapterStartTimeComparator.java new file mode 100644 index 000000000..7cc6fa458 --- /dev/null +++ b/src/de/danoeh/antennapod/util/comparator/ChapterStartTimeComparator.java @@ -0,0 +1,20 @@ +package de.danoeh.antennapod.util.comparator; + +import java.util.Comparator; + +import de.danoeh.antennapod.feed.Chapter; + +public class ChapterStartTimeComparator implements Comparator<Chapter> { + + @Override + public int compare(Chapter lhs, Chapter rhs) { + if (lhs.getStart() == rhs.getStart()) { + return 0; + } else if (lhs.getStart() < rhs.getStart()) { + return -1; + } else { + return 1; + } + } + +} diff --git a/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java b/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java index 3711cb644..9a86de15d 100644 --- a/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java +++ b/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java @@ -5,6 +5,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import de.danoeh.antennapod.feed.Chapter; import de.danoeh.antennapod.feed.ID3Chapter; import de.danoeh.antennapod.util.id3reader.model.FrameHeader; import de.danoeh.antennapod.util.id3reader.model.TagHeader; @@ -14,12 +15,12 @@ public class ChapterReader extends ID3Reader { private static final String FRAME_ID_CHAPTER = "CHAP"; private static final String FRAME_ID_TITLE = "TIT2"; - private List<ID3Chapter> chapters; + private List<Chapter> chapters; private ID3Chapter currentChapter; @Override public int onStartTagHeader(TagHeader header) { - chapters = new ArrayList<ID3Chapter>(); + chapters = new ArrayList<Chapter>(); System.out.println(header.toString()); return ID3Reader.ACTION_DONT_SKIP; } @@ -58,8 +59,8 @@ public class ChapterReader extends ID3Reader { } private boolean hasId3Chapter(ID3Chapter chapter) { - for (ID3Chapter c : chapters) { - if (c.getId3ID().equals(chapter.getId3ID())) { + for (Chapter c : chapters) { + if (((ID3Chapter) c).getId3ID().equals(chapter.getId3ID())) { return true; } } @@ -75,7 +76,7 @@ public class ChapterReader extends ID3Reader { } System.out.println("Reached end of tag"); if (chapters != null) { - for (ID3Chapter c : chapters) { + for (Chapter c : chapters) { System.out.println(c.toString()); } } @@ -87,4 +88,8 @@ public class ChapterReader extends ID3Reader { super.onNoTagHeaderFound(); } + public List<Chapter> getChapters() { + return chapters; + } + } |