All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tinymediamanager.scraper.entities.MediaGenres Maven / Gradle / Ivy

There is a newer version: 3.0.5
Show newest version
/*
 * 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.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.tinymediamanager.scraper.ApiResourceBundle;
import org.tinymediamanager.scraper.DynaEnum;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

/**
 * The class/dynaenum MediaGenres. This class stores all default known genres along with some different parsing informations
 * 
 * @author Manuel Laggner
 * @since 1.0
 */
public class MediaGenres extends DynaEnum {
  private final static Comparator COMPARATOR      = new MediaGenres.MediaGenresComparator();

  public final static MediaGenres              ACTION          = new MediaGenres("ACTION", 0, "Action");
  public final static MediaGenres              ADVENTURE       = new MediaGenres("ADVENTURE", 1, "Adventure");
  public final static MediaGenres              ANIMATION       = new MediaGenres("ANIMATION", 2, "Animation");
  public final static MediaGenres              ANIME           = new MediaGenres("ANIME", -1, "Anime");
  public final static MediaGenres              ANIMAL          = new MediaGenres("ANIMAL", 3, "Animal");
  public final static MediaGenres              BIOGRAPHY       = new MediaGenres("BIOGRAPHY", 4, "Biography");
  public final static MediaGenres              COMEDY          = new MediaGenres("COMEDY", 5, "Comedy");
  public final static MediaGenres              CRIME           = new MediaGenres("CRIME", 6, "Crime");
  public final static MediaGenres              DISASTER        = new MediaGenres("DISASTER", 7, "Disaster");
  public final static MediaGenres              DOCUMENTARY     = new MediaGenres("DOCUMENTARY", 8, "Documentary",
      new String[] { "Home and Garden", "Food" });
  public final static MediaGenres              DRAMA           = new MediaGenres("DRAMA", 9, "Drama");
  public final static MediaGenres              EASTERN         = new MediaGenres("EASTERN", 10, "Eastern");
  public final static MediaGenres              EROTIC          = new MediaGenres("EROTIC", 11, "Erotic");
  public final static MediaGenres              FAMILY          = new MediaGenres("FAMILY", 12, "Family", new String[] { "Children" });
  public final static MediaGenres              FAN_FILM        = new MediaGenres("FAN_FILM", 13, "Fan Film");
  public final static MediaGenres              FANTASY         = new MediaGenres("FANTASY", 14, "Fantasy");
  public final static MediaGenres              FILM_NOIR       = new MediaGenres("FILM_NOIR", 15, "Film Noir");
  public final static MediaGenres              FOREIGN         = new MediaGenres("FOREIGN", 16, "Foreign");
  public final static MediaGenres              GAME_SHOW       = new MediaGenres("GAME_SHOW", 17, "Game Show",
      new String[] { "Game Show", "Gameshow" });
  public final static MediaGenres              HISTORY         = new MediaGenres("HISTORY", 18, "History");
  public final static MediaGenres              HOLIDAY         = new MediaGenres("HOLIDAY", 19, "Holiday", new String[] { "Travel" });
  public final static MediaGenres              HORROR          = new MediaGenres("HORROR", 20, "Horror");
  public final static MediaGenres              INDIE           = new MediaGenres("INDIE", 21, "Indie", new String[] { "Special Interest" });
  public final static MediaGenres              MUSIC           = new MediaGenres("MUSIC", 22, "Music");
  public final static MediaGenres              MUSICAL         = new MediaGenres("MUSICAL", 23, "Musical");
  public final static MediaGenres              MYSTERY         = new MediaGenres("MYSTERY", 24, "Mystery");
  public final static MediaGenres              NEO_NOIR        = new MediaGenres("NEO_NOIR", 25, "Neo Noir");
  public final static MediaGenres              NEWS            = new MediaGenres("NEWS", 26, "News");
  public final static MediaGenres              REALITY_TV      = new MediaGenres("REALITY_TV", 27, "Reality TV", new String[] { "Reality" });
  public final static MediaGenres              ROAD_MOVIE      = new MediaGenres("ROAD_MOVIE", 28, "Road Movie");
  public final static MediaGenres              ROMANCE         = new MediaGenres("ROMANCE", 29, "Romance");
  public final static MediaGenres              SCIENCE_FICTION = new MediaGenres("SCIENCE_FICTION", 30, "Science Fiction",
      new String[] { "Sci-Fi", "Science-Fiction" });
  public final static MediaGenres              SERIES          = new MediaGenres("SERIES", 31, "Series", new String[] { "Soap", "Mini-Series" });
  public final static MediaGenres              SHORT           = new MediaGenres("SHORT", 32, "Short");
  public final static MediaGenres              SILENT_MOVIE    = new MediaGenres("SILENT_MOVIE", 33, "Silent Movie");
  public final static MediaGenres              SPORT           = new MediaGenres("SPORT", 34, "Sport");
  public final static MediaGenres              SPORTING_EVENT  = new MediaGenres("SPORTING_EVENT", 35, "Sporting Event");
  public final static MediaGenres              SPORTS_FILM     = new MediaGenres("SPORTS_FILM", 36, "Sports Film");
  public final static MediaGenres              SUSPENSE        = new MediaGenres("SUSPENSE", 37, "Suspense");
  public final static MediaGenres              TALK_SHOW       = new MediaGenres("TALK_SHOW", 38, "Talk Show");
  public final static MediaGenres              TV_MOVIE        = new MediaGenres("TV_MOVIE", 39, "TV Movie");
  public final static MediaGenres              THRILLER        = new MediaGenres("THRILLER", 40, "Thriller");
  public final static MediaGenres              WAR             = new MediaGenres("WAR", 41, "War");
  public final static MediaGenres              WESTERN         = new MediaGenres("WESTERN", 42, "Western");

