ソースを参照

Sort upvotes (#73)

* Make BeatSaver data available.
* Add sorting by UpVotes.
Halsafar 5 年 前
コミット
aefa733d04

+ 4 - 2
SongBrowserPlugin/DataAccess/ScrappedData.cs

@@ -19,6 +19,8 @@ namespace SongBrowser.DataAccess
         public List<DifficultyStats> Diffs { get; set; }
         public long Bpm { get; set; }
         public long PlayedCount { get; set; }
+        public long Upvotes { get; set; }
+        public long Downvotes { get; set; }
     }
 
     public class DifficultyStats
@@ -69,7 +71,7 @@ namespace SongBrowser.DataAccess
             }
             catch (Exception e)
             {
-                Logger.Exception("Exception hitting scrappedDataURL", e);
+                Logger.Error(e);
                 yield break;
             }
 
@@ -77,7 +79,7 @@ namespace SongBrowser.DataAccess
             {
                 yield return null;
                 time += Time.deltaTime;
-                if (time >= 5f && asyncRequest.progress == 0f)
+                if (time >= 5f && asyncRequest.progress <= float.Epsilon)
                 {
                     www.Abort();
                     timeout = true;

+ 52 - 0
SongBrowserPlugin/DataAccess/SongBrowserModel.cs

@@ -29,6 +29,7 @@ namespace SongBrowser
         private Dictionary<String, double> _cachedLastWriteTimes;
         private Dictionary<string, int> _weights;
         private Dictionary<BeatmapDifficulty, int> _difficultyWeights;
+        private Dictionary<string, ScrappedSong> _levelHashToDownloaderData = null;
         private Dictionary<string, ScoreSaberData> _levelIdToScoreSaberData = null;
         private Dictionary<string, int> _levelIdToPlayCount;
         private Dictionary<string, string> _levelIdToSongVersion;
@@ -388,6 +389,24 @@ namespace SongBrowser
         }
 
         /// <summary>
+        /// Map the downloader data for quick lookup.
+        /// </summary>
+        /// <param name="songs"></param>
+        public void UpdateDownloaderDataMapping(List<ScrappedSong> songs)
+        {
+            _levelHashToDownloaderData = new Dictionary<string, ScrappedSong>();
+            foreach (ScrappedSong song in songs)
+            {
+                if (_levelHashToDownloaderData.ContainsKey(song.Hash))
+                {
+                    continue;
+                }
+
+                _levelHashToDownloaderData.Add(song.Hash, song);
+            }
+        }
+
+        /// <summary>
         /// Add Song to Editing Playlist
         /// </summary>
         /// <param name="songInfo"></param>
@@ -542,6 +561,9 @@ namespace SongBrowser
                 case SongSortMode.Author:
                     sortedSongs = SortAuthor(filteredSongs);
                     break;
+                case SongSortMode.UpVotes:
+                    sortedSongs = SortUpVotes(filteredSongs);
+                    break;
                 case SongSortMode.PlayCount:
                     sortedSongs = SortPlayCount(filteredSongs);
                     break;
@@ -806,5 +828,35 @@ namespace SongBrowser
                 .ThenBy(x => x.songAuthorName)
                 .ToList();
         }
+
+        /// <summary>
+        /// Sorting by Downloader UpVotes.
+        /// </summary>
+        /// <param name="levelIds"></param>
+        /// <returns></returns>
+        private List<IPreviewBeatmapLevel> SortUpVotes(List<IPreviewBeatmapLevel> levelIds)
+        {
+            Logger.Info("Sorting song list by UpVotes");
+
+            // Do not always have data when trying to sort by UpVotes
+            if (_levelHashToDownloaderData == null)
+            {
+                return levelIds;
+            }
+
+            return levelIds
+                .OrderByDescending(x => {
+                    var hash = x.levelID.Split('_')[2];
+                    if (_levelHashToDownloaderData.ContainsKey(hash))
+                    {
+                        return _levelHashToDownloaderData[hash].Upvotes;
+                    }
+                    else
+                    {
+                        return int.MinValue;
+                    }
+                })
+                .ToList();
+        }
     }
 }

+ 1 - 0
SongBrowserPlugin/DataAccess/SongBrowserSettings.cs

@@ -21,6 +21,7 @@ namespace SongBrowser.DataAccess
         Difficulty,
         Random,
         PP,
+        UpVotes,
 
         // Deprecated
         Favorites,

+ 7 - 1
SongBrowserPlugin/SongBrowserApplication.cs

@@ -136,10 +136,16 @@ namespace SongBrowser
             try
             {
                 PlaylistsCollection.MatchSongsForAllPlaylists(true);
+                _songBrowserUI.Model.UpdateDownloaderDataMapping(songs);
+                if (_songBrowserUI.Model.Settings.sortMode == SongSortMode.UpVotes)
+                {
+                    _songBrowserUI.ProcessSongList();
+                    _songBrowserUI.RefreshSongList();
+                }
             }
             catch (Exception e)
             {
-                Logger.Exception("Exception during OnScoreSaberDataDownloaded: ", e);
+                Logger.Exception("Exception during OnDownloaderScrappedDataDownloaded: ", e);
             }
         }
 

+ 2 - 2
SongBrowserPlugin/UI/Browser/SongBrowserUI.cs

@@ -286,12 +286,12 @@ namespace SongBrowser.UI
 
                 string[] sortButtonNames = new string[]
                 {
-                    "Song", "Author", "Newest", "Plays", "PP", "Difficult", "Random"
+                    "Song", "Author", "Newest", "Plays", "PP", "Difficult", "UpVotes", "Random"
                 };
 
                 SongSortMode[] sortModes = new SongSortMode[]
                 {
-                    SongSortMode.Default, SongSortMode.Author, SongSortMode.Newest, SongSortMode.PlayCount, SongSortMode.PP, SongSortMode.Difficulty, SongSortMode.Random
+                    SongSortMode.Default, SongSortMode.Author, SongSortMode.Newest, SongSortMode.PlayCount, SongSortMode.PP, SongSortMode.Difficulty,  SongSortMode.UpVotes, SongSortMode.Random
                 };
                 
                 _sortButtonGroup = new List<SongSortButton>();