summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/de/danoeh/antennapod/feed/FeedManager.java6
-rw-r--r--src/de/danoeh/antennapod/service/PlaybackService.java10
-rw-r--r--src/de/danoeh/antennapod/service/download/DownloadService.java7
-rw-r--r--src/de/danoeh/antennapod/util/ChapterUtils.java71
4 files changed, 90 insertions, 4 deletions
diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java
index 98da731dd..3f774b4bd 100644
--- a/src/de/danoeh/antennapod/feed/FeedManager.java
+++ b/src/de/danoeh/antennapod/feed/FeedManager.java
@@ -627,7 +627,7 @@ public class FeedManager {
if (itemIndex != -1 && itemIndex < (queue.size() - 1)) {
return queue.get(itemIndex + 1);
}
- }
+ }
return null;
}
@@ -1185,6 +1185,10 @@ public class FeedManager {
chapter = new ID3Chapter(start, title, item,
link);
break;
+ case VorbisCommentChapter.CHAPTERTYPE_VORBISCOMMENT_CHAPTER:
+ chapter = new VorbisCommentChapter(start,
+ title, item, link);
+ break;
}
chapter.setId(chapterCursor
.getLong(PodDBAdapter.KEY_ID_INDEX));
diff --git a/src/de/danoeh/antennapod/service/PlaybackService.java b/src/de/danoeh/antennapod/service/PlaybackService.java
index 11719127d..0bf7ab075 100644
--- a/src/de/danoeh/antennapod/service/PlaybackService.java
+++ b/src/de/danoeh/antennapod/service/PlaybackService.java
@@ -611,6 +611,11 @@ public class PlaybackService extends Service {
ChapterUtils
.readID3ChaptersFromFeedMediaDownloadUrl(media
.getItem());
+ if (media.getItem().getChapters() == null) {
+ ChapterUtils
+ .readOggChaptersFromMediaDownloadUrl(media
+ .getItem());
+ }
if (media.getItem().getChapters() != null
&& !interrupted()) {
sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD,
@@ -1274,9 +1279,10 @@ public class PlaybackService extends Service {
return INVALID_TIME;
}
}
-
+
private void setCurrentlyPlayingMedia(long id) {
- SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit();
+ SharedPreferences.Editor editor = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
editor.putLong(PREF_CURRENTLY_PLAYING_MEDIA, id);
editor.commit();
}
diff --git a/src/de/danoeh/antennapod/service/download/DownloadService.java b/src/de/danoeh/antennapod/service/download/DownloadService.java
index e2709d141..6da651838 100644
--- a/src/de/danoeh/antennapod/service/download/DownloadService.java
+++ b/src/de/danoeh/antennapod/service/download/DownloadService.java
@@ -632,7 +632,8 @@ public class DownloadService extends Service {
return false;
}
if (item.getPubDate() == null) {
- Log.e(TAG, "Item has no pubDate. Using current time as pubDate");
+ Log.e(TAG,
+ "Item has no pubDate. Using current time as pubDate");
if (item.getTitle() != null) {
Log.e(TAG, "Title of invalid item: " + item.getTitle());
}
@@ -720,6 +721,10 @@ public class DownloadService extends Service {
if (media.getItem().getChapters() == null) {
ChapterUtils.readID3ChaptersFromFeedMediaFileUrl(media
.getItem());
+ if (media.getItem().getChapters() == null) {
+ ChapterUtils.readOggChaptersFromMediaFileUrl(media
+ .getItem());
+ }
if (media.getItem().getChapters() != null) {
chaptersRead = true;
}
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++) {