public void Search_Default_LimitedSongs()
        {
            BeatSaverReader reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            int maxSongs = 10;
            BeatSaverSearchType searchType = BeatSaverSearchType.name;
            string criteria                = "Believer";
            BeatSaverSearchQuery  query    = new SearchQueryBuilder(searchType, criteria).GetQuery();
            BeatSaverFeedSettings settings = new BeatSaverFeedSettings((int)BeatSaverFeedName.Search)
            {
                MaxSongs = maxSongs, SearchQuery = query
            };
            FeedResult result = reader.GetSongsFromFeed(settings);

            Assert.IsTrue(result.Count > 0);
            Assert.IsTrue(result.Count <= 10);
            int expectedPages = ExpectedPagesForSongs(result.Count);

            Assert.AreEqual(expectedPages, result.PagesChecked);
            foreach (ScrapedSong song in result.Songs.Values)
            {
                Console.WriteLine($"{song.Name} by {song.LevelAuthorName}, {song.Hash}");
            }
        }
        public void Latest()
        {
            var settings = new BeatSaverFeedSettings(BeatSaverFeedName.Latest);
            var feed     = new BeatSaverFeed(settings);

            feed.EnsureValidSettings();
            Assert.IsTrue(feed.HasValidSettings);
        }
        public void Success_Authors_LimitedSongs()
        {
            BeatSaverReader reader = new BeatSaverReader()
            {
                StoreRawData = true
            };

            string[] authorList = new string[] { "BlackBlazon", "greatyazer", "joetastic" };
            Dictionary <string, ScrapedSong> songList = new Dictionary <string, ScrapedSong>();
            int maxSongs = 59;
            int maxPages = 10;
            SearchQueryBuilder queryBuilder = new SearchQueryBuilder(BeatSaverSearchType.author, null);

            foreach (string author in authorList)
            {
                queryBuilder.Criteria = author;
                BeatSaverFeedSettings settings = new BeatSaverFeedSettings((int)BeatSaverFeedName.Author)
                {
                    SearchQuery = queryBuilder.GetQuery(), MaxSongs = maxSongs, MaxPages = maxPages
                };
                FeedResult songsByAuthor = reader.GetSongsFromFeed(settings);
                Assert.IsTrue(songsByAuthor.Count > 0);
                Assert.IsTrue(songsByAuthor.Count <= maxSongs);
                int expectedPages = ExpectedPagesForSongs(songsByAuthor.Count);
                Assert.IsTrue(expectedPages <= songsByAuthor.PagesChecked);
                foreach (KeyValuePair <string, ScrapedSong> song in songsByAuthor.Songs)
                {
                    songList.TryAdd(song.Key, song.Value);
                }
            }
            IEnumerable <string> detectedAuthors = songList.Values.Select(s => s.LevelAuthorName.ToLower()).Distinct();

            foreach (KeyValuePair <string, ScrapedSong> song in songList)
            {
                Assert.IsTrue(song.Value.DownloadUri != null);
                Assert.IsTrue(authorList.Any(a => a.ToLower() == song.Value.LevelAuthorName.ToLower()));
            }
            foreach (string author in authorList)
            {
                Assert.IsTrue(songList.Any(s => s.Value.LevelAuthorName.ToLower() == author.ToLower()));
            }

            // BlackBlazon check
            string      blazonHash = "58de2d709a45b68fdb1dbbfefb187f59f629bfc5".ToUpper();
            ScrapedSong blazonSong = songList[blazonHash];

            Assert.IsTrue(blazonSong != null);
            Assert.IsTrue(blazonSong.DownloadUri != null);
            // GreatYazer check
            string      songHash  = "bf8c016dc6b9832ece3030f05277bbbe67db790d".ToUpper();
            ScrapedSong yazerSong = songList[songHash];

            Assert.IsTrue(yazerSong != null);
            Assert.IsTrue(yazerSong.DownloadUri != null);
            var checkedPages = songList.Values.Select(s => s.SourceUri.OriginalString).Distinct().ToList();

            checkedPages.ForEach(p => Console.WriteLine(p));
        }
        public void Search_NullQuery()
        {
            var settings = new BeatSaverFeedSettings(BeatSaverFeedName.Search);
            var feed     = new BeatSaverFeed(settings);
            var ex       = Assert.ThrowsException <InvalidFeedSettingsException>(() => feed.EnsureValidSettings());

            Console.WriteLine(ex.Message);
            Assert.IsFalse(feed.HasValidSettings);
        }
        public void Followings_Exception_WrongSettingsType()
        {
            var reader   = GetDefaultReader();
            int maxSongs = 60;
            var settings = new BeatSaverFeedSettings((int)BeatSaverFeedName.Author)
            {
                MaxSongs = maxSongs
            };

            Assert.ThrowsException <InvalidCastException>(() => reader.GetSongsFromFeed(settings));
        }
        public void Search_HasQuery()
        {
            var settings     = new BeatSaverFeedSettings(BeatSaverFeedName.Search);
            var queryBuilder = new SearchQueryBuilder(BeatSaverSearchType.all, "test");

            settings.SearchQuery = queryBuilder.GetQuery();
            var feed = new BeatSaverFeed(settings);

            feed.EnsureValidSettings();
            Assert.IsTrue(feed.HasValidSettings);
        }
        public void Author_EmptyCriteria()
        {
            var settings     = new BeatSaverFeedSettings(BeatSaverFeedName.Author);
            var queryBuilder = new SearchQueryBuilder(BeatSaverSearchType.author, "");

            settings.SearchQuery = queryBuilder.GetQuery();
            var feed = new BeatSaverFeed(settings);
            var ex   = Assert.ThrowsException <InvalidFeedSettingsException>(() => feed.EnsureValidSettings());

            Console.WriteLine(ex.Message);
            Assert.IsFalse(feed.HasValidSettings);
        }
        public void Success_Filtered360()
        {
            BeatSaverReader reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            int maxSongs = 20;
            int maxPages = 30;
            BeatSaverFeedSettings settings = new BeatSaverFeedSettings((int)BeatSaverFeedName.Latest)
            {
                MaxSongs = maxSongs, MaxPages = maxPages
            };
            Progress <ReaderProgress> progress = new Progress <ReaderProgress>(p =>
            {
                if (p.SongCount > 0)
                {
                    Console.WriteLine($"Progress: Page {p.CurrentPage} found {p.SongCount} songs.");
                }
                else
                {
                    Console.WriteLine($"Progress: Page {p.CurrentPage} did not have any songs.");
                }
            });

            bool stopAfter(ScrapedSong song)
            {
                DateTime uploadDate = song.JsonData["uploaded"].Value <DateTime>();
                bool     shouldStop = uploadDate < (DateTime.Now - TimeSpan.FromDays(5));

                if (shouldStop)
                {
                    Console.WriteLine($"StopWhenAny reached with {song.Key} ({uploadDate.ToString()})");
                }
                return(shouldStop);
            }

            Func <ScrapedSong, bool> filter = SongFeedReaders.Filtering.BuiltInFilters.ThreeSixtyDegree;

            settings.Filter      = filter;
            settings.StopWhenAny = stopAfter;
            FeedResult result = reader.GetSongsFromFeedAsync(settings, progress, CancellationToken.None).Result;

            Assert.IsTrue(result.Count > 0 && result.Count < maxPages * settings.SongsPerPage);
            int expectedPages = ExpectedPagesForSongs(result.Count);

            Assert.IsTrue(expectedPages <= result.PagesChecked);
            Console.WriteLine($"----------------");
            foreach (ScrapedSong song in result.Songs.Values)
            {
                Console.WriteLine($"{song.Name} by {song.LevelAuthorName}, {song.Hash}");
            }
        }
