using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Crosstales.Radio.Model; using Crosstales.Radio.Model.Enum; using Crosstales.Radio.Provider; using Crosstales.Radio.Util; using UnityEngine; namespace Crosstales.Radio { [ExecuteInEditMode] [HelpURLAttribute("https://www.crosstales.com/media/data/assets/radio/api/class_crosstales_1_1_radio_1_1_radio_manager.html")] public class RadioManager : MonoBehaviour { [Header("General Settings")] [Tooltip("Radio station providers for this manager.")] public BaseRadioProvider[] Providers; [Tooltip("Global RadioFilter (active if no explicit filter is given).")] public RadioFilter Filter; [Header("Behaviour Settings")] [Tooltip("Calls 'Load' on Start (default: true).")] public bool LoadOnStart = true; [Tooltip("Calls 'Load' on Start in Editor (default: true).")] public bool LoadOnStartInEditor = true; [Header("Player Settings")] [Tooltip("Instantiate RadioPlayers (default: false).")] public bool InstantiateRadioPlayers; [Tooltip("Prefab of the RadioPlayer.")] public GameObject RadioPrefab; private int stationIndex = -1; private List randomStations = new List(Constants.INITIAL_LIST_SIZE); private int randomStationIndex = -1; private int playerIndex = -1; private List randomPlayers = new List(Constants.INITIAL_LIST_SIZE); private int randomPlayerIndex = -1; private RadioPlayer currentRadioPlayer; private List stations = new List(Constants.INITIAL_LIST_SIZE); private List players = new List(Constants.INITIAL_LIST_SIZE); private bool clearedStation = true; private bool clearedStationRandom = true; private RadioFilter lastStationFilter; private RadioFilter lastRandomStationFilter; private List lastFilteredStations; private List lastFilteredRandomStations; private RadioFilter lastPlayerFilter; private RadioFilter lastRandomPlayerFilter; private List lastFilteredPlayers; private List lastFilteredRandomPlayers; private RadioFilter playersByNameFilterDesc; private RadioFilter playersByNameFilterAsc; private List playersByNameDesc = new List(); private List playersByNameAsc = new List(); private RadioFilter playersByURLFilterDesc; private RadioFilter playersByURLFilterAsc; private List playersByURLDesc = new List(); private List playersByURLAsc = new List(); private RadioFilter playersByFormatFilterDesc; private RadioFilter playersByFormatFilterAsc; private List playersByFormatDesc = new List(); private List playersByFormatAsc = new List(); private RadioFilter playersByStationFilterDesc; private RadioFilter playersByStationFilterAsc; private List playersByStationDesc = new List(); private List playersByStationAsc = new List(); private RadioFilter playersByBitrateFilterDesc; private RadioFilter playersByBitrateFilterAsc; private List playersByBitrateDesc = new List(); private List playersByBitrateAsc = new List(); private RadioFilter playersByGenresFilterDesc; private RadioFilter playersByGenresFilterAsc; private List playersByGenresDesc = new List(); private List playersByGenresAsc = new List(); private RadioFilter playersByRatingFilterDesc; private RadioFilter playersByRatingFilterAsc; private List playersByRatingDesc = new List(); private List playersByRatingAsc = new List(); private RadioFilter stationsByNameFilterDesc; private RadioFilter stationsByNameFilterAsc; private List stationsByNameDesc = new List(); private List stationsByNameAsc = new List(); private RadioFilter stationsByURLFilterDesc; private RadioFilter stationsByURLFilterAsc; private List stationsByURLDesc = new List(); private List stationsByURLAsc = new List(); private RadioFilter stationsByFormatFilterDesc; private RadioFilter stationsByFormatFilterAsc; private List stationsByFormatDesc = new List(); private List stationsByFormatAsc = new List(); private RadioFilter stationsByStationFilterDesc; private RadioFilter stationsByStationFilterAsc; private List stationsByStationDesc = new List(); private List stationsByStationAsc = new List(); private RadioFilter stationsByBitrateFilterDesc; private RadioFilter stationsByBitrateFilterAsc; private List stationsByBitrateDesc = new List(); private List stationsByBitrateAsc = new List(); private RadioFilter stationsByGenresFilterDesc; private RadioFilter stationsByGenresFilterAsc; private List stationsByGenresDesc = new List(); private List stationsByGenresAsc = new List(); private RadioFilter stationsByRatingFilterDesc; private RadioFilter stationsByRatingFilterAsc; private List stationsByRatingDesc = new List(); private List stationsByRatingAsc = new List(); private FilterChange _filterChange; private ProviderReady _providerReady; public List Stations { get { return stations; } } public List Players { get { return players; } } public bool isReady { get { if (Providers != null) { BaseRadioProvider[] providers = Providers; foreach (BaseRadioProvider baseRadioProvider in providers) { if (baseRadioProvider != null && !baseRadioProvider.isReady) { return false; } } } return true; } } public bool isPlayback { get { foreach (RadioPlayer player in Players) { if (player != null && player.isPlayback) { return true; } } return false; } } public bool isAudioPlaying { get { foreach (RadioPlayer player in Players) { if (player != null && player.isAudioPlaying) { return true; } } return false; } } public bool isBuffering { get { foreach (RadioPlayer player in Players) { if (player != null && player.isBuffering) { return true; } } return false; } } public event FilterChange OnFilterChange { add { _filterChange = (FilterChange)Delegate.Combine(_filterChange, value); } remove { _filterChange = (FilterChange)Delegate.Remove(_filterChange, value); } } public event ProviderReady OnProviderReady { add { _providerReady = (ProviderReady)Delegate.Combine(_providerReady, value); } remove { _providerReady = (ProviderReady)Delegate.Remove(_providerReady, value); } } private void Awake() { } public void Start() { if (LoadOnStart && !Helper.isEditorMode) { Invoke("Load", 0.1f); } if (LoadOnStartInEditor && Helper.isEditorMode) { Load(); } } public void Load() { if (!Helper.isEditorMode) { StartCoroutine(init()); } } public void Save(string path, RadioFilter filter = null) { if (!string.IsNullOrEmpty(path)) { try { path = path.Replace(Constants.PREFIX_FILE, string.Empty); using (StreamWriter streamWriter = new StreamWriter(path)) { streamWriter.WriteLine("# Radio PRO 2.9.2"); streamWriter.WriteLine("# © 2015-2017 by crosstales LLC (https://www.crosstales.com)"); streamWriter.WriteLine("#"); streamWriter.WriteLine("# List of all radio stations from '" + GetType().Name + "'"); streamWriter.WriteLine("# Created: " + DateTime.Now.ToString("dd.MM.yyyy")); streamWriter.WriteLine("# Name;Url;DataFormat;AudioFormat;Station (optional);Genres (optional);Bitrate (in kbit/s, optional);Rating (0-5, optional);Description (optional);ExcludeCodec (optional);ChunkSize (in KB, optional);BufferSize (in KB, optional)"); foreach (RadioStation item in StationsByStation(false, getFilter(filter))) { streamWriter.WriteLine(item.ToTextLine()); } return; } } catch (Exception ex) { Debug.LogError("Could not save file: " + path + Environment.NewLine + ex); return; } } Debug.LogWarning("'path' was null or empty! Could not save the data!"); } public List GetStations(bool random = false, RadioFilter filter = null) { return filterStations(random, getFilter(filter)).ToList(); } public List GetPlayers(bool random = false, RadioFilter filter = null) { return filterPlayers(random, getFilter(filter)).ToList(); } public int CountStations(RadioFilter filter = null) { if (getFilter(filter) == null) { return Stations.Count(); } return filterStations(false, getFilter(filter)).ToList().Count(); } public int CountPlayers(RadioFilter filter = null) { if (getFilter(filter) == null) { return Players.Count(); } return filterPlayers(false, getFilter(filter)).ToList().Count(); } public void PlayAll() { StopAll(); foreach (RadioPlayer player in Players) { if (player != null) { player.Play(); } } } public RadioPlayer PlayerByIndex(bool random = false, int index = 0, RadioFilter filter = null) { return playerByIndex(random, index, filter); } public RadioPlayer Next(bool random = false, RadioFilter filter = null, bool stopAll = true, bool playImmediately = true) { if (Players != null && Players.Count > 0) { if (stopAll) { StopAll(); } currentRadioPlayer = nextPlayer(random, getFilter(filter)); if (stopAll && playImmediately) { Invoke("play", 0.4f); } else { play(); } } else { Debug.LogWarning("No 'Players' found. Can't play next radio station and returning null."); } return currentRadioPlayer; } public RadioPlayer Previous(bool random = false, RadioFilter filter = null, bool stopAll = true, bool playImmediately = true) { if (Players != null && Players.Count > 0) { if (stopAll) { StopAll(); } currentRadioPlayer = previousPlayer(random, getFilter(filter)); if (stopAll && playImmediately) { Invoke("play", 0.4f); } else { play(); } } else { Debug.LogWarning("No 'Players' found. Can't play previous radio station and returning null."); } return currentRadioPlayer; } public RadioStation StationByIndex(bool random = false, int index = 0, RadioFilter filter = null) { return stationByIndex(random, index, filter); } public RadioStation NextStation(bool random = false, RadioFilter filter = null) { if (Stations != null && Stations.Count > 0) { return nextStation(random, getFilter(filter)); } Debug.LogWarning("No 'Stations' found: returning null."); return null; } public RadioStation PreviousStation(bool random = false, RadioFilter filter = null) { if (Stations != null && Stations.Count > 0) { return previousStation(random, getFilter(filter)); } Debug.LogWarning("No 'Stations' found: returning null."); return null; } public void StopAll(bool resetIndex = false) { foreach (RadioPlayer player in Players) { if (player != null) { player.Stop(); } } if (resetIndex) { playerIndex = (randomPlayerIndex = 0); } } public List PlayersByName(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(playersByNameFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName with filter DESC: CACHED!"); } return playersByNameDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName with filter DESC: NOT cached!"); } playersByNameDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Name descending select entry); playersByNameFilterDesc = new RadioFilter(filter2); return playersByNameDesc; } if (playersByNameDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName without filter DESC: CACHED!"); } return playersByNameDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName without filter DESC: NOT cached!"); } playersByNameDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Name descending select entry); playersByNameFilterDesc = null; return playersByNameDesc; } if (filter2 != null) { if (filter2.Equals(playersByNameFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName with filter ASC: CACHED!"); } return playersByNameAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName with filter ASC: NOT cached!"); } playersByNameAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Name select entry); playersByNameFilterAsc = new RadioFilter(filter2); return playersByNameAsc; } if (playersByNameAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName without filter ASC: CACHED!"); } return playersByNameAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByName without filter ASC: NOT cached!"); } playersByNameAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Name select entry); playersByNameFilterAsc = null; return playersByNameAsc; } public List PlayersByURL(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(playersByURLFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL with filter DESC: CACHED!"); } return playersByURLDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL with filter DESC: NOT cached!"); } playersByURLDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Url descending, entry.Station.Name select entry); playersByURLFilterDesc = new RadioFilter(filter2); return playersByURLDesc; } if (playersByURLDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL without filter DESC: CACHED!"); } return playersByURLDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL without filter DESC: NOT cached!"); } playersByURLDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Url descending, entry.Station.Name select entry); playersByURLFilterDesc = null; return playersByURLDesc; } if (filter2 != null) { if (filter2.Equals(playersByURLFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL with filter ASC: CACHED!"); } return playersByURLAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL with filter ASC: NOT cached!"); } playersByURLAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Url, entry.Station.Name select entry); playersByURLFilterAsc = new RadioFilter(filter2); return playersByURLAsc; } if (playersByURLAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL without filter ASC: CACHED!"); } return playersByURLAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByURL without filter ASC: NOT cached!"); } playersByURLAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Url, entry.Station.Name select entry); playersByURLFilterAsc = null; return playersByURLAsc; } public List PlayersByFormat(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(playersByFormatFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat with filter DESC: CACHED!"); } return playersByFormatDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat with filter DESC: NOT cached!"); } playersByFormatDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Format descending, entry.Station.Name select entry); playersByFormatFilterDesc = new RadioFilter(filter2); return playersByFormatDesc; } if (playersByFormatDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat without filter DESC: CACHED!"); } return playersByFormatDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat without filter DESC: NOT cached!"); } playersByFormatDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Format descending, entry.Station.Name select entry); playersByFormatFilterDesc = null; return playersByFormatDesc; } if (filter2 != null) { if (filter2.Equals(playersByFormatFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat with filter ASC: CACHED!"); } return playersByFormatAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat with filter ASC: NOT cached!"); } playersByFormatAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Format, entry.Station.Name select entry); playersByFormatFilterAsc = new RadioFilter(filter2); return playersByFormatAsc; } if (playersByFormatAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat without filter ASC: CACHED!"); } return playersByFormatAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByFormat without filter ASC: NOT cached!"); } playersByFormatAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Format, entry.Station.Name select entry); playersByFormatFilterAsc = null; return playersByFormatAsc; } public List PlayersByStation(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(playersByStationFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation with filter DESC: CACHED!"); } return playersByStationDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation with filter DESC: NOT cached!"); } playersByStationDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Station descending, entry.Station.Name select entry); playersByStationFilterDesc = new RadioFilter(filter2); return playersByStationDesc; } if (playersByStationDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation without filter DESC: CACHED!"); } return playersByStationDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation without filter DESC: NOT cached!"); } playersByStationDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Station descending, entry.Station.Name select entry); playersByStationFilterDesc = null; return playersByStationDesc; } if (filter2 != null) { if (filter2.Equals(playersByStationFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation with filter ASC: CACHED!"); } return playersByStationAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation with filter ASC: NOT cached!"); } playersByStationAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Station, entry.Station.Name select entry); playersByStationFilterAsc = new RadioFilter(filter2); return playersByStationAsc; } if (playersByStationAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation without filter ASC: CACHED!"); } return playersByStationAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByStation without filter ASC: NOT cached!"); } playersByStationAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Station, entry.Station.Name select entry); playersByStationFilterAsc = null; return playersByStationAsc; } public List PlayersByBitrate(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(playersByBitrateFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate with filter DESC: CACHED!"); } return playersByBitrateDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate with filter DESC: NOT cached!"); } playersByBitrateDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Bitrate descending, entry.Station.Name select entry); playersByBitrateFilterDesc = new RadioFilter(filter2); return playersByBitrateDesc; } if (playersByBitrateDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate without filter DESC: CACHED!"); } return playersByBitrateDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate without filter DESC: NOT cached!"); } playersByBitrateDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Bitrate descending, entry.Station.Name select entry); return playersByBitrateDesc; } if (filter2 != null) { if (filter2.Equals(playersByBitrateFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate with filter ASC: CACHED!"); } return playersByBitrateAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate with filter ASC: NOT cached!"); } playersByBitrateAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Bitrate, entry.Station.Name select entry); playersByBitrateFilterAsc = new RadioFilter(filter2); return playersByBitrateAsc; } if (playersByBitrateAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate without filter ASC: CACHED!"); } return playersByBitrateAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByBitrate without filter ASC: NOT cached!"); } playersByBitrateAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Bitrate, entry.Station.Name select entry); playersByBitrateFilterAsc = null; return playersByBitrateAsc; } public List PlayersByGenres(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(playersByGenresFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres with filter DESC: CACHED!"); } return playersByGenresDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres with filter DESC: NOT cached!"); } playersByGenresDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Genres descending, entry.Station.Name select entry); playersByGenresFilterDesc = new RadioFilter(filter2); return playersByGenresDesc; } if (playersByGenresDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres without filter DESC: CACHED!"); } return playersByGenresDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres without filter DESC: NOT cached!"); } playersByGenresDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Genres descending, entry.Station.Name select entry); playersByGenresFilterDesc = null; return playersByGenresDesc; } if (filter2 != null) { if (filter2.Equals(playersByGenresFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres with filter ASC: CACHED!"); } return playersByGenresAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres with filter ASC: NOT cached!"); } playersByGenresAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Genres, entry.Station.Name select entry); playersByGenresFilterAsc = new RadioFilter(filter2); return playersByGenresAsc; } if (playersByGenresAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres without filter ASC: CACHED!"); } return playersByGenresAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByGenres without filter ASC: NOT cached!"); } playersByGenresAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Genres, entry.Station.Name select entry); playersByGenresFilterAsc = null; return playersByGenresAsc; } public List PlayersByRating(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(playersByRatingFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating with filter DESC: CACHED!"); } return playersByRatingDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating with filter DESC: NOT cached!"); } playersByRatingDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Rating descending, entry.Station.Name select entry); playersByRatingFilterDesc = new RadioFilter(filter2); return playersByRatingDesc; } if (playersByRatingDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating without filter DESC: CACHED!"); } return playersByRatingDesc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating without filter DESC: NOT cached!"); } playersByRatingDesc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Rating descending, entry.Station.Name select entry); playersByRatingFilterDesc = null; return playersByRatingDesc; } if (filter2 != null) { if (filter2.Equals(playersByRatingFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating with filter ASC: CACHED!"); } return playersByRatingAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating with filter ASC: NOT cached!"); } playersByRatingAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Rating, entry.Station.Name select entry); playersByRatingFilterAsc = new RadioFilter(filter2); return playersByRatingAsc; } if (playersByRatingAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating without filter ASC: CACHED!"); } return playersByRatingAsc; } if (Constants.DEV_DEBUG) { Debug.Log("PlayersByRating without filter ASC: NOT cached!"); } playersByRatingAsc = new List(from entry in filterPlayers(false, getFilter(filter2)) orderby entry.Station.Rating, entry.Station.Name select entry); playersByRatingFilterAsc = null; return playersByRatingAsc; } public List StationsByName(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(stationsByNameFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByName with filter DESC: CACHED!"); } return stationsByNameDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByName with filter DESC: NOT cached!"); } stationsByNameDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Name descending select entry); stationsByNameFilterDesc = new RadioFilter(filter2); return stationsByNameDesc; } if (stationsByNameDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByName without filter DESC: CACHED!"); } return stationsByNameDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByName without filter DESC: NOT cached!"); } stationsByNameDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Name descending select entry); stationsByNameFilterDesc = null; return stationsByNameDesc; } if (filter2 != null) { if (filter2.Equals(stationsByNameFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByName with filter ASC: CACHED!"); } return stationsByNameAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByName with filter ASC: NOT cached!"); } stationsByNameAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Name select entry); stationsByNameFilterAsc = new RadioFilter(filter2); return stationsByNameAsc; } if (stationsByNameAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByName without filter ASC: CACHED!"); } return stationsByNameAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByName without filter ASC: NOT cached!"); } stationsByNameAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Name select entry); stationsByNameFilterAsc = null; return stationsByNameAsc; } public List StationsByURL(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(stationsByURLFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL with filter DESC: CACHED!"); } return stationsByURLDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL with filter DESC: NOT cached!"); } stationsByURLDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Url descending, entry.Name select entry); stationsByURLFilterDesc = new RadioFilter(filter2); return stationsByURLDesc; } if (stationsByURLDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL without filter DESC: CACHED!"); } return stationsByURLDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL without filter DESC: NOT cached!"); } stationsByURLDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Url descending, entry.Name select entry); stationsByURLFilterDesc = null; return stationsByURLDesc; } if (filter2 != null) { if (filter2.Equals(stationsByURLFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL with filter ASC: CACHED!"); } return stationsByURLAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL with filter ASC: NOT cached!"); } stationsByURLAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Url, entry.Name select entry); stationsByURLFilterAsc = new RadioFilter(filter2); return stationsByURLAsc; } if (stationsByURLAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL without filter ASC: CACHED!"); } return stationsByURLAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByURL without filter ASC: NOT cached!"); } stationsByURLAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Url, entry.Name select entry); stationsByURLFilterAsc = null; return stationsByURLAsc; } public List StationsByFormat(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(stationsByFormatFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat with filter DESC: CACHED!"); } return stationsByFormatDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat with filter DESC: NOT cached!"); } stationsByFormatDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Format descending, entry.Name select entry); stationsByFormatFilterDesc = new RadioFilter(filter2); return stationsByFormatDesc; } if (stationsByFormatDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat without filter DESC: CACHED!"); } return stationsByFormatDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat without filter DESC: NOT cached!"); } stationsByFormatDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Format descending, entry.Name select entry); stationsByFormatFilterDesc = null; return stationsByFormatDesc; } if (filter2 != null) { if (filter2.Equals(stationsByFormatFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat with filter ASC: CACHED!"); } return stationsByFormatAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat with filter ASC: NOT cached!"); } stationsByFormatAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Format, entry.Name select entry); stationsByFormatFilterAsc = new RadioFilter(filter2); return stationsByFormatAsc; } if (stationsByFormatAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat without filter ASC: CACHED!"); } return stationsByFormatAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByFormat without filter ASC: NOT cached!"); } stationsByFormatAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Format, entry.Name select entry); stationsByFormatFilterAsc = null; return stationsByFormatAsc; } public List StationsByStation(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(stationsByStationFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation with filter DESC: CACHED!"); } return stationsByStationDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation with filter DESC: NOT cached!"); } stationsByStationDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Station descending, entry.Name select entry); stationsByStationFilterDesc = new RadioFilter(filter2); return stationsByStationDesc; } if (stationsByStationDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation without filter DESC: CACHED!"); } return stationsByStationDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation without filter DESC: NOT cached!"); } stationsByStationDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Station descending, entry.Name select entry); stationsByStationFilterDesc = null; return stationsByStationDesc; } if (filter2 != null) { if (filter2.Equals(stationsByStationFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation with filter ASC: CACHED!"); } return stationsByStationAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation with filter ASC: NOT cached!"); } stationsByStationAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Station, entry.Name select entry); stationsByStationFilterAsc = new RadioFilter(filter2); return stationsByStationAsc; } if (stationsByStationAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation without filter ASC: CACHED!"); } return stationsByStationAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByStation without filter ASC: NOT cached!"); } stationsByStationAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Station, entry.Name select entry); stationsByStationFilterAsc = null; return stationsByStationAsc; } public List StationsByBitrate(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(stationsByBitrateFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate with filter DESC: CACHED!"); } return stationsByBitrateDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate with filter DESC: NOT cached!"); } stationsByBitrateDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Bitrate descending, entry.Name select entry); stationsByBitrateFilterDesc = new RadioFilter(filter2); return stationsByBitrateDesc; } if (stationsByBitrateDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate without filter DESC: CACHED!"); } return stationsByBitrateDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate without filter DESC: NOT cached!"); } stationsByBitrateDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Bitrate descending, entry.Name select entry); stationsByBitrateFilterDesc = null; return stationsByBitrateDesc; } if (filter2 != null) { if (filter2.Equals(stationsByBitrateFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate with filter ASC: CACHED!"); } return stationsByBitrateAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate with filter ASC: NOT cached!"); } stationsByBitrateAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Bitrate, entry.Name select entry); stationsByBitrateFilterAsc = new RadioFilter(filter2); return stationsByBitrateAsc; } if (stationsByBitrateAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate without filter ASC: CACHED!"); } return stationsByBitrateAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByBitrate without filter ASC: NOT cached!"); } stationsByBitrateAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Bitrate, entry.Name select entry); stationsByBitrateFilterAsc = null; return stationsByBitrateAsc; } public List StationsByGenres(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(stationsByGenresFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres with filter DESC: CACHED!"); } return stationsByGenresDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres with filter DESC: NOT cached!"); } stationsByGenresDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Genres descending, entry.Name select entry); stationsByGenresFilterDesc = new RadioFilter(filter2); return stationsByGenresDesc; } if (stationsByGenresDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres without filter DESC: CACHED!"); } return stationsByGenresDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres without filter DESC: NOT cached!"); } stationsByGenresDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Genres descending, entry.Name select entry); stationsByGenresFilterDesc = null; return stationsByGenresDesc; } if (filter2 != null) { if (filter2.Equals(stationsByGenresFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres with filter ASC: CACHED!"); } return stationsByGenresAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres with filter ASC: NOT cached!"); } stationsByGenresAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Genres, entry.Name select entry); stationsByGenresFilterAsc = new RadioFilter(filter2); return stationsByGenresAsc; } if (stationsByGenresAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres without filter ASC: CACHED!"); } return stationsByGenresAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByGenres without filter ASC: NOT cached!"); } stationsByGenresAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Genres, entry.Name select entry); stationsByGenresFilterAsc = null; return stationsByGenresAsc; } public List StationsByRating(bool desc = false, RadioFilter filter = null) { RadioFilter filter2 = getFilter(filter); if (desc) { if (filter2 != null) { if (filter2.Equals(stationsByRatingFilterDesc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating with filter DESC: CACHED!"); } return stationsByRatingDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating with filter DESC: NOT cached!"); } stationsByRatingDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Rating descending, entry.Name select entry); stationsByRatingFilterDesc = new RadioFilter(filter2); return stationsByRatingDesc; } if (stationsByRatingDesc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating without filter DESC: CACHED!"); } return stationsByRatingDesc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating without filter DESC: NOT cached!"); } stationsByRatingDesc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Rating descending, entry.Name select entry); return stationsByRatingDesc; } if (filter2 != null) { if (filter2.Equals(stationsByRatingFilterAsc)) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating with filter ASC: CACHED!"); } return stationsByRatingAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating with filter ASC: NOT cached!"); } stationsByRatingAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Rating, entry.Name select entry); stationsByRatingFilterAsc = new RadioFilter(filter2); return stationsByRatingAsc; } if (stationsByRatingAsc.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating without filter ASC: CACHED!"); } return stationsByRatingAsc; } if (Constants.DEV_DEBUG) { Debug.Log("StationsByRating without filter ASC: NOT cached!"); } stationsByRatingAsc = new List(from entry in filterStations(false, getFilter(filter2)) orderby entry.Rating, entry.Name select entry); stationsByRatingFilterAsc = null; return stationsByRatingAsc; } public void RandomizePlayers(bool resetIndex = true) { randomPlayers.CTShuffle(); if (resetIndex) { randomPlayerIndex = 0; } } public void RandomizeStations(bool resetIndex = true) { randomStations.CTShuffle(); if (resetIndex) { randomStationIndex = 0; } } private IEnumerator init() { Stations.Clear(); randomStations.Clear(); Players.Clear(); randomPlayers.Clear(); if (Providers != null) { while (!isReady) { yield return null; } BaseRadioProvider[] providers = Providers; foreach (BaseRadioProvider provider in providers) { if (provider != null) { foreach (RadioStation station in provider.Stations) { if (!Stations.Contains(station)) { Stations.Add(station); randomStations.Add(station); if (InstantiateRadioPlayers && RadioPrefab != null) { GameObject gameObject = UnityEngine.Object.Instantiate(RadioPrefab); gameObject.transform.parent = base.transform; RadioPlayer component = gameObject.GetComponent(); component.Station = station; Players.Add(component); randomPlayers.Add(component); if (Config.DEBUG) { Debug.Log("Radio station found: " + component); } } } else { Debug.LogWarning(string.Concat("Station already added: '", station, "'")); } } } yield return null; } RandomizePlayers(); RandomizeStations(); } onProviderReady(); } private IEnumerable filterPlayers(bool random = false, RadioFilter filter = null) { if (random) { if (filter != null && filter.isFiltering) { clearedStationRandom = false; if (filter.Equals(lastRandomPlayerFilter) && lastFilteredRandomPlayers.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("filterPlayers RND: CACHED!"); } return lastFilteredRandomPlayers; } if (Constants.DEV_DEBUG) { Debug.Log("filterPlayers RND: NOT Cached!"); } IEnumerable enumerable = randomPlayers.Where((RadioPlayer entry) => filter == null || ((string.IsNullOrEmpty(entry.Station.Name) || entry.Station.Name.CTContainsAny(filter.Name)) && (string.IsNullOrEmpty(entry.Station.Station) || entry.Station.Station.CTContainsAny(filter.Station)) && (string.IsNullOrEmpty(entry.Station.Url) || entry.Station.Url.CTContainsAll(filter.Url)) && (string.IsNullOrEmpty(entry.Station.Genres) || entry.Station.Genres.CTContainsAny(filter.Genres)) && entry.Station.Format.ToString().CTContainsAny(filter.Format) && entry.Station.Bitrate >= filter.BitrateMin && entry.Station.Bitrate <= filter.BitrateMax && entry.Station.Rating >= filter.RatingMin && entry.Station.Rating <= filter.RatingMax && (!filter.ExcludeUnsupportedCodecs || entry.Station.ExcludedCodec == AudioCodec.None || entry.Station.ExcludedCodec != Helper.AudioCodecForAudioFormat(entry.Station.Format)))); lastFilteredRandomPlayers = enumerable.ToList(); lastRandomPlayerFilter = new RadioFilter(filter); clearFilters(false, false); onFilterChange(); return enumerable; } if (Constants.DEV_DEBUG) { Debug.Log("filterPlayers RND: No filtering!"); } if (!clearedStationRandom) { clearFilters(); clearedStationRandom = true; onFilterChange(); } return randomPlayers; } if (filter != null && filter.isFiltering) { clearedStation = false; if (filter.Equals(lastPlayerFilter) && lastFilteredPlayers.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("filterPlayers: CACHED!"); } return lastFilteredPlayers; } if (Constants.DEV_DEBUG) { Debug.Log("filterPlayers: NOT Cached!"); } IEnumerable enumerable2 = Players.Where((RadioPlayer entry) => filter == null || ((string.IsNullOrEmpty(entry.Station.Name) || entry.Station.Name.CTContainsAny(filter.Name)) && (string.IsNullOrEmpty(entry.Station.Station) || entry.Station.Station.CTContainsAny(filter.Station)) && (string.IsNullOrEmpty(entry.Station.Url) || entry.Station.Url.CTContainsAll(filter.Url)) && (string.IsNullOrEmpty(entry.Station.Genres) || entry.Station.Genres.CTContainsAny(filter.Genres)) && entry.Station.Format.ToString().CTContainsAny(filter.Format) && entry.Station.Bitrate >= filter.BitrateMin && entry.Station.Bitrate <= filter.BitrateMax && entry.Station.Rating >= filter.RatingMin && entry.Station.Rating <= filter.RatingMax && (!filter.ExcludeUnsupportedCodecs || entry.Station.ExcludedCodec == AudioCodec.None || entry.Station.ExcludedCodec != Helper.AudioCodecForAudioFormat(entry.Station.Format)))); lastFilteredPlayers = enumerable2.ToList(); lastPlayerFilter = new RadioFilter(filter); clearFilters(false, false); onFilterChange(); return enumerable2; } if (Constants.DEV_DEBUG) { Debug.Log("filterPlayers: No filtering!"); } if (!clearedStation) { clearFilters(); clearedStation = true; onFilterChange(); } return Players; } private IEnumerable filterStations(bool random = false, RadioFilter filter = null) { if (random) { if (filter != null && filter.isFiltering) { clearedStationRandom = false; if (filter.Equals(lastRandomStationFilter) && lastFilteredRandomStations.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("filterStations RND: CACHED!"); } return lastFilteredRandomStations; } if (Constants.DEV_DEBUG) { Debug.Log("filterStations RND: NOT Cached!"); } IEnumerable enumerable = randomStations.Where((RadioStation entry) => filter == null || ((entry.Name == null || entry.Name.CTContainsAny(filter.Name)) && (entry.Station == null || entry.Station.CTContainsAny(filter.Station)) && (entry.Url == null || entry.Url.CTContainsAll(filter.Url)) && (entry.Genres == null || entry.Genres.CTContainsAny(filter.Genres)) && entry.Format.ToString().CTContainsAny(filter.Format) && entry.Bitrate >= filter.BitrateMin && entry.Bitrate <= filter.BitrateMax && entry.Rating >= filter.RatingMin && entry.Rating <= filter.RatingMax && (!filter.ExcludeUnsupportedCodecs || entry.ExcludedCodec == AudioCodec.None || entry.ExcludedCodec != Helper.AudioCodecForAudioFormat(entry.Format)))); lastFilteredRandomStations = enumerable.ToList(); lastRandomStationFilter = new RadioFilter(filter); clearFilters(false, false); onFilterChange(); return enumerable; } if (Constants.DEV_DEBUG) { Debug.Log("filterStations RND: No filtering!"); } if (!clearedStationRandom) { clearFilters(); clearedStationRandom = true; onFilterChange(); } return randomStations; } if (filter != null && filter.isFiltering) { clearedStation = false; if (filter.Equals(lastStationFilter) && lastFilteredStations.Count > 0) { if (Constants.DEV_DEBUG) { Debug.Log("filterStations: CACHED!"); } return lastFilteredStations; } if (Constants.DEV_DEBUG) { Debug.Log("filterStations: NOT Cached!"); } IEnumerable enumerable2 = Stations.Where((RadioStation entry) => filter == null || ((entry.Name == null || entry.Name.CTContainsAny(filter.Name)) && (entry.Station == null || entry.Station.CTContainsAny(filter.Station)) && (entry.Url == null || entry.Url.CTContainsAll(filter.Url)) && (entry.Genres == null || entry.Genres.CTContainsAny(filter.Genres)) && entry.Format.ToString().CTContainsAny(filter.Format) && entry.Bitrate >= filter.BitrateMin && entry.Bitrate <= filter.BitrateMax && entry.Rating >= filter.RatingMin && entry.Rating <= filter.RatingMax && (!filter.ExcludeUnsupportedCodecs || entry.ExcludedCodec == AudioCodec.None || entry.ExcludedCodec != Helper.AudioCodecForAudioFormat(entry.Format)))); lastFilteredStations = enumerable2.ToList(); lastStationFilter = new RadioFilter(filter); clearFilters(false, false); onFilterChange(); return enumerable2; } if (Constants.DEV_DEBUG) { Debug.Log("filterStations: No filtering!"); } if (!clearedStation) { clearFilters(); clearedStation = true; onFilterChange(); } return Stations; } private void clearFilters(bool clearLastFilter = true, bool clearLastRandomFilter = true) { if (clearLastFilter) { lastFilteredStations = null; lastStationFilter = null; lastFilteredPlayers = null; lastPlayerFilter = null; } if (clearLastRandomFilter) { lastFilteredRandomStations = null; lastRandomStationFilter = null; lastFilteredRandomPlayers = null; lastRandomPlayerFilter = null; } playersByNameFilterDesc = null; playersByNameFilterAsc = null; playersByURLFilterDesc = null; playersByURLFilterAsc = null; playersByFormatFilterDesc = null; playersByFormatFilterAsc = null; playersByStationFilterDesc = null; playersByStationFilterAsc = null; playersByBitrateFilterDesc = null; playersByBitrateFilterAsc = null; playersByGenresFilterDesc = null; playersByGenresFilterAsc = null; playersByRatingFilterDesc = null; playersByRatingFilterAsc = null; stationsByNameFilterDesc = null; stationsByNameFilterAsc = null; stationsByURLFilterDesc = null; stationsByURLFilterAsc = null; stationsByFormatFilterDesc = null; stationsByFormatFilterAsc = null; stationsByStationFilterDesc = null; stationsByStationFilterAsc = null; stationsByBitrateFilterDesc = null; stationsByBitrateFilterAsc = null; stationsByGenresFilterDesc = null; stationsByGenresFilterAsc = null; stationsByRatingFilterDesc = null; stationsByRatingFilterAsc = null; resetFilterLists(); } private void resetFilterLists() { playersByNameDesc.Clear(); playersByNameAsc.Clear(); stationsByNameDesc.Clear(); stationsByNameAsc.Clear(); playersByURLDesc.Clear(); playersByURLAsc.Clear(); stationsByURLDesc.Clear(); stationsByURLAsc.Clear(); playersByFormatDesc.Clear(); playersByFormatAsc.Clear(); stationsByFormatDesc.Clear(); stationsByFormatAsc.Clear(); playersByStationDesc.Clear(); playersByStationAsc.Clear(); stationsByStationDesc.Clear(); stationsByStationAsc.Clear(); playersByBitrateDesc.Clear(); playersByBitrateAsc.Clear(); stationsByBitrateDesc.Clear(); stationsByBitrateAsc.Clear(); playersByGenresDesc.Clear(); playersByGenresAsc.Clear(); stationsByGenresDesc.Clear(); stationsByGenresAsc.Clear(); playersByRatingDesc.Clear(); playersByRatingAsc.Clear(); stationsByRatingDesc.Clear(); stationsByRatingAsc.Clear(); } private void play() { currentRadioPlayer.Play(); } private RadioPlayer playerByIndex(bool random = false, int index = 0, RadioFilter filter = null) { List list = new List(filterPlayers(random, filter)); if (random) { if (index > -1 && index < list.Count) { randomPlayerIndex = index; return list[index]; } } else if (index > -1 && index < list.Count) { playerIndex = index; return list[index]; } return null; } private RadioPlayer nextPlayer(bool random = false, RadioFilter filter = null) { List list = new List(filterPlayers(random, filter)); if (random) { if (randomPlayerIndex > -1 && randomPlayerIndex + 1 < list.Count) { randomPlayerIndex++; } else { randomPlayerIndex = 0; } if (list.Count > 0) { return list[randomPlayerIndex]; } } else { if (playerIndex > -1 && playerIndex + 1 < list.Count) { playerIndex++; } else { playerIndex = 0; } if (list.Count > 0) { return list[playerIndex]; } } return null; } private RadioPlayer previousPlayer(bool random = false, RadioFilter filter = null) { List list = new List(filterPlayers(random, filter)); if (random) { if (randomPlayerIndex > 0 && randomPlayerIndex < list.Count) { randomPlayerIndex--; } else { randomPlayerIndex = list.Count - 1; } if (list.Count > 0) { return list[randomPlayerIndex]; } } else { if (playerIndex > 0 && playerIndex < list.Count) { playerIndex--; } else { playerIndex = list.Count - 1; } if (list.Count > 0) { return list[playerIndex]; } } return null; } private RadioStation stationByIndex(bool random = false, int index = 0, RadioFilter filter = null) { List list = new List(filterStations(random, filter)); if (random) { if (index > -1 && index < list.Count) { randomStationIndex = index; return list[index]; } } else if (index > -1 && index < list.Count) { stationIndex = index; return list[index]; } return null; } private RadioStation nextStation(bool random = false, RadioFilter filter = null) { List list = new List(filterStations(random, filter)); if (random) { if (randomStationIndex > -1 && randomStationIndex + 1 < list.Count) { randomStationIndex++; } else { randomStationIndex = 0; } if (list.Count > 0) { return list[randomStationIndex]; } } else { if (stationIndex > -1 && stationIndex + 1 < list.Count) { stationIndex++; } else { stationIndex = 0; } if (list.Count > 0) { return list[stationIndex]; } } return null; } private RadioStation previousStation(bool random = false, RadioFilter filter = null) { List list = new List(filterStations(random, filter)); if (random) { if (randomStationIndex > 0 && randomStationIndex < list.Count) { randomStationIndex--; } else { randomStationIndex = list.Count - 1; } if (list.Count > 0) { return list[randomStationIndex]; } } else { if (stationIndex > 0 && stationIndex < list.Count) { stationIndex--; } else { stationIndex = list.Count - 1; } if (list.Count > 0) { return list[stationIndex]; } } return null; } private RadioFilter getFilter(RadioFilter filter) { if (filter != null && filter.isFiltering) { return filter; } if (Filter.isFiltering) { return Filter; } return null; } private void onProviderReady() { if (Config.DEBUG) { Debug.Log("onProviderReady"); } if (_providerReady != null) { _providerReady(); } } private void onFilterChange() { if (Config.DEBUG) { Debug.Log("onFilterChange"); } if (_filterChange != null) { _filterChange(); } } public override string ToString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(GetType().Name); stringBuilder.Append(Constants.TEXT_TOSTRING_START); stringBuilder.Append("Providers='"); stringBuilder.Append(Providers); stringBuilder.Append(Constants.TEXT_TOSTRING_DELIMITER); stringBuilder.Append("LoadOnStart='"); stringBuilder.Append(LoadOnStart); stringBuilder.Append(Constants.TEXT_TOSTRING_DELIMITER); stringBuilder.Append("LoadOnStartInEditor='"); stringBuilder.Append(LoadOnStartInEditor); stringBuilder.Append(Constants.TEXT_TOSTRING_DELIMITER); stringBuilder.Append("InstantiateRadioPlayers='"); stringBuilder.Append(InstantiateRadioPlayers); stringBuilder.Append(Constants.TEXT_TOSTRING_DELIMITER); stringBuilder.Append("RadioPrefab='"); stringBuilder.Append(RadioPrefab); stringBuilder.Append(Constants.TEXT_TOSTRING_DELIMITER_END); stringBuilder.Append(Constants.TEXT_TOSTRING_END); return stringBuilder.ToString(); } } }