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(); } } }