コード例 #1
0
ファイル: LoginViewModel.cs プロジェクト: saber-nyan/meridian
        private async void ValidateUser(Uri redirectUri)
        {
            var flyout = new FlyoutControl();

            flyout.FlyoutContent = new WebValidationView(redirectUri);
            var token = await flyout.ShowAsync() as AccessToken;

            if (token != null)
            {
                AccountManager.SetLoginVk(token);

                var p = ViewModelLocator.Vkontakte.LoginParams ?? new Dictionary <string, string>()
                {
                    ["version"] = "4.11.1",
                    ["func_v"]  = "5"
                };

                p.Add("userId", token.UserId.ToString());

                await ViewModelLocator.Vkontakte.Execute.GetBaseData(p);

                MessengerInstance.Send(new NavigateToPageMessage()
                {
                    Page = "/Main.MusicView"
                });
            }
        }
コード例 #2
0
        private async void AddNewAlbum()
        {
            var album = new VkPlaylist()
            {
                Title = "New album"
            };

            var flyout = new FlyoutControl();

            flyout.FlyoutContent = new EditAlbumView(album);
            var result = await flyout.ShowAsync();

            if ((bool)result)
            {
                try
                {
                    var newAlbumId = await ViewModelLocator.Vkontakte.Audio.AddAlbum(album.Title);

                    if (newAlbumId != 0)
                    {
                        album.Id      = newAlbumId;
                        album.OwnerId = ViewModelLocator.Vkontakte.AccessToken.UserId;
                        Albums.Insert(5, album);
                    }
                }
                catch (Exception ex)
                {
                    LoggingService.Log(ex);
                }
            }
        }
コード例 #3
0
        private async void Refresh()
        {
            await ServiceLocator.LocalMusicService.Clear();

            if (Tracks != null)
            {
                Tracks.Clear();
            }

            if (Artists != null)
            {
                Artists.Clear();
            }

            if (Albums != null)
            {
                Albums.Clear();
            }

            if (AlbumGroups != null)
            {
                AlbumGroups.Clear();
            }

            if (SelectedArtistAlbums != null)
            {
                SelectedArtistAlbums.Clear();
            }

            var flyout = new FlyoutControl();

            flyout.FlyoutContent = new MusicScanView();
            await flyout.ShowAsync();

            switch (SelectedTabIndex)
            {
            case 0:
                LoadTracks();
                break;

            case 1:
                LoadAlbums();
                break;

            case 2:
                LoadArtists();
                break;
            }
        }
コード例 #4
0
        public async void Save()
        {
            try
            {
                var settings = new JsonSerializerSettings
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver(),
                    Formatting       = Formatting.Indented
                };

                var json = JsonConvert.SerializeObject(this, settings);

                File.WriteAllText(SettingsFile, json);
            }
            catch (UnauthorizedAccessException ex)
            {
                var flyout = new FlyoutControl
                {
                    FlyoutContent = new CommonErrorView(ErrorResources.AccessDeniedErrorTitle,
                                                        ErrorResources.AccessDeniedErrorDescription)
                };
                await flyout.ShowAsync().ContinueWith(t =>
                {
                    if ((bool)t.Result)
                    {
                        var info = new ProcessStartInfo
                        {
                            UseShellExecute  = true,
                            FileName         = Application.ResourceAssembly.Location,
                            WorkingDirectory = Environment.CurrentDirectory,
                            Verb             = "runas"
                        };

                        Process.Start(info);
                    }

                    Application.Current.Shutdown();

                    LoggingService.Log(ex);
                });
            }
            catch (Exception ex)
            {
                LoggingService.Log(ex);
            }
        }
コード例 #5
0
        private async void ValidateUser(Uri redirectUri)
        {
            var flyout = new FlyoutControl();

            flyout.FlyoutContent = new WebValidationView(redirectUri);
            var token = await flyout.ShowAsync() as AccessToken;

            if (token != null)
            {
                AccountManager.SetLoginVk(token);

                MessengerInstance.Send(new NavigateToPageMessage()
                {
                    Page = "/Main.MusicView"
                });
            }
        }
