/**
* ======================== legal notice ======================
*
* File: MediaFactory.java
* Created: 13. June 2012, 04:57
* Author: Geronimo
* Project: cmpc - a java frontend (client) part of compound media player
* uses external players to play the media
*
* CMP - compound media player
*
* is a client/server mediaplayer intended to play any media from any workstation
* without the need to export or mount shares. cmps is an easy to use backend
* with a (ready to use) HTML-interface. Additionally the backend supports
* authentication via HTTP-digest authorization.
* cmpc is a client with vdr-like osd-menues.
*
* Copyright (c) 2012 Reinhard Mantey, some rights reserved!
* published under Creative Commons by-sa
* For details see http://creativecommons.org/licenses/by-sa/3.0/
*
* The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
*
* --------------------------------------------------------------
*/
package de.schwarzrot.media.service;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import de.schwarzrot.media.domain.AbstractMediaNode;
import de.schwarzrot.media.domain.Audio;
import de.schwarzrot.media.domain.DVDImage;
import de.schwarzrot.media.domain.Genre;
import de.schwarzrot.media.domain.LegacyVdrRecording;
import de.schwarzrot.media.domain.Media;
import de.schwarzrot.media.domain.Movie;
import de.schwarzrot.media.domain.Picture;
import de.schwarzrot.media.domain.VdrRecording;
public class MediaFactory {
public MediaFactory(File baseDir) {
this.baseDir = baseDir;
prefix = baseDir.getAbsolutePath();
mediaCache = new HashMap();
mediaCache.put(baseDir, new Genre(baseDir));
}
//TODO:
// here we can't rely on file system information.
// may be we got files from remote system ...
// so instead to use lookahead for multifile movies, we need to go back
// from keyfiles
public Media createMedia(File mayBeMedia) {
if (!mayBeMedia.getAbsolutePath().startsWith(prefix))
return null;
String xt = mayBeMedia.getName().substring(mayBeMedia.getName().lastIndexOf(".") + 1);
Genre parent = null;
Media rv = null;
if (VdrRecording.isKeyFile(mayBeMedia)) {
parent = getGenre(mayBeMedia.getParentFile().getParentFile().getParentFile());
rv = new VdrRecording(parent, mayBeMedia.getParentFile());
} else if (LegacyVdrRecording.isKeyFile(mayBeMedia)) {
parent = getGenre(mayBeMedia.getParentFile().getParentFile().getParentFile());
rv = new LegacyVdrRecording(parent, mayBeMedia.getParentFile());
} else if (DVDImage.isKeyFile(mayBeMedia)) {
parent = getGenre(mayBeMedia.getParentFile().getParentFile().getParentFile());
rv = new DVDImage(parent, mayBeMedia.getParentFile().getParentFile());
} else if (Movie.isSupportedExtension(xt)) {
parent = getGenre(mayBeMedia.getParentFile());
rv = new Movie(parent, mayBeMedia, Movie.getContentType(xt));
} else if (Audio.isSupportedExtension(xt)) {
parent = getGenre(mayBeMedia.getParentFile());
rv = new Audio(parent, mayBeMedia, Audio.getContentType(xt));
} else if (Picture.isSupportedExtension(xt)) {
parent = getGenre(mayBeMedia.getParentFile());
rv = new Picture(parent, mayBeMedia, Picture.getContentType(xt));
}
if (rv != null)
mediaCache.put(mayBeMedia, rv);
return rv;
}
public Map getCache() {
return mediaCache;
}
public Genre getGenre(File mayBeGenre) {
if (!mayBeGenre.isDirectory())
return null;
if (!mediaCache.containsKey(mayBeGenre))
createGenre(mayBeGenre);
AbstractMediaNode rv = mediaCache.get(mayBeGenre);
if (rv instanceof Genre)
return (Genre) rv;
return null;
}
protected void createGenre(File shouldBeGenre) {
File tmp = shouldBeGenre;
Stack unknownGenres = new Stack();
while (tmp != null && !mediaCache.containsKey(tmp)) {
unknownGenres.push(tmp);
tmp = tmp.getParentFile();
}
AbstractMediaNode node = mediaCache.get(tmp != null ? tmp : baseDir);
Genre g = null;
if (node != null && node instanceof Genre)
g = (Genre) node;
while (unknownGenres.size() > 0) {
tmp = unknownGenres.pop();
g = new Genre(g, tmp);
mediaCache.put(tmp, g);
}
}
private Map mediaCache;
private File baseDir;
private String prefix;
}