From 7d44a549bca89e320b1e2b2bd6b8ac22aee2de5b Mon Sep 17 00:00:00 2001 From: daniel oeh Date: Sun, 13 Jan 2013 21:22:23 +0100 Subject: FeedManager now checks if episode file exists before playing. --- src/de/danoeh/antennapod/feed/FeedManager.java | 79 +++++++++++++++++----- .../util/exception/MediaFileNotFoundException.java | 23 +++++++ 2 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 src/de/danoeh/antennapod/util/exception/MediaFileNotFoundException.java diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java index 855316d81..597936e5a 100644 --- a/src/de/danoeh/antennapod/feed/FeedManager.java +++ b/src/de/danoeh/antennapod/feed/FeedManager.java @@ -30,6 +30,7 @@ import de.danoeh.antennapod.util.FeedtitleComparator; import de.danoeh.antennapod.util.comparator.DownloadStatusComparator; import de.danoeh.antennapod.util.comparator.FeedItemPubdateComparator; import de.danoeh.antennapod.util.comparator.PlaybackCompletionDateComparator; +import de.danoeh.antennapod.util.exception.MediaFileNotFoundException; /** * Singleton class Manages all feeds, categories and feeditems @@ -121,21 +122,50 @@ public class FeedManager { */ public void playMedia(Context context, FeedMedia media, boolean showPlayer, boolean startWhenPrepared, boolean shouldStream) { - // Start playback Service - Intent launchIntent = new Intent(context, PlaybackService.class); - launchIntent.putExtra(PlaybackService.EXTRA_MEDIA_ID, media.getId()); - launchIntent.putExtra(PlaybackService.EXTRA_FEED_ID, media.getItem() - .getFeed().getId()); - launchIntent.putExtra(PlaybackService.EXTRA_START_WHEN_PREPARED, - startWhenPrepared); - launchIntent - .putExtra(PlaybackService.EXTRA_SHOULD_STREAM, shouldStream); - launchIntent.putExtra(PlaybackService.EXTRA_PREPARE_IMMEDIATELY, true); - context.startService(launchIntent); - if (showPlayer) { - // Launch Mediaplayer - context.startActivity(PlaybackService.getPlayerActivityIntent( - context, media)); + try { + if (!shouldStream) { + if (media.getFile_url() == null) { + throw new MediaFileNotFoundException("Feed URL was null", + media); + } else { + File f = new File(media.getFile_url()); + if (!f.exists() || !f.canRead()) { + throw new MediaFileNotFoundException( + "No episode was found at " + + media.getFile_url(), media); + } + } + + } + // Start playback Service + Intent launchIntent = new Intent(context, PlaybackService.class); + launchIntent + .putExtra(PlaybackService.EXTRA_MEDIA_ID, media.getId()); + launchIntent.putExtra(PlaybackService.EXTRA_FEED_ID, media + .getItem().getFeed().getId()); + launchIntent.putExtra(PlaybackService.EXTRA_START_WHEN_PREPARED, + startWhenPrepared); + launchIntent.putExtra(PlaybackService.EXTRA_SHOULD_STREAM, + shouldStream); + launchIntent.putExtra(PlaybackService.EXTRA_PREPARE_IMMEDIATELY, + true); + context.startService(launchIntent); + if (showPlayer) { + // Launch Mediaplayer + context.startActivity(PlaybackService.getPlayerActivityIntent( + context, media)); + } + } catch (MediaFileNotFoundException e) { + e.printStackTrace(); + SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(context); + final long lastPlayedId = prefs.getLong( + PlaybackService.PREF_LAST_PLAYED_ID, -1); + if (lastPlayedId == media.getId()) { + context.sendBroadcast(new Intent( + PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE)); + } + notifyMissingFeedMediaFile(context, media); } } @@ -503,6 +533,19 @@ public class FeedManager { } } + /** + * Notifies the feed manager that a downloaded episode doesn't exist + * anymore. It will update the values of the FeedMedia object accordingly. + */ + public void notifyMissingFeedMediaFile(Context context, FeedMedia media) { + Log.i(TAG, + "The feedmanager was notified about a missing episode. It will update its database now."); + media.setDownloaded(false); + media.setFile_url(null); + setFeedMedia(context, media); + sendFeedUpdateBroadcast(context); + } + public void refreshFeed(Context context, Feed feed) throws DownloadRequestException { requester.downloadFeed(context, new Feed(feed.getDownload_url(), @@ -926,10 +969,10 @@ public class FeedManager { }); } - + /** - * Updates Information of an existing Feed and its FeedItems. Creates and opens its own - * adapter. + * Updates Information of an existing Feed and its FeedItems. Creates and + * opens its own adapter. */ public void setCompleteFeed(final Context context, final Feed feed) { dbExec.execute(new Runnable() { diff --git a/src/de/danoeh/antennapod/util/exception/MediaFileNotFoundException.java b/src/de/danoeh/antennapod/util/exception/MediaFileNotFoundException.java new file mode 100644 index 000000000..4586cea87 --- /dev/null +++ b/src/de/danoeh/antennapod/util/exception/MediaFileNotFoundException.java @@ -0,0 +1,23 @@ +package de.danoeh.antennapod.util.exception; + +import de.danoeh.antennapod.feed.FeedMedia; + +public class MediaFileNotFoundException extends Exception { + private static final long serialVersionUID = 1L; + + private FeedMedia media; + + public MediaFileNotFoundException(String msg, FeedMedia media) { + super(msg); + this.media = media; + } + + public MediaFileNotFoundException(FeedMedia media) { + super(); + this.media = media; + } + + public FeedMedia getMedia() { + return media; + } +} -- cgit v1.2.3