예제 #9
0
        public override IFeedSettings ToFeedSettings()
        {
            BeatSaverFeedSettings settings = new BeatSaverFeedSettings((int)BeatSaverFeedName.Latest)
            {
                MaxSongs = this.MaxSongs
            };

            settings.Filter = song =>
            {
                return(song.JsonData["metadata"]["difficulties"]["expertPlus"].ToObject <bool>());
            };
            return(settings);
        }
예제 #10
0
        public void Success_Authors_LimitedSongs()
        {
            var reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            var authorList = new string[] { "BlackBlazon", "greatyazer", "joetastic" };
            var songList   = new Dictionary <string, ScrapedSong>();
            int maxSongs   = 59;

            foreach (var author in authorList)
            {
                var settings = new BeatSaverFeedSettings((int)BeatSaverFeed.Author)
                {
                    Criteria = author, MaxSongs = maxSongs
                };
                var songsByAuthor = reader.GetSongsFromFeed(settings);
                Assert.IsTrue(songsByAuthor.Count > 0);
                Assert.IsTrue(songsByAuthor.Count <= maxSongs);
                int expectedPages = ExpectedPagesForSongs(songsByAuthor.Count);
                Assert.IsTrue(expectedPages <= songsByAuthor.PagesChecked);
                foreach (var song in songsByAuthor.Songs)
                {
                    songList.TryAdd(song.Key, song.Value);
                }
            }
            var detectedAuthors = songList.Values.Select(s => s.MapperName.ToLower()).Distinct();

            foreach (var song in songList)
            {
                Assert.IsTrue(song.Value.DownloadUri != null);
                Assert.IsTrue(authorList.Any(a => a.ToLower() == song.Value.MapperName.ToLower()));
            }
            foreach (var author in authorList)
            {
                Assert.IsTrue(songList.Any(s => s.Value.MapperName.ToLower() == author.ToLower()));
            }

            // BlackBlazon check
            var blazonHash = "58de2d709a45b68fdb1dbbfefb187f59f629bfc5".ToUpper();
            var blazonSong = songList[blazonHash];

            Assert.IsTrue(blazonSong != null);
            Assert.IsTrue(blazonSong.DownloadUri != null);
            // GreatYazer check
            var songHash  = "bf8c016dc6b9832ece3030f05277bbbe67db790d".ToUpper();
            var yazerSong = songList[songHash];

            Assert.IsTrue(yazerSong != null);
            Assert.IsTrue(yazerSong.DownloadUri != null);
        }
        public void UnusedQuery()
        {
            var querylessFeeds = new BeatSaverFeedName[] { BeatSaverFeedName.Latest, BeatSaverFeedName.Plays };
            var queryBuilder   = new SearchQueryBuilder(BeatSaverSearchType.all, "test");

            foreach (var feedType in querylessFeeds)
            {
                var settings = new BeatSaverFeedSettings(feedType);
                settings.SearchQuery = queryBuilder.GetQuery();
                var feed = new BeatSaverFeed(settings);
                feed.EnsureValidSettings();
                Assert.IsTrue(feed.HasValidSettings);
            }
        }
        public void GetUriForDate_Before()
        {
            string dateStr = "2021-08-02T20:36:22.804Z";

            DateTime.Parse(dateStr);
            DateTime dateTime = DateTime.Parse(dateStr);
            FeedDate feedDate = new FeedDate(dateTime, DateDirection.Before);
            BeatSaverFeedSettings settings = new BeatSaverFeedSettings(BeatSaverFeedName.Latest);
            BeatSaverFeed         feed     = new BeatSaverFeed(settings);
            string expectedUrl             = $"https://api.beatsaver.com/maps/latest?automapper=false&before={dateStr}";

            string actualUrl = feed.GetUriForDate(feedDate).ToString();

            Assert.AreEqual(expectedUrl, actualUrl);
        }
        public void GetSongsFromFeed_Hot_Test()
        {
            var reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            var settings = new BeatSaverFeedSettings((int)BeatSaverFeed.Hot)
            {
                MaxSongs = 50
            };
            var songList = reader.GetSongsFromFeed(settings);

            Assert.IsTrue(songList.Count == settings.MaxSongs);
            foreach (var song in songList.Values)
            {
                Console.WriteLine($"{song.SongName} by {song.MapperName}, {song.Hash}");
            }
        }
        public void CancelledInProgress()
        {
            BeatSaverReader reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            var cts      = new CancellationTokenSource(1000);
            int maxSongs = 50;
            BeatSaverFeedSettings settings = new BeatSaverFeedSettings((int)BeatSaverFeedName.Plays)
            {
                MaxSongs = maxSongs
            };
            FeedResult result = reader.GetSongsFromFeed(settings, cts.Token);

            Assert.IsFalse(result.Successful);
            Assert.IsTrue(result.Count > 0);
            Assert.AreEqual(FeedResultError.Cancelled, result.ErrorCode);
            cts.Dispose();
        }
