mirror of
https://github.com/mitb-archive/filebot
synced 2025-01-11 05:48:01 -05:00
Experiment with unifying Artwork interface for all databases
This commit is contained in:
parent
91639b40e5
commit
b54908475b
@ -5,8 +5,11 @@ import static java.util.Collections.*;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class Artwork implements Serializable {
|
public class Artwork implements Serializable {
|
||||||
|
|
||||||
@ -22,12 +25,12 @@ public class Artwork implements Serializable {
|
|||||||
// used by serializer
|
// used by serializer
|
||||||
}
|
}
|
||||||
|
|
||||||
public Artwork(Datasource database, List<String> category, URL url, Locale language, double rating) {
|
public Artwork(Datasource database, Stream<?> category, URL url, Locale language, Double rating) {
|
||||||
this.database = database.getIdentifier();
|
this.database = database.getIdentifier();
|
||||||
this.category = category.toArray(new String[0]);
|
this.category = category.filter(Objects::nonNull).map(Object::toString).toArray(String[]::new);
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.language = language.getLanguage();
|
this.language = language == null || language.getLanguage().isEmpty() ? null : language.getLanguage();
|
||||||
this.rating = rating;
|
this.rating = rating == null ? 0 : rating;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDatabase() {
|
public String getDatabase() {
|
||||||
@ -66,7 +69,7 @@ public class Artwork implements Serializable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return asList(database, asList(category), url, language, rating).toString();
|
return asList(String.join("/", category), language, new DecimalFormat("0.##").format(rating), url).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,20 @@
|
|||||||
package net.filebot.web;
|
package net.filebot.web;
|
||||||
|
|
||||||
import static java.util.Arrays.*;
|
|
||||||
import static java.util.stream.Collectors.*;
|
import static java.util.stream.Collectors.*;
|
||||||
import static net.filebot.Logging.*;
|
import static net.filebot.Logging.*;
|
||||||
import static net.filebot.util.JsonUtilities.*;
|
import static net.filebot.util.JsonUtilities.*;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.EnumMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.swing.Icon;
|
import javax.swing.Icon;
|
||||||
|
|
||||||
import net.filebot.Cache;
|
import net.filebot.Cache;
|
||||||
import net.filebot.CacheType;
|
import net.filebot.CacheType;
|
||||||
import net.filebot.web.FanartTVClient.FanartDescriptor.FanartProperty;
|
|
||||||
|
|
||||||
public class FanartTVClient implements Datasource, ArtworkProvider {
|
public class FanartTVClient implements Datasource, ArtworkProvider {
|
||||||
|
|
||||||
@ -38,121 +34,11 @@ public class FanartTVClient implements Datasource, ArtworkProvider {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<FanartDescriptor> getSeriesArtwork(int tvdbid) throws Exception {
|
|
||||||
return getArtwork("tv", String.valueOf(tvdbid));
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<FanartDescriptor> getMovieArtwork(int tmdbid) throws Exception {
|
|
||||||
return getArtwork("movies", String.valueOf(tmdbid));
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<FanartDescriptor> getArtwork(String category, String id) throws Exception {
|
|
||||||
String path = category + '/' + id;
|
|
||||||
|
|
||||||
Cache cache = Cache.getCache(getName(), CacheType.Weekly);
|
|
||||||
Object json = cache.json(path, s -> getResource(s)).expire(Cache.ONE_WEEK).get();
|
|
||||||
|
|
||||||
return asMap(json).entrySet().stream().flatMap(type -> {
|
|
||||||
return streamJsonObjects(type.getValue()).map(item -> {
|
|
||||||
Map<FanartProperty, String> map = getEnumMap(item, FanartProperty.class);
|
|
||||||
map.put(FanartProperty.type, type.getKey().toString());
|
|
||||||
|
|
||||||
return new FanartDescriptor(map);
|
|
||||||
}).filter(art -> art.getUrl() != null);
|
|
||||||
}).collect(toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
public URL getResource(String path) throws Exception {
|
public URL getResource(String path) throws Exception {
|
||||||
// e.g. http://webservice.fanart.tv/v3/movies/17645?api_key=6fa42b0ef3b5f3aab6a7edaa78675ac2
|
// e.g. http://webservice.fanart.tv/v3/movies/17645?api_key=6fa42b0ef3b5f3aab6a7edaa78675ac2
|
||||||
return new URL("http://webservice.fanart.tv/v3/" + path + "?api_key=" + apikey);
|
return new URL("http://webservice.fanart.tv/v3/" + path + "?api_key=" + apikey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class FanartDescriptor implements Serializable {
|
|
||||||
|
|
||||||
public static enum FanartProperty {
|
|
||||||
type, id, url, lang, likes, season, disc, disc_type
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Map<FanartProperty, String> properties;
|
|
||||||
|
|
||||||
protected FanartDescriptor() {
|
|
||||||
// used by serializer
|
|
||||||
}
|
|
||||||
|
|
||||||
protected FanartDescriptor(Map<FanartProperty, String> fields) {
|
|
||||||
this.properties = new EnumMap<FanartProperty, String>(fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String get(Object key) {
|
|
||||||
return properties.get(FanartProperty.valueOf(key.toString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public String get(FanartProperty key) {
|
|
||||||
return properties.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getType() {
|
|
||||||
return properties.get(FanartProperty.type);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getId() {
|
|
||||||
try {
|
|
||||||
return new Integer(properties.get(FanartProperty.id));
|
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public URL getUrl() {
|
|
||||||
try {
|
|
||||||
return new URL(properties.get(FanartProperty.url));
|
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getLikes() {
|
|
||||||
try {
|
|
||||||
return new Integer(properties.get(FanartProperty.likes));
|
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Locale getLanguage() {
|
|
||||||
try {
|
|
||||||
return new Locale(properties.get(FanartProperty.lang));
|
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getSeason() {
|
|
||||||
try {
|
|
||||||
return new Integer(properties.get(FanartProperty.season));
|
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getDiskNumber() {
|
|
||||||
try {
|
|
||||||
return new Integer(properties.get(FanartProperty.disc));
|
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDiskType() {
|
|
||||||
return properties.get(FanartProperty.disc_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return properties.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Artwork> getArtwork(int id, String category, Locale locale) throws Exception {
|
public List<Artwork> getArtwork(int id, String category, Locale locale) throws Exception {
|
||||||
Cache cache = Cache.getCache(getName(), CacheType.Weekly);
|
Cache cache = Cache.getCache(getName(), CacheType.Weekly);
|
||||||
@ -162,12 +48,12 @@ public class FanartTVClient implements Datasource, ArtworkProvider {
|
|||||||
return streamJsonObjects(type.getValue()).map(it -> {
|
return streamJsonObjects(type.getValue()).map(it -> {
|
||||||
try {
|
try {
|
||||||
String url = getString(it, "url");
|
String url = getString(it, "url");
|
||||||
String lang = getString(it, "lang");
|
Locale language = getStringValue(it, "lang", Locale::new);
|
||||||
Double likes = getDecimal(it, "likes");
|
Double likes = getDecimal(it, "likes");
|
||||||
String season = getString(it, "season");
|
String season = getString(it, "season");
|
||||||
String discType = getString(it, "disc_type");
|
String discType = getString(it, "disc_type");
|
||||||
|
|
||||||
return new Artwork(this, asList(category, type.getKey().toString(), season, discType), new URL(url), new Locale(lang), likes == null ? 0 : likes);
|
return new Artwork(this, Stream.of(type.getKey(), season, discType), new URL(url), language, likes);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
debug.log(Level.WARNING, e, e::getMessage);
|
debug.log(Level.WARNING, e, e::getMessage);
|
||||||
return null;
|
return null;
|
||||||
|
@ -39,7 +39,7 @@ import net.filebot.ResourceManager;
|
|||||||
import net.filebot.web.TMDbClient.MovieInfo.MovieProperty;
|
import net.filebot.web.TMDbClient.MovieInfo.MovieProperty;
|
||||||
import net.filebot.web.TMDbClient.Person.PersonProperty;
|
import net.filebot.web.TMDbClient.Person.PersonProperty;
|
||||||
|
|
||||||
public class TMDbClient implements MovieIdentificationService {
|
public class TMDbClient implements MovieIdentificationService, ArtworkProvider {
|
||||||
|
|
||||||
private static final String host = "api.themoviedb.org";
|
private static final String host = "api.themoviedb.org";
|
||||||
private static final String version = "3";
|
private static final String version = "3";
|
||||||
@ -270,28 +270,26 @@ public class TMDbClient implements MovieIdentificationService {
|
|||||||
return new MovieInfo(fields, alternativeTitles, genres, certifications, spokenLanguages, productionCountries, productionCompanies, cast, trailers);
|
return new MovieInfo(fields, alternativeTitles, genres, certifications, spokenLanguages, productionCountries, productionCompanies, cast, trailers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Artwork> getArtwork(String id) throws Exception {
|
@Override
|
||||||
// http://api.themoviedb.org/3/movie/11/images
|
public List<Artwork> getArtwork(int id, String category, Locale locale) throws Exception {
|
||||||
Object config = request("configuration", emptyMap(), Locale.ROOT, REQUEST_LIMIT);
|
Object config = request("configuration", emptyMap(), Locale.ROOT, REQUEST_LIMIT);
|
||||||
String baseUrl = getString(getMap(config, "images"), "secure_base_url");
|
URL baseUrl = new URL(getString(getMap(config, "images"), "secure_base_url"));
|
||||||
|
|
||||||
Object images = request("movie/" + id + "/images", emptyMap(), Locale.ROOT, REQUEST_LIMIT);
|
Object images = request("movie/" + id + "/images", emptyMap(), Locale.ROOT, REQUEST_LIMIT);
|
||||||
|
|
||||||
return Stream.of("backdrops", "posters").flatMap(section -> {
|
return streamJsonObjects(images, category).map(it -> {
|
||||||
Stream<Artwork> artwork = streamJsonObjects(images, section).map(it -> {
|
try {
|
||||||
try {
|
String path = "original" + getString(it, "file_path");
|
||||||
String url = baseUrl + "original" + getString(it, "file_path");
|
String width = getString(it, "width");
|
||||||
int width = getDecimal(it, "width").intValue();
|
String height = getString(it, "height");
|
||||||
int height = getDecimal(it, "height").intValue();
|
Locale language = getStringValue(it, "iso_639_1", Locale::new);
|
||||||
String lang = getString(it, "iso_639_1");
|
|
||||||
return new Artwork(section, new URL(url), width, height, lang);
|
return new Artwork(this, Stream.of(category, String.join("x", width, height)), new URL(baseUrl, path), language, null);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
debug.warning(format("Bad artwork: %s => %s", it, e));
|
debug.log(Level.WARNING, e, e::getMessage);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
}).filter(Objects::nonNull).collect(toList());
|
||||||
return artwork;
|
|
||||||
}).collect(toList());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Object request(String resource, Map<String, Object> parameters, Locale locale, final FloodLimit limit) throws Exception {
|
protected Object request(String resource, Map<String, Object> parameters, Locale locale, final FloodLimit limit) throws Exception {
|
||||||
@ -645,50 +643,6 @@ public class TMDbClient implements MovieIdentificationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Artwork {
|
|
||||||
|
|
||||||
private String category;
|
|
||||||
private String language;
|
|
||||||
|
|
||||||
private int width;
|
|
||||||
private int height;
|
|
||||||
|
|
||||||
private URL url;
|
|
||||||
|
|
||||||
public Artwork(String category, URL url, int width, int height, String language) {
|
|
||||||
this.category = category;
|
|
||||||
this.url = url;
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
this.language = language;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCategory() {
|
|
||||||
return category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLanguage() {
|
|
||||||
return language;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWidth() {
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHeight() {
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
public URL getUrl() {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return String.format("{category: %s, width: %s, height: %s, language: %s, url: %s}", category, width, height, language, url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Trailer {
|
public static class Trailer {
|
||||||
|
|
||||||
private String type;
|
private String type;
|
||||||
|
@ -238,7 +238,7 @@ public class TheTVDBClient2 extends AbstractEpisodeListProvider implements Artwo
|
|||||||
String resolution = getString(it, "resolution");
|
String resolution = getString(it, "resolution");
|
||||||
Double rating = getDecimal(getString(it, "ratingsInfo"), "average");
|
Double rating = getDecimal(getString(it, "ratingsInfo"), "average");
|
||||||
|
|
||||||
return new Artwork(this, asList(category, subKey, resolution), new URL(mirror, fileName), locale, rating == null ? 0 : rating);
|
return new Artwork(this, Stream.of(category, subKey, resolution), new URL(mirror, fileName), locale, rating);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
debug.log(Level.WARNING, e, e::getMessage);
|
debug.log(Level.WARNING, e, e::getMessage);
|
||||||
return null;
|
return null;
|
||||||
|
@ -15,7 +15,6 @@ import org.junit.Test;
|
|||||||
import net.filebot.Cache;
|
import net.filebot.Cache;
|
||||||
import net.filebot.CacheType;
|
import net.filebot.CacheType;
|
||||||
import net.filebot.CachedResource;
|
import net.filebot.CachedResource;
|
||||||
import net.filebot.web.TMDbClient.Artwork;
|
|
||||||
import net.filebot.web.TMDbClient.MovieInfo;
|
import net.filebot.web.TMDbClient.MovieInfo;
|
||||||
|
|
||||||
public class TMDbClientTest {
|
public class TMDbClientTest {
|
||||||
@ -89,9 +88,9 @@ public class TMDbClientTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getArtwork() throws Exception {
|
public void getArtwork() throws Exception {
|
||||||
List<Artwork> artwork = tmdb.getArtwork("tt0418279");
|
Artwork a = tmdb.getArtwork(16320, "backdrops", Locale.ROOT).get(0);
|
||||||
assertEquals("backdrops", artwork.get(0).getCategory());
|
assertEquals("[backdrops, 1920x1080]", a.getCategory().toString());
|
||||||
assertEquals("https://image.tmdb.org/t/p/original/ac0HwGJIU3GxjjGujlIjLJmAGPR.jpg", artwork.get(0).getUrl().toString());
|
assertEquals("https://image.tmdb.org/t/p/original/424MxHQe5Hfu92hTeRvZb5Giv0X.jpg", a.getUrl().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore
|
@Ignore
|
||||||
|
Loading…
Reference in New Issue
Block a user