private static void EnqueueCoverRequest(AudioArtist target) { lock (_syncRoot) { if (_requestQueue.ContainsKey(target.Id)) { if (_requestQueue[target.Id].All(t => t != target)) { _requestQueue[target.Id].Add(target); } } else { _requestQueue.Add(target.Id, new List <AudioArtist>() { target }); } } if (!_isQueueWorking) { Task.Run(() => StartQueueProcessing()); //вся обработка очереди производится в 1 потоке } }
public static Task <List <AudioArtist> > GetArtistsFromTracks(IEnumerable <Audio> tracks, CancellationToken token) { return(Task.Run(() => { var artists = new Dictionary <string, AudioArtist>(); foreach (var track in tracks) { if (token.IsCancellationRequested) { break; } //parse artist var artistName = track.Artist; var artistId = Md5Helper.Md5(artistName.ToLowerInvariant()); //artistid = md5(artistName) if (!artists.ContainsKey(artistId)) { var artist = new AudioArtist(); artist.Id = artistId; artist.Title = artistName; artists.Add(artistId, artist); } artists[artistId].Tracks.Add(track); } return artists.Values.OrderBy(a => a.Title).ToList(); })); }
private bool UpdateArtist(AudioArtist cachedArtist, AudioArtist updatedArtist) { bool changed = false; if (!cachedArtist.Title.Equals(updatedArtist.Title, StringComparison.OrdinalIgnoreCase)) { cachedArtist.Title = updatedArtist.Title; changed = true; } return(changed); }
/// <summary> /// Получить обложку /// </summary> /// <param name="target"></param> public static Task <ImageSource> GetCover(AudioArtist target) { return(GetImage(target.Title)); }
/// <summary> /// Ставит трек в очередь на получение обложки. Когда очередь подойдет, треку будет присвоена обложка. /// </summary> /// <param name="target"></param> public static void RequestCover(AudioArtist target) { //ставим трек в очередь и сразу возвращаем null EnqueueCoverRequest(target); }
private async void SearchLocalArtists(CancellationToken token) { SearchResults = null; OnTaskStarted("results"); SearchResults = null; try { var artists = await ServiceLocator.LocalMusicService.SearchArtists(_query); if (token.IsCancellationRequested) { Debug.WriteLine("Local artists search cancelled"); return; } if (artists != null && artists.Count > 0) { var results = new List <AudioArtist>(); foreach (var artist in artists) { var a = new AudioArtist() { Title = artist.Title }; var albums = await ServiceLocator.LocalMusicService.GetArtistAlbums(artist.Id); if (token.IsCancellationRequested) { Debug.WriteLine("Local artists search cancelled"); return; } if (!albums.IsNullOrEmpty()) { foreach (var album in albums) { var tracks = await ServiceLocator.LocalMusicService.GetAlbumTracks(album.Id); if (token.IsCancellationRequested) { Debug.WriteLine("Local artists search cancelled"); return; } if (!tracks.IsNullOrEmpty()) { album.Tracks = tracks.Cast <Audio>().ToList(); } } } a.Albums = albums; results.Add(a); } SearchResults = new ObservableCollection <object>(results); } else { OnTaskError("results", ErrorResources.LoadSearchErrorEmpty); } } catch (Exception ex) { LoggingService.Log(ex); OnTaskError("results", ErrorResources.LoadSearchErrorCommon); } OnTaskFinished("results"); }