Esempio n. 1
0
        public async Task <IActionResult> OnGetAsync([FromQuery] int offset = 0)
        {
            this.Offset = offset;
            VisifyUser user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."));
            }

            VOption <IList <VisifySavedTrack> > stracks = await DatabaseService.GetUsersSavedTracks(user.Id, offset, 50);

            if (!stracks.WasSuccess)
            {
                StatusMessage = "Sorry, we coudln't retrieve your saved songs, we are having database problems. Please try again later.";
                IsDisabled    = true;
            }
            VOption <int> libCountO = await DatabaseService.GetUserLibraryCount(user.Id);

            if (!libCountO.WasSuccess)
            {
                StatusMessage = "Sorry, we coudln't retrieve your saved songs, we are having database problems. Please try again later.";
                IsDisabled    = true;
            }

            SavedTracks    = stracks.Value;
            LibraryCount   = libCountO.Value;
            CanGoForwards  = (!IsDisabled && this.Offset < LibraryCount);
            CanGoBackwards = (!IsDisabled && this.Offset > 0);

            return(Page());
        }
Esempio n. 2
0
        public async Task <IActionResult> GetArtistLinks()
        {
            VisifyUser user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                logger.LogInformation($"Tried to get Artist Song Count graph data for user {_userManager.GetUserId(User)}, but user did not exist");
                return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."));
            }

            // Get the tracks and artists
            VOption <IList <VisifySavedTrack> > stracks = await DatabaseService.GetUsersSavedTracks(user.Id, limit : 10_000);

            if (!stracks.WasSuccess)
            {
                logger.LogError($"Failed to retreive saved tracks for user {_userManager.GetUserId(User)}", stracks.ErrorMessage);
                return(Json("FAILED"));
            }

            // create a proper d3 structure
            Dictionary <string, FDGNode> nodes = new Dictionary <string, FDGNode>();
            Dictionary <string, FDGEdge> edges = new Dictionary <string, FDGEdge>();

            foreach (VisifySavedTrack vst in stracks.Value)
            {
                string   tid   = $"tid_{vst.VisifyTrack.SpotifyId}";
                string[] idarr = new string[2];
                foreach (VisifyArtist va in vst.VisifyTrack.Artists)
                {
                    string sid = $"aid_{va.SpotifyId}";
                    idarr[0] = sid;
                    idarr[1] = tid;
                    Array.Sort(idarr);
                    string lid0 = String.Join("", idarr);
                    string lid1 = $"at_{lid0}";
                    if (!nodes.ContainsKey(sid))
                    {
                        nodes.Add(sid, new FDGNode(sid, 0, va.ArtistName, 0, 1));
                    }
                    else
                    {
                        nodes[sid].size += 1;
                    }
                    nodes.Add(lid1, new FDGNode(lid1, 0, vst.VisifyTrack.TrackName, 1, 1));
                    if (!edges.ContainsKey(lid0))
                    {
                        edges.Add(lid0, new FDGEdge(lid1, sid, 0.1));
                    }
                }
            }

            Dictionary <string, object> keys = new Dictionary <string, object>()
            {
                { "nodes", nodes.Values },
                { "links", edges.Values }
            };

            return(Json(keys));
        }
Esempio n. 3
0
        public async Task <IActionResult> OnGetCallbackAsync(string returnUrl = null, string remoteError = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            if (remoteError != null)
            {
                ErrorMessage = $"Error from external provider: {remoteError}";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }
            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ErrorMessage = "Error loading external login information.";
                return(RedirectToPage("./Login", new { ReturnUrl = returnUrl }));
            }

            // Sign in the user with this external login provider if the user already has a login.
            var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : false, bypassTwoFactor : true);

            string aspnetid = _userManager.GetUserId(info.Principal);

            if (result.Succeeded)
            {
                _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
                await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

                _spotify.GetUsersLibrary(aspnetid);
                return(LocalRedirect(returnUrl));
            }
            if (result.IsLockedOut)
            {
                return(RedirectToPage("./Lockout"));
            }
            else
            {
                // If the user does not have an account, then ask the user to create an account.
                string uid   = _userManager.GetUserId(info.Principal);
                string uname = _userManager.GetUserName(info.Principal);
                var    user  = new VisifyUser {
                    UserName = String.IsNullOrWhiteSpace(uname) ? uid : uname, Id = uid
                };
                var result2 = await _userManager.CreateAsync(user);

                if (result2.Succeeded)
                {
                    result2 = await _userManager.AddLoginAsync(user, info);

                    if (result2.Succeeded)
                    {
                        await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

                        _spotify.GetUsersLibrary(aspnetid); // Purposefully do not await
                        ReturnUrl     = returnUrl;
                        LoginProvider = info.LoginProvider;
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result2.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
                return(Page());
            }
        }
Esempio n. 4
0
        public async Task <IActionResult> GetArtistCollabLinks()
        {
            VisifyUser user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                logger.LogInformation($"Tried to get Artist Collab Link graph data for user {_userManager.GetUserId(User)}, but user did not exist");
                return(NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."));
            }

            // Get the tracks and artists
            VOption <IList <VisifySavedTrack> > stracks = await DatabaseService.GetUsersSavedTracks(user.Id, limit : 10_000);

            if (!stracks.WasSuccess)
            {
                logger.LogError($"Failed to retreive saved tracks for user {_userManager.GetUserId(User)}", stracks.ErrorMessage);
                return(Json("FAILED"));
            }

            // create a proper d3 structure
            Dictionary <string, FDGNode> nodes = new Dictionary <string, FDGNode>();
            Dictionary <string, FDGEdge> edges = new Dictionary <string, FDGEdge>();

            foreach (VisifySavedTrack vst in stracks.Value)
            {
                string         tid   = $"tid_{vst.VisifyTrack.SpotifyId}";
                string[]       idarr = new string[2];
                Stack <string> artistsOnThisTrack = new Stack <string>(vst.VisifyTrack.Artists.Count);
                for (int i = 0; i < vst.VisifyTrack.Artists.Count; i++)
                {
                    VisifyArtist va = vst.VisifyTrack.Artists[i];
                    if (!nodes.ContainsKey(va.SpotifyId))
                    {
                        nodes.Add(va.SpotifyId, new FDGNode(va.SpotifyId, 0, va.ArtistName, 1, 1000));
                    }
                    artistsOnThisTrack.Push(va.SpotifyId);
                }

                while (artistsOnThisTrack.Count > 0)
                {
                    string a = artistsOnThisTrack.Pop();
                    foreach (string othera in artistsOnThisTrack)
                    {
                        idarr[0] = a;
                        idarr[1] = othera;
                        Array.Sort(idarr);
                        string lid0 = String.Join("", idarr);
                        Dictionary <string, string> tn = new Dictionary <string, string>()
                        {
                            { "name", vst.VisifyTrack.TrackName }
                        };
                        if (edges.ContainsKey(lid0))
                        {
                            edges[lid0].strength += 0.1;
                            edges[lid0].tracks.Add(tn);
                        }
                        else
                        {
                            FDGEdge n = new FDGEdge(othera, a, 0.1);
                            n.tracks.Add(tn);
                            edges.Add(lid0, n);
                        }
                    }
                }
            }

            Dictionary <string, object> keys = new Dictionary <string, object>()
            {
                { "nodes", nodes.Values },
                { "links", edges.Values }
            };

            return(Json(keys));
        }