예제 #15
0
        public void Success_Downloads()
        {
            var reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            int maxSongs = 50;
            var settings = new BeatSaverFeedSettings((int)BeatSaverFeed.Downloads)
            {
                MaxSongs = maxSongs
            };
            var result = reader.GetSongsFromFeed(settings);

            Assert.IsTrue(result.Count == settings.MaxSongs);
            int expectedPages = ExpectedPagesForSongs(result.Count);

            Assert.AreEqual(expectedPages, result.PagesChecked);
            foreach (var song in result.Songs.Values)
            {
                Console.WriteLine($"{song.SongName} by {song.MapperName}, {song.Hash}");
            }
        }
        public void Success_Newest()
        {
            BeatSaverReader reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            int maxSongs = 55;
            BeatSaverFeedSettings settings = new BeatSaverFeedSettings((int)BeatSaverFeedName.Latest)
            {
                MaxSongs = maxSongs
            };
            FeedResult result = reader.GetSongsFromFeed(settings);

            Assert.AreEqual(settings.MaxSongs, result.Count);
            int expectedPages = ExpectedPagesForSongs(result.Count);

            Assert.IsTrue(expectedPages <= result.PagesChecked);
            foreach (ScrapedSong song in result.Songs.Values)
            {
                Console.WriteLine($"{song.Name} by {song.LevelAuthorName}, {song.Hash}");
            }
        }
