org.tinymediamanager.scraper.entities.MediaArtwork Maven / Gradle / Ivy
/*
* Copyright 2012 - 2019 Manuel Laggner
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.tinymediamanager.scraper.entities;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.ResourceBundle;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.tinymediamanager.scraper.ApiResourceBundle;
import org.tinymediamanager.scraper.util.StrgUtils;
/**
* This class is used to represent an artwork for a media
*
* @author Manuel Laggner
* @since 1.0
*/
public class MediaArtwork {
private static final ResourceBundle BUNDLE = ApiResourceBundle.getResourceBundle();
/**
* The different types of artwork we know
*
* @author Manuel Laggner
* @since 1.0
*/
public enum MediaArtworkType {
// @formatter:off
BACKGROUND,
BANNER,
POSTER,
ACTOR,
SEASON_POSTER,
SEASON_BANNER,
SEASON_THUMB,
THUMB,
CLEARART,
KEYART,
CHARACTERART,
DISC,
LOGO,
CLEARLOGO,
ALL
// @formatter:on
}
/**
* All available poster sizes
*
* @author Manuel Laggner
* @since 1.0
*/
public enum PosterSizes {
XLARGE(BUNDLE.getString("Settings.image.xlarge") + ": ~2000x3000px", 16), //$NON-NLS-1$
LARGE(BUNDLE.getString("Settings.image.large") + ": ~1000x1500px", 8), //$NON-NLS-1$
BIG(BUNDLE.getString("Settings.image.big") + ": ~500x750px", 4), //$NON-NLS-1$
MEDIUM(BUNDLE.getString("Settings.image.medium") + ": ~342x513px", 2), //$NON-NLS-1$
SMALL(BUNDLE.getString("Settings.image.small") + ": ~185x277px", 1); //$NON-NLS-1$
private String text;
private int order;
PosterSizes(String text, int order) {
this.text = text;
this.order = order;
}
@Override
public String toString() {
return text;
}
public int getOrder() {
return order;
}
}
/**
* All available fanart sizes
*
* @author Manuel Laggner
* @since 1.0
*/
public enum FanartSizes {
XLARGE(BUNDLE.getString("Settings.image.xlarge") + ": ~3840x2160px", 16), //$NON-NLS-1$
LARGE(BUNDLE.getString("Settings.image.large") + ": ~1920x1080px", 8), //$NON-NLS-1$
MEDIUM(BUNDLE.getString("Settings.image.medium") + ": ~1280x720px", 2), //$NON-NLS-1$
SMALL(BUNDLE.getString("Settings.image.small") + ": ~300x168px", 1); //$NON-NLS-1$
private String text;
private int order;
FanartSizes(String text, int order) {
this.text = text;
this.order = order;
}
@Override
public String toString() {
return text;
}
public int getOrder() {
return order;
}
}
private String imdbId;
private int tmdbId;
private int season = -1;
private String previewUrl = "";
private String defaultUrl = "";
private String language = "";
private String providerId;
private MediaArtworkType type;
private int sizeOrder = 0;
private int likes = 0;
private boolean animated = false;
private List imageSizes = new ArrayList<>();
/**
* Create a new instance of MediaArtwork for the given provider and type
*
* @param providerId
* the provider id
* @param type
* the artwork type
*/
public MediaArtwork(String providerId, MediaArtworkType type) {
this.providerId = providerId;
this.type = type;
}
/**
* A copy constructor for MediaArtwork - to clone an existing one for a new type
*
* @param oldArtwork
* the instance to copy
* @param type
* the new type
*/
public MediaArtwork(MediaArtwork oldArtwork, MediaArtworkType type) {
this.imdbId = oldArtwork.getImdbId();
this.tmdbId = oldArtwork.getTmdbId();
this.season = oldArtwork.getSeason();
this.previewUrl = oldArtwork.getPreviewUrl();
this.defaultUrl = oldArtwork.getDefaultUrl();
this.language = oldArtwork.getLanguage();
this.providerId = oldArtwork.getProviderId();
this.sizeOrder = oldArtwork.getSizeOrder();
this.likes = oldArtwork.getLikes();
for (ImageSizeAndUrl oldImageSizeAndUrl : oldArtwork.getImageSizes()) {
this.imageSizes.add(new ImageSizeAndUrl(oldImageSizeAndUrl.width, oldImageSizeAndUrl.height, oldImageSizeAndUrl.url));
}
this.type = type;
}
/**
* Get a preview url or the default url if no preview url is available
*
* @return the preview url or the default url
*/
public String getPreviewUrl() {
// return the default url if the preview url has not been set
if (StringUtils.isBlank(previewUrl)) {
return defaultUrl;
}
return previewUrl;
}
/**
* Set the preview url
*
* @param previewUrl
* the preview url
*/
public void setPreviewUrl(String previewUrl) {
this.previewUrl = previewUrl;
}
/**
* Get the default url for this artwork
*
* @return the default url
*/
public String getDefaultUrl() {
return defaultUrl;
}
/**
* Set the default url
*
* @param defaultUrl
* the default url
*/
public void setDefaultUrl(String defaultUrl) {
this.defaultUrl = defaultUrl;
}
/**
* Get the provider id
*
* @return the provider id
*/
public String getProviderId() {
return providerId;
}
/**
* Get the artwork type
*
* @return the artwork type
*/
public MediaArtworkType getType() {
return type;
}
/**
* Get the language for this artwork if available
*
* @return the language for this artwork
*/
public String getLanguage() {
return language;
}
/**
* Set the language for this artwork
*
* @param language
* the language
*/
public void setLanguage(String language) {
this.language = StrgUtils.getNonNullString(language);
}
/**
* Get the assigned TMDB id for this artwork
*
* @return the tmdb id
*/
public int getTmdbId() {
return tmdbId;
}
/**
* Set the assigned TMDB id for this artwork
*
* @param tmdbId
* the tmdb id
*/
public void setTmdbId(int tmdbId) {
this.tmdbId = tmdbId;
}
/**
* Get the assigned IMDB id for this artwork
*
* @return the imdb id
*/
public String getImdbId() {
return imdbId;
}
/**
* Set the assigned IMDB id for this artwork
*
* @param imdbId
* the imdb id
*/
public void setImdbId(String imdbId) {
this.imdbId = StrgUtils.getNonNullString(imdbId);
}
/**
* Add an image size. This is used for the image chooser to show the user the different sizes for this artwork
*
* @param width
* thw width
* @param height
* the height
* @param url
* the url
*/
public void addImageSize(int width, int height, String url) {
imageSizes.add(new ImageSizeAndUrl(width, height, url));
}
/**
* Get all available image sizes for this artwork
*
* @return a list of all available image sizes
*/
public List getImageSizes() {
List descImageSizes = new ArrayList<>(imageSizes);
// sort descending
Collections.sort(descImageSizes, Collections.reverseOrder());
return descImageSizes;
}
/**
* Get the smallest artwork if different sizes are available or null
*
* @return the smallest artwork or null
*/
public ImageSizeAndUrl getSmallestArtwork() {
if (imageSizes.size() > 0) {
List ascImageSizes = new ArrayList<>(imageSizes);
// sort ascending
Collections.sort(ascImageSizes);
ImageSizeAndUrl smallestImage = ascImageSizes.get(0);
if (smallestImage != null) {
return smallestImage;
}
}
return null;
}
/**
* Get the biggest artwork if different sizes are available or null
*
* @return the biggest artwork or null
*/
public ImageSizeAndUrl getBiggestArtwork() {
if (imageSizes.size() > 0) {
List descImageSizes = new ArrayList<>(imageSizes);
// sort descending
Collections.sort(descImageSizes, Collections.reverseOrder());
ImageSizeAndUrl biggestImage = descImageSizes.get(0);
if (biggestImage != null) {
return biggestImage;
}
}
return null;
}
/**
* Get the size order to indicate how big this artwork is
*
* @return the size order
*/
public int getSizeOrder() {
return sizeOrder;
}
/**
* Set the size order to indicate how big this artwork is
*
* @param sizeOrder
* the size order
*/
public void setSizeOrder(int sizeOrder) {
this.sizeOrder = sizeOrder;
}
/**
* Get the likes of this artwork to indicate how popular this artwork is
*
* @return the likes
*/
public int getLikes() {
return likes;
}
/**
* amount of likes (or other, for ordering)
*
* @param likes
* set the amount of likes
*/
public void setLikes(int likes) {
this.likes = likes;
}
/**
* is this an animated graphic?
*
* @return
*/
public boolean isAnimated() {
return animated;
}
/**
* set this graphic as animated
*
* @param animated
*/
public void setAnimated(boolean animated) {
this.animated = animated;
}
/**
* Get the season (useful for season artwork)
*
* @return the season
*/
public int getSeason() {
return season;
}
/**
* Set the season (useful for season artwork)
*
* @param season
* the season
*/
public void setSeason(int season) {
this.season = season;
}
/**
*
* Uses ReflectionToStringBuilder
to generate a toString
for the specified object.
*
*
* @return the String result
* @see ReflectionToStringBuilder#toString(Object)
*/
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
/**
* This class represents a combination of image size and the correspondin url for an artwork
*
* @author Manuel Laggner
* @since 1.0
*/
public static class ImageSizeAndUrl implements Comparable {
private int width = 0;
private int height = 0;
private String url = "";
public ImageSizeAndUrl(int width, int height, String url) {
this.width = width;
this.height = height;
this.url = StrgUtils.getNonNullString(url);
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public String getUrl() {
return url;
}
@Override
public int compareTo(ImageSizeAndUrl obj) {
return width - obj.width;
}
@Override
public String toString() {
return width + "x" + height;
}
}
public static class MediaArtworkComparator implements Comparator {
private String preferredLangu = "en";
public MediaArtworkComparator(String language) {
preferredLangu = language;
}
/*
* sort artwork: primary by language: preferred lang (ie de), en, others; then: score
*/
@Override
public int compare(MediaArtwork arg0, MediaArtwork arg1) {
// check first if is preferred langu
if (Objects.equals(preferredLangu, arg0.getLanguage()) && !Objects.equals(preferredLangu, arg1.getLanguage())) {
return -1;
}
if (!Objects.equals(preferredLangu, arg0.getLanguage()) && Objects.equals(preferredLangu, arg1.getLanguage())) {
return 1;
}
// not? compare with EN
if ("en".equals(arg0.getLanguage()) && !"en".equals(arg1.getLanguage())) {
return -1;
}
if (!"en".equals(arg0.getLanguage()) && "en".equals(arg1.getLanguage())) {
return 1;
}
// we did not sort until here; so lets sort with the rating / likes
if (arg0.getSizeOrder() == arg1.getSizeOrder()) {
if (arg0.getLikes() == arg1.getLikes()) {
return 0;
}
else {
return arg0.getLikes() > arg1.getLikes() ? -1 : 1;
}
}
else {
return arg0.getSizeOrder() > arg1.getSizeOrder() ? -1 : 1;
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy