package manager; import java.util.ArrayList; import java.util.List; import config.Config; import manager.structure.Collector; import model.collector.chartlyrics.ChartLyricsCollector; import model.collector.interfaces.ICollector; import model.collector.interfaces.ICoverArtCollector; import model.collector.interfaces.IID3DataCollector; import model.collector.interfaces.ILyricsCollector; import model.collector.lastfm.LastfmCoverArtCollector; import model.collector.lastfm.LastfmTrackCollector; import model.collector.lyricstime.LyricstimeCollector; public class CollectorManager { /** * instance */ private static CollectorManager instance; /** * ID3 data collector ID */ public final static int ID3DATA_COLLECTOR = 0; /** * Cover collector ID */ public final static int COVER_COLLECTOR = 1; /** * Lyrics collector ID */ public final static int LYRICS_COLLECTOR = 2; /** * the registered ID3 data collectors */ private List<IID3DataCollector> id3dataCollectors; /** * all enabled ID3 data collector indentifiers */ private List<String> usedID3Collectors; /** * the registered cover collectors */ private List<ICoverArtCollector> coverCollectors; /** * the enabled cover collector identifiers */ private List<String> usedCoverCollectors; /** * the registered lyrics collectors */ private List<ILyricsCollector> lyricsCollectors; /** * the enabled lyrics collector identifiers */ private List<String> usedLyricsCollectors; /** * gets the instance * * @return the instance */ public static CollectorManager getInstance() { if (instance == null) instance = new CollectorManager(); return instance; } /** * registers the collectors */ private void register() { // *************************** // Register Collectors here: * // *************************** // register collectors here, if no order is given in the settings file, // this order will be taken // id3 data collector registerID3DataCollector(new LastfmTrackCollector()); // cover image collector registerCoverCollector(new LastfmCoverArtCollector()); // lyrics collector registerLyricsCollector(new ChartLyricsCollector()); registerLyricsCollector(new LyricstimeCollector()); // ************************* // End Register Collectors * // ************************* } /** * Constructor */ private CollectorManager() { id3dataCollectors = new ArrayList<>(); coverCollectors = new ArrayList<>(); lyricsCollectors = new ArrayList<>(); // register all register(); usedID3Collectors = Config.getInstance().getID3DataCollectors(); usedCoverCollectors = Config.getInstance().getCoverCollectors(); usedLyricsCollectors = Config.getInstance().getLyricsCollectors(); // if no valid collector is given, add all if (usedID3Collectors.isEmpty()) usedID3Collectors = fill(this.id3dataCollectors); if (usedCoverCollectors.isEmpty()) usedCoverCollectors = fill(this.coverCollectors); if (usedLyricsCollectors.isEmpty()) usedLyricsCollectors = fill(this.lyricsCollectors); } /** * creates a list with the identifiers of the given collector list * * @param collectors * the collectors * * @return the identifier list */ private List<String> fill(List<? extends ICollector> collectors) { List<String> result = new ArrayList<>(); for (ICollector c : collectors) result.add(c.getCollectorName()); return result; } /** * gets the collector with the given identifier out of the given collector * list * * @param lst * given collector list * @param name * given identifier * * @return the collector or null, if not found */ private ICollector getCollector(List<? extends ICollector> lst, String name) { for (ICollector c : lst) { if (c.getCollectorName().equals(name)) return c; } return null; } /** * sets the enabled collectors * * @param collectors * the collectors * @param type * collector ID */ public void setCollectors(List<String> collectors, int type) { if (type == ID3DATA_COLLECTOR) this.usedID3Collectors = collectors; else if (type == COVER_COLLECTOR) this.usedCoverCollectors = collectors; else if (type == LYRICS_COLLECTOR) this.usedLyricsCollectors = collectors; } /** * checks if the given identifier is in the given collector list * * @param name * given identifier * @param used * given collector list * * @return true if found, else false */ private boolean isIn(String name, List<String> used) { for (String str : used) { if (name.equals(str)) return true; } return false; } /** * gets the collectors, enabled one first, disabled last * * @param type * collector ID * * @return the wanted collectors */ public List<Collector> getCollectors(int type) { List<Collector> result = new ArrayList<>(); List<? extends ICollector> lst = null; List<String> used = null; if (type == ID3DATA_COLLECTOR) { lst = this.id3dataCollectors; used = this.usedID3Collectors; } else if (type == COVER_COLLECTOR) { lst = this.coverCollectors; used = this.usedCoverCollectors; } else if (type == LYRICS_COLLECTOR) { lst = this.lyricsCollectors; used = this.usedLyricsCollectors; } // add enabled collectors in this order for (String u : used) { ICollector c = getCollector(lst, u); if (c == null) continue; result.add(new Collector(c.getCollectorName(), true)); } // add all unabled collectors which arent in this list for (ICollector c : lst) { if (!isIn(c.getCollectorName(), used)) result.add(new Collector(c.getCollectorName(), false)); } return result; } /** * gets all enabled ID3 data Collectors in the correct order * * @return the enabled ID3 data collectors */ public List<IID3DataCollector> getID3DataCollectors() { List<IID3DataCollector> result = new ArrayList<>(); for (String name : this.usedID3Collectors) { ICollector c = getCollector(this.id3dataCollectors, name); if (c != null) result.add((IID3DataCollector) c); } return result; } /** * gets all enabled cover Collectors in the correct order * * @return the enabled cover collectors */ public List<ICoverArtCollector> getCoverArtCollectors() { List<ICoverArtCollector> result = new ArrayList<>(); for (String name : this.usedCoverCollectors) { ICollector c = getCollector(this.coverCollectors, name); if (c != null) result.add((ICoverArtCollector) c); } return result; } /** * gets all enabled lyrics Collectors in the correct order * * @return the enabled lyrics collectors */ public List<ILyricsCollector> getLyricsCollectors() { List<ILyricsCollector> result = new ArrayList<>(); for (String name : this.usedLyricsCollectors) { ICollector c = getCollector(this.lyricsCollectors, name); if (c != null) result.add((ILyricsCollector) c); } return result; } /** * registeres the given ID3 data collector * * @param collector * given collector */ private void registerID3DataCollector(IID3DataCollector collector) { if (collector != null) this.id3dataCollectors.add(collector); } /** * registers the given cover collector * * @param collector * given collector */ private void registerCoverCollector(ICoverArtCollector collector) { if (collector != null) this.coverCollectors.add(collector); } /** * registers the given lyrics collector * * @param collector * given lyrics collector */ private void registerLyricsCollector(ILyricsCollector collector) { if (collector != null) this.lyricsCollectors.add(collector); } /** * saves the collector configuration */ public void saveConfig() { Config.getInstance().setID3DataCollectors(listToString(this.usedID3Collectors)); Config.getInstance().setCoverCollectors(listToString(this.usedCoverCollectors)); Config.getInstance().setLyricsCollectors(listToString(this.usedLyricsCollectors)); } /** * joins the given list of strings with comma seperation * * @param lst * given list * * @return the comma joined list */ private String listToString(List<String> lst) { String result = ""; for (String str : lst) { result += str + ","; } if (result.length() > 0) result = result.substring(0, result.length() - 1); return result; } }