//saving spotify full tracks using viez.
        public static async Task <SavingError> SaveSpotifyTrackLevel1(FullTrack track, bool manualMatch = false)
        {
            //clean track only english letters
            track.Name        = SongSavingHelper.ToCleanQuery(track.Name);
            track.Artist.Name = SongSavingHelper.ToCleanQuery(track.Artist.Name);
            track.Album.Name  = SongSavingHelper.ToCleanQuery(track.Album.Name);

            //check if it is track properties are noll or not;
            if (!CheckUp(track))
            {
                ShowResults(SavingError.Unknown, track.Name);
                return(SavingError.Unknown);
            }

            if (App.Locator.CollectionService.SongAlreadyExists(track.Name, track.Album.Name, track.Artist.Name))
            {
                ShowResults(SavingError.AlreadyExists, track.Name);
                return(SavingError.AlreadyExists);
            }

            SavingError result;

            try
            {
                var album = await App.Locator.Spotify.GetAlbum(track.Album.Id);

                result = await SaveSpotifyTrackLevel2(track, album);
            }
            catch
            {
                result = SavingError.Network;
            }
            return(result);
        }
        public static async Task <SavingError> SaveViezTrackLevel1(WebSong track)
        {
            if (!string.IsNullOrEmpty(track.Id) && track.Provider != Data.Mp3Provider.YouTube)
            {
                track.Album = await GetAlbumName(track.Id);
            }

            else if (track.Album.ToLower().Contains("unknown") ||
                     track.Album.ToLower().Contains("various") ||
                     track.Album.ToLower().Contains("random"))
            {
                await SaveViezTrackFindAlbum(track);
            }

            //clean track only english letters
            track.Name   = SongSavingHelper.ToCleanQuery(track.Name);
            track.Artist = SongSavingHelper.ToCleanQuery(track.Artist);
            track.Album  = SongSavingHelper.ToCleanQuery(track.Album);


            //check if it is track properties are noll or not;
            if (!CheckUp(track))
            {
                ShowResults(SavingError.Unknown, track.Name);
                return(SavingError.Unknown);
            }

            if (App.Locator.CollectionService.ViezSongAlreadyExists(track.Name, track.Album, track.Artist))
            {
                ShowResults(SavingError.AlreadyExists, track.Name);
                return(SavingError.AlreadyExists);
            }

            if (App.Locator.Network.IsActive)
            {
                var result = await SaveViezTrackLevel2(track);

                return(result);
            }

            ShowResults(SavingError.Network, track.Name);
            return(SavingError.Network);
        }
        public static async Task <SavingError> SaveSpotifyChartTrackLevel1(ChartTrack chartTrack)
        {
            //clean track only english letters
            chartTrack.Name       = SongSavingHelper.ToCleanQuery(chartTrack.Name);
            chartTrack.ArtistName = SongSavingHelper.ToCleanQuery(chartTrack.ArtistName);
            chartTrack.album_name = SongSavingHelper.ToCleanQuery(chartTrack.album_name);

            //check if it is track properties are noll or not;
            if (!CheckUp(chartTrack))
            {
                ShowResults(SavingError.Unknown, chartTrack.Name);
                return(SavingError.Unknown);
            }

            //checking for duplicate songs.
            if (App.Locator.CollectionService.SongAlreadyExists(chartTrack.Name, chartTrack.album_name, chartTrack.ArtistName))
            {
                ShowResults(SavingError.AlreadyExists, chartTrack.Name);
                return(SavingError.AlreadyExists);
            }


            //getting track metadata from spotify and search using viez.
            var track = await App.Locator.Spotify.GetTrack(chartTrack.track_id);

            if (track != null)
            {
                var album = await App.Locator.Spotify.GetAlbum(track.Album.Id);

                var result = await SaveSpotifyTrackLevel2(track, album);

                return(result);
            }

            //network fail
            ShowResults(SavingError.Network, chartTrack.Name);
            return(SavingError.Network);
        }
        public static async Task SaveSpotifyAlbumLevel1(FullAlbum album)
        {
            if (album.Tracks.Items.Count == 0)
            {
                ToastManager.ShowError("Nothing found.");
                return;
            }

            //clean track only english letters
            album.Name        = SongSavingHelper.ToCleanQuery(album.Name);
            album.Artist.Name = SongSavingHelper.ToCleanQuery(album.Artist.Name);
            foreach (var obj in album.Tracks.Items)
            {
                obj.Name = SongSavingHelper.ToCleanQuery(obj.Name);
            }

            //check if it is track properties are noll or not;
            if (!CheckUp(album))
            {
                ShowResults(SavingError.Unknown, album.Name);
                return;
            }


            var alreadySaving = SpotifySavingAlbums.FirstOrDefault(p => p == album.Id) != null;

            if (alreadySaving)
            {
                ShowResults(SavingError.AlreadySaving, album.Name);
                return;
            }

            SpotifySavingAlbums.Add(album.Id);

            //ignore
            //problem when os is not under this thread.
            //solution: use dispatcher.
            //testing under android pending.

            while (!App.Locator.CollectionService.IsLibraryLoaded)
            {
            }
            //var collAlbum = App.Locator.CollectionService.Albums.FirstOrDefault(p => p.ProviderId.Contains(album.Id));

            var collAlbum = App.Locator.CollectionService.Albums.FirstOrDefault(p => string.Equals(p.Name.ToLower(), album.Name.ToLower()));

            var alreadySaved = collAlbum != null;

            if (alreadySaved)
            {
                var missingTracks = collAlbum.Songs.Count < album.Tracks.Items.Count;
                if (!missingTracks)
                {
                    ShowResults(SavingError.AlreadyExists, album.Name);
                    SpotifySavingAlbums.Remove(album.Id);
                    return;
                }
            }
            ToastManager.ShowError("Saving " + album.Name + ".");
            var index = 0;

            if (!alreadySaved)
            {
                SavingError result;
                do
                {
                    // first save one song (to avoid duplicate album creation)
                    result = await SaveSpotifyTrackLevel3(album.Tracks.Items[index], album, false);

                    index++;
                }while (result != SavingError.None && index < album.Tracks.Items.Count);
            }

            bool success;
            var  missing = false;

            if (album.Tracks.Items.Count > 1)
            {
                App.Locator.SqlService.BeginTransaction();
                // save the rest at the rest time
                var songs   = album.Tracks.Items.Skip(index).Select(track => SaveSpotifyTrackLevel3(track, album, false));
                var results = await Task.WhenAll(songs);

                // now wait a split second before showing success message
                await Task.Delay(1000);

                var alreadySavedCount = results.Count(p => p == SavingError.AlreadyExists);
                var successCount      =
                    results.Count(
                        p =>
                        p == SavingError.None || p == SavingError.AlreadyExists || p == SavingError.AlreadySaving);
                var missingCount = successCount == 0 ? -1 : album.Tracks.Items.Count - (successCount + index);
                success = missingCount == 0;
                missing = missingCount > 0;
                if (missing)
                {
                    ToastManager.ShowError("Problem while saving " + missingCount + " tracks.");
                }
                App.Locator.SqlService.Commit();
            }
            else
            {
                success = App.Locator.CollectionService.Albums.FirstOrDefault(p => p.ProviderId.Contains(album.Id)) != null;
            }

            if (success)
            {
                ShowResults(SavingError.None, album.Name);
            }

            else if (!missing)
            {
                ShowResults(SavingError.Unknown, album.Name);
            }


            SpotifySavingAlbums.Remove(album.Id);

            if (collAlbum == null)
            {
                collAlbum = App.Locator.CollectionService.Albums.FirstOrDefault(p => string.Equals(p.Name.ToLower(), album.Name.ToLower()));
                if (collAlbum != null && !collAlbum.HasArtwork && !collAlbum.NoArtworkFound)
                {
                    await DownloadArtworks.SaveAlbumImageAsync(collAlbum, album.Images[0].Url);
                }

                if (App.Locator.Setting.SpotifyArtworkSync)
                {
                    await DownloadArtworks.DownloadArtistsArtworkAsyncFromSpotify(false, album.Artist.Name);
                }
                else
                {
                    await DownloadArtworks.DownloadArtistsArtworkAsync(false, album.Artist.Name);
                }
            }
        }