コード例 #6
0
        private void App_OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            LoggingService.Log(e.Exception);

            Dispatcher.Invoke(async() =>
            {
                e.Handled = true;

                var flyout           = new FlyoutControl();
                flyout.FlyoutContent = new CommonErrorView();
                var restart          = (bool)await flyout.ShowAsync();
                if (restart)
                {
                    Process.Start(Application.ResourceAssembly.Location);
                }

                Shutdown();
            });
        }
コード例 #7
0
        private async void EditAlbum(VkPlaylist album)
        {
            var flyout = new FlyoutControl();

            flyout.FlyoutContent = new EditAlbumView(album);

            var result = await flyout.ShowAsync();

            if (result != null && (bool)result)
            {
                try
                {
                    if (await ViewModelLocator.Vkontakte.Audio.EditAlbum(album.Id.ToString(), album.Title))
                    {
                        Albums[Albums.IndexOf(album)].Title = album.Title;
                    }
                }
                catch (Exception ex)
                {
                    LoggingService.Log(ex);
                }
            }
        }
コード例 #8
0
        private async Task LikeDislikeAudio(VkAudio audio, bool captchaNeeded = false, string captchaSid = null, string captchaImg = null)
        {
            if (audio == null)
            {
                return;
            }

            IsWorking = true;

            string captchaKey = null;

            if (captchaNeeded)
            {
                var flyout = new FlyoutControl();
                flyout.FlyoutContent = new CaptchaRequestView(captchaSid, captchaImg);
                var result = await flyout.ShowAsync();

                if (string.IsNullOrEmpty((string)result))
                {
                    IsWorking = false;
                    return;
                }
                else
                {
                    captchaKey = (string)result;
                }
            }

            try
            {
                bool result;

                if (!audio.IsAddedByCurrentUser)
                {
                    result = await DataService.RemoveAudio(audio);
                }
                else
                {
                    result = await DataService.AddAudio(audio, captchaSid, captchaKey);
                }

                if (result)
                {
                    //нужно, чтобы обновить список треков пользователя, если он открыт в данный момент
                    MessengerInstance.Send(new UserTracksChangedMessage());
                }
                else
                {
                    audio.IsAddedByCurrentUser = !audio.IsAddedByCurrentUser;
                    LoggingService.Log("Can't add/remove audio " + audio.Id + " owner: " + audio.OwnerId + ".");
                }
            }
            catch (VkCaptchaNeededException ex)
            {
                LikeDislikeAudio(audio, true, ex.CaptchaSid, ex.CaptchaImg);
            }
            catch (Exception ex)
            {
                audio.IsAddedByCurrentUser = !audio.IsAddedByCurrentUser;
                LoggingService.Log(ex);
            }

            IsWorking = false;
        }
