├── MorePlaylists ├── Images │ ├── Hitbloq.png │ ├── AccSaber.png │ └── BeatSaver.png ├── Sources │ ├── ICachable.cs │ ├── IBasicSource.cs │ ├── ISource.cs │ └── BasicSource.cs ├── BeatSaver │ ├── IBeatSaverEntry.cs │ ├── BeatSaverFilterModel.cs │ ├── BeatSaverFiltersView.bsml │ ├── BeatSaverDetailView.bsml │ ├── BeatSaverPlaylistEntry.cs │ ├── BeatSaverUserPlaylistEntry.cs │ ├── BeatSaverFiltersViewController.cs │ ├── BeatSaver.cs │ ├── BeatSaverDetailViewController.cs │ └── BeatSaverListViewController.cs ├── Utilities │ ├── MaterialGrabber.cs │ ├── AnimationGrabber.cs │ ├── Utils.cs │ ├── InputFieldGrabber.cs │ ├── PlaylistLibUtils.cs │ ├── Accessors.cs │ └── SpriteLoader.cs ├── Entries │ ├── IBasicEntry.cs │ ├── Song.cs │ ├── IEntry.cs │ ├── SongDetailsEntry.cs │ └── BasicEntry.cs ├── UI │ ├── ViewControllers │ │ ├── IDetailViewController.cs │ │ ├── IListViewController.cs │ │ ├── MorePlaylistsDownloaderViewController.cs │ │ ├── SourceModalController.cs │ │ ├── PopupModalsController.cs │ │ ├── BasicDetailViewController.cs │ │ ├── MorePlaylistsSongListViewController.cs │ │ └── BasicListViewController.cs │ ├── Views │ │ ├── SourceModal.bsml │ │ ├── PopupModals.bsml │ │ ├── BasicListView.bsml │ │ ├── MorePlaylistsSongListView.bsml │ │ └── BasicDetailView.bsml │ ├── MenuButtonUI.cs │ └── MorePlaylistsFlowCoordinator.cs ├── Directory.Build.props ├── AccSaber │ ├── AccSaberEntry.cs │ └── AccSaber.cs ├── manifest.json ├── Hitbloq │ ├── HitbloqEntry.cs │ └── Hitbloq.cs ├── Plugin.cs ├── Installers │ └── MorePlaylistsMenuInstaller.cs ├── MorePlaylists.csproj ├── .editorconfig └── Directory.Build.targets ├── .github ├── FUNDING.yml └── workflows │ ├── pr.yml │ └── master.yml ├── MorePlaylists.sln ├── README.md ├── .gitattributes ├── .gitignore └── LICENSE /MorePlaylists/Images/Hitbloq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rithik-b/MorePlaylists/HEAD/MorePlaylists/Images/Hitbloq.png -------------------------------------------------------------------------------- /MorePlaylists/Images/AccSaber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rithik-b/MorePlaylists/HEAD/MorePlaylists/Images/AccSaber.png -------------------------------------------------------------------------------- /MorePlaylists/Images/BeatSaver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rithik-b/MorePlaylists/HEAD/MorePlaylists/Images/BeatSaver.png -------------------------------------------------------------------------------- /MorePlaylists/Sources/ICachable.cs: -------------------------------------------------------------------------------- 1 | namespace MorePlaylists.Sources 2 | { 3 | internal interface ICachable 4 | { 5 | void ClearCache(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /MorePlaylists/BeatSaver/IBeatSaverEntry.cs: -------------------------------------------------------------------------------- 1 | using BeatSaverSharp.Models; 2 | using MorePlaylists.Entries; 3 | 4 | namespace MorePlaylists.BeatSaver 5 | { 6 | internal interface IBeatSaverEntry : IEntry 7 | { 8 | User Owner { get; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /MorePlaylists/Sources/IBasicSource.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | using MorePlaylists.Entries; 5 | 6 | namespace MorePlaylists.Sources 7 | { 8 | internal interface IBasicSource : ISource 9 | { 10 | Task?> GetEndpointResult(bool refreshRequested, CancellationToken token); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /MorePlaylists/Utilities/MaterialGrabber.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UnityEngine; 3 | 4 | namespace MorePlaylists.Utilities 5 | { 6 | internal class MaterialGrabber 7 | { 8 | private Material? noGlowRoundEdge; 9 | public Material NoGlowRoundEdge => noGlowRoundEdge ??= Resources.FindObjectsOfTypeAll().First(m => m.name == "UINoGlowRoundEdge"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /MorePlaylists/Entries/IBasicEntry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | using BeatSaberPlaylistsLib.Types; 5 | using SiraUtil.Web; 6 | 7 | namespace MorePlaylists.Entries 8 | { 9 | internal interface IBasicEntry : IEntry 10 | { 11 | IPlaylist? RemotePlaylist { get; } 12 | Task CachePlaylist(IHttpService siraHttpService, CancellationToken cancellationToken = default); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MorePlaylists/Entries/Song.cs: -------------------------------------------------------------------------------- 1 | namespace MorePlaylists.Entries 2 | { 3 | internal class Song 4 | { 5 | public string Name { get; } 6 | public string SubName { get; } 7 | public string CoverURL { get; } 8 | 9 | public Song(string name, string subName, string coverURL) 10 | { 11 | Name = name; 12 | SubName = subName; 13 | CoverURL = coverURL; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MorePlaylists/UI/ViewControllers/IDetailViewController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using HMUI; 3 | using MorePlaylists.Entries; 4 | 5 | namespace MorePlaylists.UI 6 | { 7 | internal interface IDetailViewController 8 | { 9 | ViewController ViewController { get; } 10 | event Action DidPressDownload; 11 | event Action DidGoToPlaylist; 12 | void ShowDetail(IEntry entry); 13 | void OnPlaylistDownloaded(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MorePlaylists/Sources/ISource.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using HMUI; 3 | using MorePlaylists.UI; 4 | using UnityEngine; 5 | 6 | namespace MorePlaylists.Sources 7 | { 8 | internal interface ISource 9 | { 10 | Sprite Logo { get; } 11 | IDetailViewController DetailViewController { get; } 12 | IListViewController ListViewController { get; } 13 | event Action? ViewControllerRequested; 14 | event Action? ViewControllerDismissRequested; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MorePlaylists/UI/ViewControllers/IListViewController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using HMUI; 3 | using MorePlaylists.Entries; 4 | using MorePlaylists.Sources; 5 | 6 | namespace MorePlaylists.UI 7 | { 8 | internal interface IListViewController 9 | { 10 | ViewController ViewController { get; } 11 | event Action? DidSelectPlaylist; 12 | event Action? DidClickSource; 13 | event Action? DetailDismissRequested; 14 | void ShowPlaylistsForSource(ISource source); 15 | void SetEntryAsOwned(IEntry entry); 16 | void AbortLoading(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MorePlaylists/UI/Views/SourceModal.bsml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /MorePlaylists/UI/Views/PopupModals.bsml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |