diff --git a/source/net/filebot/web/Artwork.java b/source/net/filebot/web/Artwork.java index acb387a1..3068fbf0 100644 --- a/source/net/filebot/web/Artwork.java +++ b/source/net/filebot/web/Artwork.java @@ -5,8 +5,11 @@ import static java.util.Collections.*; import java.io.Serializable; import java.net.URL; +import java.text.DecimalFormat; import java.util.List; import java.util.Locale; +import java.util.Objects; +import java.util.stream.Stream; public class Artwork implements Serializable { @@ -22,12 +25,12 @@ public class Artwork implements Serializable { // used by serializer } - public Artwork(Datasource database, List category, URL url, Locale language, double rating) { + public Artwork(Datasource database, Stream category, URL url, Locale language, Double rating) { 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.language = language.getLanguage(); - this.rating = rating; + this.language = language == null || language.getLanguage().isEmpty() ? null : language.getLanguage(); + this.rating = rating == null ? 0 : rating; } public String getDatabase() { @@ -66,7 +69,7 @@ public class Artwork implements Serializable { @Override 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(); } } diff --git a/source/net/filebot/web/FanartTVClient.java b/source/net/filebot/web/FanartTVClient.java index a9a68dc8..dfee00c4 100644 --- a/source/net/filebot/web/FanartTVClient.java +++ b/source/net/filebot/web/FanartTVClient.java @@ -1,24 +1,20 @@ package net.filebot.web; -import static java.util.Arrays.*; import static java.util.stream.Collectors.*; import static net.filebot.Logging.*; import static net.filebot.util.JsonUtilities.*; -import java.io.Serializable; import java.net.URL; -import java.util.EnumMap; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.Objects; import java.util.logging.Level; +import java.util.stream.Stream; import javax.swing.Icon; import net.filebot.Cache; import net.filebot.CacheType; -import net.filebot.web.FanartTVClient.FanartDescriptor.FanartProperty; public class FanartTVClient implements Datasource, ArtworkProvider { @@ -38,121 +34,11 @@ public class FanartTVClient implements Datasource, ArtworkProvider { return null; } - public List getSeriesArtwork(int tvdbid) throws Exception { - return getArtwork("tv", String.valueOf(tvdbid)); - } - - public List getMovieArtwork(int tmdbid) throws Exception { - return getArtwork("movies", String.valueOf(tmdbid)); - } - - public List 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 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 { // e.g. http://webservice.fanart.tv/v3/movies/17645?api_key=6fa42b0ef3b5f3aab6a7edaa78675ac2 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 properties; - - protected FanartDescriptor() { - // used by serializer - } - - protected FanartDescriptor(Map fields) { - this.properties = new EnumMap(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 public List getArtwork(int id, String category, Locale locale) throws Exception { Cache cache = Cache.getCache(getName(), CacheType.Weekly); @@ -162,12 +48,12 @@ public class FanartTVClient implements Datasource, ArtworkProvider { return streamJsonObjects(type.getValue()).map(it -> { try { String url = getString(it, "url"); - String lang = getString(it, "lang"); + Locale language = getStringValue(it, "lang", Locale::new); Double likes = getDecimal(it, "likes"); String season = getString(it, "season"); 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) { debug.log(Level.WARNING, e, e::getMessage); return null; diff --git a/source/net/filebot/web/TMDbClient.java b/source/net/filebot/web/TMDbClient.java index c529f10f..04c99b97 100644 --- a/source/net/filebot/web/TMDbClient.java +++ b/source/net/filebot/web/TMDbClient.java @@ -39,7 +39,7 @@ import net.filebot.ResourceManager; import net.filebot.web.TMDbClient.MovieInfo.MovieProperty; 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 version = "3"; @@ -270,28 +270,26 @@ public class TMDbClient implements MovieIdentificationService { return new MovieInfo(fields, alternativeTitles, genres, certifications, spokenLanguages, productionCountries, productionCompanies, cast, trailers); } - public List getArtwork(String id) throws Exception { - // http://api.themoviedb.org/3/movie/11/images + @Override + public List getArtwork(int id, String category, Locale locale) throws Exception { 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); - return Stream.of("backdrops", "posters").flatMap(section -> { - Stream artwork = streamJsonObjects(images, section).map(it -> { - try { - String url = baseUrl + "original" + getString(it, "file_path"); - int width = getDecimal(it, "width").intValue(); - int height = getDecimal(it, "height").intValue(); - String lang = getString(it, "iso_639_1"); - return new Artwork(section, new URL(url), width, height, lang); - } catch (Exception e) { - debug.warning(format("Bad artwork: %s => %s", it, e)); - return null; - } - }); - return artwork; - }).collect(toList()); + return streamJsonObjects(images, category).map(it -> { + try { + String path = "original" + getString(it, "file_path"); + String width = getString(it, "width"); + String height = getString(it, "height"); + Locale language = getStringValue(it, "iso_639_1", Locale::new); + + return new Artwork(this, Stream.of(category, String.join("x", width, height)), new URL(baseUrl, path), language, null); + } catch (Exception e) { + debug.log(Level.WARNING, e, e::getMessage); + return null; + } + }).filter(Objects::nonNull).collect(toList()); } protected Object request(String resource, Map 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 { private String type; diff --git a/source/net/filebot/web/TheTVDBClient2.java b/source/net/filebot/web/TheTVDBClient2.java index 3f437ce0..b29c3a36 100644 --- a/source/net/filebot/web/TheTVDBClient2.java +++ b/source/net/filebot/web/TheTVDBClient2.java @@ -238,7 +238,7 @@ public class TheTVDBClient2 extends AbstractEpisodeListProvider implements Artwo String resolution = getString(it, "resolution"); 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) { debug.log(Level.WARNING, e, e::getMessage); return null; diff --git a/test/net/filebot/web/TMDbClientTest.java b/test/net/filebot/web/TMDbClientTest.java index 75fb7cdf..7e32ef76 100644 --- a/test/net/filebot/web/TMDbClientTest.java +++ b/test/net/filebot/web/TMDbClientTest.java @@ -15,7 +15,6 @@ import org.junit.Test; import net.filebot.Cache; import net.filebot.CacheType; import net.filebot.CachedResource; -import net.filebot.web.TMDbClient.Artwork; import net.filebot.web.TMDbClient.MovieInfo; public class TMDbClientTest { @@ -89,9 +88,9 @@ public class TMDbClientTest { @Test public void getArtwork() throws Exception { - List artwork = tmdb.getArtwork("tt0418279"); - assertEquals("backdrops", artwork.get(0).getCategory()); - assertEquals("https://image.tmdb.org/t/p/original/ac0HwGJIU3GxjjGujlIjLJmAGPR.jpg", artwork.get(0).getUrl().toString()); + Artwork a = tmdb.getArtwork(16320, "backdrops", Locale.ROOT).get(0); + assertEquals("[backdrops, 1920x1080]", a.getCategory().toString()); + assertEquals("https://image.tmdb.org/t/p/original/424MxHQe5Hfu92hTeRvZb5Giv0X.jpg", a.getUrl().toString()); } @Ignore