X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fload%2FMediaHelper.java;fp=src%2Ftim%2Fprune%2Fload%2FMediaHelper.java;h=ab4f366d820967c67674e916c15985cddc5debb2;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/load/MediaHelper.java b/src/tim/prune/load/MediaHelper.java new file mode 100644 index 0000000..ab4f366 --- /dev/null +++ b/src/tim/prune/load/MediaHelper.java @@ -0,0 +1,131 @@ +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.AudioClip; +import tim.prune.data.MediaObject; +import tim.prune.data.Photo; + +/** + * Class to provide helper functions for loading media + */ +public abstract class MediaHelper +{ + /** File filters */ + private static GenericFileFilter _jpegFilter = null, _audioFilter = 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 MediaObject createMediaObject(File inZipFile, String inPath, File inSourceFile) + { + 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 (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(inFile.getName())) { + return JpegLoader.createPhoto(inFile); + } + // Check if filename looks like an audio clip + if (_audioFilter.acceptFilename(inFile.getName())) { + return new AudioClip(inFile); + } + // Neither photo nor audio + return null; + } + + /** + * Initialise filters if necessary + */ + private static void initFilters() + { + if (_jpegFilter == null) { + _jpegFilter = new JpegFileFilter(); + _audioFilter = new AudioFileFilter(); + } + } +}