  private String                               name;
  private String[]                             alternateNames;

  /**
   * Instantiates a new genres.
   * 
   * @param enumName
   *          the enum name
   * @param ordinal
   *          the ordinal
   * @param name
   *          the name
   */
  private MediaGenres(String enumName, int ordinal, String name) {
    super(enumName, ordinal);
    this.name = name;
    this.alternateNames = loadAlternateNames(enumName);

    addElement();
  }

  /**
   * Instantiates a new genres.
   *
   * @param enumName
   *          the enum name
   * @param ordinal
   *          the ordinal
   * @param name
   *          the name
   * @param alternates
   *          extra alternate names
   */
  private MediaGenres(String enumName, int ordinal, String name, String[] alternates) {
    super(enumName, ordinal);
    this.name = name;
    this.alternateNames = ArrayUtils.addAll(loadAlternateNames(enumName), alternates);

    addElement();
  }

  @Override
  public String toString() {
    return getLocalizedName();
  }

  public String dump() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
  }

  /**
   * get the (english) name of this genre
   * 
   * @return the name
   */
  public String getName() {
    return name;
  }

  @JsonValue
  public String getEnumName() {
    return name();
  }

  /**
   * Iterates over all found languages and gets the "alternative name" of specified property
   * 
   * @param propName
   *          the property
   * @return array of alternate names
   */
  public static String[] loadAlternateNames(String propName) {
    ArrayList alt = new ArrayList<>();
    for (Locale loc : getLanguages()) {
      if (loc == null || loc.getLanguage().equals("en")) {
        // English not needed, since it's in default properties
        // and for invalid languages (like NB) it will be null
        continue;
      }
      ResourceBundle b = ApiResourceBundle.getResourceBundle(loc);
      try {
        alt.add(loc.getLanguage() + "-" + b.getString("Genres." + propName)); // just genres
      }
      catch (Exception e) {
        // not found or localized - ignore
      }
    }
    return alt.toArray(new String[alt.size()]);
  }

  /**
   * get all available Languages. Here we use reflection to get rid of the dependency to the tmm core. If org.tinymediamanager.core.Utils is not in
   * our classpath, we only use en as available language
   * 
   * @return all available languages
   */
  @SuppressWarnings("unchecked")
  private static List getLanguages() {
    try {
      Class clazz = Class.forName("org.tinymediamanager.core.Utils");

      Method method = clazz.getDeclaredMethod("getLanguages");
      if (method.getReturnType() == List.class) {
        return (List) method.invoke(null);
      }
    }
    catch (Exception ignored) {
      // nothing to be done here
    }
    return Arrays.asList(new Locale("en", "US"));
  }

  /**
   * All the localized MediaGenres values, alphabetically sorted.
   * 
   * @return the media genres2[]
   */
  public static MediaGenres[] values() {
    MediaGenres[] mg = values(MediaGenres.class);
    Arrays.sort(mg, COMPARATOR);
    return mg;
  }

  /**
   * Gets the genre.
   * 
   * @param name
   *          the name
   * @return the genre
   */
  @JsonCreator
  public synchronized static MediaGenres getGenre(String name) {
    String cleanedName = name.replaceAll("[._-]", " ");
    for (MediaGenres genre : values()) {
      // check if the "enum" name matches
      if (genre.name().equals(name)) {
        return genre;
      }
      // check if the printable name matches
      if (genre.name.equalsIgnoreCase(name)) {
        return genre;
      }
      if (genre.name.equalsIgnoreCase(cleanedName)) {
        return genre;
      }
      // check if one of the possible names matches
      for (String notation : genre.alternateNames) {
        if (notation.equalsIgnoreCase(name)) {
          return genre;
        }
        if (notation.length() > 3) {
          // first 3 chars are language like "de-"
          if (notation.substring(3).equalsIgnoreCase(name)) {
            return genre;
          }

          // match both names without prefix
          if (name.length() > 3 && notation.substring(3).equalsIgnoreCase(name.substring(3))) {
            return genre;

          }
        }
      }
    }

    // dynamically create new one
    return new MediaGenres(name, values().length, name);
  }

  /**
   * Gets the genre name with default Locale
* or just name if not found
* eg: Name = "de-Abenteuer" * * @return the localized genre */ public String getLocalizedName() { return getLocalizedName(Locale.getDefault()); } /** * Gets the genre name with given Locale
* or just name if not found
* eg: Name = "de-Abenteuer" * * @return the localized genre */ public String getLocalizedName(Locale locale) { String lang = locale.getLanguage() + "-"; for (String notation : alternateNames) { if (notation.startsWith(lang)) { return notation.substring(3); } } return name; } /** * Comparator for sorting our MediaGenres in a localized fashion */ public static class MediaGenresComparator implements Comparator { @Override public int compare(MediaGenres o1, MediaGenres o2) { // toString is localized name if (o1.toString() == null && o2.toString() == null) { return 0; } if (o1.toString() == null) { return 1; } if (o2.toString() == null) { return -1; } return o1.toString().compareTo(o2.toString()); } } /** * add a new DynaEnumEventListener. This listener will be informed if any new value has been added * * @param listener * the new listener to be added */ public static void addListener(DynaEnumEventListener listener) { addListener(MediaGenres.class, listener); } /** * remove the given DynaEnumEventListener * * @param listener * the listener to be removed */ public static void removeListener(DynaEnumEventListener listener) { removeListener(MediaGenres.class, listener); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy