package tim.prune.load;
import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
-import tim.prune.data.AudioFile;
-import tim.prune.data.MediaFile;
-import tim.prune.data.MediaList;
+import tim.prune.data.AudioClip;
+import tim.prune.data.MediaObject;
import tim.prune.data.Photo;
-import tim.prune.data.Track;
/**
* Class to provide helper functions for loading media
/** File filters */
private static GenericFileFilter _jpegFilter = null, _audioFilter = null;
+
/**
- * Construct a MediaFile object for the given path
- * @param inPath path to file
- * @return either Photo or AudioFile object as appropriate, or null
+ * Construct a MediaObject for the given path
+ * @param inZipFile path to archive file (if any)
+ * @param inPath path to media file
+ * @param inSourceFile file from which data was loaded
+ * @return either Photo or AudioClip object as appropriate, or null
*/
- public static MediaFile createMediaFile(String inPath)
+ public static MediaObject createMediaObject(File inZipFile, String inPath, File inSourceFile)
{
- if (inPath == null) {return null;}
+ if (inPath == null || inPath.length() < 5) return null;
+ InputStream is = null;
+ ZipFile zf = null;
+ byte[] data = null;
+ String url = null;
+ try
+ {
+ // Check if path is a URL, in which case get an input stream from it
+ if (inPath.substring(0, 5).toLowerCase().equals("http:"))
+ {
+ url = inPath;
+ is = new URL(inPath).openStream();
+ data = ByteScooper.scoop(is);
+ }
+ }
+ catch (IOException ioe) {
+ System.err.println("Got ioe from url: " + ioe.getMessage());
+ } // is stays null
+
+ // Now see if file is in the zip file
+ if (is == null && inZipFile != null && inZipFile.exists() && inZipFile.canRead())
+ {
+ try
+ {
+ zf = new ZipFile(inZipFile);
+ ZipEntry entry = zf.getEntry(inPath);
+ if (entry != null && entry.getSize() > 0)
+ {
+ data = ByteScooper.scoop(zf.getInputStream(entry));
+ // System.out.println("Size of data " + (data.length == entry.getSize()?"matches":"DOESN'T match"));
+ }
+ }
+ catch (IOException ioe) {
+ System.err.println("Got ioe from zip file: " + ioe.getMessage());
+ }
+ }
+ // Clean up input streams
+ if (is != null) try {
+ is.close();
+ } catch (IOException ioe) {}
+ if (zf != null) try {
+ zf.close();
+ } catch (IOException ioe) {}
+
+ if (data != null)
+ {
+ // Create Photo or AudioClip using this entry
+ String filename = new File(inPath).getName();
+ initFilters();
+ if (_jpegFilter.acceptFilename(inPath)) {
+ return new Photo(data, filename, url);
+ }
+ else if (_audioFilter.acceptFilename(inPath)) {
+ return new AudioClip(data, filename, url);
+ }
+ return null;
+ }
+
+ // If we haven't got a result by now, try to load plain file
File file = new File(inPath);
- if (!file.exists() || !file.canRead() || !file.isFile()) {return null;}
- // Initialise filters if necessary
- if (_jpegFilter == null) {
- _jpegFilter = new JpegFileFilter();
- _audioFilter = new AudioFileFilter();
+ if (inSourceFile != null && !file.isAbsolute()) {
+ file = new File(inSourceFile.getParent(), inPath);
}
+ // awkward construction because new File(startPath, absolutePath) doesn't work
+ return createMediaObject(file);
+ }
+
+ /**
+ * Construct a MediaObject for the given file
+ * @param inFile file to load
+ * @return either Photo or AudioClip object as appropriate, or null
+ */
+ private static MediaObject createMediaObject(File inFile)
+ {
+ if (inFile == null) {return null;}
+ if (!inFile.exists() || !inFile.canRead() || !inFile.isFile()) {return null;}
+ initFilters();
// Check if filename looks like a jpeg
- if (_jpegFilter.acceptFilename(file.getName())) {
- return JpegLoader.createPhoto(file);
+ if (_jpegFilter.acceptFilename(inFile.getName())) {
+ return JpegLoader.createPhoto(inFile);
}
- // Check if filename looks like an audio file
- if (_audioFilter.acceptFilename(file.getName())) {
- return new AudioFile(file);
+ // Check if filename looks like an audio clip
+ if (_audioFilter.acceptFilename(inFile.getName())) {
+ return new AudioClip(inFile);
}
// Neither photo nor audio
return null;
}
/**
- * Add all the media from the given track into the specified list
- * @param inTrack track from which media to take
- * @param inMediaList list to which media should be added
- * @param inMediaClass class of media, either Photo or AudioFile
+ * Initialise filters if necessary
*/
- public static void addMediaFromTrack(Track inTrack, MediaList inMediaList,
- Class<?> inMediaClass)
+ private static void initFilters()
{
- final int numPoints = inTrack.getNumPoints();
- for (int i=0; i<numPoints; i++)
- {
- MediaFile media = null;
- if (inMediaClass == Photo.class) {
- media = inTrack.getPoint(i).getPhoto();
- }
- else if (inMediaClass == AudioFile.class) {
- media = inTrack.getPoint(i).getAudio();
- }
- if (media != null) {
- inMediaList.addMedia(media);
- }
+ if (_jpegFilter == null) {
+ _jpegFilter = new JpegFileFilter();
+ _audioFilter = new AudioFileFilter();
}
}
}