コード例 #9
0
        private async void Save()
        {
            var album = new VkPlaylist()
            {
                Title = _album.Artist + " - " + _album.Name
            };

            var flyout = new FlyoutControl();

            flyout.FlyoutContent = new EditAlbumView(album);
            var result = await flyout.ShowAsync();

            if ((bool)result)
            {
                try
                {
                    Debug.WriteLine("Creating new album...");


                    NotificationService.NotifyProgressStarted(MainResources.NotificationSaving);

                    var newAlbumId = await ViewModelLocator.Vkontakte.Audio.AddAlbum(album.Title);

                    Debug.WriteLine("Album created. Id: " + newAlbumId);
                    Debug.WriteLine("Gettings audios...");

                    var progress = new Progress <int>(p => NotificationService.NotifyProgressChanged((int)(p / 2.0f)));

                    var audios = await GetAudioList(progress);

                    Debug.WriteLine("Got audios. Count: " + audios.Count);
                    Debug.WriteLine("Saving audios.");

                    int requestsCount = 0;
                    var audioIds      = new List <long>();

                    bool   captchaNeeded = false;
                    string captchaImg    = string.Empty;
                    string captchaSid    = string.Empty;
                    string captchaKey    = string.Empty;

                    int progressStep = (int)(100.0f / (audios.Count + 1));

                    for (var i = audios.Count - 1; i > 0; i--)
                    {
                        var vkAudio = audios[i];

                        try
                        {
                            var newAudioId = await ViewModelLocator.Vkontakte.Audio.Add(long.Parse(vkAudio.Id), vkAudio.OwnerId, captchaSid : captchaSid, captchaKey : captchaKey);

                            if (newAudioId != 0)
                            {
                                audioIds.Add(newAudioId);

                                captchaNeeded = false;
                                captchaKey    = null;
                                captchaSid    = null;
                            }
                        }
                        catch (VkCaptchaNeededException ex)
                        {
                            captchaNeeded = true;
                            captchaImg    = ex.CaptchaImg;
                            captchaSid    = ex.CaptchaSid;
                        }

                        if (captchaNeeded)
                        {
                            flyout = new FlyoutControl();
                            flyout.FlyoutContent = new CaptchaRequestView(captchaSid, captchaImg);
                            result = await flyout.ShowAsync();

                            if (!string.IsNullOrEmpty((string)result))
                            {
                                captchaKey = (string)result;
                                i          = i - 1;
                                continue;
                            }
                            else
                            {
                                NotificationService.NotifyProgressFinished();
                                return;
                            }
                        }

                        NotificationService.NotifyProgressChanged((int)(progressStep / 2.0f));

                        requestsCount++;

                        if (requestsCount >= 2) //не больше 2-х запросов в секунду
                        {
                            requestsCount = 0;
                            await Task.Delay(1000);
                        }
                    }

                    Debug.WriteLine("Audios saved. Moving to album...");

                    if (audioIds.Count > 0)
                    {
                        if (await ViewModelLocator.Vkontakte.Audio.MoveToAlbum(newAlbumId, audioIds))
                        {
                            Debug.WriteLine("Album saved!");

                            NotificationService.NotifyProgressFinished(MainResources.NotificationSaved);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LoggingService.Log(ex);
                }
            }
        }
コード例 #10
0
        public static async Task CopyAlbum(string title, long albumId, long ownerId)
        {
            var newAlbumId = await ViewModelLocator.Vkontakte.Audio.AddAlbum(title);

            var audio = await GetUserTracks(albumId : albumId, ownerId : ownerId);

            if (audio.Items != null && audio.Items.Count > 0)
            {
                NotificationService.NotifyProgressStarted(MainResources.NotificationSaving);
                int progressStep = (int)(100.0f / audio.Items.Count);


                bool   captchaNeeded = false;
                string captchaImg    = string.Empty;
                string captchaSid    = string.Empty;
                string captchaKey    = string.Empty;

                var audioIds = new List <long>();

                int count = 0;
                audio.Items.Reverse();
                for (int i = 0; i < audio.Items.Count; i++)
                {
                    var track = audio.Items[i];

                    if (count > 1)
                    {
                        count = 0;
                        await Task.Delay(1000); //не больше 2-х запросов в секунду
                    }

                    try
                    {
                        var newAudioId = await ViewModelLocator.Vkontakte.Audio.Add(long.Parse(track.Id), track.OwnerId, captchaSid : captchaSid, captchaKey : captchaKey);

                        audioIds.Add(newAudioId);

                        captchaNeeded = false;
                        captchaKey    = null;
                        captchaSid    = null;
                    }
                    catch (VkCaptchaNeededException ex)
                    {
                        captchaNeeded = true;
                        captchaImg    = ex.CaptchaImg;
                        captchaSid    = ex.CaptchaSid;
                    }

                    if (captchaNeeded)
                    {
                        var flyout = new FlyoutControl();
                        flyout.FlyoutContent = new CaptchaRequestView(captchaSid, captchaImg);
                        var result = await flyout.ShowAsync();

                        if (!string.IsNullOrEmpty((string)result))
                        {
                            captchaKey = (string)result;
                            i          = i - 1;
                            continue;
                        }
                        else
                        {
                            NotificationService.NotifyProgressFinished();
                            return;
                        }
                    }

                    count++;

                    NotificationService.NotifyProgressChanged(progressStep);
                }

                await ViewModelLocator.Vkontakte.Audio.MoveToAlbum(newAlbumId, audioIds);

                NotificationService.NotifyProgressFinished(MainResources.NotificationSaved);
            }
        }
コード例 #11
0
        private void InitializeCommands()
        {
            AddSocietyCommand = new RelayCommand(async() =>
            {
                var flyout           = new FlyoutControl();
                flyout.FlyoutContent = new AddSocietyFlyout();
                var result           = await flyout.ShowAsync();
                if (result != null)
                {
                    CancelAsync();

                    if (Societies.Count == 0)
                    {
                        _societies.Add(new VkGroup()
                        {
                            Name = MainResources.AllSocieties
                        });
                    }

                    Societies.Add((VkGroup)result);
                    SaveSocieties();

                    if (SelectedSociety == null)
                    {
                        SelectedSociety = _societies.First();
                    }
                    else if (SelectedSociety.Id == 0)
                    {
                        LoadFeed(_cancellationToken.Token);
                    }
                }
            });

            RemoveSocietyCommand = new RelayCommand <VkGroup>(society =>
            {
                bool isActiveSociety = false;
                if (society == SelectedSociety)
                {
                    isActiveSociety = true;
                }

                CancelAsync();
                Societies.Remove(society);

                if (Societies.Count == 1)
                {
                    Societies.Clear();
                }

                SaveSocieties();

                if (!isActiveSociety && (SelectedSociety != null && SelectedSociety.Id != 0))
                {
                    return;
                }

                if (isActiveSociety)
                {
                    if (Societies.Any())
                    {
                        SelectedSociety = Societies.First();
                    }
                }

                //if (SelectedSociety != null && SelectedSociety.Id == 0)
                //{
                CancelAsync();

                LoadFeed(_cancellationToken.Token);
                //}

                //if (isActiveSociety && Societies.Any())
                //    SelectedSociety = Societies.First();
                //else if (isActiveSociety)
                //    LoadFeed(_cancellationToken.Token);
            });

            PlayAudioCommand = new RelayCommand <Audio>(audio =>
            {
                AudioService.Play(audio);
                AudioService.SetCurrentPlaylist(Tracks);
            });
        }
コード例 #12
0
        private void InitializeCommands()
        {
            CreateStationCommand = new RelayCommand(async() =>
            {
                var flyout           = new FlyoutControl();
                flyout.FlyoutContent = new CreateRadioStationView();
                var artists          = await flyout.ShowAsync() as IList <EchoArtist>;

                if (artists != null)
                {
                    AddStation(artists);
                }
            });

            PlayStationCommand = new RelayCommand <RadioStation>(station =>
            {
                RadioService.PlayRadio(station);
                MessengerInstance.Send(new NavigateToPageMessage()
                {
                    Page = "/Main.NowPlayingView"
                });
            });

            RemoveStationCommand = new RelayCommand <RadioStation>(station =>
            {
                Stations.Remove(station);
                RadioService.SaveStations(Stations);
            });

            EditStationCommand = new RelayCommand <RadioStation>(async station =>
            {
                var createRadioStationView     = new CreateRadioStationView();
                createRadioStationView.Artists = new ObservableCollection <EchoArtist>(station.Artists);

                var flyout           = new FlyoutControl();
                flyout.FlyoutContent = createRadioStationView;
                var artists          = await flyout.ShowAsync() as IList <EchoArtist>;

                if (artists != null)
                {
                    var titleArtist = station.Artists.First();
                    station.Artists = artists.ToList();


                    //update image and title
                    station.Title = string.Join(", ", station.Artists.Select(s => s.Name));

                    if (station.Artists.First().Name != titleArtist.Name)
                    {
                        station.ImageUrl = null;

                        try
                        {
                            var artistImage = await DataService.GetArtistImage(station.Artists.First().Name, false);
                            if (artistImage != null)
                            {
                                station.ImageUrl = artistImage.OriginalString;
                            }
                        }
                        catch (Exception ex)
                        {
                            LoggingService.Log(ex);
                        }
                    }

                    RadioService.SaveStations(Stations);
                }
            });
        }