├── SpotifyWPF ├── icon.ico ├── publish │ ├── setup.exe │ ├── Application Files │ │ ├── SpotifyWPF_1_0_0_0 │ │ │ ├── icon.ico.deploy │ │ │ ├── AutoMapper.dll.deploy │ │ │ ├── SpotifyWPF.exe.deploy │ │ │ ├── Newtonsoft.Json.dll.deploy │ │ │ ├── SpotifyAPI.Web.dll.deploy │ │ │ ├── GalaSoft.MvvmLight.dll.deploy │ │ │ ├── CommonServiceLocator.dll.deploy │ │ │ ├── SpotifyAPI.Web.Auth.dll.deploy │ │ │ ├── Unosquare.Swan.Lite.dll.deploy │ │ │ ├── Unosquare.Labs.EmbedIO.dll.deploy │ │ │ ├── GalaSoft.MvvmLight.Extras.dll.deploy │ │ │ ├── GalaSoft.MvvmLight.Platform.dll.deploy │ │ │ ├── System.Windows.Interactivity.dll.deploy │ │ │ ├── SpotifyWPF.exe.config.deploy │ │ │ ├── SpotifyWPF.application │ │ │ └── SpotifyWPF.exe.manifest │ │ └── SpotifyWPF_1_0_0_1 │ │ │ ├── icon.ico.deploy │ │ │ ├── AutoMapper.dll.deploy │ │ │ ├── SpotifyWPF.exe.deploy │ │ │ ├── Newtonsoft.Json.dll.deploy │ │ │ ├── SpotifyAPI.Web.dll.deploy │ │ │ ├── GalaSoft.MvvmLight.dll.deploy │ │ │ ├── CommonServiceLocator.dll.deploy │ │ │ ├── SpotifyAPI.Web.Auth.dll.deploy │ │ │ ├── Unosquare.Swan.Lite.dll.deploy │ │ │ ├── Unosquare.Labs.EmbedIO.dll.deploy │ │ │ ├── GalaSoft.MvvmLight.Extras.dll.deploy │ │ │ ├── GalaSoft.MvvmLight.Platform.dll.deploy │ │ │ ├── System.Windows.Interactivity.dll.deploy │ │ │ ├── SpotifyWPF.exe.config.deploy │ │ │ ├── SpotifyWPF.application │ │ │ └── SpotifyWPF.exe.manifest │ └── SpotifyWPF.application ├── ViewModel │ ├── MessageType.cs │ ├── Page │ │ ├── LoginPageViewModel.cs │ │ ├── PlaylistsPageViewModel.cs │ │ └── SearchPageViewModel.cs │ ├── Component │ │ ├── TracksDataGridViewModel.cs │ │ ├── AlbumsDataGridViewModel.cs │ │ ├── ArtistsDataGridViewModel.cs │ │ ├── PlaylistsDataGridViewModel.cs │ │ └── MenuItemViewModel.cs │ ├── ViewModelLocator.cs │ ├── MainViewModel.cs │ └── DataGridViewModelBase.cs ├── Model │ ├── Track.cs │ └── AutoMapperConfiguration.cs ├── App.xaml.cs ├── Service │ ├── ISettingsProvider.cs │ ├── SettingsProvider.cs │ ├── ISpotify.cs │ ├── MessageBoxes.cs │ └── Spotify.cs ├── View │ ├── MainWindow.xaml.cs │ ├── Page │ │ ├── LoginPage.xaml.cs │ │ ├── SearchPage.xaml.cs │ │ ├── PlaylistsPage.xaml.cs │ │ ├── LoginPage.xaml │ │ ├── SearchPage.xaml │ │ └── PlaylistsPage.xaml │ ├── Component │ │ ├── AlbumsDataGrid.xaml.cs │ │ ├── ArtistsDataGrid.xaml.cs │ │ ├── TracksDataGrid.xaml.cs │ │ ├── PlaylistsDataGrid.xaml.cs │ │ ├── PlaylistsDataGrid.xaml │ │ ├── AlbumsDataGrid.xaml │ │ ├── ArtistsDataGrid.xaml │ │ └── TracksDataGrid.xaml │ ├── ArtistsAlbumsTracks.xaml.cs │ ├── Extension │ │ ├── UIHelper.cs │ │ └── DataGridExtensions.cs │ └── MainWindow.xaml ├── App.xaml ├── Properties │ ├── Settings.settings │ ├── Settings.Designer.cs │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ └── Resources.resx ├── Converter │ ├── RadioButtonStringConverter.cs │ ├── StringListToStringConverter.cs │ └── ArtistsToStringConverter.cs ├── App.config ├── packages.config └── SpotifyWPF.csproj ├── .editorconfig ├── SpotifyWPF.MSIX ├── Images │ ├── StoreLogo.backup.png │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── LockScreenLogo.scale-200.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.targetsize-24_altform-unplated.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ └── Square44x44Logo.altform-lightunplated_targetsize-48.png ├── Package.appinstaller ├── Package.appxmanifest └── SpotifyWPF.MSIX.wapproj ├── README.md ├── .gitattributes ├── azure-pipelines.yml ├── SpotifyWPF.sln └── .gitignore /SpotifyWPF/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/icon.ico -------------------------------------------------------------------------------- /SpotifyWPF/publish/setup.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/setup.exe -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.cs] 2 | 3 | # CS0618: Type or member is obsolete 4 | dotnet_diagnostic.CS0618.severity = none 5 | -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/StoreLogo.backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/StoreLogo.backup.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/LargeTile.scale-100.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/LargeTile.scale-125.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/LargeTile.scale-150.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/LargeTile.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/LargeTile.scale-400.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SmallTile.scale-100.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SmallTile.scale-125.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SmallTile.scale-150.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SmallTile.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SmallTile.scale-400.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/MessageType.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.ViewModel 2 | { 3 | public enum MessageType 4 | { 5 | LoginSuccessful 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/icon.ico.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/icon.ico.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/icon.ico.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/icon.ico.deploy -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/AutoMapper.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/AutoMapper.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/SpotifyWPF.exe.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/SpotifyWPF.exe.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/AutoMapper.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/AutoMapper.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/SpotifyWPF.exe.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/SpotifyWPF.exe.deploy -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF.MSIX/Images/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/Newtonsoft.Json.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/Newtonsoft.Json.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/SpotifyAPI.Web.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/SpotifyAPI.Web.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/Newtonsoft.Json.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/Newtonsoft.Json.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/SpotifyAPI.Web.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/SpotifyAPI.Web.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/GalaSoft.MvvmLight.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/GalaSoft.MvvmLight.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/GalaSoft.MvvmLight.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/GalaSoft.MvvmLight.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/CommonServiceLocator.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/CommonServiceLocator.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/SpotifyAPI.Web.Auth.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/SpotifyAPI.Web.Auth.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/Unosquare.Swan.Lite.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/Unosquare.Swan.Lite.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/CommonServiceLocator.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/CommonServiceLocator.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/SpotifyAPI.Web.Auth.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/SpotifyAPI.Web.Auth.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/Unosquare.Swan.Lite.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/Unosquare.Swan.Lite.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/Unosquare.Labs.EmbedIO.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/Unosquare.Labs.EmbedIO.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/Unosquare.Labs.EmbedIO.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/Unosquare.Labs.EmbedIO.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/Model/Track.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.Model 2 | { 3 | public class Track 4 | { 5 | public string TrackName { get; set; } 6 | 7 | public string Artists { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/GalaSoft.MvvmLight.Extras.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/GalaSoft.MvvmLight.Extras.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/GalaSoft.MvvmLight.Extras.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/GalaSoft.MvvmLight.Extras.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/GalaSoft.MvvmLight.Platform.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/GalaSoft.MvvmLight.Platform.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/System.Windows.Interactivity.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/System.Windows.Interactivity.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/GalaSoft.MvvmLight.Platform.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/GalaSoft.MvvmLight.Platform.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/System.Windows.Interactivity.dll.deploy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrPnut/SpotifyWPF/HEAD/SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/System.Windows.Interactivity.dll.deploy -------------------------------------------------------------------------------- /SpotifyWPF/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace SpotifyWPF 4 | { 5 | /// 6 | /// Interaction logic for App.xaml 7 | /// 8 | public partial class App : Application 9 | { 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SpotifyWPF/Service/ISettingsProvider.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.Service 2 | { 3 | public interface ISettingsProvider 4 | { 5 | string SpotifyClientId { get; } 6 | 7 | string SpotifyRedirectPort { get; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /SpotifyWPF/View/MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View 2 | { 3 | /// 4 | /// Interaction logic for MainWindow.xaml 5 | /// 6 | public partial class MainWindow 7 | { 8 | public MainWindow() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Page/LoginPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View.Page 2 | { 3 | /// 4 | /// Interaction logic for LoginPage.xaml 5 | /// 6 | public partial class LoginPage 7 | { 8 | public LoginPage() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Page/SearchPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View.Page 2 | { 3 | /// 4 | /// Interaction logic for SearchPage.xaml 5 | /// 6 | public partial class SearchPage 7 | { 8 | public SearchPage() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /SpotifyWPF/Service/SettingsProvider.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.Service 2 | { 3 | public class SettingsProvider : ISettingsProvider 4 | { 5 | public string SpotifyClientId => Properties.Settings.Default.SpotifyClientId; 6 | 7 | public string SpotifyRedirectPort => Properties.Settings.Default.SpotifyRedirectPort; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Page/PlaylistsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View.Page 2 | { 3 | /// 4 | /// Interaction logic for PlaylistsPage.xaml 5 | /// 6 | public partial class PlaylistsPage 7 | { 8 | public PlaylistsPage() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/AlbumsDataGrid.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View.Component 2 | { 3 | /// 4 | /// Interaction logic for AlbumsDataGrid.xaml 5 | /// 6 | public partial class AlbumsDataGrid 7 | { 8 | public AlbumsDataGrid() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /SpotifyWPF/Service/ISpotify.cs: -------------------------------------------------------------------------------- 1 | using SpotifyAPI.Web; 2 | using System; 3 | using System.Threading.Tasks; 4 | 5 | namespace SpotifyWPF.Service 6 | { 7 | public interface ISpotify 8 | { 9 | Task LoginAsync(Action onSuccess); 10 | 11 | Task GetPrivateProfileAsync(); 12 | 13 | ISpotifyClient Api { get; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/ArtistsDataGrid.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View.Component 2 | { 3 | /// 4 | /// Interaction logic for ArtistsDataGrid.xaml 5 | /// 6 | public partial class ArtistsDataGrid 7 | { 8 | public ArtistsDataGrid() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/TracksDataGrid.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View.Component 2 | { 3 | /// 4 | /// Interaction logic for TracksDataGrid.xaml 5 | /// 6 | public partial class TracksDataGrid 7 | { 8 | public TracksDataGrid() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/PlaylistsDataGrid.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.View.Component 2 | { 3 | /// 4 | /// Interaction logic for PlaylistsDataGrid.xaml 5 | /// 6 | public partial class PlaylistsDataGrid 7 | { 8 | public PlaylistsDataGrid() 9 | { 10 | InitializeComponent(); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /SpotifyWPF/View/ArtistsAlbumsTracks.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Controls; 2 | 3 | namespace SpotifyWPF.View 4 | { 5 | /// 6 | /// Interaction logic for Search.xaml 7 | /// 8 | public partial class ArtistsAlbumsTracks : UserControl 9 | { 10 | public ArtistsAlbumsTracks() 11 | { 12 | InitializeComponent(); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Package.appinstaller: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SpotifyWPF/App.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /SpotifyWPF/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 137da97fe5de4e8c839d69d41c637364 7 | 8 | 9 | 4002 10 | 11 | 12 | -------------------------------------------------------------------------------- /SpotifyWPF/Converter/RadioButtonStringConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Windows.Data; 4 | 5 | namespace SpotifyWPF.Converter 6 | { 7 | public class RadioButtonStringConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | return (string)parameter == (string)value; 12 | } 13 | 14 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 15 | { 16 | return value != null && (bool) value ? parameter : null; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SpotifyWPF/Converter/StringListToStringConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Windows.Data; 5 | 6 | namespace SpotifyWPF.Converter 7 | { 8 | public class StringListToStringConverter : IValueConverter 9 | { 10 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 11 | { 12 | return !(value is IList) ? null : string.Join("\n", ((IList) value)); 13 | } 14 | 15 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 16 | { 17 | throw new NotImplementedException(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/Page/LoginPageViewModel.cs: -------------------------------------------------------------------------------- 1 | using GalaSoft.MvvmLight; 2 | using GalaSoft.MvvmLight.Command; 3 | using SpotifyWPF.Service; 4 | // ReSharper disable AsyncVoidLambda 5 | 6 | namespace SpotifyWPF.ViewModel.Page 7 | { 8 | public class LoginPageViewModel : ViewModelBase 9 | { 10 | public RelayCommand SpotifyLoginCommand { get; private set; } 11 | 12 | public LoginPageViewModel(ISpotify spotify) 13 | { 14 | SpotifyLoginCommand = new RelayCommand(async () => { await spotify.LoginAsync(OnSuccess); }); 15 | } 16 | 17 | private void OnSuccess() 18 | { 19 | MessengerInstance.Send(new { }, MessageType.LoginSuccessful); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /SpotifyWPF/Converter/ArtistsToStringConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Linq; 5 | using System.Windows.Data; 6 | using SpotifyAPI.Web; 7 | 8 | 9 | namespace SpotifyWPF.Converter 10 | { 11 | public class ArtistsToStringConverter : IValueConverter 12 | { 13 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 14 | { 15 | return !(value is IList) ? null : 16 | string.Join(",", ((IList) value).Select(a => a.Name).ToList()); 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/Component/TracksDataGridViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using SpotifyAPI.Web; 3 | using SpotifyWPF.Service; 4 | 5 | namespace SpotifyWPF.ViewModel.Component 6 | { 7 | public class TracksDataGridViewModel : DataGridViewModelBase 8 | { 9 | private readonly ISpotify _spotify; 10 | 11 | public TracksDataGridViewModel(ISpotify spotify) 12 | { 13 | _spotify = spotify; 14 | } 15 | 16 | private protected override async Task> FetchPageInternalAsync() 17 | { 18 | var req = new SearchRequest(SearchRequest.Types.Track, Query) 19 | { 20 | Limit = 20, 21 | Offset = Items.Count 22 | }; 23 | 24 | var resp = await _spotify.Api.Search.Item(req); 25 | 26 | return resp.Tracks; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/Component/AlbumsDataGridViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using SpotifyAPI.Web; 3 | using SpotifyWPF.Service; 4 | 5 | namespace SpotifyWPF.ViewModel.Component 6 | { 7 | public class AlbumsDataGridViewModel : DataGridViewModelBase 8 | { 9 | private readonly ISpotify _spotify; 10 | 11 | public AlbumsDataGridViewModel(ISpotify spotify) 12 | { 13 | _spotify = spotify; 14 | } 15 | 16 | private protected override async Task> FetchPageInternalAsync() 17 | { 18 | var req = new SearchRequest(SearchRequest.Types.Album, Query) 19 | { 20 | Limit = 20, 21 | Offset = Items.Count 22 | }; 23 | 24 | var resp = await _spotify.Api.Search.Item(req); 25 | 26 | return resp.Albums; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/Component/ArtistsDataGridViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using SpotifyAPI.Web; 3 | using SpotifyWPF.Service; 4 | 5 | namespace SpotifyWPF.ViewModel.Component 6 | { 7 | public class ArtistsDataGridViewModel : DataGridViewModelBase 8 | { 9 | private readonly ISpotify _spotify; 10 | 11 | public ArtistsDataGridViewModel(ISpotify spotify) 12 | { 13 | _spotify = spotify; 14 | } 15 | 16 | private protected override async Task> FetchPageInternalAsync() 17 | { 18 | var req = new SearchRequest(SearchRequest.Types.Artist, Query) 19 | { 20 | Limit = 20, 21 | Offset = Items.Count 22 | }; 23 | 24 | var resp = await _spotify.Api.Search.Item(req); 25 | 26 | return resp.Artists; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/Component/PlaylistsDataGridViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using SpotifyAPI.Web; 3 | using SpotifyWPF.Service; 4 | 5 | namespace SpotifyWPF.ViewModel.Component 6 | { 7 | public class PlaylistsDataGridViewModel : DataGridViewModelBase 8 | { 9 | private readonly ISpotify _spotify; 10 | 11 | public PlaylistsDataGridViewModel(ISpotify spotify) 12 | { 13 | _spotify = spotify; 14 | } 15 | 16 | private protected override async Task> FetchPageInternalAsync() 17 | { 18 | var req = new SearchRequest(SearchRequest.Types.Playlist, Query) 19 | { 20 | Limit = 20, 21 | Offset = Items.Count 22 | }; 23 | 24 | var resp = await _spotify.Api.Search.Item(req); 25 | 26 | return resp.Playlists; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Page/LoginPage.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 19 | 20 | -------------------------------------------------------------------------------- /SpotifyWPF/Model/AutoMapperConfiguration.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using AutoMapper; 4 | using SpotifyAPI.Web; 5 | 6 | namespace SpotifyWPF.Model 7 | { 8 | // ReSharper disable once ClassNeverInstantiated.Global 9 | public class AutoMapperConfiguration 10 | { 11 | public static MapperConfiguration Configure() 12 | { 13 | var config = new MapperConfiguration(cfg => 14 | { 15 | cfg.CreateMap, Track>() 16 | .ForMember(dest => dest.TrackName, 17 | act => act.MapFrom((src, dest) => (src.Track as FullTrack)?.Name)) 18 | .ForMember(dest => dest.Artists, act => act.MapFrom((src, dest) => 19 | { 20 | var fullTrack = src.Track as FullTrack; 21 | 22 | var artists = string.Join(", ", 23 | (fullTrack?.Artists ?? new List()).Select(sa => sa.Name)); 24 | 25 | return $"{artists}"; 26 | })); 27 | }); 28 | 29 | config.AssertConfigurationIsValid(); 30 | 31 | return config; 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/Component/MenuItemViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Windows.Input; 3 | using GalaSoft.MvvmLight; 4 | using GalaSoft.MvvmLight.CommandWpf; 5 | 6 | namespace SpotifyWPF.ViewModel.Component 7 | { 8 | public class MenuItemViewModel : ViewModelBase 9 | { 10 | private string _header; 11 | private bool _isChecked; 12 | 13 | public MenuItemViewModel(string header) : this(header, null) { } 14 | 15 | public MenuItemViewModel(string header, ICommand command) 16 | { 17 | _header = header; 18 | Command = command ?? new RelayCommand(() => {}); 19 | } 20 | 21 | public string Header 22 | { 23 | get => _header; 24 | 25 | set 26 | { 27 | _header = value; 28 | RaisePropertyChanged(); 29 | } 30 | } 31 | 32 | public ObservableCollection MenuItems { get; set; } 33 | 34 | public bool IsChecked 35 | { 36 | get => _isChecked; 37 | 38 | set 39 | { 40 | _isChecked = value; 41 | RaisePropertyChanged(); 42 | } 43 | } 44 | 45 | public ICommand Command { get; } 46 | } 47 | } -------------------------------------------------------------------------------- /SpotifyWPF/Service/MessageBoxes.cs: -------------------------------------------------------------------------------- 1 | namespace SpotifyWPF.Service.MessageBoxes 2 | { 3 | public enum MessageBoxButton 4 | { 5 | OK = 0, 6 | OkCancel = 1, 7 | YesNoCancel = 3, 8 | YesNo = 4 9 | } 10 | 11 | public enum MessageBoxResult 12 | { 13 | None = 0, 14 | Ok = 1, 15 | Cancel = 2, 16 | Yes = 6, 17 | No = 7 18 | } 19 | 20 | public enum MessageBoxIcon 21 | { 22 | None = 0, 23 | Error = 16, 24 | Hand = 16, 25 | Stop = 16, 26 | Question = 32, 27 | Exclamation = 48, 28 | Warning = 48, 29 | Information = 64, 30 | Asterisk = 64 31 | } 32 | 33 | public interface IMessageBoxService 34 | { 35 | MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon); 36 | } 37 | 38 | public class MessageBoxService : IMessageBoxService 39 | { 40 | public MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon) 41 | { 42 | return (MessageBoxResult)System.Windows.MessageBox.Show(message, caption, 43 | (System.Windows.MessageBoxButton)buttons, (System.Windows.MessageBoxImage)icon); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Extension/UIHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Windows; 3 | using System.Windows.Media; 4 | 5 | namespace SpotifyWPF.View.Extension 6 | { 7 | public static class UiHelper 8 | { 9 | public static IList FindChildren(DependencyObject element) where T : FrameworkElement 10 | { 11 | var retval = new List(); 12 | 13 | for (var counter = 0; counter < VisualTreeHelper.GetChildrenCount(element); counter++) 14 | { 15 | if (!(VisualTreeHelper.GetChild(element, counter) is FrameworkElement toAdd)) continue; 16 | 17 | if (toAdd is T correctlyTyped) 18 | retval.Add(correctlyTyped); 19 | 20 | else 21 | retval.AddRange(FindChildren(toAdd)); 22 | } 23 | 24 | return retval; 25 | } 26 | 27 | public static T FindParent(DependencyObject element) where T : FrameworkElement 28 | { 29 | var parent = VisualTreeHelper.GetParent(element) as FrameworkElement; 30 | 31 | while (parent != null) 32 | { 33 | if (parent is T correctlyTyped) return correctlyTyped; 34 | 35 | return FindParent(parent); 36 | } 37 | 38 | return null; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /SpotifyWPF/ViewModel/ViewModelLocator.cs: -------------------------------------------------------------------------------- 1 | using AutoMapper; 2 | using CommonServiceLocator; 3 | using GalaSoft.MvvmLight.Ioc; 4 | using SpotifyWPF.Model; 5 | using SpotifyWPF.Service; 6 | using SpotifyWPF.Service.MessageBoxes; 7 | using SpotifyWPF.ViewModel.Page; 8 | 9 | namespace SpotifyWPF.ViewModel 10 | { 11 | public class ViewModelLocator 12 | { 13 | public ViewModelLocator() 14 | { 15 | SimpleIoc.Default.Reset(); 16 | 17 | ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 18 | 19 | SimpleIoc.Default.Register(() => AutoMapperConfiguration.Configure().CreateMapper()); 20 | SimpleIoc.Default.Register(); 21 | SimpleIoc.Default.Register(); 22 | SimpleIoc.Default.Register(); 23 | 24 | SimpleIoc.Default.Register(); 25 | SimpleIoc.Default.Register(); 26 | SimpleIoc.Default.Register(); 27 | SimpleIoc.Default.Register(); 28 | } 29 | 30 | public MainViewModel Main => ServiceLocator.Current.GetInstance(); 31 | 32 | public PlaylistsPageViewModel PlaylistsPage => ServiceLocator.Current.GetInstance(); 33 | 34 | public SearchPageViewModel Search => ServiceLocator.Current.GetInstance(); 35 | 36 | public static void Cleanup() 37 | { 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_0/SpotifyWPF.exe.config.deploy: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 137da97fe5de4e8c839d69d41c637364 23 | 24 | 25 | http://localhost:4002 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /SpotifyWPF/publish/Application Files/SpotifyWPF_1_0_0_1/SpotifyWPF.exe.config.deploy: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 137da97fe5de4e8c839d69d41c637364 23 | 24 | 25 | http://localhost:4002 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /SpotifyWPF/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 137da97fe5de4e8c839d69d41c637364 27 | 28 | 29 | 4002 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /SpotifyWPF/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SpotifyWPF 2 | An unofficial, simple tools application for Spotify 3 | 4 | This application was born out of a community ask to delete multiple playlists at a time (they had thousands of them). With that said, 5 | that's the only feature this application supports currently. 6 | 7 | The idea is for this to be a sort of "power tools" application for Spotify. Stuff that you can't do in the app (but can with the public APIs) 8 | will be considered for addition to this app. Things that you can do in the Spotify app, but cumbersone to perform, will be considersed as 9 | well. 10 | 11 | For example: 12 | * Adding all of an artist's tracks to a playlist 13 | * Mass deletion (technically unfollow) of playlists 14 | * Displaying information from the API that the Spotify client doesn't show 15 | 16 | If you have any feature ideas, you can either add it as an issue to this repo, or post it on the Spotify Community. I'll keep a lookout 17 | for any asks I see that the official app doesn't support. 18 | 19 | # Installation 20 | 21 | If you want to use the [installer](https://mrpnut.github.io/SpotifyWPF/SpotifyWPF.appinstaller), then you need to install my self signed certificate to your computer's trusted certificate authorities. 22 | To do that easily, run the following in an Administrator PowerShell command prompt. After that, run the installer. 23 | 24 | ``` 25 | Invoke-WebRequest -Uri "https://mrpnut.github.io/SpotifyWPF/SpotifyWPF.cer" -OutFile "$env:temp\SpotifyWPF.cer"; Import-Certificate -FilePath "$env:temp\SpotifyWPF.cer" -CertStoreLocation Cert:\LocalMachine\Root 26 | ``` 27 | 28 | If you don't want to use the installer, you can pick one of the Github releases to extract to a folder and run. 29 | Using the installer will keep SpotifyWPF up to date. 30 | 31 | # Running 32 | 33 | After installation, you can just search for "SpotifyWPF" in your start menu if you used the installer. 34 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/PlaylistsDataGrid.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 14 | 15 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /SpotifyWPF.MSIX/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 13 | 14 | 15 | SpotifyWPF 16 | ncsoftworks.com 17 | Images\StoreLogo.png 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /SpotifyWPF/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SpotifyWPF.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.2.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("137da97fe5de4e8c839d69d41c637364")] 29 | public string SpotifyClientId { 30 | get { 31 | return ((string)(this["SpotifyClientId"])); 32 | } 33 | } 34 | 35 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 36 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 37 | [global::System.Configuration.DefaultSettingValueAttribute("4002")] 38 | public string SpotifyRedirectPort { 39 | get { 40 | return ((string)(this["SpotifyRedirectPort"])); 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/AlbumsDataGrid.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | 21 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/ArtistsDataGrid.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | 21 | 33 | 34 | 35 | 36 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /SpotifyWPF/View/MainWindow.xaml: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /SpotifyWPF/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | using System.Windows; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("SpotifyWPF")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("SpotifyWPF")] 13 | [assembly: AssemblyCopyright("Copyright © 2020")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | //In order to begin building localizable applications, set 23 | //CultureYouAreCodingWith in your .csproj file 24 | //inside a . For example, if you are using US english 25 | //in your source files, set the to en-US. Then uncomment 26 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 27 | //the line below to match the UICulture setting in the project file. 28 | 29 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 30 | 31 | 32 | [assembly: ThemeInfo( 33 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 34 | //(used if a resource is not found in the page, 35 | // or application resource dictionaries) 36 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 37 | //(used if a resource is not found in the page, 38 | // app, or any theme specific resource dictionaries) 39 | )] 40 | 41 | 42 | // Version information for an assembly consists of the following four values: 43 | // 44 | // Major Version 45 | // Minor Version 46 | // Build Number 47 | // Revision 48 | // 49 | // You can specify all the values or you can default the Build and Revision Numbers 50 | // by using the '*' as shown below: 51 | // [assembly: AssemblyVersion("1.0.*")] 52 | [assembly: AssemblyVersion("1.0.0.0")] 53 | [assembly: AssemblyFileVersion("1.0.0.0")] 54 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Component/TracksDataGrid.xaml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | 21 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | 65 | *.manifest binary 66 | *.application binary 67 | *.deploy binary 68 | -------------------------------------------------------------------------------- /SpotifyWPF/View/Page/SearchPage.xaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |