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 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 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 chapters) { this.chapters = chapters; } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 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]; } }; }