filebot/source/net/filebot/MediaTypes.java

119 lines
3.4 KiB
Java
Raw Normal View History

2014-04-19 02:30:29 -04:00
package net.filebot;
import static java.util.Collections.*;
2014-04-19 02:30:29 -04:00
import static net.filebot.util.XPathUtilities.*;
import java.util.ArrayList;
2011-10-29 16:19:53 -04:00
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
2011-10-29 16:19:53 -04:00
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.parsers.DocumentBuilderFactory;
2014-04-19 02:30:29 -04:00
import net.filebot.util.FileUtilities.ExtensionFileFilter;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public class MediaTypes {
2014-04-16 13:23:25 -04:00
private static MediaTypes defaultInstance;
public static synchronized MediaTypes getDefault() {
if (defaultInstance == null) {
defaultInstance = parseDefault();
}
return defaultInstance;
}
private static MediaTypes parseDefault() {
try {
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(MediaTypes.class.getResourceAsStream("media.types"));
Map<String, List<String>> types = new LinkedHashMap<String, List<String>>();
for (Node it : getChildren("type", dom.getFirstChild())) {
List<String> extensions = new ArrayList<String>(2);
for (Node ie : getChildren("extension", it)) {
extensions.add(getTextContent(ie));
}
types.put(getAttribute("name", it), extensions);
}
return new MediaTypes(types);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private Map<String, List<String>> types;
2011-10-29 16:19:53 -04:00
private Map<String, ExtensionFileFilter> filters = synchronizedMap(new HashMap<String, ExtensionFileFilter>());
public MediaTypes(Map<String, List<String>> types) {
this.types = types;
}
public List<String> getExtensionList(String name) {
List<String> list = new ArrayList<String>();
for (Entry<String, List<String>> type : types.entrySet()) {
if (type.getKey().startsWith(name)) {
list.addAll(type.getValue());
}
}
return list;
}
public ExtensionFileFilter getFilter(String name) {
2011-10-29 16:19:53 -04:00
ExtensionFileFilter filter = filters.get(name);
2011-10-29 16:19:53 -04:00
if (filter == null) {
filter = new ExtensionFileFilter(getExtensionList(name));
filters.put(name, filter);
}
2011-10-29 16:19:53 -04:00
return filter;
}
public Map<String, List<String>> getTypes() {
return types;
}
public String getMediaType(String extension) {
for (Entry<String, List<String>> it : getTypes().entrySet()) {
if (it.getValue().contains(extension)) {
return it.getKey();
}
}
return null;
}
public static ExtensionFileFilter getDefaultFilter(String name) {
2014-04-16 13:23:25 -04:00
return getDefault().getFilter(name);
}
public static ExtensionFileFilter combineFilter(ExtensionFileFilter... filters) {
List<String> extensions = new ArrayList<String>();
for (ExtensionFileFilter it : filters) {
if (!it.acceptAny()) {
addAll(extensions, it.extensions());
}
}
return new ExtensionFileFilter(extensions);
}
// some convenience filters
public static final ExtensionFileFilter AUDIO_FILES = getDefaultFilter("audio");
public static final ExtensionFileFilter VIDEO_FILES = getDefaultFilter("video");
public static final ExtensionFileFilter SUBTITLE_FILES = getDefaultFilter("subtitle");
2014-04-16 13:23:25 -04:00
public static final ExtensionFileFilter ARCHIVE_FILES = getDefaultFilter("archive");
public static final ExtensionFileFilter VERIFICATION_FILES = getDefaultFilter("verification");
public static final ExtensionFileFilter NFO_FILES = getDefaultFilter("application/nfo");
public static final ExtensionFileFilter LIST_FILES = getDefaultFilter("application/list");
public static final ExtensionFileFilter TORRENT_FILES = getDefaultFilter("application/torrent");
}