package org.limewire.ui.swing.search.model;
import java.util.EnumMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
import org.limewire.core.api.Category;
import org.limewire.core.api.FilePropertyKey;
import org.limewire.core.api.search.SearchResult;
import org.limewire.util.StringUtils;
/**
* Compares the meta data of two SearchResults to see if the results match.
*
* If there is missing meta data, the file name will be parsed to try and fill
* in the missing pieces.
*
* The keys identifying this VisualSearchResult are built by the
* getCleanIdentifyingStrings method.
*/
public class AudioMetaDataSimilarResultsDetector extends AbstractNameSimilarResultsDetector {
private static final String REPLACE = "\\(\\d*\\)|[-_. ()\\d]";
public AudioMetaDataSimilarResultsDetector() {
super(Pattern.compile(REPLACE));
}
@Override
public void detectSimilarResult(VisualSearchResult visualSearchResult) {
if (visualSearchResult.getCategory() == Category.AUDIO) {
super.detectSimilarResult(visualSearchResult);
}
}
@Override
public Set<String> getCleanIdentifyingStrings(VisualSearchResult visualSearchResult) {
Set<String> names = new HashSet<String>();
for (SearchResult searchResult : visualSearchResult.getCoreSearchResults()) {
addNames(names, searchResult);
}
return names;
}
private void addNames(Set<String> names, SearchResult searchResult) {
Map<FilePropertyKey, String> metaData = getMetadata(searchResult);
String artist = metaData.get(FilePropertyKey.AUTHOR);
String album = metaData.get(FilePropertyKey.ALBUM);
String track = metaData.get(FilePropertyKey.TITLE);
if (!StringUtils.isEmpty(track)) {
if (!StringUtils.isEmpty(artist)) {
String artistTrack = metaData.get(FilePropertyKey.AUTHOR) + "-"
+ metaData.get(FilePropertyKey.TITLE);
names.add(artistTrack);
if (!StringUtils.isEmpty(album)) {
String artistAlbumTrack = metaData.get(FilePropertyKey.AUTHOR) + "-"
+ metaData.get(FilePropertyKey.ALBUM) + "-"
+ metaData.get(FilePropertyKey.TITLE);
names.add(artistAlbumTrack);
}
}
if (!StringUtils.isEmpty(album)) {
String albumTrack = metaData.get(FilePropertyKey.ALBUM) + "-"
+ metaData.get(FilePropertyKey.TITLE);
names.add(albumTrack);
}
}
}
private Map<FilePropertyKey, String> getMetadata(SearchResult result) {
String name = result.getProperty(FilePropertyKey.NAME).toString();
Map<FilePropertyKey, String> metadataCopy = new EnumMap<FilePropertyKey, String>(FilePropertyKey.class);
copyProperty(result, metadataCopy, FilePropertyKey.TITLE);
copyProperty(result, metadataCopy, FilePropertyKey.ALBUM);
copyProperty(result, metadataCopy, FilePropertyKey.AUTHOR);
StringTokenizer st = new StringTokenizer(name, "-");
Stack<String> nameParts = new Stack<String>();
while (st.hasMoreElements()) {
String part = st.nextToken().trim();
nameParts.push(part);
}
if (!nameParts.empty()) {
String trackName = nameParts.pop();
if (StringUtils.isEmpty(metadataCopy.get(FilePropertyKey.TITLE))) {
metadataCopy.put(FilePropertyKey.TITLE, trackName);
}
if (!nameParts.empty()) {
String albumOrArtist = nameParts.pop();
if (StringUtils.isEmpty(metadataCopy.get(FilePropertyKey.ALBUM))) {
metadataCopy.put(FilePropertyKey.ALBUM, albumOrArtist);
}
if (!nameParts.empty()) {
String artist = nameParts.pop();
if (StringUtils.isEmpty(metadataCopy.get(FilePropertyKey.AUTHOR))) {
metadataCopy.put(FilePropertyKey.AUTHOR, artist);
}
}
}
}
cleanProperty(metadataCopy, FilePropertyKey.TITLE);
cleanProperty(metadataCopy, FilePropertyKey.ALBUM);
cleanProperty(metadataCopy, FilePropertyKey.AUTHOR);
return metadataCopy;
}
private void copyProperty(SearchResult result,
Map<FilePropertyKey, String> metadataCopy, FilePropertyKey propertyKey) {
metadataCopy.put(propertyKey, result.getProperty(propertyKey) == null ? "" : result
.getProperty(propertyKey).toString());
}
private void cleanProperty(Map<FilePropertyKey, String> metadataCopy,
FilePropertyKey propertyKey) {
String cleanedProperty = getNameCache().getCleanString(metadataCopy.get(propertyKey));
metadataCopy.put(propertyKey, cleanedProperty);
}
}