Compare commits

..

No commits in common. "4df2f55922c09cd6b11cc5d63abfb74ccba3be5a" and "0bdf5d614d6e0d2ca2a58b26ed240ee71cd5798c" have entirely different histories.

6 changed files with 84 additions and 212 deletions

View File

@ -73,11 +73,6 @@
<version>1.1.4</version>
<classifier>module</classifier>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
<name>MusicSearcher</name>
</project>

View File

@ -19,7 +19,6 @@ import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import moe.nekojimi.musicsearcher.providers.MetaSearcher;
import moe.nekojimi.musicsearcher.providers.Searcher;
/**
@ -36,31 +35,39 @@ public class Main
public static void main(String[] args) throws IOException
{
// System.out.println("Hello world!");
System.out.println(searchers);
String query = "eminem lose yourself";
MetaSearcher metaSearch = MetaSearcher.loadYAML(new File("searchproviders.yml"));
YamlInput input = Yaml.createYamlInput(new File("searchproviders.yml"));
YamlSequence seq = input.readYamlSequence();
for (int i = 0; i < seq.size(); i++)
{
try
{
List<Result> results = metaSearch.searchAndWait(Query.fullText(query));
// for (Searcher searcher: searchers.values())
// {
// System.out.println("Searching " + searcher.getName() + " for " + query);
// try
// {
// List<Result> results = searcher.searchAndWait(Query.fullText(query));
for (Result result : results)
System.out.println("\t" + result);
// } catch (InterruptedException | ExecutionException ex) {
// Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
// }
// }
} catch (ExecutionException | InterruptedException ex)
{
YamlMapping map = seq.yamlMapping(i);
String type = map.string("type");
Class<? extends Searcher> clazz = (Class<? extends Searcher>) Class.forName("moe.nekojimi.musicsearcher.providers." + type);
Constructor<? extends Searcher> constructor = clazz.getConstructor(YamlMapping.class);
Searcher searcher = constructor.newInstance(map);
searchers.put(searcher.getName(), searcher);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println(searchers);
String query = "everybodys circulation";
for (Searcher searcher: searchers.values())
{
System.out.println("Searching " + searcher.getName() + " for " + query);
try
{
List<Result> results = searcher.searchAndWait(Query.fullText(query));
for (Result result: results)
{
System.out.println("\t" + result);
}
} catch (InterruptedException | ExecutionException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}

View File

@ -11,18 +11,13 @@ import java.net.URL;
*
* @author jim
*/
public class Result implements Comparable<Result>
public class Result
{
private URL link;
private String artist;
private String album;
private String title;
private String sourceName;
private String sourceAbbr;
private double score;
public URL getLink() {
return link;
}
@ -55,36 +50,9 @@ public class Result implements Comparable<Result>
this.title = title;
}
public String getSourceName()
{
return sourceName;
}
public void setSource(String name, String abbr)
{
sourceName = name;
sourceAbbr = abbr;
}
public String getSourceAbbr()
{
return sourceAbbr;
}
public double getScore()
{
return score;
}
public void setScore(double score)
{
this.score = score;
}
@Override
public String toString()
{
return "Result{" + "artist=" + artist + ", album=" + album + ", title=" + title + ", sourceAbbr=" + sourceAbbr + ", score=" + score + '}';
public String toString() {
return "Result{" + "link=" + link + ", artist=" + artist + ", album=" + album + ", title=" + title + '}';
}
public void setAlbumArtist(String field)
@ -110,17 +78,9 @@ public class Result implements Comparable<Result>
else
album += word + " ";
}
}
artist = artist.trim();
album = album.trim();
}
}
@Override
public int compareTo(Result t)
{
return (int) Math.signum(score - t.score);
}
}

View File

