//
        // GET: /Manage/Index
        public async Task <ActionResult> Index(ManageMessageId?message)
        {
            ViewBag.StatusMessage =
                message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
                : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
                : message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set."
                : message == ManageMessageId.Error ? "An error has occurred."
                : message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added."
                : message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed."
                : "";

            var userId = User.Identity.GetUserId();
            var model  = new IndexViewModel
            {
                HasPassword       = HasPassword(),
                PhoneNumber       = await UserManager.GetPhoneNumberAsync(userId),
                TwoFactor         = await UserManager.GetTwoFactorEnabledAsync(userId),
                Logins            = await UserManager.GetLoginsAsync(userId),
                BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId),
            };

            using (var db = new SoundFundingDbContext())
            {
                var currentUser = db.Users.FirstOrDefault(u => u.Id == userId);
                if (currentUser != null)
                {
                    model.MinutesContributed = currentUser.MinutesContributed;
                }
            }
            return(View(model));
        }
Example #2
0
        public async Task <ActionResult> Join(int id)
        {
            var token = Session["SpotifyToken"] as AuthenticationToken;

            if (token == null)
            {
                throw new Exception("Not logged in against Spotify");
            }
            using (var db = new SoundFundingDbContext())
            {
                var cause = db.Causes.Find(id);

                if (cause.SpotifyPlaylistId != null)
                {
                    var user = await PlaylistGenerator.AddToPlaylist(token, cause);

                    var image = user.Images.FirstOrDefault();
                    if (image != null)
                    {
                        cause.Contributors = cause.Contributors ?? new List <Contributor>();
                        cause.Contributors.Add(new Contributor
                        {
                            ImageUrl = image.Url
                        });
                    }
                }

                db.SaveChanges();
            }
            return(RedirectToAction("Cause", new { id = id }));
        }
Example #3
0
        public ActionResult Cause(int id)
        {
            using (var db = new SoundFundingDbContext())
            {
                var cause = db.Causes.Find(id);

                return(View(cause));
            }
        }
Example #4
0
        public ActionResult Index()
        {
            using (var db = new SoundFundingDbContext())
            {
                ViewBag.OtherCauses = db.Causes.ToList();

                return(View());
            }
        }
Example #5
0
        public async Task <ActionResult> Create(Cause cause)
        {
            var token = Session["SpotifyToken"] as AuthenticationToken;

            if (token == null)
            {
                throw new Exception("Not logged in against Spotify");
            }

            if (ModelState.IsValid)
            {
                if (cause.PostedPicture != null)
                {
                    var bh = new BlobHandler("soundfunding");
                    bh.Upload(new List <HttpPostedFileBase> {
                        cause.PostedPicture
                    });
                    var blobUri = bh.GetBlobs().FirstOrDefault(b => b.Contains(cause.PostedPicture.FileName));
                    cause.Picture = blobUri;
                }

                var playlist = await PlaylistGenerator.GeneratePlaylist(token, cause);

                cause.SpotifyPlaylistId  = playlist.Id;
                cause.SpotifyPlaylistUri = playlist.Uri;
                cause.SpotifyUserId      = playlist.Owner.Id;

                var image = playlist.Owner.Images.FirstOrDefault();
                if (image != null)
                {
                    cause.SpotifyUserAvatarUrl = image.Url;
                }

                using (var db = new SoundFundingDbContext())
                {
                    db.Causes.Add(cause);
                    db.SaveChanges();
                }

                return(RedirectToAction("Cause", "Cause", new { id = cause.Id }));
            }
            return(View("Create"));
        }
Example #6
0
        public static async Task <User> AddToPlaylist(AuthenticationToken token, Cause cause)
        {
            var user = await User.GetCurrentUserProfile(token);

            using (var db = new SoundFundingDbContext())
            {
                var stored = db.Tracks.OrderByDescending(t => t.Id).FirstOrDefault(t => t.UserId == user.Id);
                if (stored == null)
                {
                    return(user);
                }

                var newPlaylistTracks = await Track.GetTracks(stored.TrackIds.Split(',').ToList());

                var playlist = await Playlist.GetPlaylist(cause.SpotifyUserId, cause.SpotifyPlaylistId, token);

                await playlist.AddTracks(newPlaylistTracks.OrderBy(t => t.Popularity).Take(5).ToList(), token);
            }
            return(user);
        }