예제 #17
0
        public void Search_Default_LimitedSongs()
        {
            var reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            int maxSongs = 10;
            var settings = new BeatSaverFeedSettings((int)BeatSaverFeed.Search)
            {
                MaxSongs = maxSongs, Criteria = "Believer"
            };
            var result = reader.GetSongsFromFeed(settings);

            Assert.IsTrue(result.Count > 0);
            Assert.IsTrue(result.Count <= 10);
            int expectedPages = ExpectedPagesForSongs(result.Count);

            Assert.AreEqual(expectedPages, result.PagesChecked);
            foreach (var song in result.Songs.Values)
            {
                Console.WriteLine($"{song.SongName} by {song.MapperName}, {song.Hash}");
            }
        }
        public void GetSongsFromFeed_Authors_Test()
        {
            var reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            var authorList = new string[] { "BlackBlazon", "greatyazer" };
            var settings   = new BeatSaverFeedSettings((int)BeatSaverFeed.Author)
            {
                Authors = authorList, MaxSongs = 59
            };
            var songsByAuthor   = reader.GetSongsFromFeed(settings);
            var detectedAuthors = songsByAuthor.Values.Select(s => s.MapperName.ToLower()).Distinct();

            foreach (var song in songsByAuthor)
            {
                Assert.IsTrue(song.Value.DownloadUri != null);
                Assert.IsTrue(authorList.Any(a => a.ToLower() == song.Value.MapperName.ToLower()));
            }
            foreach (var author in authorList)
            {
                Assert.IsTrue(songsByAuthor.Any(s => s.Value.MapperName.ToLower() == author.ToLower()));
            }

            // BlackBlazon check
            var blazonHash = "58de2d709a45b68fdb1dbbfefb187f59f629bfc5".ToUpper();
            var blazonSong = songsByAuthor[blazonHash];

            Assert.IsTrue(blazonSong != null);
            Assert.IsTrue(blazonSong.DownloadUri != null);
            // GreatYazer check
            var songHash  = "bf8c016dc6b9832ece3030f05277bbbe67db790d".ToUpper();
            var yazerSong = songsByAuthor[songHash];

            Assert.IsTrue(yazerSong != null);
            Assert.IsTrue(yazerSong.DownloadUri != null);
        }
예제 #19
0
        public void Search_User()
        {
            var reader = new BeatSaverReader()
            {
                StoreRawData = true
            };
            int    maxSongs   = 10;
            string criteria   = "19F2879D11A91B51A5C090D63471C3E8D9B7AEE3";
            var    searchType = BeatSaverSearchType.hash;
            var    settings   = new BeatSaverFeedSettings((int)BeatSaverFeed.Search)
            {
                MaxSongs = maxSongs, Criteria = criteria, SearchType = searchType
            };
            var result = reader.GetSongsFromFeed(settings);

            Assert.AreEqual(1, result.Count);
            int expectedPages = ExpectedPagesForSongs(result.Count);

            Assert.AreEqual(expectedPages, result.PagesChecked);
            foreach (var song in result.Songs.Values)
            {
                Console.WriteLine($"{song.SongName} by {song.MapperName}, {song.Hash}");
            }
        }