Repository: JosefNemec/Playnite
Branch: master
Commit: ab2eed4d09ea
Files: 1302
Total size: 11.5 MB
Directory structure:
gitextract__t5v_oi7/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── custom.md
│ │ └── feature_request.yml
│ └── pull_request_template.md
├── .gitignore
├── LICENSE.md
├── README.md
├── appveyor.yml
├── build/
│ ├── ExtensionsRefIgnoreList.txt
│ ├── PlayniteSDK.nuspec
│ ├── VerifyLanguageFiles.ps1
│ ├── applyEnglishProofing.ps1
│ ├── build.ps1
│ ├── build.xml
│ ├── buildLocConstants.ps1
│ ├── buildSdkNuget.ps1
│ ├── common.ps1
│ ├── generateRetroArchProfile.ps1
│ └── updateLocalizations.ps1
├── crowdin.yml
├── media/
│ └── SplashScreen.xcf
├── references/
│ └── Windows.winmd
├── source/
│ ├── .editorconfig
│ ├── Playnite/
│ │ ├── API/
│ │ │ ├── AddonsAPI.cs
│ │ │ ├── DatabaseAPI.cs
│ │ │ ├── DesignData/
│ │ │ │ ├── DesignNotificationsAPI.cs
│ │ │ │ └── DesignPlayniteAPI.cs
│ │ │ ├── NotificationsAPI.cs
│ │ │ ├── PlayniteAPI.cs
│ │ │ ├── PlayniteInfoAPI.cs
│ │ │ ├── PlaynitePathsAPI.cs
│ │ │ └── PlayniteSettingsAPI.cs
│ │ ├── Addons/
│ │ │ └── Addons.cs
│ │ ├── App/
│ │ │ ├── CmdLineOptions.cs
│ │ │ ├── IPlayniteApplication.cs
│ │ │ ├── PlayniteApplication.cs
│ │ │ ├── UpdateManifest.cs
│ │ │ └── Updater.cs
│ │ ├── App.config
│ │ ├── Archive.cs
│ │ ├── Audio.cs
│ │ ├── Backup.cs
│ │ ├── Behaviors/
│ │ │ ├── AnimatedVisibility.cs
│ │ │ ├── ExpanderBehaviors.cs
│ │ │ ├── FocusBahaviors.cs
│ │ │ ├── LeftClickContextMenuBehavior.cs
│ │ │ ├── MediaElementBehaviors.cs
│ │ │ ├── ScrollToSelectedBehavior.cs
│ │ │ ├── ScrollViewerBehaviours.cs
│ │ │ └── SelectorBehaviors.cs
│ │ ├── BindingProxy.cs
│ │ ├── CefTools.cs
│ │ ├── CmdlineCommands.cs
│ │ ├── Commands/
│ │ │ ├── GenericCommands.cs
│ │ │ └── GlobalCommands.cs
│ │ ├── Common/
│ │ │ ├── BindingTools.cs
│ │ │ ├── Computer.cs
│ │ │ ├── Constants.cs
│ │ │ ├── CueSheet.cs
│ │ │ ├── DesignerTools.cs
│ │ │ ├── Exceptions.cs
│ │ │ ├── Explorer.cs
│ │ │ ├── Extensions/
│ │ │ │ ├── BitmapExtensions.cs
│ │ │ │ ├── BitmapIconExtensions.cs
│ │ │ │ ├── CloneObject.cs
│ │ │ │ ├── Dictionary.cs
│ │ │ │ ├── Enums.cs
│ │ │ │ ├── IconExtension.cs
│ │ │ │ ├── ItemsControlExtensions.cs
│ │ │ │ ├── KeyExtensions.cs
│ │ │ │ ├── LongExtensions.cs
│ │ │ │ ├── NetExtensions.cs
│ │ │ │ ├── ObjectExtensions.cs
│ │ │ │ ├── ProcessExtensions.cs
│ │ │ │ ├── StringExtensions.cs
│ │ │ │ └── WindowExtensions.cs
│ │ │ ├── FileSystem.cs
│ │ │ ├── FileSystem_Checksum.cs
│ │ │ ├── GdiFile.cs
│ │ │ ├── GlobalRandom.cs
│ │ │ ├── Images.cs
│ │ │ ├── IniParser.cs
│ │ │ ├── ItemsSource.cs
│ │ │ ├── M3U.cs
│ │ │ ├── MarkupConverter.cs
│ │ │ ├── Media/
│ │ │ │ └── Icons/
│ │ │ │ ├── IconExtractor.cs
│ │ │ │ └── IconUtil.cs
│ │ │ ├── MemoryCache.cs
│ │ │ ├── NLogLogProvider.cs
│ │ │ ├── Network.cs
│ │ │ ├── Paths.cs
│ │ │ ├── ProcessMonitor.cs
│ │ │ ├── ProcessStarter.cs
│ │ │ ├── Programs.cs
│ │ │ ├── Programs2.cs
│ │ │ ├── Resources.cs
│ │ │ ├── Roman.cs
│ │ │ ├── SafeFileEnumerator.cs
│ │ │ ├── Serialization.cs
│ │ │ ├── SigningTools.cs
│ │ │ ├── Sizes.cs
│ │ │ ├── Sqlite.cs
│ │ │ ├── SystemDialogs.cs
│ │ │ ├── TGASharpLib.cs
│ │ │ ├── TempDirectory.cs
│ │ │ ├── Timer.cs
│ │ │ ├── Units.cs
│ │ │ ├── Web/
│ │ │ │ ├── Downloader.cs
│ │ │ │ └── HttpDownloader.cs
│ │ │ ├── Xaml.cs
│ │ │ └── Xml.cs
│ │ ├── Common.config
│ │ ├── ControlTemplateTools.cs
│ │ ├── Controllers/
│ │ │ ├── GameControllerFactory.cs
│ │ │ └── GenericGameController.cs
│ │ ├── Controls/
│ │ │ ├── ExtendedDataGrid.cs
│ │ │ ├── ExtendedListBox.cs
│ │ │ ├── ExtendedListView.cs
│ │ │ ├── FadeImage.xaml
│ │ │ ├── FadeImage.xaml.cs
│ │ │ ├── GridEx.cs
│ │ │ ├── HotKeyBox.cs
│ │ │ ├── HtmlTextView.cs
│ │ │ └── WindowBase.cs
│ │ ├── Converters/
│ │ │ ├── BidirectionalEnumAndNumberConverter.cs
│ │ │ ├── BoolToAutoWidthConverter.cs
│ │ │ ├── BoolToYesNoConverter.cs
│ │ │ ├── BooleanToHiddenConverter.cs
│ │ │ ├── BooleanToVisibilityConverter.cs
│ │ │ ├── CoversZoomToPercentageConverter.cs
│ │ │ ├── DateTimeToLastPlayedConverter.cs
│ │ │ ├── DockToStringConverter.cs
│ │ │ ├── EnumToBooleanConverter.cs
│ │ │ ├── EnumToVisibilityConverter.cs
│ │ │ ├── GenericTypeConverter.cs
│ │ │ ├── ICollectionNullOrEmptyToVisibilityConverter.cs
│ │ │ ├── IconToImageSourceConverter.cs
│ │ │ ├── ImageStringToImageConverter.cs
│ │ │ ├── IntToVisibilityConverter.cs
│ │ │ ├── InvertableBooleanToVisibilityConverter.cs
│ │ │ ├── InvertedBoolenConverter.cs
│ │ │ ├── ListToStringConverter.cs
│ │ │ ├── NegateConverter.cs
│ │ │ ├── NotificationIconConverter.cs
│ │ │ ├── NullToBoolConverter.cs
│ │ │ ├── NullToDependencyPropertyUnsetConverter.cs
│ │ │ ├── NullToVisibilityConverter.cs
│ │ │ ├── NullableDateToStringConverter.cs
│ │ │ ├── NullableUlongBytesSizeToStringConverter.cs
│ │ │ ├── NumericConverters.cs
│ │ │ ├── ObjectEqualityToBoolConverter.cs
│ │ │ ├── ObjectToStringConverter.cs
│ │ │ ├── OpacityBoolConverter.cs
│ │ │ ├── PlayTimeToStringConverter.cs
│ │ │ ├── SortingOrderToStringConverter.cs
│ │ │ ├── StrechToStringConverter.cs
│ │ │ ├── StringNullOrEmptyToBoolConverter.cs
│ │ │ ├── StringNullOrEmptyToVisibilityConverter.cs
│ │ │ ├── StringToUpperCaseConverter.cs
│ │ │ ├── TicksToTimeSpanConverter.cs
│ │ │ ├── ValueConverterGroup.cs
│ │ │ └── WidthToFontSizeConverter.cs
│ │ ├── Database/
│ │ │ ├── Collections/
│ │ │ │ ├── AgeRatingsCollection.cs
│ │ │ │ ├── AppSoftwareCollection.cs
│ │ │ │ ├── CategoriesCollection.cs
│ │ │ │ ├── CompaniesCollection.cs
│ │ │ │ ├── CompletionStatusesCollection.cs
│ │ │ │ ├── EmulatorsCollection.cs
│ │ │ │ ├── FeaturesCollection.cs
│ │ │ │ ├── FilterPresetsCollection.cs
│ │ │ │ ├── GameScannersCollection.cs
│ │ │ │ ├── GamesCollection.cs
│ │ │ │ ├── GamesSourcesCollection.cs
│ │ │ │ ├── GenresCollection.cs
│ │ │ │ ├── ImportExclusionsCollection.cs
│ │ │ │ ├── ItemCollection.cs
│ │ │ │ ├── LiteDBFileReaderV7.cs
│ │ │ │ ├── PlatformsCollection.cs
│ │ │ │ ├── RegionsCollection.cs
│ │ │ │ ├── SeriesCollection.cs
│ │ │ │ └── TagsCollection.cs
│ │ │ ├── DatabaseExplorer.cs
│ │ │ ├── DatabaseFileEvent.cs
│ │ │ ├── DatabaseFilter.cs
│ │ │ ├── DatabaseSettings.cs
│ │ │ ├── DatabaseStats.cs
│ │ │ ├── EventBufferHandler.cs
│ │ │ ├── GameDatabase.cs
│ │ │ ├── GameDatabaseMigration.cs
│ │ │ ├── GameDatabase_Filters.cs
│ │ │ ├── GameFieldComparer.cs
│ │ │ ├── InMemoryGameDatabase.cs
│ │ │ └── OldModels/
│ │ │ ├── NewVer1/
│ │ │ │ ├── OldCompletionStatus.cs
│ │ │ │ ├── OldDatabaseObject.cs
│ │ │ │ ├── OldGame.cs
│ │ │ │ ├── OldGameAction.cs
│ │ │ │ └── OldLink.cs
│ │ │ └── Ver2.cs
│ │ ├── DateTimes.cs
│ │ ├── Diagnostic.cs
│ │ ├── DiagnosticPackageInfo.cs
│ │ ├── DialogsFactory.cs
│ │ ├── DiscordManager.cs
│ │ ├── EasyAntiCheat.cs
│ │ ├── ElementTreeHelper.cs
│ │ ├── Emulation/
│ │ │ ├── Emulators/
│ │ │ │ ├── 4DO/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Altirra/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Atari800/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── BGB/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── BigPEmu/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── BizHawk/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── BlastEm/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Cemu/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Citra/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Cxbx-Reloaded/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── DOSBox/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── DeSmuME/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Dolphin/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── DuckStation/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── FCEUX/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── FS-UAE/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── FlashPlayerProjector/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Flycast/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Fuse/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── GBE+/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Gambatte/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── KegaFusion/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Lime3DS/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── LocaleEmulator/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── M64Py/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Mednafen/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Mesen/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Mesen-S/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── NanoboyAdvance/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Nestopia/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── NullDC/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── PCSX2/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── PCSXR-PGXP/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── PCem/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── PPSSPP/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Project64/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── RPCS3/
│ │ │ │ │ ├── emulator.yaml
│ │ │ │ │ └── importGames.ps1
│ │ │ │ ├── Reicast/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── RetroArch/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── RosaliesMupenGui/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Ruffle/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Ryujinx/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── SameBoy/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── ScummVM/
│ │ │ │ │ ├── emulator.yaml
│ │ │ │ │ └── importGames.ps1
│ │ │ │ ├── Snes9X/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Stella/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── VirtualJaguar/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── VisualBoyAdvance/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── VisualBoyAdvance-M/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Vita3K/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── WinUAE/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── WinVice/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Xemu/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Xenia/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Yabuse/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── Ymir/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── ZSNES/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── ares/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── blueMSX/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── bsnes/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── bsnes-hd/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── bsnes-mt/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── decaf-emu/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── ePSXe/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── gopher64/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── higan/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── jgenesis/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── m64p/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── mGBA/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── melonDS/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── puNES/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── redream/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ ├── shadPS4/
│ │ │ │ │ ├── emulator.yaml
│ │ │ │ │ └── importGames.ps1
│ │ │ │ ├── simple64/
│ │ │ │ │ └── emulator.yaml
│ │ │ │ └── yuzu/
│ │ │ │ └── emulator.yaml
│ │ │ ├── Platforms.yaml
│ │ │ └── Regions.yaml
│ │ ├── Emulators/
│ │ │ ├── DatModels.cs
│ │ │ ├── Emulation.cs
│ │ │ ├── EmulationDatabase.cs
│ │ │ └── Scanner.cs
│ │ ├── Exceptions.cs
│ │ ├── Extensions/
│ │ │ ├── ControlExtensions.cs
│ │ │ ├── GameExtensions.cs
│ │ │ ├── IProvideValueTarget.cs
│ │ │ ├── Markup/
│ │ │ │ ├── Api.cs
│ │ │ │ ├── BindingExtension.cs
│ │ │ │ ├── MainViewModel.cs
│ │ │ │ ├── PluginConverter.cs
│ │ │ │ ├── PluginSettings.cs
│ │ │ │ ├── PluginStatus.cs
│ │ │ │ ├── Settings.cs
│ │ │ │ ├── ThemeFile.cs
│ │ │ │ └── ThemeFileBinding.cs
│ │ │ └── ServiceProvider.cs
│ │ ├── FakePlayniteLibraryPlugin.cs
│ │ ├── GameTools.cs
│ │ ├── GamesCollectionView.cs
│ │ ├── GamesCollectionViewEntry.cs
│ │ ├── GamesEditor.cs
│ │ ├── GlobalTaskHandler.cs
│ │ ├── GoogleImageDownloader.cs
│ │ ├── HdrUtilities.cs
│ │ ├── HotKey.cs
│ │ ├── HttpFileCache.cs
│ │ ├── ImageSourceManager.cs
│ │ ├── Input/
│ │ │ ├── GameController.cs
│ │ │ └── MouseWheelGesture.cs
│ │ ├── ItemSelector.cs
│ │ ├── Localization/
│ │ │ ├── LocSource.xaml
│ │ │ ├── LocalizationKeys.cs
│ │ │ ├── af_ZA.xaml
│ │ │ ├── ar_SA.xaml
│ │ │ ├── bg_BG.xaml
│ │ │ ├── ca_ES.xaml
│ │ │ ├── cs_CZ.xaml
│ │ │ ├── cy_GB.xaml
│ │ │ ├── da_DK.xaml
│ │ │ ├── de_DE.xaml
│ │ │ ├── el_GR.xaml
│ │ │ ├── en_US.xaml
│ │ │ ├── eo_UY.xaml
│ │ │ ├── es_ES.xaml
│ │ │ ├── et_EE.xaml
│ │ │ ├── fa_IR.xaml
│ │ │ ├── fi_FI.xaml
│ │ │ ├── fr_FR.xaml
│ │ │ ├── ga_IE.xaml
│ │ │ ├── gl_ES.xaml
│ │ │ ├── he_IL.xaml
│ │ │ ├── hr_HR.xaml
│ │ │ ├── hu_HU.xaml
│ │ │ ├── id_ID.xaml
│ │ │ ├── it_IT.xaml
│ │ │ ├── ja_JP.xaml
│ │ │ ├── ko_KR.xaml
│ │ │ ├── locstatus.json
│ │ │ ├── lt_LT.xaml
│ │ │ ├── mr_IN.xaml
│ │ │ ├── nl_NL.xaml
│ │ │ ├── no_NO.xaml
│ │ │ ├── pl_PL.xaml
│ │ │ ├── pt_BR.xaml
│ │ │ ├── pt_PT.xaml
│ │ │ ├── ro_RO.xaml
│ │ │ ├── ru_RU.xaml
│ │ │ ├── si_LK.xaml
│ │ │ ├── sk_SK.xaml
│ │ │ ├── sl_SI.xaml
│ │ │ ├── sr_SP.xaml
│ │ │ ├── sv_SE.xaml
│ │ │ ├── tr_TR.xaml
│ │ │ ├── uk_UA.xaml
│ │ │ ├── vi_VN.xaml
│ │ │ ├── zh_CN.xaml
│ │ │ └── zh_TW.xaml
│ │ ├── Localization.cs
│ │ ├── Manifests/
│ │ │ ├── AddonManifestBase.cs
│ │ │ ├── AddonManifests.cs
│ │ │ ├── ExtensionManifest.cs
│ │ │ └── ThemeManifest.cs
│ │ ├── MenuHelpers.cs
│ │ ├── MenuItems.cs
│ │ ├── Metadata/
│ │ │ ├── MetadataDownloader.cs
│ │ │ ├── MetadataDownloaderSettings.cs
│ │ │ └── MetadataFileExtensions.cs
│ │ ├── Native/
│ │ │ ├── Fileapi.cs
│ │ │ ├── Gdi32.cs
│ │ │ ├── Kernel32.cs
│ │ │ ├── Ntdll.cs
│ │ │ ├── Powrprof.cs
│ │ │ ├── Processthreadsapi.cs
│ │ │ ├── Psapi.cs
│ │ │ ├── Shell32.cs
│ │ │ ├── Shlwapi.cs
│ │ │ ├── User32.cs
│ │ │ ├── WinError.cs
│ │ │ ├── Winbase.cs
│ │ │ ├── Windef.cs
│ │ │ ├── Wingdi.cs
│ │ │ ├── Winnt.cs
│ │ │ ├── Wintrust.cs
│ │ │ └── winuser.cs
│ │ ├── ObservablePowerStatus.cs
│ │ ├── ObservableTime.cs
│ │ ├── PipeServer.cs
│ │ ├── Playnite.csproj
│ │ ├── PlayniteEnvironment.cs
│ │ ├── PlayniteProcess.cs
│ │ ├── PlayniteUriHandler.cs
│ │ ├── Plugins/
│ │ │ ├── ExtensionFactory.cs
│ │ │ └── ExtensionInstaller.cs
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── SDL2.cs
│ │ ├── SDL2_mixer.cs
│ │ ├── Safe Mode.bat
│ │ ├── Scripting/
│ │ │ ├── PlayniteScript.cs
│ │ │ └── PowerShell/
│ │ │ ├── PowerShell.cs
│ │ │ └── PowerShellScript.cs
│ │ ├── SdkHelpers.cs
│ │ ├── SelectableItem.cs
│ │ ├── Services/
│ │ │ ├── BaseServicesClient.cs
│ │ │ ├── GenericResponse.cs
│ │ │ └── ServicesClient.cs
│ │ ├── Settings/
│ │ │ ├── AutoClientShutdownSettings.cs
│ │ │ ├── DetailsVisibilitySettings.cs
│ │ │ ├── FilterSettings.cs
│ │ │ ├── FullscreenSettings.cs
│ │ │ ├── OldSettings/
│ │ │ │ └── Plugins.cs
│ │ │ ├── PlaynitePaths.cs
│ │ │ ├── PlayniteSettings.cs
│ │ │ ├── SearchWindowVisibilitySettings.cs
│ │ │ ├── SettingsAttributes.cs
│ │ │ ├── ViewProperties.cs
│ │ │ └── WindowPositions.cs
│ │ ├── SortableNameConverter.cs
│ │ ├── SystemIntegration.cs
│ │ ├── Themes.cs
│ │ ├── ThirdPartyClients/
│ │ │ └── ThirdPartyToolsList.cs
│ │ ├── UrlConstants.cs
│ │ ├── ViewModels/
│ │ │ ├── AddonsViewModelBase_Online.cs
│ │ │ ├── CrashHandlerViewModel.cs
│ │ │ ├── ItemSelectionViewModel.cs
│ │ │ ├── LicenseAgreementViewModel.cs
│ │ │ ├── MainViewModelBase.cs
│ │ │ ├── ProgressViewViewModel.cs
│ │ │ ├── RandomGameSelectViewModel.cs
│ │ │ ├── SearchViewModel.cs
│ │ │ └── UpdateViewModel.cs
│ │ ├── WebView/
│ │ │ ├── CookieDestroyer.cs
│ │ │ ├── OffscreenWebView.cs
│ │ │ ├── WebView.cs
│ │ │ ├── WebViewBase.cs
│ │ │ └── WebViewFactory.cs
│ │ ├── Windows/
│ │ │ ├── CrashHandlerWindowFactory.cs
│ │ │ ├── ExtensionCrashHandlerWindowFactory.cs
│ │ │ ├── ItemSelectorWindowFactory.cs
│ │ │ ├── LicenseAgreementWindowFactory.cs
│ │ │ ├── ProgressWindowFactory.cs
│ │ │ ├── UpdateWindowFactory.cs
│ │ │ ├── WebViewWindow.xaml
│ │ │ ├── WebViewWindow.xaml.cs
│ │ │ ├── WindowFactory.cs
│ │ │ ├── WindowManager.cs
│ │ │ └── WindowPositionHandler.cs
│ │ ├── WindowsNotifyIconManager.cs
│ │ ├── crash_reporter.cfg
│ │ ├── gamecontrollerdb.txt
│ │ ├── license.txt
│ │ └── packages.config
│ ├── Playnite.DesktopApp/
│ │ ├── Api/
│ │ │ └── MainViewAPI.cs
│ │ ├── App.config
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── ControlGalleryView.xaml
│ │ ├── Controls/
│ │ │ ├── AddonsSections/
│ │ │ │ ├── AddonUpdates.xaml
│ │ │ │ ├── AddonUpdates.xaml.cs
│ │ │ │ ├── BrowseAddons.xaml
│ │ │ │ ├── BrowseAddons.xaml.cs
│ │ │ │ ├── InstalledExtensions.xaml
│ │ │ │ ├── InstalledExtensions.xaml.cs
│ │ │ │ ├── InstalledThemes.xaml
│ │ │ │ └── InstalledThemes.xaml.cs
│ │ │ ├── ComboBoxList.cs
│ │ │ ├── ComboBoxListBase.cs
│ │ │ ├── DdItemListSelectionBox.cs
│ │ │ ├── ExpanderEx.cs
│ │ │ ├── FilterEnumSelectionBox.cs
│ │ │ ├── FilterSelectionBox.cs
│ │ │ ├── FilterStringSelectionBox.cs
│ │ │ ├── GameListItem.cs
│ │ │ ├── GameTaskView.xaml
│ │ │ ├── GameTaskView.xaml.cs
│ │ │ ├── GamesGridView.xaml
│ │ │ ├── GamesGridView.xaml.cs
│ │ │ ├── GridViewPanel.cs
│ │ │ ├── LibraryStatistics.xaml
│ │ │ ├── LibraryStatistics.xaml.cs
│ │ │ ├── LongNumericBox.cs
│ │ │ ├── Menus/
│ │ │ │ ├── FilterPresetsMenu.cs
│ │ │ │ ├── GameGroupMenu.cs
│ │ │ │ ├── GameMenu.cs
│ │ │ │ ├── GroupSettingsMenu.cs
│ │ │ │ ├── MainMenu.cs
│ │ │ │ ├── SortSettingsMenu.cs
│ │ │ │ ├── TrayContextMenu.cs
│ │ │ │ ├── ViewSelectionMenu.cs
│ │ │ │ └── ViewSettingsMenu.cs
│ │ │ ├── MetadataDownloadSettings.xaml
│ │ │ ├── MetadataDownloadSettings.xaml.cs
│ │ │ ├── NullableIntBox.cs
│ │ │ ├── NumericDoubleBox.cs
│ │ │ ├── PathSelectionBox.cs
│ │ │ ├── SearchBox.cs
│ │ │ ├── SettingsSections/
│ │ │ │ ├── AppearanceAdvanced.xaml
│ │ │ │ ├── AppearanceAdvanced.xaml.cs
│ │ │ │ ├── AppearanceDetailsView.xaml
│ │ │ │ ├── AppearanceDetailsView.xaml.cs
│ │ │ │ ├── AppearanceGeneral.xaml
│ │ │ │ ├── AppearanceGeneral.xaml.cs
│ │ │ │ ├── AppearanceGridView.xaml
│ │ │ │ ├── AppearanceGridView.xaml.cs
│ │ │ │ ├── AppearanceLayout.xaml
│ │ │ │ ├── AppearanceLayout.xaml.cs
│ │ │ │ ├── AppearanceListView.xaml
│ │ │ │ ├── AppearanceListView.xaml.cs
│ │ │ │ ├── AppearanceTopPanel.xaml
│ │ │ │ ├── AppearanceTopPanel.xaml.cs
│ │ │ │ ├── Backup.xaml
│ │ │ │ ├── Backup.xaml.cs
│ │ │ │ ├── ClientShutdown.xaml
│ │ │ │ ├── ClientShutdown.xaml.cs
│ │ │ │ ├── Development.xaml
│ │ │ │ ├── Development.xaml.cs
│ │ │ │ ├── EmptyParent.xaml
│ │ │ │ ├── EmptyParent.xaml.cs
│ │ │ │ ├── ErrorLoading.xaml
│ │ │ │ ├── ErrorLoading.xaml.cs
│ │ │ │ ├── General.xaml
│ │ │ │ ├── General.xaml.cs
│ │ │ │ ├── GeneralAdvanced.xaml
│ │ │ │ ├── GeneralAdvanced.xaml.cs
│ │ │ │ ├── ImportExlusionList.xaml
│ │ │ │ ├── ImportExlusionList.xaml.cs
│ │ │ │ ├── Input.xaml
│ │ │ │ ├── Input.xaml.cs
│ │ │ │ ├── LibrariesConfigWindowInfo.xaml
│ │ │ │ ├── LibrariesConfigWindowInfo.xaml.cs
│ │ │ │ ├── Metadata.xaml
│ │ │ │ ├── Metadata.xaml.cs
│ │ │ │ ├── NoSettingsAvailable.xaml
│ │ │ │ ├── NoSettingsAvailable.xaml.cs
│ │ │ │ ├── Performance.xaml
│ │ │ │ ├── Performance.xaml.cs
│ │ │ │ ├── Scripting.xaml
│ │ │ │ ├── Scripting.xaml.cs
│ │ │ │ ├── Search.xaml
│ │ │ │ ├── Search.xaml.cs
│ │ │ │ ├── Sorting.xaml
│ │ │ │ ├── Sorting.xaml.cs
│ │ │ │ ├── Updates.xaml
│ │ │ │ └── Updates.xaml.cs
│ │ │ ├── SidebarItem.cs
│ │ │ ├── SliderEx.cs
│ │ │ ├── SliderWithPopup.xaml
│ │ │ ├── SliderWithPopup.xaml.cs
│ │ │ ├── TopPanelItem.cs
│ │ │ └── Views/
│ │ │ ├── BaseGamesView.cs
│ │ │ ├── DetailsViewGameOverview.cs
│ │ │ ├── ExplorerPanel.cs
│ │ │ ├── FilterPanel.cs
│ │ │ ├── GameOverview.cs
│ │ │ ├── GridViewGameOverview.cs
│ │ │ ├── Library.cs
│ │ │ ├── LibraryDetailsView.cs
│ │ │ ├── LibraryGridView.cs
│ │ │ ├── LibraryListView.cs
│ │ │ ├── MainWindow.cs
│ │ │ ├── NotificationPanel.cs
│ │ │ ├── SearchWindow.cs
│ │ │ ├── Sidebar.cs
│ │ │ └── TopPanel.cs
│ │ ├── DesktopActionSelector.cs
│ │ ├── DesktopApplication.cs
│ │ ├── DesktopCollectionView.cs
│ │ ├── DesktopDialogs.cs
│ │ ├── DesktopGamesEditor.cs
│ │ ├── GlobalResources.xaml
│ │ ├── Markups.cs
│ │ ├── Playnite.DesktopApp.csproj
│ │ ├── PluginSettingsHelper.cs
│ │ ├── ProgramEntry.cs
│ │ ├── Properties/
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Resources.Designer.cs
│ │ │ ├── Resources.resx
│ │ │ ├── Settings.Designer.cs
│ │ │ └── Settings.settings
│ │ ├── Resources/
│ │ │ └── contributors.txt
│ │ ├── Themes/
│ │ │ ├── Desktop/
│ │ │ │ └── Default/
│ │ │ │ ├── Common.xaml
│ │ │ │ ├── Constants.xaml
│ │ │ │ ├── CustomControls/
│ │ │ │ │ ├── ComboBoxList.xaml
│ │ │ │ │ ├── ExpanderEx.xaml
│ │ │ │ │ ├── ExtendedDataGrid.xaml
│ │ │ │ │ ├── ExtendedListBox.xaml
│ │ │ │ │ ├── ExtendedListView.xaml
│ │ │ │ │ ├── FilterSelectionBox.xaml
│ │ │ │ │ ├── GameGroupMenu.xaml
│ │ │ │ │ ├── GameMenu.xaml
│ │ │ │ │ ├── HotKeyBox.xaml
│ │ │ │ │ ├── HtmlTextView.xaml
│ │ │ │ │ ├── NumericBoxes.xaml
│ │ │ │ │ ├── PathSelectionBox.xaml
│ │ │ │ │ ├── SearchBox.xaml
│ │ │ │ │ ├── SidebarItem.xaml
│ │ │ │ │ ├── SliderEx.xaml
│ │ │ │ │ ├── TopPanelItem.xaml
│ │ │ │ │ ├── TrayContextMenu.xaml
│ │ │ │ │ └── WindowBase.xaml
│ │ │ │ ├── DefaultControls/
│ │ │ │ │ ├── Border.xaml
│ │ │ │ │ ├── Button.xaml
│ │ │ │ │ ├── CheckBox.xaml
│ │ │ │ │ ├── ComboBox.xaml
│ │ │ │ │ ├── ContextMenu.xaml
│ │ │ │ │ ├── DataGrid.xaml
│ │ │ │ │ ├── DatePicker.xaml
│ │ │ │ │ ├── Expander.xaml
│ │ │ │ │ ├── GridSplitter.xaml
│ │ │ │ │ ├── GroupBox.xaml
│ │ │ │ │ ├── Hyperlink.xaml
│ │ │ │ │ ├── Label.xaml
│ │ │ │ │ ├── ListBox.xaml
│ │ │ │ │ ├── ListView.xaml
│ │ │ │ │ ├── Menu.xaml
│ │ │ │ │ ├── PasswordBox.xaml
│ │ │ │ │ ├── Popup.xaml
│ │ │ │ │ ├── ProgressBar.xaml
│ │ │ │ │ ├── RadioButton.xaml
│ │ │ │ │ ├── RepeatButton.xaml
│ │ │ │ │ ├── RichTextBox.xaml
│ │ │ │ │ ├── ScrollViewer.xaml
│ │ │ │ │ ├── Slider.xaml
│ │ │ │ │ ├── TabControl.xaml
│ │ │ │ │ ├── TextBlock.xaml
│ │ │ │ │ ├── TextBox.xaml
│ │ │ │ │ ├── Thumb.xaml
│ │ │ │ │ ├── ToggleButton.xaml
│ │ │ │ │ ├── ToolTip.xaml
│ │ │ │ │ └── TreeView.xaml
│ │ │ │ ├── DerivedStyles/
│ │ │ │ │ ├── BottomButton.xaml
│ │ │ │ │ ├── DetailsHyperlink.xaml
│ │ │ │ │ ├── DetailsScrollViewer.xaml
│ │ │ │ │ ├── DetailsViewGroupStyle.xaml
│ │ │ │ │ ├── DetailsViewItemStyle.xaml
│ │ │ │ │ ├── DetailsViewItemTemplate.xaml
│ │ │ │ │ ├── GridViewGroupStyle.xaml
│ │ │ │ │ ├── GridViewItemStyle.xaml
│ │ │ │ │ ├── GridViewItemTemplate.xaml
│ │ │ │ │ ├── HighlightBorder.xaml
│ │ │ │ │ ├── ImageHighlightButton.xaml
│ │ │ │ │ ├── ListViewGroupStyle.xaml
│ │ │ │ │ ├── MainWindowStyle.xaml
│ │ │ │ │ ├── NotificationMessage.xaml
│ │ │ │ │ ├── PlayButton.xaml
│ │ │ │ │ ├── PropertyItemButton.xaml
│ │ │ │ │ ├── SimpleButton.xaml
│ │ │ │ │ ├── StandardWindowStyle.xaml
│ │ │ │ │ ├── TextBlockGameScore.xaml
│ │ │ │ │ └── WindowBarButton.xaml
│ │ │ │ ├── DescriptionView.html
│ │ │ │ ├── Media.xaml
│ │ │ │ ├── Views/
│ │ │ │ │ ├── DetailsViewGameOverview.xaml
│ │ │ │ │ ├── ExplorerPanel.xaml
│ │ │ │ │ ├── FilterPanelView.xaml
│ │ │ │ │ ├── GridViewGameOverview.xaml
│ │ │ │ │ ├── Library.xaml
│ │ │ │ │ ├── LibraryDetailsView.xaml
│ │ │ │ │ ├── LibraryGridView.xaml
│ │ │ │ │ ├── LibraryListView.xaml
│ │ │ │ │ ├── MainWindow.xaml
│ │ │ │ │ ├── NotificationPanel.xaml
│ │ │ │ │ ├── SearchView.xaml
│ │ │ │ │ ├── Sidebar.xaml
│ │ │ │ │ └── TopPanel.xaml
│ │ │ │ └── theme.yaml
│ │ │ └── Generic.xaml
│ │ ├── ViewModels/
│ │ │ ├── AboutViewModel.cs
│ │ │ ├── ActionSelectionViewModel.cs
│ │ │ ├── AddonsViewModel.cs
│ │ │ ├── AddonsViewModel_Installed.cs
│ │ │ ├── AddonsViewModel_Online.cs
│ │ │ ├── CategoryConfigViewModel.cs
│ │ │ ├── DatabaseFieldsManagerViewModel.cs
│ │ │ ├── DesignData/
│ │ │ │ └── DesignMainViewModel.cs
│ │ │ ├── DesktopAppViewModel.cs
│ │ │ ├── DesktopAppViewModel_Commands.cs
│ │ │ ├── DesktopAppViewModel_Sidebar.cs
│ │ │ ├── DesktopAppViewModel_TopPanel.cs
│ │ │ ├── EmulatedGamesImportViewModel.cs
│ │ │ ├── EmulatorImportViewModel.cs
│ │ │ ├── EmulatorsViewModel.cs
│ │ │ ├── FirstTimeStartupViewModel.cs
│ │ │ ├── GameDetailsViewModel.cs
│ │ │ ├── GameEditViewModel.cs
│ │ │ ├── GameEditViewModelCommands.cs
│ │ │ ├── GameEditViewModelFieldChecks.cs
│ │ │ ├── GameEditViewModelMetadata.cs
│ │ │ ├── GoogleImageDownloadViewModel.cs
│ │ │ ├── ImageSelectionViewModel.cs
│ │ │ ├── InstalledGamesViewModel.cs
│ │ │ ├── ItemSelectionWithSearchViewModel.cs
│ │ │ ├── LibraryIntegrationsViewModel.cs
│ │ │ ├── MetadataComparisonViewModel.cs
│ │ │ ├── MetadataDownloadViewModel.cs
│ │ │ ├── PluginSettingsViewModel.cs
│ │ │ ├── SettingsViewModel.cs
│ │ │ ├── StatisticsViewModel.cs
│ │ │ └── ToolsConfigViewModel.cs
│ │ ├── Windows/
│ │ │ ├── AboutWindow.xaml
│ │ │ ├── AboutWindow.xaml.cs
│ │ │ ├── ActionSelectionWindow.xaml
│ │ │ ├── ActionSelectionWindow.xaml.cs
│ │ │ ├── AddonsWindow.xaml
│ │ │ ├── AddonsWindow.xaml.cs
│ │ │ ├── CategoryConfigWindow.xaml
│ │ │ ├── CategoryConfigWindow.xaml.cs
│ │ │ ├── ControlGallery.xaml
│ │ │ ├── ControlGallery.xaml.cs
│ │ │ ├── CrashHandlerWindow.xaml
│ │ │ ├── CrashHandlerWindow.xaml.cs
│ │ │ ├── DatabaseFieldsManagerWindow.xaml
│ │ │ ├── DatabaseFieldsManagerWindow.xaml.cs
│ │ │ ├── EmulatedGameImportWindow.xaml
│ │ │ ├── EmulatedGameImportWindow.xaml.cs
│ │ │ ├── EmulatorDownloadWindow.xaml
│ │ │ ├── EmulatorDownloadWindow.xaml.cs
│ │ │ ├── EmulatorImportWindow.xaml
│ │ │ ├── EmulatorImportWindow.xaml.cs
│ │ │ ├── EmulatorsWindow.xaml
│ │ │ ├── EmulatorsWindow.xaml.cs
│ │ │ ├── ExtensionCrashHandlerWindow.xaml
│ │ │ ├── ExtensionCrashHandlerWindow.xaml.cs
│ │ │ ├── FirstTimeStartupWindow.xaml
│ │ │ ├── FirstTimeStartupWindow.xaml.cs
│ │ │ ├── GameEditWindow.xaml
│ │ │ ├── GameEditWindow.xaml.cs
│ │ │ ├── GoogleImageDownloadWindow.xaml
│ │ │ ├── GoogleImageDownloadWindow.xaml.cs
│ │ │ ├── ImageSelectionWindow.xaml
│ │ │ ├── ImageSelectionWindow.xaml.cs
│ │ │ ├── InstalledGamesWindow.xaml
│ │ │ ├── InstalledGamesWindow.xaml.cs
│ │ │ ├── ItemSelectionWithSearchWindow.xaml
│ │ │ ├── ItemSelectionWithSearchWindow.xaml.cs
│ │ │ ├── LibraryIntegrationsWindow.xaml
│ │ │ ├── LibraryIntegrationsWindow.xaml.cs
│ │ │ ├── LicenseAgreementWindow.xaml
│ │ │ ├── LicenseAgreementWindow.xaml.cs
│ │ │ ├── MainWindow.xaml
│ │ │ ├── MainWindow.xaml.cs
│ │ │ ├── MessageBoxWindow.xaml
│ │ │ ├── MessageBoxWindow.xaml.cs
│ │ │ ├── MetadataComparisonWindow.xaml
│ │ │ ├── MetadataComparisonWindow.xaml.cs
│ │ │ ├── MetadataDownloadWindow.xaml
│ │ │ ├── MetadataDownloadWindow.xaml.cs
│ │ │ ├── MultiItemSelectionWindow.xaml
│ │ │ ├── MultiItemSelectionWindow.xaml.cs
│ │ │ ├── PluginSettingsWindow.xaml
│ │ │ ├── PluginSettingsWindow.xaml.cs
│ │ │ ├── ProgressWindow.xaml
│ │ │ ├── ProgressWindow.xaml.cs
│ │ │ ├── RandomGameSelectWindow.xaml
│ │ │ ├── RandomGameSelectWindow.xaml.cs
│ │ │ ├── SearchWindow.xaml
│ │ │ ├── SearchWindow.xaml.cs
│ │ │ ├── SettingsWindow.xaml
│ │ │ ├── SettingsWindow.xaml.cs
│ │ │ ├── SingleItemSelectionWindow.xaml
│ │ │ ├── SingleItemSelectionWindow.xaml.cs
│ │ │ ├── ToolsConfigWindow.xaml
│ │ │ ├── ToolsConfigWindow.xaml.cs
│ │ │ ├── UpdateWindow.xaml
│ │ │ └── UpdateWindow.xaml.cs
│ │ ├── app.manifest
│ │ └── packages.config
│ ├── Playnite.FullscreenApp/
│ │ ├── Api/
│ │ │ └── MainViewAPI.cs
│ │ ├── App.config
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Commands/
│ │ │ └── GlobalCommands.cs
│ │ ├── ControlGalleryView.xaml
│ │ ├── Controls/
│ │ │ ├── ButtonEx.cs
│ │ │ ├── CheckBoxEx.cs
│ │ │ ├── ComboBoxEx.cs
│ │ │ ├── FilterDbItemtSelection.cs
│ │ │ ├── FilterEnumListSelection.cs
│ │ │ ├── FilterPresetSelector.cs
│ │ │ ├── FilterStringListSelection.cs
│ │ │ ├── FullscreenTilePanel.cs
│ │ │ ├── GameListItem.cs
│ │ │ ├── ItemsControlEx.cs
│ │ │ ├── ListBoxEx.cs
│ │ │ ├── ScrollViewerEx.cs
│ │ │ ├── SettingsSections/
│ │ │ │ ├── Audio.xaml
│ │ │ │ ├── Audio.xaml.cs
│ │ │ │ ├── General.xaml
│ │ │ │ ├── General.xaml.cs
│ │ │ │ ├── Input.xaml
│ │ │ │ ├── Input.xaml.cs
│ │ │ │ ├── Layout.xaml
│ │ │ │ ├── Layout.xaml.cs
│ │ │ │ ├── Menus.xaml
│ │ │ │ ├── Menus.xaml.cs
│ │ │ │ ├── SettingsSectionControl.cs
│ │ │ │ ├── Visuals.xaml
│ │ │ │ └── Visuals.xaml.cs
│ │ │ ├── SliderEx.cs
│ │ │ ├── ToggleButtonEx.cs
│ │ │ └── Views/
│ │ │ ├── Filters.cs
│ │ │ ├── FiltersAdditional.cs
│ │ │ ├── GameDetails.cs
│ │ │ ├── GameStatus.cs
│ │ │ └── Main.cs
│ │ ├── FullscreenActionSelector.cs
│ │ ├── FullscreenApplication.cs
│ │ ├── FullscreenCollectionView.cs
│ │ ├── FullscreenDialogs.cs
│ │ ├── GlobalResources.xaml
│ │ ├── HiddenStyles.xaml
│ │ ├── Markup/
│ │ │ └── Markups.cs
│ │ ├── Playnite.FullscreenApp.csproj
│ │ ├── ProgramEntry.cs
│ │ ├── Properties/
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Resources.Designer.cs
│ │ │ ├── Resources.resx
│ │ │ ├── Settings.Designer.cs
│ │ │ └── Settings.settings
│ │ ├── Themes/
│ │ │ ├── Fullscreen/
│ │ │ │ └── Default/
│ │ │ │ ├── Constants.xaml
│ │ │ │ ├── CustomControls/
│ │ │ │ │ ├── FilterDbItemtSelection.xaml
│ │ │ │ │ ├── FilterEnumListSelection.xaml
│ │ │ │ │ ├── FilterPresetSelector.xaml
│ │ │ │ │ └── FilterStringListSelection.xaml
│ │ │ │ ├── DefaultControls/
│ │ │ │ │ ├── Button.xaml
│ │ │ │ │ ├── CheckBox.xaml
│ │ │ │ │ ├── ComboBox.xaml
│ │ │ │ │ ├── ProgressBar.xaml
│ │ │ │ │ ├── ScrollViewer.xaml
│ │ │ │ │ ├── Slider.xaml
│ │ │ │ │ ├── TextBox.xaml
│ │ │ │ │ ├── ToggleButton.xaml
│ │ │ │ │ └── ToolTip.xaml
│ │ │ │ ├── DerivedStyles/
│ │ │ │ │ ├── ButtonBottomMenu.xaml
│ │ │ │ │ ├── ButtonTopMenu.xaml
│ │ │ │ │ ├── ListGameItemStyle.xaml
│ │ │ │ │ └── ListGameItemTemplate.xaml
│ │ │ │ ├── DescriptionView.html
│ │ │ │ ├── Images/
│ │ │ │ │ └── ButtonPrompts/
│ │ │ │ │ ├── PlayStation/
│ │ │ │ │ │ └── PlayStation.xaml
│ │ │ │ │ └── Xbox/
│ │ │ │ │ └── Xbox.xaml
│ │ │ │ ├── Media.xaml
│ │ │ │ ├── Views/
│ │ │ │ │ ├── CustomMenus.xaml
│ │ │ │ │ ├── FiltersAdditional.xaml
│ │ │ │ │ ├── FiltersView.xaml
│ │ │ │ │ ├── GameDetails.xaml
│ │ │ │ │ ├── GameMenu.xaml
│ │ │ │ │ ├── GameStatus.xaml
│ │ │ │ │ ├── HelpMenu.xaml
│ │ │ │ │ ├── ItemSelection.xaml
│ │ │ │ │ ├── Main.xaml
│ │ │ │ │ ├── MainMenu.xaml
│ │ │ │ │ ├── MessageBox.xaml
│ │ │ │ │ ├── NotificationsMenu.xaml
│ │ │ │ │ ├── SettingsMenus.xaml
│ │ │ │ │ └── TextInput.xaml
│ │ │ │ └── theme.yaml
│ │ │ └── Generic.xaml
│ │ ├── ViewModels/
│ │ │ ├── AddonsViewModel.cs
│ │ │ ├── DesignData/
│ │ │ │ └── DesignMainViewModel.cs
│ │ │ ├── ExtensionsMenuViewModels.cs
│ │ │ ├── FullscreenAppViewModel.cs
│ │ │ ├── FullscreenAppViewModel_Commands.cs
│ │ │ ├── GameClientsMenuViewModel.cs
│ │ │ ├── GameDetailsViewModel.cs
│ │ │ ├── GameMenuViewModel.cs
│ │ │ ├── GameStatusViewModel.cs
│ │ │ ├── HelpMenuViewModel.cs
│ │ │ ├── MainMenuViewModel.cs
│ │ │ ├── NotificationsViewModel.cs
│ │ │ ├── SettingsViewModel.cs
│ │ │ └── SoftwareToolsMenuViewModel.cs
│ │ ├── Windows/
│ │ │ ├── AddonsUpdateWindow.xaml
│ │ │ ├── AddonsUpdateWindow.xaml.cs
│ │ │ ├── CrashWindow.xaml
│ │ │ ├── CrashWindow.xaml.cs
│ │ │ ├── ExtensionCrashWindow.xaml
│ │ │ ├── ExtensionCrashWindow.xaml.cs
│ │ │ ├── ExtensionsMenuWindow.xaml
│ │ │ ├── ExtensionsMenuWindow.xaml.cs
│ │ │ ├── GameClientsMenuWindow.xaml
│ │ │ ├── GameClientsMenuWindow.xaml.cs
│ │ │ ├── GameMenuWindow.xaml
│ │ │ ├── GameMenuWindow.xaml.cs
│ │ │ ├── HelpMenuWindow.xaml
│ │ │ ├── HelpMenuWindow.xaml.cs
│ │ │ ├── LicenseAgreementWindow.xaml
│ │ │ ├── LicenseAgreementWindow.xaml.cs
│ │ │ ├── MainMenuWindow.xaml
│ │ │ ├── MainMenuWindow.xaml.cs
│ │ │ ├── MainWindow.xaml
│ │ │ ├── MainWindow.xaml.cs
│ │ │ ├── MessageBoxWindow.xaml
│ │ │ ├── MessageBoxWindow.xaml.cs
│ │ │ ├── MultiItemSelectionWindow.xaml
│ │ │ ├── MultiItemSelectionWindow.xaml.cs
│ │ │ ├── NotificationsWindow.xaml
│ │ │ ├── NotificationsWindow.xaml.cs
│ │ │ ├── ProgressWindow.xaml
│ │ │ ├── ProgressWindow.xaml.cs
│ │ │ ├── RandomGameSelectWindow.xaml
│ │ │ ├── RandomGameSelectWindow.xaml.cs
│ │ │ ├── SettingsWindow.xaml
│ │ │ ├── SettingsWindow.xaml.cs
│ │ │ ├── SingleItemSelectionWindow.xaml
│ │ │ ├── SingleItemSelectionWindow.xaml.cs
│ │ │ ├── SoftwareToolsMenuWindow.xaml
│ │ │ ├── SoftwareToolsMenuWindow.xaml.cs
│ │ │ ├── TextInputWindow.xaml
│ │ │ ├── TextInputWindow.xaml.cs
│ │ │ ├── UpdateWindow.xaml
│ │ │ ├── UpdateWindow.xaml.cs
│ │ │ └── WindowTools.cs
│ │ ├── app.manifest
│ │ └── packages.config
│ ├── Playnite.sln
│ ├── PlayniteSDK/
│ │ ├── ApplicationMode.cs
│ │ ├── BuiltInExtensions.cs
│ │ ├── Collections/
│ │ │ ├── ComparableList.cs
│ │ │ ├── ObservableConcurrentDictionary.cs
│ │ │ ├── ObservableObject.cs
│ │ │ └── RangeObservableCollection.cs
│ │ ├── Controls/
│ │ │ └── PluginUserControl.cs
│ │ ├── Data/
│ │ │ ├── DataSerialization.cs
│ │ │ ├── MarkupConverter.cs
│ │ │ └── SQLite.cs
│ │ ├── Database/
│ │ │ ├── IGameDatabase.cs
│ │ │ ├── IGameDatabaseAPI.cs
│ │ │ └── IItemCollection.cs
│ │ ├── Events/
│ │ │ ├── ApplicationEvents.cs
│ │ │ ├── PlayniteUriEventArgs.cs
│ │ │ └── WebViewEvents.cs
│ │ ├── Exceptions/
│ │ │ ├── LocalizedException.cs
│ │ │ ├── ReferenceException.cs
│ │ │ ├── ScriptRuntimeException.cs
│ │ │ └── TypeMismatchException.cs
│ │ ├── ExpandableVariables.cs
│ │ ├── ExtensionFunction.cs
│ │ ├── Extensions/
│ │ │ ├── ListExtensions.cs
│ │ │ └── StringExtensions.cs
│ │ ├── IAddons.cs
│ │ ├── IDialogsFactory.cs
│ │ ├── IEmulationAPI.cs
│ │ ├── ILogger.cs
│ │ ├── IMainViewAPI.cs
│ │ ├── INotificationsAPI.cs
│ │ ├── IPlayniteAPI.cs
│ │ ├── IPlayniteInfoAPI.cs
│ │ ├── IPlaynitePathsAPI.cs
│ │ ├── IPlayniteSettingsAPI.cs
│ │ ├── ISettings.cs
│ │ ├── IUriHandlerAPI.cs
│ │ ├── IWebView.cs
│ │ ├── LibraryClient.cs
│ │ ├── LogManager.cs
│ │ ├── MetadataProvider.cs
│ │ ├── Models/
│ │ │ ├── AgeRating.cs
│ │ │ ├── AgeRatingOrg.cs
│ │ │ ├── AppSoftware.cs
│ │ │ ├── Category.cs
│ │ │ ├── Company.cs
│ │ │ ├── CompletionStatus.cs
│ │ │ ├── DatabaseObject.cs
│ │ │ ├── Emulator.cs
│ │ │ ├── FilterPreset.cs
│ │ │ ├── Game.cs
│ │ │ ├── GameAction.cs
│ │ │ ├── GameFeature.cs
│ │ │ ├── GameMetadata.cs
│ │ │ ├── GameRom.cs
│ │ │ ├── GameScannerConfig.cs
│ │ │ ├── GameSource.cs
│ │ │ ├── Genre.cs
│ │ │ ├── IIdentifiable.cs
│ │ │ ├── ImportExclusionList.cs
│ │ │ ├── InstallSizeGroup.cs
│ │ │ ├── InstallationStatus.cs
│ │ │ ├── Link.cs
│ │ │ ├── PastTimeSegment.cs
│ │ │ ├── Platform.cs
│ │ │ ├── PlaytimeCategory.cs
│ │ │ ├── Region.cs
│ │ │ ├── ReleaseDate.cs
│ │ │ ├── ScoreGroup.cs
│ │ │ ├── Series.cs
│ │ │ └── Tag.cs
│ │ ├── Playnite.SDK.csproj
│ │ ├── Plugins/
│ │ │ ├── Actions.cs
│ │ │ ├── LibraryPlugin.cs
│ │ │ ├── MenuEntry.cs
│ │ │ ├── MetadataPlugin.cs
│ │ │ ├── Plugin.cs
│ │ │ ├── Search.cs
│ │ │ ├── SidebarItem.cs
│ │ │ └── TopPanelItem.cs
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── RelayCommand.cs
│ │ ├── ResourceProvider.cs
│ │ ├── SdkVersions.cs
│ │ ├── WebViewModels.cs
│ │ └── readme.md
│ ├── Tests/
│ │ ├── Playnite.DesktopApp.Tests/
│ │ │ ├── GamesEditorTests.cs
│ │ │ ├── MainViewAPITests.cs
│ │ │ ├── Playnite.DesktopApp.Tests.csproj
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── SkinsTests.cs
│ │ │ ├── TestsSetupClass.cs
│ │ │ ├── ViewModels/
│ │ │ │ ├── DatabaseFieldsManagerViewModelTests.cs
│ │ │ │ └── GameEditViewModelTests.cs
│ │ │ ├── app.config
│ │ │ └── packages.config
│ │ ├── Playnite.FullscreenApp.Tests/
│ │ │ ├── Controls/
│ │ │ │ └── FullscreenTilePanelTests.cs
│ │ │ ├── Playnite.FullscreenApp.Tests.csproj
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── app.config
│ │ │ └── packages.config
│ │ ├── Playnite.Tests/
│ │ │ ├── Api/
│ │ │ │ └── PluginDescriptionTests.cs
│ │ │ ├── App/
│ │ │ │ └── UpdateTests.cs
│ │ │ ├── App.config
│ │ │ ├── ArchiveTests.cs
│ │ │ ├── BackupTests.cs
│ │ │ ├── CloneObjectTests.cs
│ │ │ ├── Converters/
│ │ │ │ └── PlayTimeToStringConverterTests.cs
│ │ │ ├── CueSheetTests.cs
│ │ │ ├── Database/
│ │ │ │ ├── EmulatorsCollectionTests.cs
│ │ │ │ ├── FiltersDatabaseTests.cs
│ │ │ │ ├── GameDatabaseFileTests.cs
│ │ │ │ ├── GameDatabaseMigrationTests.cs
│ │ │ │ ├── GameDatabasePlatformsTests.cs
│ │ │ │ ├── GameDatabaseTests.cs
│ │ │ │ ├── GameLibraryFilterTests.cs
│ │ │ │ ├── GameLibraryTests.cs
│ │ │ │ └── ItemCollectionTests.cs
│ │ │ ├── DictionaryTests.cs
│ │ │ ├── Emulators/
│ │ │ │ ├── EmulationDatabaseTests.cs
│ │ │ │ ├── EmulationTests.cs
│ │ │ │ ├── EmulatorDefinitionTests.cs
│ │ │ │ ├── EmulatorScannerTests.cs
│ │ │ │ ├── ScannedGameTests.cs
│ │ │ │ └── ScannerTests.cs
│ │ │ ├── ExtensionFactoryTests.cs
│ │ │ ├── Extensions/
│ │ │ │ ├── BitmapExtensionsTests.cs
│ │ │ │ ├── DateTimesTests.cs
│ │ │ │ ├── EnumsTests.cs
│ │ │ │ ├── NetExtensionsTests.cs
│ │ │ │ ├── ObjectExtensionsTests.cs
│ │ │ │ └── StringExtensionsTests.cs
│ │ │ ├── FileSystemTests.cs
│ │ │ ├── GameFieldComparerTests.cs
│ │ │ ├── GamesEditorTests.cs
│ │ │ ├── GamesStatsTests.cs
│ │ │ ├── ImageSourceManagerTests.cs
│ │ │ ├── ImagesTests.cs
│ │ │ ├── IniParserTests.cs
│ │ │ ├── InstallSizeScanTests.cs
│ │ │ ├── ListExtensionsTests.cs
│ │ │ ├── LocalizationTests.cs
│ │ │ ├── M3UTests.cs
│ │ │ ├── Manifests/
│ │ │ │ └── AddonManifestTests.cs
│ │ │ ├── Metadata/
│ │ │ │ └── MetadataDownloaderDownloadTests.cs
│ │ │ ├── Models/
│ │ │ │ ├── CopyDiffToTest.cs
│ │ │ │ ├── DatabaseObjectTests.cs
│ │ │ │ ├── GameActionTests.cs
│ │ │ │ ├── GameTests.cs
│ │ │ │ └── MetadataPropertyTests.cs
│ │ │ ├── PathsTests.cs
│ │ │ ├── Playnite.Tests.csproj
│ │ │ ├── PlayniteUriHandlerTests.cs
│ │ │ ├── Plugins/
│ │ │ │ └── ExtensionManifestTests.cs
│ │ │ ├── ProcessStarterTests.cs
│ │ │ ├── ProgramsTests.cs
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── ReleaseDateTests.cs
│ │ │ ├── Resources/
│ │ │ │ ├── GOG/
│ │ │ │ │ └── library_unreleased.json
│ │ │ │ ├── Serialization/
│ │ │ │ │ ├── invalid.json
│ │ │ │ │ ├── invalid.toml
│ │ │ │ │ ├── invalid.yaml
│ │ │ │ │ ├── valid.json
│ │ │ │ │ ├── valid.toml
│ │ │ │ │ └── valid.yaml
│ │ │ │ ├── SizeScan/
│ │ │ │ │ ├── CueNonExistingFiles.cue
│ │ │ │ │ └── CueTestFiles.cue
│ │ │ │ ├── TestIni.ini
│ │ │ │ ├── TestIni.md5
│ │ │ │ ├── TestIni.sfv
│ │ │ │ ├── TestUpdateManifest.json
│ │ │ │ ├── XmlTest/
│ │ │ │ │ ├── Xml1.xaml
│ │ │ │ │ ├── Xml2.xaml
│ │ │ │ │ ├── Xml3.xaml
│ │ │ │ │ └── Xml4.xaml
│ │ │ │ └── test.m3u
│ │ │ ├── SafeFileEnumeratorTests.cs
│ │ │ ├── Scripting/
│ │ │ │ └── PowerShell/
│ │ │ │ └── PowerShellTests.cs
│ │ │ ├── SearchViewModelTests.cs
│ │ │ ├── SelectableDbItemListTests.cs
│ │ │ ├── SerializationTests.cs
│ │ │ ├── Settings/
│ │ │ │ └── FilterSettingsTests.cs
│ │ │ ├── SettingsTests.cs
│ │ │ ├── SigningToolsTests.cs
│ │ │ ├── SizesTests.cs
│ │ │ ├── SortableNameConverterTests.cs
│ │ │ ├── StringExtensionsTests.cs
│ │ │ ├── System/
│ │ │ │ ├── ComputerTests.cs
│ │ │ │ └── ProcessExtensionsTests.cs
│ │ │ ├── TimerTests.cs
│ │ │ ├── Web/
│ │ │ │ └── HttpDownloaderTests.cs
│ │ │ ├── XmlTests.cs
│ │ │ ├── _TestTools/
│ │ │ │ ├── GameDbTestWrapper.cs
│ │ │ │ ├── MockDialogsFactory.cs
│ │ │ │ ├── MockWindowFactory.cs
│ │ │ │ ├── PlayniteTests.cs
│ │ │ │ ├── TestAppTools.cs
│ │ │ │ ├── TestDateTimes.cs
│ │ │ │ ├── TestEmulationDatabase.cs
│ │ │ │ ├── TestPlayniteApplication.cs
│ │ │ │ ├── TestResourceProvider.cs
│ │ │ │ └── TestsSetupClass.cs
│ │ │ └── packages.config
│ │ ├── Playnite.Toolbox.Tests/
│ │ │ ├── ExtensionsTests.cs
│ │ │ ├── PathsTests.cs
│ │ │ ├── Playnite.Toolbox.Tests.csproj
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── Resources/
│ │ │ │ └── Changelog/
│ │ │ │ ├── 1.1.0-1.2.0.txt
│ │ │ │ ├── 1.2.0-1.3.0.txt
│ │ │ │ └── 1.3.0-1.4.0.txt
│ │ │ ├── ThemesTests.cs
│ │ │ ├── app.config
│ │ │ └── packages.config
│ │ ├── TestApp/
│ │ │ ├── App.config
│ │ │ ├── Properties/
│ │ │ │ ├── AssemblyInfo.cs
│ │ │ │ ├── Resources.Designer.cs
│ │ │ │ ├── Resources.resx
│ │ │ │ ├── Settings.Designer.cs
│ │ │ │ └── Settings.settings
│ │ │ ├── TestApp.cs
│ │ │ ├── TestApp.csproj
│ │ │ ├── TestAppProcInfo.cs
│ │ │ ├── app.manifest
│ │ │ └── packages.config
│ │ ├── TestGameLibrary/
│ │ │ ├── BuildCopyExclude.txt
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── Resources/
│ │ │ │ └── icon.tga
│ │ │ ├── TestGameLibrary.cs
│ │ │ ├── TestGameLibrary.csproj
│ │ │ └── extension.yaml
│ │ ├── TestMetadataPlugin/
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── TestMetadataPlugin.cs
│ │ │ ├── TestMetadataPlugin.csproj
│ │ │ └── extension.yaml
│ │ └── TestPlugin/
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── TestPlugin.cs
│ │ ├── TestPlugin.csproj
│ │ ├── TestPluginSettings.cs
│ │ ├── TestPluginSettingsView.xaml
│ │ ├── TestPluginSettingsView.xaml.cs
│ │ ├── TestPluginUserControl.xaml
│ │ ├── TestPluginUserControl.xaml.cs
│ │ └── extension.yaml
│ └── Tools/
│ ├── Playnite.Toolbox/
│ │ ├── App.config
│ │ ├── CmdLineOptions.cs
│ │ ├── Extensions.cs
│ │ ├── NLog.config
│ │ ├── Paths.cs
│ │ ├── Playnite.Toolbox.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── Strings.cs
│ │ ├── Templates/
│ │ │ ├── Extensions/
│ │ │ │ ├── CustomLibraryPlugin/
│ │ │ │ │ ├── App.xaml
│ │ │ │ │ ├── BuildInclude.txt
│ │ │ │ │ ├── CustomLibraryPlugin.csproj
│ │ │ │ │ ├── CustomLibraryPlugin.sln
│ │ │ │ │ ├── Localization/
│ │ │ │ │ │ └── en_US.xaml
│ │ │ │ │ ├── Properties/
│ │ │ │ │ │ └── AssemblyInfo.cs
│ │ │ │ │ ├── _name_.cs
│ │ │ │ │ ├── _name_Client.cs
│ │ │ │ │ ├── _name_Settings.cs
│ │ │ │ │ ├── _name_SettingsView.xaml
│ │ │ │ │ ├── _name_SettingsView.xaml.cs
│ │ │ │ │ ├── extension.yaml
│ │ │ │ │ └── packages.config
│ │ │ │ ├── CustomMetadataPlugin/
│ │ │ │ │ ├── App.xaml
│ │ │ │ │ ├── BuildInclude.txt
│ │ │ │ │ ├── CustomMetadataPlugin.csproj
│ │ │ │ │ ├── CustomMetadataPlugin.sln
│ │ │ │ │ ├── Localization/
│ │ │ │ │ │ └── en_US.xaml
│ │ │ │ │ ├── Properties/
│ │ │ │ │ │ └── AssemblyInfo.cs
│ │ │ │ │ ├── _name_.cs
│ │ │ │ │ ├── _name_Provider.cs
│ │ │ │ │ ├── _name_Settings.cs
│ │ │ │ │ ├── _name_SettingsView.xaml
│ │ │ │ │ ├── _name_SettingsView.xaml.cs
│ │ │ │ │ ├── extension.yaml
│ │ │ │ │ └── packages.config
│ │ │ │ ├── GenericPlugin/
│ │ │ │ │ ├── App.xaml
│ │ │ │ │ ├── BuildInclude.txt
│ │ │ │ │ ├── GenericPlugin.csproj
│ │ │ │ │ ├── GenericPlugin.sln
│ │ │ │ │ ├── Localization/
│ │ │ │ │ │ └── en_US.xaml
│ │ │ │ │ ├── Properties/
│ │ │ │ │ │ └── AssemblyInfo.cs
│ │ │ │ │ ├── _name_.cs
│ │ │ │ │ ├── _name_Settings.cs
│ │ │ │ │ ├── _name_SettingsView.xaml
│ │ │ │ │ ├── _name_SettingsView.xaml.cs
│ │ │ │ │ ├── extension.yaml
│ │ │ │ │ └── packages.config
│ │ │ │ └── PowerShellScript/
│ │ │ │ ├── BuildInclude.txt
│ │ │ │ ├── PowerShellScript.psm1
│ │ │ │ └── extension.yaml
│ │ │ └── Themes/
│ │ │ ├── Changelog/
│ │ │ │ ├── 1.0.0-1.1.0.txt
│ │ │ │ ├── 1.1.0-1.2.0.txt
│ │ │ │ ├── 1.2.0-1.3.0.txt
│ │ │ │ ├── 1.3.0-1.4.0.txt
│ │ │ │ ├── 1.4.0-1.4.1.txt
│ │ │ │ ├── 1.4.1-1.5.0.txt
│ │ │ │ ├── 1.5.0-1.6.0.txt
│ │ │ │ ├── 1.6.0-1.7.0.txt
│ │ │ │ ├── 1.7.0-1.8.0.txt
│ │ │ │ ├── 1.8.0-1.9.0.txt
│ │ │ │ ├── 1.9.0-2.0.0.txt
│ │ │ │ ├── 2.0.0-2.1.0.txt
│ │ │ │ ├── 2.1.0-2.2.0.txt
│ │ │ │ ├── 2.2.0-2.3.0.txt
│ │ │ │ ├── 2.3.0-2.4.0.txt
│ │ │ │ ├── 2.4.0-2.5.0.txt
│ │ │ │ ├── 2.5.0-2.6.0.txt
│ │ │ │ ├── 2.7.0-2.8.0.txt
│ │ │ │ └── 2.8.0-2.9.0.txt
│ │ │ ├── Desktop/
│ │ │ │ ├── Theme.csproj
│ │ │ │ └── Theme.sln
│ │ │ └── Fullscreen/
│ │ │ ├── Theme.csproj
│ │ │ └── Theme.sln
│ │ ├── Themes.cs
│ │ ├── Verify.cs
│ │ └── packages.config
│ ├── Playnite.Utilities/
│ │ ├── App.config
│ │ ├── DatParser.cs
│ │ ├── Playnite.Utilities.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ └── packages.config
│ └── PlayniteInstaller/
│ ├── App.config
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── Classic.xaml
│ ├── Converters.cs
│ ├── Logger.cs
│ ├── MainViewModel.cs
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ ├── PlayniteInstaller.csproj
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ ├── Resources.Designer.cs
│ │ ├── Resources.resx
│ │ ├── Settings.Designer.cs
│ │ └── Settings.settings
│ ├── app.manifest
│ └── installer_mirrors.txt
└── tests/
├── Extensions/
│ ├── Plugins/
│ │ ├── FullTestPluginDev/
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── TestPluginDev.cs
│ │ │ ├── TestPluginDev.csproj
│ │ │ ├── TestPluginDev.sln
│ │ │ └── packages.config
│ │ ├── FullTestPluginNuget/
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── TestPluginNuget.cs
│ │ │ ├── TestPluginNuget.csproj
│ │ │ ├── TestPluginNuget.sln
│ │ │ └── packages.config
│ │ └── LibraryExporter/
│ │ ├── LibraryExporter.psm1
│ │ └── plugin.info
│ └── Scripts/
│ ├── FullPowerShellScript.ps1
│ └── FullPythonScript.py
├── Mapping/
│ ├── AboutWindow.ps1
│ ├── CategoryConfigWindow.ps1
│ ├── CrashHandlerWindow.ps1
│ ├── FirstTimeWizardWindow.ps1
│ ├── GameEditWindow.ps1
│ ├── InstalledGamesWindow.ps1
│ ├── MainWindow.ps1
│ ├── MetadataLookupWindow.ps1
│ ├── NotificationsWindow.ps1
│ ├── OpenFileWindow.ps1
│ ├── SettingsWindow.ps1
│ ├── SetupUninstallWindow.ps1
│ ├── SetupWindow.ps1
│ └── SystemDialog.ps1
├── PlayniteCommon.ps1
├── RunTests.ps1
├── Setup/
│ └── Setup.Tests.ps1
├── TestConfig.Template.yaml
├── TestExtensions.ps1
└── UI/
├── CustomGames.Tests.ps1
├── FirstTimeWizard.Tests.ps1
├── GameEditWindow.Tests.ps1
├── InstalledGamesImport.Tests.ps1
└── Startup.Tests.ps1
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
patreon: playnite
ko_fi: playnite
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug report
description: Create a report to help us improve
labels: ['bug']
body:
- type: markdown
attributes:
value: |
**Before creating bug report:**
- Please post in English language only!
- Please use issue search in the repository first. If the bug is something really obvious there's a high change it was already reported.
- Make sure that the issue is not caused by custom theme or extension. You can restart Playnite in "safe mode" from help menu to quickly test it.
- Check list of known issues https://github.com/JosefNemec/Playnite/wiki/Known-Issues
**Integration issues**
If an issue is related to library integrations, use separate [extensions repository](https://github.com/JosefNemec/PlayniteExtensions) to file a report.
- type: textarea
attributes:
label: Bug Description
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
attributes:
label: To Reproduce
description: If it''s not clear from the description how to reproduce the issue please add clear steps to reproduce the behavior.
validations:
required: false
- type: input
attributes:
label: Diagnostics ID
description: 'Please generate diagnostics package from "About Playnite" menu and attach identifier you received. If the issue is a crash bug, you can generate diag. package directly from crash dialog.'
validations:
required: true
- type: textarea
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain your problem.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Playnite Discord server
url: https://playnite.link/discord
about: Official Discord server for general chat and support with Playnite.
- name: Playnite SDK documentation
url: https://playnite.link/docs/
about: Useful documentation when creating plugins and themes.
================================================
FILE: .github/ISSUE_TEMPLATE/custom.md
================================================
## Use [issue templates](https://github.com/JosefNemec/Playnite/issues/new/choose) instead!
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request
description: Suggest an idea for this project
labels: ['enhancement']
body:
- type: markdown
attributes:
value: |
Please post in English language only!
**Integration features**
If a feature request is related to library integrations, use separate [extensions repository](https://github.com/JosefNemec/PlayniteExtensions) to file a request.
**Check for existing issue**
Please use issue search in the repository if your feature request is something really obvious there's a high change it was already requested.
- type: textarea
attributes:
label: Feature description
description: A clear and concise description of feature you want to be added.
validations:
required: true
- type: textarea
attributes:
label: Screenshots
description: If applicable, add screenshots to help explain requested changes.
validations:
required: false
================================================
FILE: .github/pull_request_template.md
================================================
Pull requests are generally on pause because majority of code base is being rewritten for Playnite 11.
Smaller "safe" changes for P10 might get accepted based on what they and if they come with test coverage. If you plan to work on bigger changes, please discuss it first in related issue or on Discord, thank you.
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
[Originals]/
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
project.fragment.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Visual Studio Code stuff
.vscode/
build/nuget.exe
build/PlayniteSetup.exe
build/PlaynitePortable.zip
build/TestPackage/*
build/PlayniteServices/*
build/ReleaseSDK/*
build/DebugSDK/*
build/Playnite.zip
tests/TestConfig.yaml
# Don't share API keys with anyone :)
source/PlayniteServices/customSettings.json
source/PlayniteServices/patreonTokens.json
source/PlayniteServices/twitchTokens.json
# Not redistributable
XBOXONE.ttf
PlayStation4.ttf
source/Playnite.FullscreenApp/Themes/Fullscreen/Default/audio/*
================================================
FILE: LICENSE.md
================================================
MIT License
Copyright (c) 2020 Josef Nemec
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
#
Playnite [](https://crowdin.com/project/playnite)
An open source video game library manager and launcher with support for 3rd party libraries like Steam, Epic, GOG, EA App, Battle.net and [others](https://playnite.link/addons.html). Includes game emulation support, providing one unified interface for your games.
Screenshots are available at the [Homepage](http://playnite.link/)
*If you find Playnite useful please consider supporting the lead developer [Josef Nemec](https://github.com/JosefNemec) on [Patreon](https://www.patreon.com/playnite).*
Features
---------
See the [Homepage](http://playnite.link/) for the list of features.
Download
---------
Grab the latest installer or portable package from the [download](https://playnite.link/download.html) page. Playnite will automatically notify you about a new version upon release.
Requirements: Windows 10 or 11
FAQ, Known Issues, user manual
---------
Can be found [here](https://api.playnite.link/docs/)
Questions, issues etc.
---------
If you find a bug please file an [issue](https://github.com/JosefNemec/Playnite/issues) and if relevant (crashes, broken features) please attach a diagnostics package, which can be created from inside the "About Playnite..." submenu.
Biggest community around Playnite currently gathers on our [Discord server](https://playnite.link/discord) and [Reddit](https://www.reddit.com/r/playnite/).
Privacy Statement
---------
Playnite itself doesn't store any user information and you generally don't need to provide any information to import installed games. All game library data is stored locally on your PC.
Account connection process depends on how a library plugin is implemented, but is usually done via official login web forms and only the web session cookies or tokens are stored, the same way when you login to those services via the web browser.
Add-ons
---------
Playnite can be extended with plugins (written in .NET languages), PowerShell scripts and user interface themes.
See the [extensions portal](https://api.playnite.link/docs/tutorials/index.html) for more information about how to make these addons.
Translations
---------
We use Crowdin to manage localization, please join our project if you want to submit translations:
https://crowdin.com/project/playnite
Proofreading changes to original English strings can be submitted by creating pull request for [LocSource.xaml](https://github.com/JosefNemec/Playnite/blob/devel/source/Playnite/Localization/LocSource.xaml) file.
Code Contributions
---------
Pull requests are generally on pause because majority of code base is being rewritten for Playnite 11. Smaller "safe" changes for P10 might get accepted based on what they and if they come with test coverage. If you plan to work on bigger changes, please discuss it first in related issue or on Discord, thank you.
Please ask in the related issue first before starting implementing something to make sure that nobody else is already working on it. If an issue doesn't exist for your feature/bug fix, create one first.
Regarding code styling, there are only a few major rules:
- private fields and properties should use camelCase (without underscore)
- all methods (private and public) should use PascalCase
- use spaces instead of tabs with 4 spaces width
- add empty line between code block end `}` and additional expression
- always encapsulate the code body after *if, for, foreach, while* etc. with curly braces:
```csharp
if (true)
{
DoSomething();
}
DoSomethingElse();
```
instead of
```csharp
if (true)
DoSomething();
DoSomethingElse();
```
Branches
---------
* `master` - default branch representing state of currently released build.
* `devel` - development branch containing latest changes. All pull requests should be made against `devel` branch.
* `devel*` - development branches for specific features/versions.
Roadmap
---------
Playnite is currently being rewritten from scratch for next major version release 11. The work is being done in private repository until beta release, after which the code will be release in this repository under the same license as current version 10 release. There is no list of planned changes and new features for version 11.
Development
---------
See the [wiki](https://github.com/JosefNemec/Playnite/wiki/Building) for info about building and setting up the development environment.
Others
---------
.NET development tools courtesy of [JetBrains](https://www.jetbrains.com/?from=Playnite)
[](https://www.jetbrains.com/?from=Playnite)
This program uses free code signing provided by [SignPath.io](https://signpath.io?utm_source=foundation&utm_medium=github&utm_campaign=playnite), and a free code signing certificate by the [SignPath Foundation](https://signpath.org?utm_source=foundation&utm_medium=github&utm_campaign=playnite)
[](https://about.signpath.io?utm_source=foundation&utm_medium=github&utm_campaign=playnite)
================================================
FILE: appveyor.yml
================================================
version: '{branch}_{build}'
pull_requests:
do_not_increment_build_number: true
branches:
only:
- master
skip_non_tags: true
image: Visual Studio 2019
shallow_clone: true
environment:
LicensedDependenciesUrl:
secure: ZTSg1DK6QAtwZoCBUDQ94cIaMCKWgSeJMI0dCpVJBPE40+UqG9MNu+UJjjGWjvVa
OnlineInstallerConfig: https://playnite.link/build/installer_mirrors.txt
build_script:
- pwsh: .\build\build.ps1 -Package -SdkNuget -LicensedDependenciesUrl $env:LicensedDependenciesUrl -OnlineInstallerConfig $env:OnlineInstallerConfig
test: off
artifacts:
- path: 'build\Playnite.zip'
deploy:
- provider: Webhook
url: https://app.signpath.io/API/v1/4028e7e6-f183-4bbf-9640-c4b4d9a6992d/Integrations/AppVeyor?ProjectSlug=Playnite&SigningPolicySlug=release-signing
authorization:
secure: ZXw8Ro7eQ0opsdjLpNH7ZgTgS8ycnud7ag2qNOMRvqdxBmvegj+7QHrsh4pSgTSINhB5tbTZwgiMKFDjJV9QHg==
================================================
FILE: build/ExtensionsRefIgnoreList.txt
================================================
AngleSharp.dll
CefSharp.dll
CefSharp.BrowserSubprocess.Core.dll
CefSharp.Core.dll
CefSharp.Core.Runtime.dll
CefSharp.OffScreen.dll
CefSharp.Wpf.dll
CommandLine.dll
concrt140.dll
Crc32.NET.dll
d3dcompiler_47.dll
DiscordRPC.dll
Flurl.dll
Hardcodet.Wpf.TaskbarNotification.dll
HtmlRenderer.dll
HtmlRenderer.WPF.dll
chrome_elf.dll
libcef.dll
libEGL.dll
libGLESv2.dll
LiteDB.dll
Magick.Native-Q8-x86.dll
Magick.NET.Core.dll
Magick.NET.SystemWindowsMedia.dll
Magick.NET-Q8-x86.dll
Markdig.dll
Microsoft.Dynamic.dll
Microsoft.Practices.ServiceLocation.dll
Microsoft.Scripting.dll
Microsoft.Scripting.Metadata.dll
Microsoft.VisualStudio.CodeCoverage.Shim.dll
Microsoft.Win32.Primitives.dll
Microsoft.WindowsAPICodePack.dll
Microsoft.WindowsAPICodePack.ExtendedLinguisticServices.dll
Microsoft.WindowsAPICodePack.Sensors.dll
Microsoft.WindowsAPICodePack.Shell.dll
Microsoft.WindowsAPICodePack.ShellExtensions.dll
Microsoft.Xaml.Behaviors.dll
msvcp140.dll
msvcp140_1.dll
msvcp140_2.dll
msvcp140_atomic_wait.dll
msvcp140_codecvt_ids.dll
netstandard.dll
Nett.dll
Newtonsoft.Json.dll
NLog.dll
PhotoSauce.MagicScaler.dll
Playnite.dll
Playnite.SDK.dll
Polly.dll
Prism.dll
Prism.Wpf.dll
protobuf-net.dll
SDL2.dll
SDL2_mixer.dll
SharpCompress.dll
sqlite3.x86.dll
SQLNado.dll
System.AppContext.dll
System.Buffers.dll
System.Collections.dll
System.Collections.Concurrent.dll
System.Collections.NonGeneric.dll
System.Collections.Specialized.dll
System.ComponentModel.dll
System.ComponentModel.EventBasedAsync.dll
System.ComponentModel.Primitives.dll
System.ComponentModel.TypeConverter.dll
System.Console.dll
System.Data.Common.dll
System.Diagnostics.Contracts.dll
System.Diagnostics.Debug.dll
System.Diagnostics.FileVersionInfo.dll
System.Diagnostics.Process.dll
System.Diagnostics.StackTrace.dll
System.Diagnostics.TextWriterTraceListener.dll
System.Diagnostics.Tools.dll
System.Diagnostics.TraceSource.dll
System.Diagnostics.Tracing.dll
System.Drawing.Primitives.dll
System.Dynamic.Runtime.dll
System.Globalization.dll
System.Globalization.Calendars.dll
System.Globalization.Extensions.dll
System.IO.dll
System.IO.Abstractions.dll
System.IO.Compression.dll
System.IO.Compression.ZipFile.dll
System.IO.FileSystem.dll
System.IO.FileSystem.DriveInfo.dll
System.IO.FileSystem.Primitives.dll
System.IO.FileSystem.Watcher.dll
System.IO.IsolatedStorage.dll
System.IO.MemoryMappedFiles.dll
System.IO.Pipes.dll
System.IO.UnmanagedMemoryStream.dll
System.Linq.dll
System.Linq.Expressions.dll
System.Linq.Parallel.dll
System.Linq.Queryable.dll
System.Memory.dll
System.Net.Http.dll
System.Net.NameResolution.dll
System.Net.NetworkInformation.dll
System.Net.Ping.dll
System.Net.Primitives.dll
System.Net.Requests.dll
System.Net.Security.dll
System.Net.Sockets.dll
System.Net.WebHeaderCollection.dll
System.Net.WebSockets.dll
System.Net.WebSockets.Client.dll
System.Numerics.Vectors.dll
System.ObjectModel.dll
System.Reflection.dll
System.Reflection.Extensions.dll
System.Reflection.Primitives.dll
System.Resources.Reader.dll
System.Resources.ResourceManager.dll
System.Resources.Writer.dll
System.Runtime.dll
System.Runtime.CompilerServices.Unsafe.dll
System.Runtime.CompilerServices.VisualC.dll
System.Runtime.Extensions.dll
System.Runtime.Handles.dll
System.Runtime.InteropServices.dll
System.Runtime.InteropServices.RuntimeInformation.dll
System.Runtime.Numerics.dll
System.Runtime.Serialization.Formatters.dll
System.Runtime.Serialization.Json.dll
System.Runtime.Serialization.Primitives.dll
System.Runtime.Serialization.Xml.dll
System.Security.Claims.dll
System.Security.Cryptography.Algorithms.dll
System.Security.Cryptography.Csp.dll
System.Security.Cryptography.Encoding.dll
System.Security.Cryptography.Primitives.dll
System.Security.Cryptography.X509Certificates.dll
System.Security.Principal.dll
System.Security.SecureString.dll
System.Text.Encoding.dll
System.Text.Encoding.Extensions.dll
System.Text.RegularExpressions.dll
System.Threading.dll
System.Threading.Overlapped.dll
System.Threading.Tasks.dll
System.Threading.Tasks.Parallel.dll
System.Threading.Thread.dll
System.Threading.ThreadPool.dll
System.Threading.Timer.dll
System.ValueTuple.dll
System.Windows.Interactivity.dll
System.Xml.ReaderWriter.dll
System.Xml.XDocument.dll
System.Xml.XmlDocument.dll
System.Xml.XmlSerializer.dll
System.Xml.XPath.dll
System.Xml.XPath.XDocument.dll
vccorlib140.dll
vcruntime140.dll
vcruntime140_threads.dll
vk_swiftshader.dll
vulkan-1.dll
YamlDotNet.dll
AngleSharp.xml
CefSharp.xml
CefSharp.BrowserSubprocess.Core.xml
CefSharp.Core.xml
CefSharp.Core.Runtime.xml
CefSharp.OffScreen.xml
CefSharp.Wpf.xml
CommandLine.xml
concrt140.xml
Crc32.NET.xml
d3dcompiler_47.xml
DiscordRPC.xml
Flurl.xml
Hardcodet.Wpf.TaskbarNotification.xml
HtmlRenderer.xml
HtmlRenderer.WPF.xml
chrome_elf.xml
libcef.xml
libEGL.xml
libGLESv2.xml
LiteDB.xml
Magick.Native-Q8-x86.xml
Magick.NET.Core.xml
Magick.NET.SystemWindowsMedia.xml
Magick.NET-Q8-x86.xml
Markdig.xml
Microsoft.Dynamic.xml
Microsoft.Practices.ServiceLocation.xml
Microsoft.Scripting.xml
Microsoft.Scripting.Metadata.xml
Microsoft.VisualStudio.CodeCoverage.Shim.xml
Microsoft.Win32.Primitives.xml
Microsoft.WindowsAPICodePack.xml
Microsoft.WindowsAPICodePack.ExtendedLinguisticServices.xml
Microsoft.WindowsAPICodePack.Sensors.xml
Microsoft.WindowsAPICodePack.Shell.xml
Microsoft.WindowsAPICodePack.ShellExtensions.xml
Microsoft.Xaml.Behaviors.xml
msvcp140.xml
msvcp140_1.xml
msvcp140_2.xml
msvcp140_atomic_wait.xml
msvcp140_codecvt_ids.xml
netstandard.xml
Nett.xml
Newtonsoft.Json.xml
NLog.xml
PhotoSauce.MagicScaler.xml
Playnite.xml
Playnite.SDK.xml
Polly.xml
Prism.xml
Prism.Wpf.xml
protobuf-net.xml
SDL2.xml
SDL2_mixer.xml
SharpCompress.xml
sqlite3.x86.xml
SQLNado.xml
System.AppContext.xml
System.Buffers.xml
System.Collections.xml
System.Collections.Concurrent.xml
System.Collections.NonGeneric.xml
System.Collections.Specialized.xml
System.ComponentModel.xml
System.ComponentModel.EventBasedAsync.xml
System.ComponentModel.Primitives.xml
System.ComponentModel.TypeConverter.xml
System.Console.xml
System.Data.Common.xml
System.Diagnostics.Contracts.xml
System.Diagnostics.Debug.xml
System.Diagnostics.FileVersionInfo.xml
System.Diagnostics.Process.xml
System.Diagnostics.StackTrace.xml
System.Diagnostics.TextWriterTraceListener.xml
System.Diagnostics.Tools.xml
System.Diagnostics.TraceSource.xml
System.Diagnostics.Tracing.xml
System.Drawing.Primitives.xml
System.Dynamic.Runtime.xml
System.Globalization.xml
System.Globalization.Calendars.xml
System.Globalization.Extensions.xml
System.IO.xml
System.IO.Abstractions.xml
System.IO.Compression.xml
System.IO.Compression.ZipFile.xml
System.IO.FileSystem.xml
System.IO.FileSystem.DriveInfo.xml
System.IO.FileSystem.Primitives.xml
System.IO.FileSystem.Watcher.xml
System.IO.IsolatedStorage.xml
System.IO.MemoryMappedFiles.xml
System.IO.Pipes.xml
System.IO.UnmanagedMemoryStream.xml
System.Linq.xml
System.Linq.Expressions.xml
System.Linq.Parallel.xml
System.Linq.Queryable.xml
System.Memory.xml
System.Net.Http.xml
System.Net.NameResolution.xml
System.Net.NetworkInformation.xml
System.Net.Ping.xml
System.Net.Primitives.xml
System.Net.Requests.xml
System.Net.Security.xml
System.Net.Sockets.xml
System.Net.WebHeaderCollection.xml
System.Net.WebSockets.xml
System.Net.WebSockets.Client.xml
System.Numerics.Vectors.xml
System.ObjectModel.xml
System.Reflection.xml
System.Reflection.Extensions.xml
System.Reflection.Primitives.xml
System.Resources.Reader.xml
System.Resources.ResourceManager.xml
System.Resources.Writer.xml
System.Runtime.xml
System.Runtime.CompilerServices.Unsafe.xml
System.Runtime.CompilerServices.VisualC.xml
System.Runtime.Extensions.xml
System.Runtime.Handles.xml
System.Runtime.InteropServices.xml
System.Runtime.InteropServices.RuntimeInformation.xml
System.Runtime.Numerics.xml
System.Runtime.Serialization.Formatters.xml
System.Runtime.Serialization.Json.xml
System.Runtime.Serialization.Primitives.xml
System.Runtime.Serialization.Xml.xml
System.Security.Claims.xml
System.Security.Cryptography.Algorithms.xml
System.Security.Cryptography.Csp.xml
System.Security.Cryptography.Encoding.xml
System.Security.Cryptography.Primitives.xml
System.Security.Cryptography.X509Certificates.xml
System.Security.Principal.xml
System.Security.SecureString.xml
System.Text.Encoding.xml
System.Text.Encoding.Extensions.xml
System.Text.RegularExpressions.xml
System.Threading.xml
System.Threading.Overlapped.xml
System.Threading.Tasks.xml
System.Threading.Tasks.Parallel.xml
System.Threading.Thread.xml
System.Threading.ThreadPool.xml
System.Threading.Timer.xml
System.ValueTuple.xml
System.Windows.Interactivity.xml
System.Xml.ReaderWriter.xml
System.Xml.XDocument.xml
System.Xml.XmlDocument.xml
System.Xml.XmlSerializer.xml
System.Xml.XPath.xml
System.Xml.XPath.XDocument.xml
vccorlib140.xml
vcruntime140.xml
vcruntime140_threads.xml
vk_swiftshader.xml
vulkan-1.xml
YamlDotNet.xml
================================================
FILE: build/PlayniteSDK.nuspec
================================================
PlayniteSDK
{Version}
Playnite SDK
Josef Nemec
JosefNemec
MIT
https://github.com/JosefNemec/Playnite
images\applogo.png
false
SDK plugin library for Playnite video game library manager.
https://playnite.link/docs/changelog.html
Copyright © Josef Nemec 2018
sdk gaming
docs\readme.md
================================================
FILE: build/VerifyLanguageFiles.ps1
================================================
#Requires -Version 7
$ErrorActionPreference = "Stop"
Add-Type -AssemblyName "PresentationFramework"
$locDir = "..\source\Playnite\Localization\"
$allOk = $true
foreach ($locFile in (Get-ChildItem $locDir -Filter "*.xaml"))
{
$stream = New-Object "System.IO.StreamReader" $locFile.FullName
try
{
$xaml = [System.Windows.Markup.XamlReader]::Load($stream.BaseStream)
Write-Host "$($locFile.Name)...OK" -ForegroundColor Green
}
catch
{
$allOk = $false
Write-Host "$($locFile.Name)...FAIL" -ForegroundColor Red
Write-Host $_.Exception.InnerException.Message -ForegroundColor Red
}
finally
{
$stream.Dispose()
}
}
if (-not $allOk)
{
throw "Some localization files failed verification."
}
================================================
FILE: build/applyEnglishProofing.ps1
================================================
#Requires -Version 7
$ErrorActionPreference = "Stop"
Add-Type -AssemblyName "PresentationFramework"
$locDir = Join-Path $pwd "..\source\Playnite\Localization\"
$proofFile = Join-Path $locDir "en_US.xaml"
$lngSourceFile = Join-Path $locDir "LocSource.xaml"
[xml]$proofXaml = Get-Content $proofFile
[xml]$lngSourceXaml = Get-Content $lngSourceFile
foreach ($node in $proofXaml.ResourceDictionary.ChildNodes)
{
if (!$node.Key)
{
continue
}
if (![string]::IsNullOrEmpty($node.InnerXml))
{
$lngSourceNode = $lngSourceXaml.ResourceDictionary.ChildNodes | Where-Object { $_.Key -eq $node.Key }
if ($lngSourceNode)
{
$importNode = $lngSourceXaml.ImportNode($node, $true)
$lngSourceXaml.ResourceDictionary.ReplaceChild($importNode, $lngSourceNode) | Out-Null
}
}
}
$settings = new-object System.Xml.XmlWriterSettings
$settings.Indent = $true;
$settings.IndentChars = " ";
$settings.Encoding = [System.Text.Encoding]::UTF8;
$settings.OmitXmlDeclaration = $true;
$writer = [System.Xml.XmlWriter]::Create($lngSourceFile, $settings);
[System.Xml.Linq.XDocument]::Parse($lngSourceXaml.OuterXml).WriteTo($writer);
$writer.Flush();
$writer.Dispose();
================================================
FILE: build/build.ps1
================================================
#Requires -Version 7
param(
# Build configuration
[ValidateSet("Release", "Debug")]
[string]$Configuration = "Release",
# Target platform
[ValidateSet("x86", "x64")]
[string]$Platform = "x86",
# Target directory for build files
[string]$OutputDir,
# Target directory for installer files
[string]$InstallerDir,
# Package build output into zip file
[switch]$Package = $false,
# Skip build process
[switch]$SkipBuild = $false,
# Temp directory for build process
[string]$TempDir = (Join-Path $env:TEMP "PlayniteBuild"),
[string]$LicensedDependenciesUrl,
[switch]$SdkNuget,
[string]$OnlineInstallerConfig
)
$ErrorActionPreference = "Stop"
if (!(Get-InstalledModule "powershell-yaml" -EA 0))
{
Install-Module powershell-yaml
}
Set-Location $PSScriptRoot
& .\common.ps1
if (!$OutputDir)
{
$OutputDir = Join-Path $PWD $Configuration
}
if (!$InstallerDir)
{
$InstallerDir = $PWD
}
function PackExtensionTemplate()
{
param(
[Parameter(Mandatory = $true)]
[string]$TemplateRootName,
[Parameter(Mandatory = $true)]
[string]$OutputDir
)
$templatesDir = Join-Path $OutputDir "Templates\Extensions\"
$templateOutDir = Join-Path $templatesDir $TemplateRootName
$tempFiles = Get-Content "..\source\Tools\Playnite.Toolbox\Templates\Extensions\$TemplateRootName\BuildInclude.txt" | Where { ![string]::IsNullOrEmpty($_) }
$targetZip = Join-Path $templatesDir "$TemplateRootName.zip"
foreach ($file in $tempFiles)
{
$target = Join-Path $templateOutDir $file
New-FolderFromFilePath $target
Copy-Item (Join-Path "..\source\Tools\Playnite.Toolbox\Templates\Extensions\$TemplateRootName" $file) $target
}
New-ZipFromDirectory $templateOutDir $targetZip
Remove-Item $templateOutDir -Recurse -Force
}
# -------------------------------------------
# Verify various non-build files
# -------------------------------------------
.\VerifyLanguageFiles.ps1
$platforms = Get-Content "..\source\Playnite\Emulation\Platforms.yaml" -Raw | ConvertFrom-Yaml
if (!($platforms.Count -gt 0))
{
throw "Platforms definition file is not valid."
}
Write-OperationLog "Platforms definitions are OK"
$regions = Get-Content "..\source\Playnite\Emulation\Regions.yaml" -Raw | ConvertFrom-Yaml
if (!($regions.Count -gt 0))
{
throw "Regions definition file is not valid."
}
Write-OperationLog "Regions definitions are OK"
Get-ChildItem "..\source\Playnite\Emulation\" -Filter "*.yaml" -Recurse | ForEach {
$emuDef = Get-Content $_.FullName -Raw | ConvertFrom-Yaml
if (!$emuDef.Id)
{
throw "$($_.FullName) is not valid emulator definition."
}
foreach ($profile in $emuDef.Profiles)
{
foreach ($platId in $profile.Platforms)
{
if (!($platforms | Where { $_.Id -eq $platId } ))
{
throw "Platform $platId not found, $($_.FullName)."
}
}
}
}
Write-OperationLog "Emulator definitions are OK"
# -------------------------------------------
# Compile application
# -------------------------------------------
if (!$SkipBuild)
{
if (Test-Path $OutputDir)
{
Remove-Item "$OutputDir\*" -Recurse -Force
}
if ($LicensedDependenciesUrl)
{
$depArchive = Join-Path $env:TEMP "deps.zip"
Invoke-WebRequest $LicensedDependenciesUrl -OutFile $depArchive
Expand-ZipToDirectory $depArchive (Resolve-Path "..").Path
}
if ($OnlineInstallerConfig)
{
Write-OperationLog "Updating online installer config..."
$locaConfigPath = "..\source\Tools\PlayniteInstaller\installer_mirrors.txt"
if ($OnlineInstallerConfig.StartsWith("http"))
{
$configFile = Join-Path $env:TEMP "installer_mirrors.txt"
Invoke-WebRequest $OnlineInstallerConfig -OutFile $locaConfigPath
}
else
{
Copy-Item $OnlineInstallerConfig $locaConfigPath -Force
}
}
$solutionDir = Join-Path $pwd "..\source"
Invoke-Nuget "restore ..\source\Playnite.sln"
$msbuildpath = Get-MsBuildPath
$arguments = "build.xml /p:SolutionDir=`"$solutionDir\\`" /p:OutputPath=`"$OutputDir`";Configuration=$configuration /property:Platform=$Platform /t:Build"
$compilerResult = StartAndWait $msbuildPath $arguments
if ($compilerResult -ne 0)
{
throw "Build failed."
}
# Copy extension templates
PackExtensionTemplate "CustomLibraryPlugin" $OutputDir
PackExtensionTemplate "CustomMetadataPlugin" $OutputDir
PackExtensionTemplate "GenericPlugin" $OutputDir
PackExtensionTemplate "PowerShellScript" $OutputDir
}
New-Folder $InstallerDir
# -------------------------------------------
# SDK nuget
# -------------------------------------------
if ($SdkNuget)
{
& .\buildSdkNuget.ps1 -SkipBuild -OutputPath $OutputDir | Out-Null
}
# -------------------------------------------
# Build zip package
# -------------------------------------------
if ($Package)
{
Write-OperationLog "Building zip package..."
$packageName = Join-Path $InstallerDir "Playnite.zip"
New-ZipFromDirectory $OutputDir $packageName
}
(Get-ChildItem (Join-Path $OutputDir "Playnite.dll")).VersionInfo.FileVersion | Write-Host -ForegroundColor Green
return $true
================================================
FILE: build/build.xml
================================================
================================================
FILE: build/buildLocConstants.ps1
================================================
#Requires -Version 7
$ErrorActionPreference = "Stop"
& .\common.ps1
$locFile = Join-Path $pwd "..\source\Playnite\Localization\LocSource.xaml"
$locKeysSrc = Join-Path $pwd "..\source\Playnite\Localization\LocalizationKeys.cs"
[xml]$locFileXaml = Get-Content $locFile
@"
///
/// DO NOT MODIFY! Automatically generated via buildLocConstants.ps1 script.
///
namespace Playnite
{
public static class LOC
{
"@ | Out-File $locKeysSrc -Encoding utf8
foreach ($node in $locFileXaml.ResourceDictionary.ChildNodes)
{
if (!$node.Key)
{
continue
}
if (![string]::IsNullOrEmpty($node.InnerXml))
{
@"
///
{0}
///
"@ -f (($node.InnerXml -split "\n") -replace "^", "/// ") | Out-File $locKeysSrc -Encoding utf8 -Append
" public const string $($node.Key -replace `"^LOC`", `"`") = `"$($node.Key)`";" `
| Out-File $locKeysSrc -Encoding utf8 -Append
}
}
@"
}
}
"@ | Out-File $locKeysSrc -Encoding utf8 -Append
================================================
FILE: build/buildSdkNuget.ps1
================================================
#Requires -Version 7
param(
[ValidateSet("Release", "Debug")]
[string]$Configuration = "Release",
[string]$OutputPath = (Join-Path $PWD "$($Configuration)SDK"),
[switch]$SkipBuild = $false,
[string]$LocalPublish
)
$ErrorActionPreference = "Stop"
& .\common.ps1
# -------------------------------------------
# Compile SDK
# -------------------------------------------
if (!$SkipBuild)
{
New-EmptyFolder $OutputPath
$project = Join-Path $pwd "..\source\PlayniteSDK\Playnite.SDK.csproj"
$msbuildPath = Get-MsBuildPath
$arguments = "`"$project`" /p:OutputPath=`"$outputPath`";Configuration=$configuration /t:Build"
$compilerResult = StartAndWait $msbuildPath $arguments
if ($compilerResult -ne 0)
{
throw "Build failed."
}
}
# -------------------------------------------
# Create NUGET
# -------------------------------------------
$version = (Get-ChildItem (Join-Path $OutputPath "Playnite.SDK.dll")).VersionInfo.ProductVersion
$version = $version -replace "\.0$", ""
$spec = Get-Content "PlayniteSDK.nuspec"
$spec = $spec -replace "{Version}", $version
$spec = $spec -replace "{OutDir}", $OutputPath
$specFile = "nuget.nuspec"
try
{
$spec | Out-File $specFile
$packageRes = Invoke-Nuget "pack $specFile -OutputDirectory $OutputPath"
if ($packageRes -ne 0)
{
throw "Nuget packing failed."
}
}
finally
{
Remove-Item $specFile -EA 0
}
if ($LocalPublish)
{
Invoke-Nuget "init `"$pwd`" `"$LocalPublish`""
}
return $true
================================================
FILE: build/common.ps1
================================================
#Requires -Version 7
$global:NugetUrl = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
function global:StartAndWait()
{
param(
[string]$Path,
[string]$Arguments,
[string]$WorkingDir
)
if ($WorkingDir)
{
$proc = Start-Process $Path $Arguments -PassThru -NoNewWindow -WorkingDirectory $WorkingDir
}
else
{
$proc = Start-Process $Path $Arguments -PassThru -NoNewWindow
}
$handle = $proc.Handle # cache proc.Handle http://stackoverflow.com/a/23797762/1479211
$proc.WaitForExit()
return $proc.ExitCode
}
function global:Invoke-Nuget()
{
param(
[string]$NugetArgs
)
$nugetCommand = Get-Command -Name "nuget" -Type Application -ErrorAction Ignore
if (-not $nugetCommand)
{
if (-not (Test-Path "nuget.exe"))
{
Invoke-WebRequest -Uri $NugetUrl -OutFile "nuget.exe"
}
}
if ($nugetCommand)
{
return StartAndWait "nuget" $NugetArgs
}
else
{
return StartAndWait ".\nuget.exe" $NugetArgs
}
}
function global:Get-MsBuildPath()
{
$VSWHERE_CMD = "vswhere"
if (-not (Get-Command -Name $VSWHERE_CMD -Type Application -ErrorAction Ignore))
{
$VSWHERE_CMD = "..\source\packages\vswhere.*\tools\vswhere.exe"
if (-not (Get-Command -Name $VSWHERE_CMD -Type Application -ErrorAction Ignore))
{
Invoke-Nuget "install vswhere -SolutionDirectory `"$solutionDir`"" | Out-Null
}
}
$path = & $VSWHERE_CMD -latest -requires Microsoft.Component.MSBuild -find "MSBuild\**\Bin\MSBuild.exe" -latest | Select-Object -First 1
if ($path -and (Test-Path $path))
{
return $path
}
throw "MS Build not found."
}
function global:New-Folder()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$Path
)
if (Test-Path $Path)
{
return
}
mkdir $Path | Out-Null
}
function global:New-FolderFromFilePath()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$FilePath
)
$dirPath = Split-Path $FilePath
if (Test-Path $dirPath)
{
return
}
mkdir $dirPath | Out-Null
}
function global:New-EmptyFolder()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$Path
)
if (Test-Path $Path)
{
Remove-Item $Path -Recurse -Force
}
mkdir $Path | Out-Null
}
function global:New-ZipFromDirectory()
{
param(
[string]$directory,
[string]$resultZipPath,
[bool]$includeBaseDirectory = $false
)
if (Test-path $resultZipPath)
{
Remove-Item $resultZipPath
}
Add-Type -assembly "System.IO.Compression.Filesystem" | Out-Null
[IO.Compression.ZipFile]::CreateFromDirectory($directory, $resultZipPath, "Optimal", $includeBaseDirectory)
}
function global:Expand-ZipToDirectory()
{
param(
[string]$zipPath,
[string]$directory
)
Add-Type -assembly "System.IO.Compression.Filesystem" | Out-Null
[IO.Compression.ZipFile]::ExtractToDirectory($zipPath, $directory, $true)
}
function global:Write-OperationLog()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$Message
)
Write-Host $Message -ForegroundColor Green
}
function global:Write-ErrorLog()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$Message
)
Write-Host $Message -ForegroundColor Red -BackgroundColor Black
}
function global:Write-WarningLog()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$Message
)
Write-Host $Message -ForegroundColor Yellow
}
function global:Write-InfoLog()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$Message
)
Write-Host $Message -ForegroundColor White
}
function global:Write-DebugLog()
{
param(
[Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
[string]$Message
)
Write-Host $Message -ForegroundColor DarkGray
}
================================================
FILE: build/generateRetroArchProfile.ps1
================================================
param(
[Parameter(Mandatory=$true)]
[string]$RetroArchDir,
[Parameter(Mandatory=$true)]
[string]$PlayniteSourceDirectory
)
$ErrorActionPreference = "Stop"
if (!(Get-InstalledModule "powershell-yaml" -EA 0))
{
Install-Module powershell-yaml
}
function Get-IsYamlValid
{
param (
[Parameter(Mandatory=$true)]
[string] $yamlContent
)
try {
$yamlContent | ConvertFrom-Yaml | Out-Null
return $true
} catch {
return $false
}
}
function ParseInfoFile()
{
param(
[Parameter(Mandatory=$true)]
[string]$Path
)
$properties = @{}
foreach ($line in (Get-Content $Path))
{
if ($line.StartsWith("#"))
{
continue
}
if ($line -match "^(.*)\s*=\s*`"(.*)`"$")
{
$property = $Matches[1].Trim()
if (!$properties.ContainsKey($property))
{
$properties.Add($property, $Matches[2].Trim())
}
}
}
return $properties
}
$emulationDirPath = [System.IO.Path]::Combine($PlayniteSourceDirectory, "Playnite", "Emulation")
$platformsDefinitionPath = [System.IO.Path]::Combine($emulationDirPath, "Platforms.yaml")
$retroArchEmuDefinitionPath = [System.IO.Path]::Combine($emulationDirPath, "Emulators", "RetroArch", "emulator.yaml")
if (!(Test-Path $platformsDefinitionPath -Type Leaf))
{
Write-Host "Playnite platforms definition file not found in $platformsDefinitionPath" -ForegroundColor Yellow
return
}
$ignoreList = @(
"00_example_libretro.info",
"2048_libretro.info",
"3dengine_libretro.info",
"advanced_tests_libretro.info",
"bk_libretro.info",
"boom3_libretro.info",
"boom3_xp_libretro.info",
"cannonball_libretro.info",
"chaigame_libretro.info",
"chailove_libretro.info",
"craft_libretro.info",
"cruzes_libretro.info",
"dhewm3_libretro.info",
"dinothawr_libretro.info",
"ecwolf_libretro.info",
"ffmpeg_libretro.info",
"freechaf_libretro.info",
"freej2me_libretro.info",
"gme_libretro.info",
"hbmame_libretro.info",
"imageviewer_libretro.info",
"lutro_libretro.info",
"mojozork_libretro.info",
"mpv_libretro.info",
"mrboom_libretro.info",
"mu_libretro.info",
"nxengine_libretro.info",
"oberon_libretro.info",
"openlara_libretro.info",
"opentyrian_libretro.info",
"pascal_pong_libretro.info",
"pocketcdg_libretro.info",
"pokemini_libretro.info",
"prboom_libretro.info",
"quasi88_libretro.info",
"redbook_libretro.info",
"reminiscence_libretro.info",
"remotejoy_libretro.info",
"rvvm_libretro.info",
"scummvm_libretro.info",
"simcp_libretro.info",
"squirreljme_libretro.info",
"stonesoup_libretro.info",
"test_libretro.info",
"test_netplay_libretro.info",
"testaudio_callback_libretro.info",
"testaudio_no_callback_libretro.info",
"testaudio_playback_wav_libretro.info",
"testgl_compute_shaders_libretro.info",
"testgl_ff_libretro.info",
"testgl_libretro.info",
"testinput_buttontest_libretro.info",
"testretroluxury_libretro.info",
"testsw_libretro.info",
"testsw_vram_libretro.info",
"testvulkan_async_compute_libretro.info",
"testvulkan_libretro.info",
"thepowdertoy_libretro.info",
"tic80_libretro.info",
"tyrquake_libretro.info",
"ume2015_libretro.info",
"uw8_libretro.info",
"vaporspec_libretro.info",
"vitaquake2-rogue_libretro.info",
"vitaquake2-xatrix_libretro.info",
"vitaquake2-zaero_libretro.info",
"vitaquake2_libretro.info",
"vitaquake3_libretro.info",
"vitavoyager_libretro.info",
"wasm4_libretro.info",
"x1_libretro.info",
"xrick_libretro.info"
)
$retroarchArcadeSystems = @(
"16-bit (Various)",
"16-bit + 32X (Various)",
"Arcade (various)",
"CP System I",
"CP System II",
"CP System III",
"Multi (various)",
"Neo Geo"
)
$retroarchMiscSystems = @(
"2003 Game Engine",
"4",
"CHIP-8",
"Handheld Electronic", #Handheld Electronic (GW)
"LowRes NX", #LowRes NX
"Magnavox Odyssey2", #133 Philips Videopac G7000
"Mega Duck", # Mega Duck
"Moonlight", # Moonlight,
"PICO8", # PICO-8
"Pong Game Clone", # Gong,
"RPG Maker 2000",
"SEGA Visual Memory Unit", #VeMUlator / Sega VMU
"Uzebox" # Uzebox (Uzem)
)
$raCoreNameToPlatformIdsTranslate = @{
"Gearsystem" = @("sega_mastersystem", "sega_gamegear", "sega_sg1000", "coleco_vision");
"Genesis Plus GX" = @("sega_mastersystem", "sega_gamegear", "sega_genesis", "sega_cd");
"Genesis Plus GX Wide" = @("sega_mastersystem", "sega_gamegear", "sega_genesis", "sega_cd");
"nSide (Super Famicom Accuracy)" = @("nintendo_super_nes", "nintendo_gameboy", "nintendo_gameboycolor");
"PicoDrive" = @("sega_mastersystem", "sega_genesis", "sega_cd", "sega_32x");
"SMS Plus GX" = @("sega_mastersystem", "sega_gamegear", "sega_sg1000", "coleco_vision");
}
$raSystemIdToPlatformIdsTranslate = @{
"msx" = @("microsoft_msx", "microsoft_msx2");
"neo_geo_pocket" = @("snk_neogeopocket", "snk_neogeopocket_color");
}
$raSystemNameToPlatformIdTranslate = @{
"3DO" = "3do";
"3DS" = "nintendo_3ds";
"Amiga" = "commodore_amiga";
"Atari 2600" = "atari_2600";
"Atari 5200" = "atari_5200";
"Atari 7800" = "atari_7800";
"Atari ST" = "atari_st";
"C128" = "commodore_64";
"C64" = "commodore_64";
"C64 SuperCPU" = "commodore_64";
"CBM-5x0" = "commodore_cbm5x0";
"CBM-II" = "commodore_cbm2";
"CD" = "nec_turbografx_cd";
"ColecoVision" = "coleco_vision";
"Color" = "bandai_wonderswan_color";
"Commodore Amiga" = "commodore_amiga";
"CPC" = "amstrad_cpc";
"DOS" = "pc_dos";
"DS" = "nintendo_ds";
"Falcon" = "atari_falcon030";
"Game Boy" = "nintendo_gameboy";
"Game Boy Advance" = "nintendo_gameboyadvance";
"Game Boy Color" = "nintendo_gameboycolor";
"GameCube" = "nintendo_gamecube";
"GG" = "sega_gamegear";
"Intellivision" = "mattel_intellivision";
"Jaguar" = "atari_jaguar";
"Lynx" = "atari_lynx";
"Nintendo 64" = "nintendo_64";
"Nintendo DS" = "nintendo_ds";
"Nintendo Entertainment System" = "nintendo_nes";
"PC" = "pc_dos";
"PC Engine" = "nec_turbografx_16";
"PC Engine SuperGrafx" = "nec_supergrafx";
"PC-98" = "nec_pc98";
"PC-FX" = "nec_pcfx";
"PCE-CD" = "nec_turbografx_cd";
"PET" = "commodore_pet";
"PlayStation" = "sony_playstation";
"PLUS" = "commodore_plus4";
"PSP" = "sony_psp";
"Saturn" = "sega_saturn";
"Sega Dreamcast" = "sega_dreamcast";
"Sega Genesis" = "sega_genesis";
"Sega Master System" = "sega_mastersystem";
"Sharp X68000" = "sharp_x68000";
"SNK Neo Geo CD" = "snk_neogeo_cd";
"Sony PlayStation 2" = "sony_playstation2";
"STE" = "atari_st";
"Super Nintendo Entertainment System" = "nintendo_super_nes";
"SuperGrafx" = "nec_supergrafx";
"Supervision" = "watara_supervision";
"SVI" = "microsoft_msx";
"Thomson MO" = "thomson_mo5";
"TO" = "thomson_to7";
"TT" = "atari_st"; # The Atari TT030 is a member of the Atari ST family
"Vectrex" = "vectrex";
"VIC-20" = "commodore_vci20";
"Virtual Boy" = "nintendo_virtualboy";
"Wii" = "nintendo_wii";
"WonderSwan" = "bandai_wonderswan";
"Xbox" = "xbox";
"ZX Spectrum (various)" = "sinclair_zxspectrum";
"ZX81" = "sinclair_zx81";
}
$emuDefinitionTemplate = "Id: retroarch
Name: RetroArch
Website: 'http://www.retroarch.com/'
Profiles:
{0}"
$profileTemplate = ' - Name: {0}
StartupArguments: ''-L ".\cores\{1}.dll" "{{ImagePath}}"''
Platforms: [{2}]
ImageExtensions: [{3}]
ProfileFiles: [''cores\{4}.dll'']
StartupExecutable: ^retroarch\.exe$'
$existingProfileReaddTemplate = ' - Name: {0}
StartupArguments: ''{1}''
Platforms: [{2}]
ImageExtensions: [{3}]
ProfileFiles: [''{4}'']
StartupExecutable: ^retroarch\.exe$'
$existingEmuDefinition = Get-Content $retroArchEmuDefinitionPath -Raw | ConvertFrom-Yaml
$usedProfileNames = @()
$existingProfiles = @{}
foreach ($existingProfile in $existingEmuDefinition.Profiles) {
$existingProfiles[$existingProfile.ProfileFiles[0]] = $existingProfile
$usedProfileNames += $existingProfile.Name
}
$foundCoreNames = @()
$foundPlatformIds = @()
$profiles = @()
$infoPath = Join-Path $RetroArchDir "info"
$infoFiles = Get-ChildItem $infoPath -Filter "*.info"
foreach ($infoFile in $infoFiles)
{
if ($ignoreList.Contains($infoFile.Name))
{
continue
}
$coreInfo = ParseInfoFile $infoFile.FullName
$coreFile = "cores\{0}.dll" -f $infoFile.BaseName
$platformIds = @()
if ($existingProfiles.ContainsKey($coreFile))
{
$coreName = $existingProfiles[$coreFile].Name
$platformIds = $existingProfiles[$coreFile].Platforms
}
else
{
if ($usedProfileNames.Contains($coreInfo.corename))
{
$coreName = "{0} - {1}" -f $coreInfo.corename, $coreInfo.display_name
}
else
{
$coreName = $coreInfo.corename
}
}
if (!($coreInfo.ContainsKey("corename")))
{
Write-Host "$($infoFile.Name) does not contain the core name" -ForegroundColor Yellow # Some cores like anarch_libretro.info don't contain a core name
continue
}
$coreInfoCoreName = $coreInfo.corename
if ($raCoreNameToPlatformIdsTranslate.ContainsKey($coreInfoCoreName))
{
$platformIds = $raCoreNameToPlatformIdsTranslate[$coreInfoCoreName]
}
elseif ($null -ne $coreInfo.systemid -and $raSystemIdToPlatformIdsTranslate.ContainsKey($coreInfo.systemid.Trim()))
{
$platformIds = $raSystemIdToPlatformIdsTranslate[$coreInfo.systemid.Trim()]
}
else
{
if (!($coreInfo.ContainsKey("systemname")))
{
Write-Host "$($infoFile.Name) does not contain systemname" -ForegroundColor Yellow # galaksija_libretro.info
continue
}
$coreInfo.systemname.Split("/", [System.StringSplitOptions]::RemoveEmptyEntries) | ForEach-Object {
$system = $_.Trim()
if (($retroarchArcadeSystems -contains $system) -or ($retroarchMiscSystems -contains $system))
{
Continue
}
if ($raSystemNameToPlatformIdTranslate.ContainsKey($system))
{
$platformId = $raSystemNameToPlatformIdTranslate[$system]
if ($platformIds -notcontains $platformId)
{
$platformIds += $platformId
}
}
else
{
Write-Host "System to platform translate not found. System: $system, CoreName: $($coreInfo.corename), DisplayName: $($coreInfo.display_name)" -ForegroundColor Yellow
}
}
}
if ($null -eq $platformIds -or $platformIds.Count -eq 0)
{
Write-Host "PlatformIds not found. System: $system, CoreName: $($coreInfo.corename), DisplayName: $($coreInfo.display_name)" -ForegroundColor Yellow
continue
}
if ($coreInfo.supported_extensions)
{
$extensions = @()
$coreInfo.supported_extensions.Split("|", [System.StringSplitOptions]::RemoveEmptyEntries) | ForEach-Object {
$extensions += $_
}
if ($extensions -notcontains "zip")
{
$extensions += "zip"
}
if ($extensions -notcontains "7z")
{
$extensions += "7z"
}
$extensions = $extensions | Sort-Object
$extensionsString = [System.String]::Join(", ", $extensions)
}
else
{
Write-Host "Profile did not have extensions. System: $system, CoreName: $($coreInfo.corename), DisplayName: $($coreInfo.display_name)" -ForegroundColor Yellow
continue
}
foreach ($platformId in $platformIds) {
if ($foundPlatformIds -notcontains $platformId)
{
$foundPlatformIds += $platformId
}
}
$platformIds = $platformIds | Sort-Object
$extensions = $extensions | Sort-Object
$platformIdsString = [System.String]::Join(", ", $platformIds)
$profileString = $profileTemplate -f $coreName, $infoFile.BaseName, $platformIdsString, $extensionsString, $infoFile.BaseName
$profiles += $profileString
$foundCoreNames += $coreName
$usedProfileNames += $coreName
}
# Previous profiles need to be kept or existing emulator configuration will break
# Here emulators not generated will be added back
foreach ($existingProfile in $existingEmuDefinition.Profiles) {
if ($foundCoreNames -notcontains $existingProfile.Name)
{
foreach ($platformId in $existingProfile.Platforms) {
if ($foundPlatformIds -notcontains $platformId)
{
$foundPlatformIds += $platformId
}
}
$platformIds = [System.String]::Join(", ", ($existingProfile.Platforms | Sort-Object))
$extensionsString = [System.String]::Join(", ", ($existingProfile.ImageExtensions | Sort-Object))
$profileFilesString = [System.String]::Join(", ", ($existingProfile.ProfileFiles | Sort-Object))
$profileString = $existingProfileReaddTemplate -f $existingProfile.Name, $existingProfile.StartupArguments, $platformIds, $extensionsString, $profileFilesString
$profiles += $profileString
Write-Host "Existing profile $($existingProfile.Name) not found in newly generated definition and was added back from previous definition" -ForegroundColor Yellow
}
}
# Join generated profiles and validated created profile yaml content
$profiles = $profiles | Sort-Object
$profilesString = [System.String]::Join("`n`n", $profiles)
$emuDefinitionContent = $emuDefinitionTemplate -f $profilesString
if ((Get-IsYamlValid $emuDefinitionContent) -eq $false)
{
Write-Host "Newly generated profile definition file is not valid!" -ForegroundColor Red
Set-Clipboard $emuDefinitionContent
return
}
# Add RetroArch to emulators list in Playnite platforms definitions
$platformDefinitionTemplate = '- Name: {0}
{1}'
$newPlatformsDefinitions = @()
$existingPlatformsDefinition = Get-Content $platformsDefinitionPath -Raw | ConvertFrom-Yaml
foreach ($platform in $existingPlatformsDefinition) {
$platformData = @()
$platformData += " Id: {0}" -f $platform.Id
if ($platform.IgdbId)
{
$platformData += "IgdbId: {0}" -f $platform.IgdbId
}
if ($platform.Databases)
{
$platformData += "Databases: [{0}]" -f [System.String]::Join(", ", ($platform.Databases | Sort-Object))
}
$isSupportedByRetroArch = $foundPlatformIds -contains $platform.Id
if ($platform.Emulators)
{
if ($isSupportedByRetroArch -and ($platform.Emulators -notcontains "retroarch"))
{
$platform.Emulators += "retroarch"
$platform.Emulators = $platform.Emulators | Sort-Object
Write-Host "Added retroarch emulator to `"$($platform.Name)`" platform" -ForegroundColor Blue
}
$platformData += "Emulators: [{0}]" -f [System.String]::Join(", ", ($platform.Emulators | Sort-Object))
}
elseif ($isSupportedByRetroArch)
{
$platformData += "Emulators: [{0}]" -f "retroarch"
}
$platformDataString = $platformDefinitionTemplate -f $platform.Name, [System.String]::Join("`n ", $platformData)
$newPlatformsDefinitions += $platformDataString
}
$newPlatformsDefinitionsContent = [System.String]::Join("`n `n", $newPlatformsDefinitions)
# Validate created platforms definition yaml content
if ((Get-IsYamlValid $newPlatformsDefinitionsContent) -eq $false)
{
Write-Host "Newly generated platforms definition file is not valid!" -ForegroundColor Red
Set-Clipboard $newPlatformsDefinitionsContent
return
}
# Save generated yaml files. New lines are replaced to maintain CRLF endings
[System.IO.File]::WriteAllLines($retroArchEmuDefinitionPath, $emuDefinitionContent.Replace("`n","`r`n"), [System.Text.Encoding]::UTF8)
[System.IO.File]::WriteAllLines($platformsDefinitionPath, $newPlatformsDefinitionsContent.Replace("`n","`r`n"), [System.Text.Encoding]::UTF8)
Write-Host "RetroArch emulator and Playnite platforms definitions updated and saved successfully!" -ForegroundColor Green
================================================
FILE: build/updateLocalizations.ps1
================================================
#Requires -Version 7
param(
[string]$AccessToken
)
$ErrorActionPreference = "Stop"
$locDir = Join-Path $pwd "..\source\Playnite\Localization"
$urlRoot = "https://crowdin.com/api/v2"
$playnitePrjId = 345875
$requestHeaders = @{
"Authorization" = "Bearer $AccessToken"
}
$locProgressData = New-Object "System.Collections.Specialized.OrderedDictionary"
$locProgress = Invoke-RestMethod -Method Get -Headers $requestHeaders -Uri "$urlRoot/projects/$playnitePrjId/files/30/languages/progress?limit=100" ` -ContentType "application/json"
foreach ($lng in $locProgress.data)
{
$locProgressData.Add($lng.data.languageId, $lng.data.translationProgress);
$locDownloadData = Invoke-RestMethod -Method Post -Headers $requestHeaders -Uri "$urlRoot/projects/$playnitePrjId/translations/builds/files/30" `
-Body "{`"targetLanguageId`":`"$($lng.data.languageId)`"}" -ContentType "application/json"
$tempFile = Join-Path $locDir "temp.xaml"
Remove-Item $tempFile -EA 0
$locDownload = Invoke-WebRequest -Uri $locDownloadData.data.url -OutFile $tempFile -PassThru
$locDownload.Headers["Content-Disposition"][0] -match '"(.+)"' | Out-Null
$fileName = $Matches[1]
Move-Item $tempFile (Join-Path $locDir $fileName) -Force
}
$locProgressData | ConvertTo-Json | Out-File (Join-Path $locDir "locstatus.json")
.\VerifyLanguageFiles.ps1
================================================
FILE: crowdin.yml
================================================
files:
- source: LocSource.xaml
translation: /%original_path%/%locale_with_underscore%.xaml
================================================
FILE: source/.editorconfig
================================================
[*.cs]
# IDE0058: Expression value is never used
dotnet_diagnostic.IDE0058.severity = none
# IDE0036: Order modifiers
dotnet_diagnostic.IDE0036.severity = none
# IDE0025: Use expression body for properties
dotnet_diagnostic.IDE0025.severity = none
================================================
FILE: source/Playnite/API/AddonsAPI.cs
================================================
using Playnite.Plugins;
using Playnite.SDK;
using Playnite.SDK.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Playnite.API
{
public class AddonsAPI : IAddons
{
private readonly ExtensionFactory extensions;
private readonly PlayniteSettings settings;
public List DisabledAddons => settings.DisabledPlugins.ToList();
public List Addons => ExtensionFactory.GetInstalledManifests().Select(a => a.Id).ToList();
public List Plugins => extensions.Plugins.Select(a => a.Value.Plugin).ToList();
public AddonsAPI(ExtensionFactory extensions, PlayniteSettings settings)
{
this.extensions = extensions;
this.settings = settings;
}
}
}
================================================
FILE: source/Playnite/API/DatabaseAPI.cs
================================================
using LiteDB;
using Playnite.Database;
using Playnite.SDK;
using Playnite.SDK.Models;
using Playnite.SDK.Plugins;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Playnite.API
{
public class DatabaseAPI : IGameDatabaseAPI
{
private GameDatabase database;
#pragma warning disable CS0067
public event EventHandler DatabaseOpened;
#pragma warning restore CS0067
public IItemCollection Games => database.Games;
public IItemCollection Platforms => database.Platforms;
public IItemCollection Emulators => database.Emulators;
public IItemCollection Genres => database.Genres;
public IItemCollection Companies => database.Companies;
public IItemCollection Tags => database.Tags;
public IItemCollection Categories => database.Categories;
public IItemCollection Series => database.Series;
public IItemCollection AgeRatings => database.AgeRatings;
public IItemCollection Regions => database.Regions;
public IItemCollection Sources => database.Sources;
public IItemCollection Features => database.Features;
public IItemCollection GameScanners => database.GameScanners;
public IItemCollection CompletionStatuses => database.CompletionStatuses;
public IItemCollection ImportExclusions => database.ImportExclusions;
public IItemCollection FilterPresets => database.FilterPresets;
public string DatabasePath
{
get => database?.DatabasePath;
}
public bool IsOpen
{
get => database?.IsOpen == true;
}
public DatabaseAPI(GameDatabase database)
{
this.database = database;
}
public string AddFile(string path, Guid parentId)
{
if (!File.Exists(path))
{
throw new FileNotFoundException("Cannot add file to database, file not found.");
}
return database.AddFile(path, parentId, false, CancellationToken.None);
}
public void SaveFile(string id, string path)
{
database.CopyFile(id, path);
}
public void RemoveFile(string id)
{
database.RemoveFile(id);
}
public IDisposable BufferedUpdate()
{
return database.BufferedUpdate();
}
public string GetFileStoragePath(Guid parentId)
{
return database.GetFileStoragePath(parentId);
}
public string GetFullFilePath(string databasePath)
{
return database.GetFullFilePath(databasePath);
}
public Game ImportGame(GameMetadata game)
{
return database.ImportGame(game);
}
public Game ImportGame(GameMetadata game, LibraryPlugin sourcePlugin)
{
return database.ImportGame(game, sourcePlugin.Id);
}
public void BeginBufferUpdate()
{
database.BeginBufferUpdate();
}
public void EndBufferUpdate()
{
database.EndBufferUpdate();
}
public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings)
{
return database.GetGameMatchesFilter(game, filterSettings, false);
}
public IEnumerable GetFilteredGames(FilterPresetSettings filterSettings)
{
return database.GetFilteredGames(filterSettings, false);
}
public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings, bool useFuzzyNameMatch)
{
return database.GetGameMatchesFilter(game, filterSettings, useFuzzyNameMatch);
}
public IEnumerable GetFilteredGames(FilterPresetSettings filterSettings, bool useFuzzyNameMatch)
{
return database.GetFilteredGames(filterSettings, useFuzzyNameMatch);
}
}
}
================================================
FILE: source/Playnite/API/DesignData/DesignNotificationsAPI.cs
================================================
using Playnite.Commands;
using Playnite.SDK;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Playnite.API.DesignData
{
public class DesignNotificationsAPI : ObservableObject, INotificationsAPI
{
public RelayCommand