@ -5,26 +5,11 @@
*/
package moe.nekojimi.musicsearcher.providers;
import com.amihaiemil.eoyaml.Yaml;
import com.amihaiemil.eoyaml.YamlInput;
import com.amihaiemil.eoyaml.YamlMapping;
import com.amihaiemil.eoyaml.YamlSequence;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import moe.nekojimi.musicsearcher.Main;
import moe.nekojimi.musicsearcher.Query;
import moe.nekojimi.musicsearcher.Result;
@ -39,35 +24,9 @@ public class MetaSearcher extends Searcher
private int minSearchTime = 10000; // ms
private int maxSearchTime = 30000; // ms
public MetaSearcher(Collection<Searcher> searchers)
public MetaSearcher()
{
super("meta");
this.searchers.addAll(searchers);
}
public static MetaSearcher loadYAML(File file)
{
try
{
List<Searcher> searchers = new ArrayList<>();
YamlInput input = Yaml.createYamlInput(file);
YamlSequence seq = input.readYamlSequence();
for (int i = 0; i < seq.size(); i++)
{
YamlMapping map = seq.yamlMapping(i);
String type = map.string("type");
Class<? extends Searcher> clazz = (Class<? extends Searcher>) Class.forName("moe.nekojimi.musicsearcher.providers." + type);
Constructor<? extends Searcher> constructor = clazz.getConstructor(YamlMapping.class);
Searcher searcher = constructor.newInstance(map);
searchers.add(searcher);
}
MetaSearcher metaSearch = new MetaSearcher(searchers);
return metaSearch;
} catch (IOException | ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex)
{
throw new IllegalArgumentException("Could not load MetaSearcher config from YAML file " + file.getAbsolutePath(), ex);
}
}
@Override
@ -79,26 +38,16 @@ public class MetaSearcher extends Searcher
{
CompletableFuture<List<Result>> search = searcher.search(query);
searches.add(search);
// search.whenComplete((t, u) ->
// {
// if (u == null)
// {
// results.addAll(t);
//// searches.remove(search);
// }
// });
}
// CompletableFuture.allOf((CompletableFuture<?>[]) searches.toArray());
for (CompletableFuture<List<Result>> search : searches)
try
search.whenComplete((t, u) ->
{
List<Result> result = search.get(30, TimeUnit.SECONDS);
results.addAll(result);
} catch (TimeoutException | InterruptedException | ExecutionException ex)
if (u == null)
{
Logger.getLogger(MetaSearcher.class.getName()).log(Level.SEVERE, null, ex);
results.addAll(t);
// searches.remove(search);
}
});
}
CompletableFuture.allOf((CompletableFuture<?>[]) searches.toArray());
return results;
}

View File

@ -6,10 +6,7 @@
package moe.nekojimi.musicsearcher.providers;
import com.amihaiemil.eoyaml.YamlMapping;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
@ -18,7 +15,6 @@ import java.util.concurrent.TimeoutException;
import moe.nekojimi.musicsearcher.Query;
import moe.nekojimi.musicsearcher.QueryFieldUnsupportedException;
import moe.nekojimi.musicsearcher.Result;
import org.apache.commons.lang3.StringUtils;
/**
*
@ -26,21 +22,18 @@ import org.apache.commons.lang3.StringUtils;
*/
public abstract class Searcher
{
protected final String name;
protected String abbr;
final String name;
private final ForkJoinPool executor;
public Searcher(String name)
{
this.name = name;
this.abbr = name.substring(0, 2);
this.executor = new ForkJoinPool();
}
public Searcher(YamlMapping yaml)
{
this(yaml.string("name"));
abbr = yaml.string("abbr");
assert yaml.string("type").equals(this.getClass().getSimpleName());
}
@ -68,41 +61,10 @@ public abstract class Searcher
public CompletableFuture<List<Result>> search(Query query)
{
CompletableFuture<List<Result>> future = new CompletableFuture<>();
future.completeAsync(() -> searchWrapper(query), executor);
future.completeAsync(()->doSearch(query), executor);
return future;
}
protected List<Result> searchWrapper(Query query)
{
List<Result> results = doSearch(query);
for (Result result : results)
{
double artistScore = 1;
double titleScore = 1;
double albumScore = 1;
double fullTextScore = 0;
Set<String> toCompare = new HashSet<>();
toCompare.add(result.getAlbum());
toCompare.add(result.getArtist());
toCompare.add(result.getTitle());
for (String comparison : toCompare)
{
if (comparison == null)
continue;
double score = StringUtils.getJaroWinklerDistance(query.getTextSearch(), comparison);
if (score > fullTextScore)
fullTextScore = score;
}
result.setScore(albumScore * artistScore * titleScore * fullTextScore);
}
Collections.sort(results, Collections.reverseOrder());
return results;
}
protected abstract List<Result> doSearch(Query query) throws QueryFieldUnsupportedException;
@Override

View File

@ -142,20 +142,19 @@ public class WebScraperSearcher extends Searcher
try
{
Result res = new Result();
res.setSource(name, abbr);
// Artist
if (resultArtistSelector != null)
res.setArtist(parser.getField(ele, resultArtistSelector).trim());
res.setArtist(parser.getField(ele, resultArtistSelector));
// Title
if (resultTitleSelector != null)
res.setTitle(parser.getField(ele, resultTitleSelector).trim());
res.setTitle(parser.getField(ele, resultTitleSelector));
// Link
if (resultLinkSelector != null)
res.setLink(parser.getURLField(ele, rootURL, resultLinkSelector));
// Artist + Album
if (resultAlbumArtistSelector != null)
res.setAlbumArtist(parser.getField(ele, resultAlbumArtistSelector).trim());
res.setAlbumArtist(parser.getField(ele, resultAlbumArtistSelector));
// Artist + Title