diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2013-02-27 22:05:13 +0100 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2013-02-27 22:05:13 +0100 |
commit | dcbf334bad1533debe0141812b3efabbde8d7d18 (patch) | |
tree | 10f8cec67267c8505abe851e3c3d748d26814e0a /src/de/danoeh/antennapod/util/playback | |
parent | cc741d66434f72d22c2952785daff28369d0ef9b (diff) | |
download | AntennaPod-dcbf334bad1533debe0141812b3efabbde8d7d18.zip |
Added support for playing local external media files
Diffstat (limited to 'src/de/danoeh/antennapod/util/playback')
-rw-r--r-- | src/de/danoeh/antennapod/util/playback/ExternalMedia.java | 238 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/util/playback/Playable.java | 8 |
2 files changed, 246 insertions, 0 deletions
diff --git a/src/de/danoeh/antennapod/util/playback/ExternalMedia.java b/src/de/danoeh/antennapod/util/playback/ExternalMedia.java new file mode 100644 index 000000000..4446d1221 --- /dev/null +++ b/src/de/danoeh/antennapod/util/playback/ExternalMedia.java @@ -0,0 +1,238 @@ +package de.danoeh.antennapod.util.playback; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; + +import org.apache.commons.io.IOUtils; + +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.media.MediaMetadataRetriever; +import android.os.Parcel; +import android.os.Parcelable; +import de.danoeh.antennapod.PodcastApp; +import de.danoeh.antennapod.feed.Chapter; +import de.danoeh.antennapod.feed.MediaType; +import de.danoeh.antennapod.util.ChapterUtils; +import de.danoeh.antennapod.util.FileNameGenerator; + +/** Represents a media file that is stored on the local storage device. */ +public class ExternalMedia implements Playable { + + public static final int PLAYABLE_TYPE_EXTERNAL_MEDIA = 2; + public static final String PREF_SOURCE_URL = "ExternalMedia.PrefSourceUrl"; + public static final String PREF_POSITION = "ExternalMedia.PrefPosition"; + public static final String PREF_MEDIA_TYPE = "ExternalMedia.PrefMediaType"; + + private String source; + + private String episodeTitle; + private String feedTitle; + private String shownotes; + private MediaType mediaType = MediaType.AUDIO; + private List<Chapter> chapters; + private String imageUrl; + private int duration; + private int position; + + public ExternalMedia(String source, MediaType mediaType) { + super(); + this.source = source; + this.mediaType = mediaType; + } + + public ExternalMedia(String source, MediaType mediaType, int position) { + this(source, mediaType); + this.position = position; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(source); + dest.writeString(mediaType.toString()); + dest.writeInt(position); + } + + @Override + public void writeToPreferences(Editor prefEditor) { + prefEditor.putString(PREF_SOURCE_URL, source); + prefEditor.putString(PREF_MEDIA_TYPE, mediaType.toString()); + prefEditor.putInt(PREF_POSITION, position); + } + + @Override + public void loadMetadata() throws PlayableException { + MediaMetadataRetriever mmr = new MediaMetadataRetriever(); + try { + mmr.setDataSource(source); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + throw new PlayableException("IllegalArgumentException when setting up MediaMetadataReceiver"); + } + episodeTitle = mmr + .extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); + feedTitle = mmr + .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); + duration = Integer.parseInt(mmr + .extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); + ChapterUtils.loadChaptersFromFileUrl(this); + byte[] imgData = mmr.getEmbeddedPicture(); + File cacheDir = PodcastApp.getInstance().getExternalCacheDir(); + if (cacheDir != null) { + OutputStream out = null; + try { + File tmpFile = File.createTempFile( + FileNameGenerator.generateFileName(source) + "-img", + null, cacheDir); + out = new BufferedOutputStream(new FileOutputStream(tmpFile)); + IOUtils.write(imgData, out); + imageUrl = tmpFile.getAbsolutePath(); + } catch (IOException e) { + e.printStackTrace(); + throw new PlayableException("IOException during loadMetadata()"); + } finally { + IOUtils.closeQuietly(out); + } + } + } + + @Override + public String getEpisodeTitle() { + return episodeTitle; + } + + @Override + public void loadShownotes(ShownoteLoaderCallback callback) { + callback.onShownotesLoaded(null); + } + + @Override + public List<Chapter> getChapters() { + return chapters; + } + + @Override + public String getWebsiteLink() { + return null; + } + + @Override + public String getPaymentLink() { + return null; + } + + @Override + public String getFeedTitle() { + return feedTitle; + } + + @Override + public String getImageFileUrl() { + return imageUrl; + } + + @Override + public Object getIdentifier() { + return source; + } + + @Override + public int getDuration() { + return duration; + } + + @Override + public int getPosition() { + return position; + } + + @Override + public MediaType getMediaType() { + return mediaType; + } + + @Override + public String getFileUrl() { + return source; + } + + @Override + public String getStreamUrl() { + return null; + } + + @Override + public boolean localFileAvailable() { + return true; + } + + @Override + public boolean streamAvailable() { + return false; + } + + @Override + public void saveCurrentPosition(SharedPreferences pref, int newPosition) { + SharedPreferences.Editor editor = pref.edit(); + editor.putInt(PREF_POSITION, newPosition); + position = newPosition; + editor.commit(); + } + + @Override + public void setPosition(int newPosition) { + position = newPosition; + } + + @Override + public void setDuration(int newDuration) { + duration = newDuration; + } + + @Override + public void onPlaybackStart() { + + } + + @Override + public void onPlaybackCompleted() { + + } + + @Override + public int getPlayableType() { + return PLAYABLE_TYPE_EXTERNAL_MEDIA; + } + + @Override + public void setChapters(List<Chapter> chapters) { + this.chapters = chapters; + } + + public static final Parcelable.Creator<ExternalMedia> CREATOR = new Parcelable.Creator<ExternalMedia>() { + public ExternalMedia createFromParcel(Parcel in) { + String source = in.readString(); + MediaType type = MediaType.valueOf(in.readString()); + int position = 0; + if (in.dataAvail() > 0) { + position = in.readInt(); + } + ExternalMedia extMedia = new ExternalMedia(source, type, position); + return extMedia; + } + + public ExternalMedia[] newArray(int size) { + return new ExternalMedia[size]; + } + }; + +} diff --git a/src/de/danoeh/antennapod/util/playback/Playable.java b/src/de/danoeh/antennapod/util/playback/Playable.java index 67acbb692..c92b3cfef 100644 --- a/src/de/danoeh/antennapod/util/playback/Playable.java +++ b/src/de/danoeh/antennapod/util/playback/Playable.java @@ -150,6 +150,14 @@ public interface Playable extends Parcelable { } } break; + case ExternalMedia.PLAYABLE_TYPE_EXTERNAL_MEDIA: + String source = pref.getString(ExternalMedia.PREF_SOURCE_URL, null); + String mediaType = pref.getString(ExternalMedia.PREF_MEDIA_TYPE, null); + if (source != null && mediaType != null) { + int position = pref.getInt(ExternalMedia.PREF_POSITION, 0); + return new ExternalMedia(source,MediaType.valueOf(mediaType), position); + } + break; } Log.e(TAG, "Could not restore Playable object from preferences"); return null; |