public async Task Update(CancellationToken token) { var query = new FileQuery(KnownFolders.MusicLibrary); await query.ToAsyncEnumerable().ForEachAsync(async arg => { var(file, deffer) = arg; try { if (!SUPPORTED_EXTENSIONS.Contains(Path.GetExtension(file.Name))) { deffer.Complete(); return; } using (var stream = await file.OpenReadAsync()) { var abstracStream = new TagLib.StreamFileAbstraction(file.Name, stream.AsStream(), null); await Task.Run(async() => { using (var tagFile = TagLib.File.Create(abstracStream)) { var tag = tagFile.Tag; //var artistString = tag.Artists properties.Artist ?? properties.AlbumArtist ?? ""; //var artistString = properties.Artist ?? properties.AlbumArtist ?? ""; //var discNumber = GetDiscNumber(discNumberPropertie); //var componosts = (await Task.WhenAll(properties.Composers.Select(x => store.GetOrCreateArtist(x, token)))).ToList(); //var title = properties.Title; //var artist = (await Task.WhenAll(artistString.Split(new[] { ';', ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => store.GetOrCreateArtist(x.Trim(), token)))).ToList(); //var genres = (await Task.WhenAll(properties.Genre.Select(x => store.GetOrCreateGenre(x, token)))).ToList(); var musicProperties = await file.Properties.GetMusicPropertiesAsync(); var song = await MusicStore.Instance.AddSong(this.Id, file.Path, duration: musicProperties.Duration, composers: tag.Composers, interpreters: tag.Performers, genres: tag.Genres, year: tag.Year, libraryImageId: file.Path, albumInterpret: tag.JoinedAlbumArtists, albumName: tag.Album, title: tag.Title, track: (int)tag.Track, discNumber: (int)tag.Disc, cancelToken: deffer.CancelToken); } }); //s.AddArtists(artist, ArtistType.Interpret); //s.AddArtists(componosts, ArtistType.Composer); //s.AddGenres(genres); //var album = await store.AddSong(s, this, deffer.CancelToken); //if (album != null) //{ // // lets look if we have already set an image on another song // var imagePath = album.Songs.Where(x => x.LibraryImageId != null).Select(x => x.LibraryImageId).FirstOrDefault() ?? file.Path; // s.LibraryImageId = imagePath; // await store.SaveChangesAsync(token); //} } deffer.Complete(); } catch (Exception e) { deffer.Complete(e); } }, token); }
private async void btnSave_Clicked(object sender, EventArgs e) { try { var folder = await FileSystem.Current.GetFileFromPathAsync(picketFilePath); streamR.Dispose(); streamR = await folder.OpenAsync(FileAccess.ReadAndWrite); TagLib.Id3v2.Tag.DefaultVersion = 3; TagLib.Id3v2.Tag.ForceDefaultVersion = true; using (var tagFile = TagLib.File.Create(new FileAbstraction(picketFileName, streamR) /*TagLib.File.Create(new TagLib.StreamFileAbstraction(name, streamR, streamW)*/)) { var tags = tagFile.Tag; string[] realArtist = new string[] { }; string[] realGenres = new string[] { }; if (!string.IsNullOrEmpty(txtArtist.Text)) { var sp = txtArtist.Text.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (sp.Count() > 0) { realArtist = sp; } } if (!string.IsNullOrEmpty(txtGenre.Text)) { var sp = txtGenre.Text.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (sp.Count() > 0) { realGenres = sp; } } tags.Title = txtSongTitle.Text.FullTrimText(); tags.Performers = realArtist.Select(x => x.TrimStart().TrimEnd()).ToArray(); tags.AlbumArtists = realArtist.Select(x => x.TrimStart().TrimEnd()).ToArray(); tags.Album = txtAlbum.Text.FullTrimText(); tags.Track = txtTrackNo.Text.ToUInt(); tags.Year = txtYear.Text.ToUInt(); tags.Genres = realGenres.Select(x => x.TrimStart().TrimEnd()).ToArray(); if (changedCover) { Stream coverStream = new MemoryStream(changedCoverImg); var tagCover = new TagLib.StreamFileAbstraction("hola", coverStream, coverStream); tagFile.Tag.Pictures = new[] { new TagLib.Picture(tagCover) }; coverStream.Dispose(); } tagFile.Save(); tagFile.Dispose(); streamR.Dispose(); //AQUI SETIAR UN VARIABLE PARA DECIR QUE REFRESQUE EL LISTVIEW App.Global_refreshListSong = true; await Navigation.PopAsync(); //OnBackButtonPressed(); } } catch (Exception ex) { streamR.Dispose(); string msj = string.Format("Ha ocurrido un error: {0}", ex); await DisplayAlert("Error", msj, "Ok"); } }