private boolean isSeekable(DLNAResource dlna) {
    Player player = dlna.getPlayer();

    if ((player == null) || player.isTimeSeekable()) {
      return true;
    } else {
      return false;
    }
  }
 /**
  * Returns whether or not another player has the same name and id as this one.
  *
  * @param other The other player.
  * @return True if names and ids match, false otherwise.
  */
 @Override
 public boolean equals(Object other) {
   if (other == null || !(other instanceof Player)) {
     return false;
   }
   if (other == this) {
     return true;
   }
   Player otherPlayer = (Player) other;
   return (otherPlayer.name().equals(this.name()) && otherPlayer.id().equals(this.id()));
 }
  /**
   * Returns the player that matches the given class and format.
   *
   * @param profileClass The class to match.
   * @param ext The format to match.
   * @return The player if a match could be found, <code>null</code> otherwise.
   */
  public static Player getPlayer(final Class<? extends Player> profileClass, final Format ext) {

    for (Player player : players) {
      if (player.getClass().equals(profileClass)
          && player.type() == ext.getType()
          && !player.excludeFormat(ext)) {
        return player;
      }
    }

    return null;
  }
  /**
   * Returns the players matching the given classes and type.
   *
   * @param profileClasses The classes to match.
   * @param type The type to match.
   * @return The list of players that match. If no players match, an empty list is returned.
   */
  public static ArrayList<Player> getPlayers(
      final ArrayList<Class<? extends Player>> profileClasses, final int type) {

    ArrayList<Player> compatiblePlayers = new ArrayList<Player>();

    for (Player player : players) {
      if (profileClasses.contains(player.getClass()) && player.type() == type) {
        compatiblePlayers.add(player);
      }
    }

    return compatiblePlayers;
  }
  public void addEngines() {
    ArrayList<Player> disPlayers = new ArrayList<Player>();
    ArrayList<Player> ordPlayers = new ArrayList<Player>();
    PMS r = PMS.get();

    for (String id : configuration.getEnginesAsList(r.getRegistry())) {
      // boolean matched = false;
      for (Player p : PlayerFactory.getAllPlayers()) {
        if (p.id().equals(id)) {
          ordPlayers.add(p);
          // matched = true;
        }
      }
    }

    for (Player p : PlayerFactory.getAllPlayers()) {
      if (!ordPlayers.contains(p)) {
        ordPlayers.add(p);
        disPlayers.add(p);
      }
    }

    for (Player p : ordPlayers) {
      TreeNodeSettings en = new TreeNodeSettings(p.name(), p, null);
      if (disPlayers.contains(p)) {
        en.setEnable(false);
      }
      JComponent jc = en.getConfigPanel();
      if (jc == null) {
        jc = buildEmpty();
      }
      jc.addComponentListener(
          new ComponentAdapter() {
            @Override
            public void componentShown(ComponentEvent e) {
              handleCardComponentChange(e.getComponent());
            }
          });
      tabbedPane.add(en.id(), jc);
      parent[p.purpose()].add(en);
    }

    for (int i = 0; i < tree.getRowCount(); i++) {
      tree.expandRow(i);
    }

    tree.setSelectionRow(0);
  }
  /**
   * Adds a single {@link Player} to the list of Players. Before the player is added to the list, it
   * is verified to be okay.
   *
   * @param player Player to be added to the list.
   */
  public static synchronized void registerPlayer(final Player player) {
    boolean ok = false;
    allPlayers.add(player);

    if (Player.NATIVE.equals(player.executable())) {
      ok = true;
    } else {
      if (Platform.isWindows()) {
        if (player.executable() == null) {
          LOGGER.info("Executable of transcoder profile " + player + " not defined");
          return;
        }

        File executable = new File(player.executable());
        File executable2 = new File(player.executable() + ".exe");

        if (executable.exists() || executable2.exists()) {
          ok = true;
        } else {
          LOGGER.info("Executable of transcoder profile " + player + " not found");
          return;
        }

        if (player.avisynth()) {
          ok = false;

          if (utils.isAvis()) {
            ok = true;
          } else {
            LOGGER.info(
                "Transcoder profile "
                    + player
                    + " will not be used because AviSynth was not found");
          }
        }
      } else if (!player.avisynth()) {
        ok = true;
      }
    }

    if (ok) {
      LOGGER.info("Registering transcoding engine: " + player);
      players.add(player);
    }
  }