mirror of
https://github.com/mitb-archive/filebot
synced 2024-12-23 16:28:51 -05:00
* improved various hashCode() methods
* removed unnecessary synchronized locks * refactoring
This commit is contained in:
parent
c81cd50fc9
commit
c4ce1aebe7
@ -225,7 +225,7 @@ public class EpisodeFormatBindingBean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private synchronized MediaInfo getMediaInfo() {
|
private MediaInfo getMediaInfo() {
|
||||||
if (mediaInfo == null) {
|
if (mediaInfo == null) {
|
||||||
// make sure media file is defined
|
// make sure media file is defined
|
||||||
checkMediaFile();
|
checkMediaFile();
|
||||||
|
@ -2,12 +2,15 @@
|
|||||||
package net.sourceforge.filebot.similarity;
|
package net.sourceforge.filebot.similarity;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
|
||||||
public class Match<Value, Candidate> {
|
public class Match<Value, Candidate> {
|
||||||
|
|
||||||
private final Value value;
|
private final Value value;
|
||||||
private final Candidate candidate;
|
private final Candidate candidate;
|
||||||
|
|
||||||
|
|
||||||
public Match(Value value, Candidate candidate) {
|
public Match(Value value, Candidate candidate) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.candidate = candidate;
|
this.candidate = candidate;
|
||||||
@ -49,7 +52,7 @@ public class Match<Value, Candidate> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return (value == null ? 0 : value.hashCode()) ^ (candidate == null ? 0 : candidate.hashCode());
|
return Arrays.hashCode(new Object[] { value, candidate });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package net.sourceforge.filebot.similarity;
|
|||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -104,7 +105,7 @@ public class SeasonEpisodeMatcher {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return season ^ episode;
|
return Arrays.hashCode(new Object[] { season, episode });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import static net.sourceforge.tuned.StringUtilities.*;
|
|||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.EnumMap;
|
||||||
import java.util.InputMismatchException;
|
import java.util.InputMismatchException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
@ -18,7 +18,7 @@ public class SubStationAlphaReader extends SubtitleReader {
|
|||||||
private final DateFormat timeFormat = new SubtitleTimeFormat();
|
private final DateFormat timeFormat = new SubtitleTimeFormat();
|
||||||
private final Pattern newline = Pattern.compile(Pattern.quote("\\n"), Pattern.CASE_INSENSITIVE);
|
private final Pattern newline = Pattern.compile(Pattern.quote("\\n"), Pattern.CASE_INSENSITIVE);
|
||||||
|
|
||||||
private Map<String, Integer> format;
|
private Map<EventProperty, Integer> format;
|
||||||
|
|
||||||
|
|
||||||
public SubStationAlphaReader(Scanner scanner) {
|
public SubStationAlphaReader(Scanner scanner) {
|
||||||
@ -37,10 +37,14 @@ public class SubStationAlphaReader extends SubtitleReader {
|
|||||||
String[] columns = event[1].split(",");
|
String[] columns = event[1].split(",");
|
||||||
|
|
||||||
// map column name to column index
|
// map column name to column index
|
||||||
format = new HashMap<String, Integer>(columns.length);
|
format = new EnumMap<EventProperty, Integer>(EventProperty.class);
|
||||||
|
|
||||||
for (int i = 0; i < columns.length; i++) {
|
for (int i = 0; i < columns.length; i++) {
|
||||||
format.put(columns[i].trim(), i);
|
try {
|
||||||
|
format.put(EventProperty.valueOf(columns[i].trim()), i);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,11 +75,11 @@ public class SubStationAlphaReader extends SubtitleReader {
|
|||||||
throw new InputMismatchException("Illegal dialogue event: " + Arrays.toString(event));
|
throw new InputMismatchException("Illegal dialogue event: " + Arrays.toString(event));
|
||||||
|
|
||||||
// extract information
|
// extract information
|
||||||
String[] row = event[1].split(",", format.size());
|
String[] values = event[1].split(",", format.size());
|
||||||
|
|
||||||
long start = timeFormat.parse(row[format.get("Start")]).getTime();
|
long start = timeFormat.parse(values[format.get(EventProperty.Start)]).getTime();
|
||||||
long end = timeFormat.parse(row[format.get("End")]).getTime();
|
long end = timeFormat.parse(values[format.get(EventProperty.End)]).getTime();
|
||||||
String text = row[format.get("Text")].trim();
|
String text = values[format.get(EventProperty.Text)].trim();
|
||||||
|
|
||||||
// translate "\\n" to new lines
|
// translate "\\n" to new lines
|
||||||
String[] lines = newline.split(text);
|
String[] lines = newline.split(text);
|
||||||
@ -83,4 +87,18 @@ public class SubStationAlphaReader extends SubtitleReader {
|
|||||||
return new SubtitleElement(start, end, join(lines, "\n"));
|
return new SubtitleElement(start, end, join(lines, "\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private enum EventProperty {
|
||||||
|
Layer,
|
||||||
|
Start,
|
||||||
|
End,
|
||||||
|
Style,
|
||||||
|
Name,
|
||||||
|
MarginL,
|
||||||
|
MarginR,
|
||||||
|
MarginV,
|
||||||
|
Effect,
|
||||||
|
Text
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -71,10 +71,11 @@ class AutoFetchEpisodeListMatcher extends SwingWorker<List<Match<File, Episode>>
|
|||||||
|
|
||||||
protected SearchResult selectSearchResult(final String query, final List<SearchResult> searchResults) throws Exception {
|
protected SearchResult selectSearchResult(final String query, final List<SearchResult> searchResults) throws Exception {
|
||||||
if (searchResults.size() == 1) {
|
if (searchResults.size() == 1) {
|
||||||
return searchResults.iterator().next();
|
return searchResults.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
final LinkedList<SearchResult> probableMatches = new LinkedList<SearchResult>();
|
// auto-select most probable search result
|
||||||
|
final List<SearchResult> probableMatches = new LinkedList<SearchResult>();
|
||||||
|
|
||||||
// use name similarity metric
|
// use name similarity metric
|
||||||
SimilarityMetric metric = new NameSimilarityMetric();
|
SimilarityMetric metric = new NameSimilarityMetric();
|
||||||
@ -86,8 +87,9 @@ class AutoFetchEpisodeListMatcher extends SwingWorker<List<Match<File, Episode>>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// auto-select first and only probable search result
|
||||||
if (probableMatches.size() == 1) {
|
if (probableMatches.size() == 1) {
|
||||||
return probableMatches.getFirst();
|
return probableMatches.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// show selection dialog on EDT
|
// show selection dialog on EDT
|
||||||
@ -95,11 +97,11 @@ class AutoFetchEpisodeListMatcher extends SwingWorker<List<Match<File, Episode>>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SearchResult call() throws Exception {
|
public SearchResult call() throws Exception {
|
||||||
// display only probable matches if any
|
// display only probable matches if possible
|
||||||
List<SearchResult> selection = probableMatches.isEmpty() ? searchResults : probableMatches;
|
List<SearchResult> options = probableMatches.isEmpty() ? searchResults : probableMatches;
|
||||||
|
|
||||||
// multiple results have been found, user must select one
|
// multiple results have been found, user must select one
|
||||||
SelectDialog<SearchResult> selectDialog = new SelectDialog<SearchResult>(null, selection);
|
SelectDialog<SearchResult> selectDialog = new SelectDialog<SearchResult>(null, options);
|
||||||
|
|
||||||
selectDialog.getHeaderLabel().setText(String.format("Shows matching '%s':", query));
|
selectDialog.getHeaderLabel().setText(String.format("Shows matching '%s':", query));
|
||||||
selectDialog.getCancelAction().putValue(Action.NAME, "Ignore");
|
selectDialog.getCancelAction().putValue(Action.NAME, "Ignore");
|
||||||
@ -149,7 +151,7 @@ class AutoFetchEpisodeListMatcher extends SwingWorker<List<Match<File, Episode>>
|
|||||||
|
|
||||||
// fetch episode lists concurrently
|
// fetch episode lists concurrently
|
||||||
List<Episode> episodes = new ArrayList<Episode>();
|
List<Episode> episodes = new ArrayList<Episode>();
|
||||||
ExecutorService executor = Executors.newFixedThreadPool(tasks.size());
|
ExecutorService executor = Executors.newCachedThreadPool();
|
||||||
|
|
||||||
for (Future<Collection<Episode>> future : executor.invokeAll(tasks)) {
|
for (Future<Collection<Episode>> future : executor.invokeAll(tasks)) {
|
||||||
episodes.addAll(future.get());
|
episodes.addAll(future.get());
|
||||||
|
@ -7,6 +7,7 @@ import static java.util.Collections.*;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -75,7 +76,7 @@ class History {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return elements.hashCode() ^ date.hashCode();
|
return Arrays.hashCode(new Object[] { elements, date });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +126,7 @@ class History {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return to.hashCode() ^ from.hashCode() ^ dir.hashCode();
|
return Arrays.hashCode(new Object[] { to, from, dir });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ public class AnidbClient implements EpisodeListProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public URI getEpisodeListLink(SearchResult searchResult) {
|
public URI getEpisodeListLink(SearchResult searchResult) {
|
||||||
return ((HyperLink) searchResult).toURI();
|
return ((HyperLink) searchResult).getURI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,13 +5,14 @@ package net.sourceforge.filebot.web;
|
|||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
|
||||||
public class HyperLink extends SearchResult {
|
public class HyperLink extends SearchResult {
|
||||||
|
|
||||||
private final URL url;
|
private final URL url;
|
||||||
|
|
||||||
|
|
||||||
public HyperLink(String name, URL url) {
|
public HyperLink(String name, URL url) {
|
||||||
super(name);
|
super(name);
|
||||||
this.url = url;
|
this.url = url;
|
||||||
@ -23,7 +24,7 @@ public class HyperLink extends SearchResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public URI toURI() {
|
public URI getURI() {
|
||||||
try {
|
try {
|
||||||
return url.toURI();
|
return url.toURI();
|
||||||
} catch (URISyntaxException e) {
|
} catch (URISyntaxException e) {
|
||||||
@ -31,4 +32,21 @@ public class HyperLink extends SearchResult {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object object) {
|
||||||
|
if (object instanceof HyperLink) {
|
||||||
|
HyperLink other = (HyperLink) object;
|
||||||
|
return name.equals(name) && url.toString().equals(other.url.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Arrays.hashCode(new Object[] { name, url.toString() });
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
package net.sourceforge.filebot.web;
|
package net.sourceforge.filebot.web;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
|
||||||
public class MovieDescriptor extends SearchResult {
|
public class MovieDescriptor extends SearchResult {
|
||||||
|
|
||||||
private final int year;
|
private final int year;
|
||||||
@ -35,7 +38,7 @@ public class MovieDescriptor extends SearchResult {
|
|||||||
public boolean equals(Object object) {
|
public boolean equals(Object object) {
|
||||||
if (object instanceof MovieDescriptor) {
|
if (object instanceof MovieDescriptor) {
|
||||||
MovieDescriptor other = (MovieDescriptor) object;
|
MovieDescriptor other = (MovieDescriptor) object;
|
||||||
return imdbId == other.imdbId && name.equals(other.name) && year == other.year;
|
return imdbId == other.imdbId && year == other.year && name.equals(other.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -44,7 +47,7 @@ public class MovieDescriptor extends SearchResult {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return name.hashCode() ^ year ^ imdbId;
|
return Arrays.hashCode(new Object[] { name, year, imdbId });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ public class SubsceneSubtitleClient implements SubtitleProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public URI getSubtitleListLink(SearchResult searchResult, String languageName) {
|
public URI getSubtitleListLink(SearchResult searchResult, String languageName) {
|
||||||
return ((HyperLink) searchResult).toURI();
|
return ((HyperLink) searchResult).getURI();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import static net.sourceforge.filebot.web.WebRequest.*;
|
|||||||
import static net.sourceforge.tuned.XPathUtilities.*;
|
import static net.sourceforge.tuned.XPathUtilities.*;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
@ -70,10 +71,9 @@ public class TVDotComClient implements EpisodeListProvider {
|
|||||||
String href = getAttribute("href", node);
|
String href = getAttribute("href", node);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
URL episodeListingUrl = new URL(href.replaceAll("summary\\.html\\?.*", "episode.html"));
|
URL episodeGuideLocation = new URL(href.replaceAll("summary\\.html\\?.*", "episode.html"));
|
||||||
|
searchResults.add(new HyperLink(title, episodeGuideLocation));
|
||||||
searchResults.add(new HyperLink(title, episodeListingUrl));
|
} catch (MalformedURLException e) {
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Invalid href: " + href, e);
|
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Invalid href: " + href, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,14 +11,14 @@ public class ByteBufferInputStream extends InputStream {
|
|||||||
|
|
||||||
private final ByteBuffer buffer;
|
private final ByteBuffer buffer;
|
||||||
|
|
||||||
|
|
||||||
public ByteBufferInputStream(ByteBuffer buffer) {
|
public ByteBufferInputStream(ByteBuffer buffer) {
|
||||||
this.buffer = buffer;
|
this.buffer = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized int read() throws IOException {
|
public int read() throws IOException {
|
||||||
if (buffer.remaining() <= 0)
|
if (buffer.remaining() <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ public class ByteBufferInputStream extends InputStream {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized int read(byte[] b, int off, int len) throws IOException {
|
public int read(byte[] b, int off, int len) throws IOException {
|
||||||
if (buffer.remaining() <= 0)
|
if (buffer.remaining() <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ public class ByteBufferInputStream extends InputStream {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized int available() throws IOException {
|
public int available() throws IOException {
|
||||||
return buffer.remaining();
|
return buffer.remaining();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,13 +52,13 @@ public class ByteBufferInputStream extends InputStream {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void mark(int readlimit) {
|
public void mark(int readlimit) {
|
||||||
buffer.mark();
|
buffer.mark();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void reset() throws IOException {
|
public void reset() throws IOException {
|
||||||
buffer.reset();
|
buffer.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user