Exemplo n.º 1
0
        public void SaveUser(PrivateProfile user)
        {
            var dProfile = new dPrivateProfile
            {
                Id          = user.Id,
                Birthdate   = user.Birthdate,
                Country     = user.Country,
                DisplayName = user.DisplayName,
                Email       = user.Email,
                product     = user.Product,
                Type        = user.Type
            };

            //lets send the user to the database
            using (var db = new AiApiDbContext())
            {
                // if we don't find the user in the data base
                if (db.PrivateProfiles.Find(dProfile.Id) == null)
                {
                    db.PrivateProfiles.Add(dProfile);
                }

                db.SaveChanges();
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Removes the saved tracks from the database
        /// </summary>
        public async void RemoveSavedTracks(string userId)
        {
            try
            {
                //launch up a new Db context
                using (var db = new AiApiDbContext())
                {
                    //removes all the records
                    var tracksToRemove = db.SavedTracks.Where(x => x.UserName == userId).ToList();

                    db.SavedTracks.RemoveRange(tracksToRemove);


                    await db.SaveChangesAsync();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("=====================");
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.InnerException);
                Console.WriteLine(ex.StackTrace);
                Console.WriteLine("=====================");
            }
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public async Task <List <object> > Get()
        {
            //all of this code up here may not be neccessary
            //I need a way to speed up the application.
            var list = new List <object>();

            using (var db = new AiApiDbContext())
            {
                var tracks = db.RecentlyPlayed.ToList();

                list.AddRange(tracks);
            }

            Thread kickThread = null;

            kickThread = new Thread(async() =>
            {
                await KickoffSpotifySync();

                AiThreadManager.RemoveThread(kickThread);
            });

            AiThreadManager.AddThread(kickThread);


            if (list.Any())
            {
                return(list);
            }


            return(new List <object>());
        }
Exemplo n.º 4
0
        /// <summary>
        /// Deletes and rewrites the Top Artists and Top Tracks from spotify. Asynchnonously while also launching up two new threads.
        /// </summary>
        /// <param name="user">The user to get this information for.</param>
        public void SyncTopList(PrivateProfile user)
        {
            Thread artistThread = null;
            Thread trackThread  = null;

            try
            {
                //the new thread for the artists objects
                artistThread = new Thread(async() =>
                {
                    await GetUsersTopArtistsShortTerm(user.Id);
                    await GetUsersTopArtistsMeduimTerm(user.Id);
                    await GetUsersTopArtistsLongTerm(user.Id);

                    AiThreadManager.RemoveThread(artistThread);
                });

                AiThreadManager.AddThread(artistThread);

                //the new thread for the track objects
                trackThread = new Thread(async() =>
                {
                    await GetUsersTopTracksShortTerm(user.Id);
                    await GetUsersTopTracksMeduimTerm(user.Id);
                    await GetUsersTopTracksLongTerm(user.Id);

                    AiThreadManager.RemoveThread(trackThread);
                });

                AiThreadManager.AddThread(trackThread);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.InnerException);
            }
            finally
            {
                using (var db = new AiApiDbContext())
                {
                    db.TopSyncDates.Add(new sTopSync()
                    {
                        UserId  = user.Id,
                        SyncTop = SpotifyTopOptions.Artists
                    });

                    db.TopSyncDates.Add(new sTopSync()
                    {
                        UserId  = user.Id,
                        SyncTop = SpotifyTopOptions.Tracks
                    });

                    db.SaveChangesAsync();
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Returns the current logged in users top tracks from the last 4 weeks.
        /// </summary>
        /// <returns></returns>
        public async Task <List <FullArtist> > GetUsersTopArtistsShortTerm(string userId)
        {
            _shortTermArtists.Clear();

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);

                HttpResponseMessage responseMessage = await client.GetAsync("https://api.spotify.com/v1/me/top/artists?time_range=short_term");

                if (responseMessage.IsSuccessStatusCode)
                {
                    var responseContent = await responseMessage.Content.ReadAsStringAsync();

                    var data = JsonConvert.DeserializeObject <Paging <FullArtist> >(responseContent);

                    _shortTermArtists.AddRange(data.Items);

                    try
                    {
                        using (var db = new AiApiDbContext())
                        {
                            var rank = 1;
                            _shortTermArtists.ForEach(x =>
                            {
                                var artist = new dTopArtist
                                {
                                    Name       = x.Name,
                                    Popularity = x.Popularity,
                                    Term       = Term.Short,
                                    UserId     = userId,
                                    Uri        = x.Uri,
                                    Rank       = rank++
                                };

                                if (!db.TopArtists.Any(a => a.Name == artist.Name && a.Term == artist.Term && a.UserId == userId))
                                {
                                    db.TopArtists.Add(artist);
                                }
                            });

                            await db.SaveChangesAsync();
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                    }
                }
            }

            return(_shortTermArtists);
        }
Exemplo n.º 6
0
        public async Task <List <dArtist> > Get()
        {
            //var caller = new Spotify.SpotifyWebApi();

            using (var db = new AiApiDbContext())
            {
                var artistList = db.Artist.Where(x => x.Popularity > 90).Take(5).ToList();

                return(artistList);
            }

            return(new List <dArtist>());
        }
Exemplo n.º 7
0
        /// <summary>
        /// Returns the current logged in users top tracks from the last 6 months.
        /// </summary>
        /// <returns></returns>
        public async Task <List <FullTrack> > GetUsersTopTracksMeduimTerm(string userId)
        {
            var medTermTracks = new List <FullTrack>();

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);

                HttpResponseMessage responseMessage = await client.GetAsync("https://api.spotify.com/v1/me/top/tracks?time_range=medium_term");

                if (responseMessage.IsSuccessStatusCode)
                {
                    var responseContent = await responseMessage.Content.ReadAsStringAsync();

                    var data = JsonConvert.DeserializeObject <Paging <FullTrack> >(responseContent);

                    _usersTopTracks.AddRange(data.Items);

                    using (var db = new AiApiDbContext())
                    {
                        var index = 1;
                        medTermTracks.ForEach(x =>
                        {
                            //lets try to add the fulltrack (spotify verson) of the track to the database

                            dFullTrack.AddFullTrackToDb(x);

                            var newTrack = new dTopTrack
                            {
                                Name        = x.Name,
                                FullTrackId = x.Id,
                                Popularity  = x.Popularity,
                                Uri         = x.Uri,
                                Term        = Term.Medium,
                                Rank        = index++,
                                UserName    = userId
                            };

                            db.TopTracks.Add(newTrack);
                        });

                        await db.SaveChangesAsync();
                    }
                }
            }

            return(medTermTracks);
        }
Exemplo n.º 8
0
        public async void GetRecentlyPlayedArtist()
        {
            var recentTracks = new List <PlayHistory>();

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);

                HttpResponseMessage responseMessage = await client.GetAsync("https://api.spotify.com/v1/me/player/recently-played?limit=50");

                if (responseMessage.IsSuccessStatusCode)
                {
                    var responseContent = await responseMessage.Content.ReadAsStringAsync();

                    var data = JsonConvert.DeserializeObject <CursorPaging <PlayHistory> >(responseContent);

                    recentTracks.AddRange(data.Items);
                }

                using (var db = new AiApiDbContext())
                {
                    var index = 0;
                    recentTracks.ForEach(x =>
                    {
                        var dPlayHistory = new dPlayHistory();

                        dPlayHistory.TrackId  = x.Track.Id;
                        dPlayHistory.PlayedAt = x.PlayedAt;
                        dPlayHistory.Id       = index;

                        var existingTrack = db.Songs.Find(dPlayHistory.TrackId);

                        //if (existingTrack != null)
                        //{
                        //	db.Songs.Add()
                        //}

                        db.RecentlyPlayed.Add(dPlayHistory);

                        index++;
                    });
                }
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Kicks off the spotify sync methods. The will run in the background while we fetch the users data.
        /// </summary>
        internal async Task <bool> KickoffSpotifySync()
        {
            var SController   = new Spotify.SpotifyWebApi();
            var trackedSynced = true;

            //let's make sure we have a acces token because if not we cannot make any calls
            if (SController.AccessToken != null)
            {
                //get the current user
                var user = SController.GetCurrentUser();

                if (user != null)
                {
                    //get and save the currently playing track.
                    await SController.GetCurrentlyPlayingTrack(user.Id);

                    DateTime date;

                    using (var db = new AiApiDbContext())
                    {
                        //when was the last time we synched
                        date = db.GetLastSyncDate(user.Id);

                        //this call attemps to save the user
                        //if the user is already in the database it wont save them again.
                        SController.SaveUser(user);

                        var syncNeeded = DateTime.Compare(date, DateTime.Today);

                        if (!string.IsNullOrWhiteSpace(user.Id) && syncNeeded < 0)
                        {
                            //await SController.ResyncSavedTracks(user.Id);
                        }

                        //caller.GetRecentlyPlayedArtist();

                        //this determines if we should sync up the users top tracks and artists
                        //SController.SyncTopList(user);
                    }
                }
                return(true);
            }
            return(false);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Gets all the saved tracks from the database
        /// </summary>
        public List <dSavedTrack> GetSavedTrackFromDb(string userId, int retRec)
        {
            try
            {
                //launch up a new Db context
                using (var db = new AiApiDbContext())
                {
                    var returnedRecords = db.SavedTracks.Where(x => x.UserName == userId).Take(retRec).ToList();

                    //removes all the records
                    return(returnedRecords);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("=====================");
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.InnerException);
                Console.WriteLine(ex.StackTrace);
                Console.WriteLine("=====================");
            }

            return(new List <dSavedTrack>());
        }
Exemplo n.º 11
0
        //public void BuildArtistList()
        //{
        //	var artistList = new HashSet<string>();

        //	if (artistList.Count < 50)
        //	{
        //		track.Track.Artists.ForEach(x =>
        //		{
        //			artistList.Add(x.Id);
        //		});
        //	}
        //	else
        //	{
        //		await GetArtistFromSpotify(artistList);
        //		artistList.Clear();
        //		continue; ;
        //	}
        //}

        /// <summary>
        /// Gets all the saved tracks from the database
        /// </summary>
        public async Task <List <dSavedTrack> > GetAllSavedTracksFromDb()
        {
            try
            {
                //launch up a new Db context
                using (var db = new AiApiDbContext())
                {
                    var returnedRecords = db.SavedTracks.ToListAsync();

                    //removes all the records
                    return(await returnedRecords);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("=====================");
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.InnerException);
                Console.WriteLine(ex.StackTrace);
                Console.WriteLine("=====================");
            }

            return(new List <dSavedTrack>());
        }
Exemplo n.º 12
0
        /// <summary>
        /// Gets artist from spotify and then saved them out to the database
        /// </summary>
        /// <param name="nextUrl"></param>
        /// <returns></returns>
        public async Task <bool> GetArtistFromSpotify(List <string> ids)
        {
            _artist.Clear();
            try
            {
                using (var db = new AiApiDbContext())
                {
                    if (ids.Count > 50)
                    {
                        ids.RemoveAt(ids.Count - 1);
                    }
                    var empString = "";
                    foreach (var id in ids)
                    {
                        if (string.IsNullOrWhiteSpace(empString))
                        {
                            empString += $"{id}";
                        }
                        else
                        {
                            empString += $",{id}";
                        }
                    }
                    using (var client = new HttpClient())
                    {
                        client.DefaultRequestHeaders.Accept.Clear();
                        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);

                        HttpResponseMessage responseMessage = await client.GetAsync("https://api.spotify.com/v1/artists?ids=" + empString);

                        if (responseMessage.IsSuccessStatusCode)
                        {
                            var responseContent = await responseMessage.Content.ReadAsStringAsync();

                            var data = JsonConvert.DeserializeObject <SeveralArtists>(responseContent);

                            data.Artists.ForEach(_artist.Add);
                        }
                    }


                    foreach (var a in _artist)
                    {
                        var dArtist = new dArtist()
                        {
                            Id         = a.Id,
                            Popularity = a.Popularity,
                            Name       = a.Name,
                            Uri        = a.Uri,
                            Type       = a.Type
                        };

                        foreach (var genreString in a.Genres)
                        {
                            if (string.IsNullOrWhiteSpace(dArtist.Genre1))
                            {
                                dArtist.Genre1 = genreString;
                                continue;
                            }

                            if (string.IsNullOrWhiteSpace(dArtist.Genre2))
                            {
                                dArtist.Genre2 = genreString;
                                continue;
                            }

                            if (string.IsNullOrWhiteSpace(dArtist.Genre3))
                            {
                                dArtist.Genre3 = genreString;
                                continue;
                            }

                            if (string.IsNullOrWhiteSpace(dArtist.Genre4))
                            {
                                dArtist.Genre4 = genreString;
                                continue;
                            }

                            if (string.IsNullOrWhiteSpace(dArtist.Genre5))
                            {
                                dArtist.Genre5 = genreString;
                                break;
                            }
                        }

                        var t = db.Artist.Where(x => x.Id == dArtist.Id).ToList();

                        if (!db.Artist.Where(x => x.Id == dArtist.Id).ToList().Any())
                        {
                            db.Artist.Add(dArtist);
                        }
                    }

                    await db.SaveChangesAsync();

                    _artist.Clear();
                    return(true);
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex);
                return(false);
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// Resyncs the current user's synced tracks
        /// </summary>
        public async Task <bool> ResyncSavedTracks(string userName)
        {
            //get's all the tracks from the database
            var tracks = GetAllSavedTracks();

            using (var db = new AiApiDbContext())
            {
                if (db.SavedTracks.Any())
                {
                    //let's clear out all the other tracks in the database
                    RemoveSavedTracks(userName);
                }

                try
                {
                    //update the lave sync date
                    db.UdpateSyncDate(userName);

                    var artistList = new List <string>();

                    var index = 0;
                    foreach (var track in tracks)
                    {
                        if (artistList.Count < 50)
                        {
                            track.Track.Artists.ForEach(x =>
                            {
                                if (!artistList.Contains(x.Id))
                                {
                                    artistList.Add(x.Id);
                                }
                            });
                        }
                        else
                        {
                            await GetArtistFromSpotify(artistList);

                            artistList.Clear();
                            continue;;
                        }
                        //let's extract what we need from the track object
                        dSavedTrack savedTrack = new dSavedTrack();
                        savedTrack.Id          = index;
                        savedTrack.FullTrackId = track.Track.Id;
                        savedTrack.AddedAt     = track.AddedAt;
                        savedTrack.UserName    = userName;

                        dFullTrack fullTrack = new dFullTrack
                        {
                            Id          = track.Track.Id,
                            Name        = track.Track.Name,
                            Explicit    = track.Track.Explicit,
                            Type        = track.Track.Type,
                            PreviewUrl  = track.Track.PreviewUrl,
                            TrackNumber = track.Track.TrackNumber,
                            Uri         = track.Track.Uri,
                        };

                        //if the track has an artist (which it should)
                        //and the artist is not already saved in my library than save the artist out
                        if (track.Track.Artists.Any())
                        {
                            fullTrack.Artist1Id = track.Track.Artists[0].Id;

                            if (track.Track.Artists.Count > 1)
                            {
                                fullTrack.Artist2Id = track.Track.Artists[1].Id;
                            }
                        }

                        if (db.SavedTracks.Find(savedTrack.Id) == null)
                        {
                            //add the track to query
                            db.SavedTracks.Add(savedTrack);
                        }

                        if (db.Songs.Find(fullTrack.Id) == null)
                        {
                            db.Songs.Add(fullTrack);
                        }

                        //let's increment the index;
                        index++;
                    }

                    await db.SaveChangesAsync();

                    return(true);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("=====================");
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.InnerException);
                    Console.WriteLine(ex.StackTrace);
                    Console.WriteLine("=====================");

                    return(false);
                }
            }

            return(false);
        }