Example #7
0
        public static async Task <Playlist> GeneratePlaylist(AuthenticationToken token, Cause cause, int attempt = 1)
        {
            var user = await User.GetCurrentUserProfile(token);

            using (var db = new SoundFundingDbContext())
            {
                var stored = db.Tracks.OrderByDescending(t => t.Id).FirstOrDefault(t => t.UserId == user.Id);
                if (stored == null)
                {
                    if (attempt <= 3)
                    {
                        // Might not be generated yet
                        Thread.Sleep(TimeSpan.FromSeconds(10));
                        return(await GeneratePlaylist(token, cause, ++attempt));
                    }
                    else
                    {
                        var filrPlaylist = GetStandardFiltrPlaylist();
                        return(new Playlist
                        {
                            Owner = user,
                            Uri = filrPlaylist.spotifyUri
                        });
                    }
                }

                var newPlaylistTracks = await Track.GetTracks(stored.TrackIds.Split(',').ToList());

                var newPlaylist = await Playlist.CreatePlaylist(user.Id, "SoundFunding " + cause.Name, true, token);

                await newPlaylist.AddTracks(newPlaylistTracks.OrderBy(t => t.Popularity).Take(5).ToList(), token);

                newPlaylist = await Playlist.GetPlaylist(user.Id, newPlaylist.Id, token);

                return(newPlaylist);
            }
        }
Example #8
0
        public static async void GenerateAndStorePlaylistTracks(AuthenticationToken token)
        {
            var user = await User.GetCurrentUserProfile(token);

            var artists = new List <Artist>();

            var savedTracks = await User.GetUsersSavedTracks(token);

            // Try getting artists from saved tracks
            if (savedTracks.Total > 0)
            {
                artists.AddRange(savedTracks.Items.SelectMany(t => t.Artists).ToList());
            }

            // Try get by most popular user playlist
            if (artists.Count < 2)
            {
                var playlists = await Playlist.GetUsersPlaylists(user, token);

                var playlistTracks = new List <PlaylistTrack>();

                var playlist = playlists.Items.FirstOrDefault(p => p.Tracks.Total > 0);

                if (playlist != null)
                {
                    var tracks = await Playlist.GetPlaylistTracks(user.Id, playlist.Id, token);

                    playlistTracks.AddRange(tracks.Items);

                    artists.AddRange(playlistTracks.SelectMany(t2 => t2.Track.Artists));
                }
            }

            if (artists.Count < 2)
            {
                return; //Give up
            }

            artists = artists.DistinctBy(a => a.Name).OrderByDescending(a => a.Popularity).Take(5).ToList();
            var artistNames = artists.Select(a => a.Name).ToList();

            var tracksPerArtist = 10 / artistNames.Count();

            var newPlaylistTrackIds = new List <string>();

            foreach (var artistName in artistNames)
            {
                var client  = new RestClient("http://cdn.filtr.com/2.1");
                var request = new RestRequest("/SE/SE/tracks");
                request.AddParameter("artist", artistName);

                var result = client.Execute <List <FiltrTrack> >(request);
                newPlaylistTrackIds.AddRange(
                    result.Data.OrderByDescending(t => t.hotness)
                    .Take(tracksPerArtist)
                    .Select(t => t.spotifyUri.Replace("spotify:track:", string.Empty)));
            }

            using (var db = new SoundFundingDbContext())
            {
                db.Tracks.Add(new PlaylistTracks {
                    UserId = user.Id, TrackIds = string.Join(",", newPlaylistTrackIds.Distinct())
                });
                db.SaveChanges();
            }
        }