├── .github ├── FUNDING.yml └── workflows │ └── build.yaml ├── .gitignore ├── App.xaml ├── Common ├── Constants │ ├── App.cs │ ├── Directory.cs │ ├── Resource.cs │ └── SoundFile.cs ├── EnumConverter.cs ├── Extensions │ └── List.cs └── StringUtilities.cs ├── Contributors.md ├── Downloaders ├── DownloadManager.cs ├── IDownloadManager.cs ├── IDownloader.cs ├── KHDownloader.cs └── YtDownloader.cs ├── LICENSE ├── Localization.cs ├── Localization ├── LocSource.xaml ├── af_ZA.xaml ├── ar_SA.xaml ├── ca_ES.xaml ├── cs_CZ.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 ├── he_IL.xaml ├── hr_HR.xaml ├── hu_HU.xaml ├── id_ID.xaml ├── it_IT.xaml ├── ja_JP.xaml ├── ko_KR.xaml ├── lt_LT.xaml ├── nl_NL.xaml ├── no_NO.xaml ├── pl_PL.xaml ├── pt_BR.xaml ├── pt_PT.xaml ├── ro_RO.xaml ├── ru_RU.xaml ├── sk_SK.xaml ├── sr_SP.xaml ├── sv_SE.xaml ├── tr_TR.xaml ├── uk_UA.xaml ├── vi_VN.xaml ├── zh_CN.xaml └── zh_TW.xaml ├── Models ├── Album.cs ├── AudioState.cs ├── DownloadItem.cs ├── GenericObjectOption.cs ├── MusicType.cs ├── PlayniteSoundSettings.cs ├── Song.cs └── Source.cs ├── PlayerEntry.cs ├── PlayniteSounds.cs ├── PlayniteSounds.csproj ├── PlayniteSounds.sln ├── PlayniteSounds.yaml ├── PlayniteSoundsSettingsView.xaml ├── PlayniteSoundsSettingsView.xaml.cs ├── PlayniteSoundsSettingsViewModel.cs ├── Properties └── AssemblyInfo.cs ├── README.md ├── Scripts ├── UpdatePlaynite.ps1 └── XamlUpdater.ps1 ├── Sound Files ├── D_ApplicationStarted.wav ├── D_ApplicationStopped.wav ├── D_GameInstalled.wav ├── D_GameSelected.wav ├── D_GameStarting.wav ├── D_GameUninstalled.wav ├── D_LibraryUpdated.wav ├── F_ApplicationStarted.wav ├── F_ApplicationStopped.wav ├── F_GameInstalled.wav ├── F_GameSelected.wav ├── F_GameStarting.wav ├── F_GameUninstalled.wav ├── F_LibraryUpdated.wav ├── SoundCredits.txt └── _music_.mp3 ├── _config.yml ├── app.config ├── extension.yaml ├── icon.png └── packages.config /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: joyrider3774 2 | -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | on: 2 | release: 3 | types: [published] 4 | 5 | name: Build and Upload Release Asset 6 | 7 | jobs: 8 | build: 9 | name: Build and Upload Release Asset 10 | runs-on: windows-latest 11 | steps: 12 | - name: Checkout code 13 | uses: actions/checkout@v2 14 | 15 | - name: Add msbuild to PATH 16 | uses: microsoft/setup-msbuild@v1.0.3 17 | 18 | - name: Setup NuGet.exe 19 | uses: nuget/setup-nuget@v1 20 | 21 | - name: Restore NuGet Packages 22 | run: nuget restore PlayniteSounds.sln 23 | 24 | - name: Build and Publish 25 | run: | 26 | msbuild PlayniteSounds.sln /p:Configuration=Release 27 | $version = ($env:GITHUB_REF -Split "/")[-1] 28 | echo "VERSION=$version" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append 29 | 30 | - name: Setup Playnite 31 | run: | 32 | mkdir playnite 33 | Invoke-WebRequest -Uri "https://github.com/JosefNemec/Playnite/releases/download/9.16/Playnite916.zip" -OutFile "playnite\Playnite916.zip" 34 | Expand-Archive "playnite\playnite916.zip" -DestinationPath "playnite" 35 | 36 | - name: Package release 37 | run: | 38 | mkdir release 39 | playnite\toolbox.exe pack "bin\release" "release" 40 | $contents = Get-ChildItem -Path "release" -Force -Recurse -File | Select-Object -First 1 41 | echo "PEXTFILE=$contents" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append 42 | 43 | - name: Upload Release Asset 44 | id: upload-release-asset 45 | uses: actions/upload-release-asset@v1 46 | env: 47 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 48 | with: 49 | upload_url: ${{ github.event.release.upload_url }} 50 | asset_path: ${{ env.PEXTFILE }} 51 | asset_name: PlayniteSounds-${{ env.VERSION }}.pext 52 | asset_content_type: application/zip 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # ASP.NET Scaffolding 66 | ScaffoldingReadMe.txt 67 | 68 | # StyleCop 69 | StyleCopReport.xml 70 | 71 | # Files built by Visual Studio 72 | *_i.c 73 | *_p.c 74 | *_h.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.iobj 79 | *.pch 80 | *.pdb 81 | *.ipdb 82 | *.pgc 83 | *.pgd 84 | *.rsp 85 | *.sbr 86 | *.tlb 87 | *.tli 88 | *.tlh 89 | *.tmp 90 | *.tmp_proj 91 | *_wpftmp.csproj 92 | *.log 93 | *.vspscc 94 | *.vssscc 95 | .builds 96 | *.pidb 97 | *.svclog 98 | *.scc 99 | 100 | # Chutzpah Test files 101 | _Chutzpah* 102 | 103 | # Visual C++ cache files 104 | ipch/ 105 | *.aps 106 | *.ncb 107 | *.opendb 108 | *.opensdf 109 | *.sdf 110 | *.cachefile 111 | *.VC.db 112 | *.VC.VC.opendb 113 | 114 | # Visual Studio profiler 115 | *.psess 116 | *.vsp 117 | *.vspx 118 | *.sap 119 | 120 | # Visual Studio Trace Files 121 | *.e2e 122 | 123 | # TFS 2012 Local Workspace 124 | $tf/ 125 | 126 | # Guidance Automation Toolkit 127 | *.gpState 128 | 129 | # ReSharper is a .NET coding add-in 130 | _ReSharper*/ 131 | *.[Rr]e[Ss]harper 132 | *.DotSettings.user 133 | 134 | # TeamCity is a build add-in 135 | _TeamCity* 136 | 137 | # DotCover is a Code Coverage Tool 138 | *.dotCover 139 | 140 | # AxoCover is a Code Coverage Tool 141 | .axoCover/* 142 | !.axoCover/settings.json 143 | 144 | # Coverlet is a free, cross platform Code Coverage Tool 145 | coverage*.json 146 | coverage*.xml 147 | coverage*.info 148 | 149 | # Visual Studio code coverage results 150 | *.coverage 151 | *.coveragexml 152 | 153 | # NCrunch 154 | _NCrunch_* 155 | .*crunch*.local.xml 156 | nCrunchTemp_* 157 | 158 | # MightyMoose 159 | *.mm.* 160 | AutoTest.Net/ 161 | 162 | # Web workbench (sass) 163 | .sass-cache/ 164 | 165 | # Installshield output folder 166 | [Ee]xpress/ 167 | 168 | # DocProject is a documentation generator add-in 169 | DocProject/buildhelp/ 170 | DocProject/Help/*.HxT 171 | DocProject/Help/*.HxC 172 | DocProject/Help/*.hhc 173 | DocProject/Help/*.hhk 174 | DocProject/Help/*.hhp 175 | DocProject/Help/Html2 176 | DocProject/Help/html 177 | 178 | # Click-Once directory 179 | publish/ 180 | 181 | # Publish Web Output 182 | *.[Pp]ublish.xml 183 | *.azurePubxml 184 | # Note: Comment the next line if you want to checkin your web deploy settings, 185 | # but database connection strings (with potential passwords) will be unencrypted 186 | *.pubxml 187 | *.publishproj 188 | 189 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 190 | # checkin your Azure Web App publish settings, but sensitive information contained 191 | # in these scripts will be unencrypted 192 | PublishScripts/ 193 | 194 | # NuGet Packages 195 | *.nupkg 196 | # NuGet Symbol Packages 197 | *.snupkg 198 | # The packages folder can be ignored because of Package Restore 199 | **/[Pp]ackages/* 200 | # except build/, which is used as an MSBuild target. 201 | !**/[Pp]ackages/build/ 202 | # Uncomment if necessary however generally it will be regenerated when needed 203 | #!**/[Pp]ackages/repositories.config 204 | # NuGet v3's project.json files produces more ignorable files 205 | *.nuget.props 206 | *.nuget.targets 207 | 208 | # Microsoft Azure Build Output 209 | csx/ 210 | *.build.csdef 211 | 212 | # Microsoft Azure Emulator 213 | ecf/ 214 | rcf/ 215 | 216 | # Windows Store app package directories and files 217 | AppPackages/ 218 | BundleArtifacts/ 219 | Package.StoreAssociation.xml 220 | _pkginfo.txt 221 | *.appx 222 | *.appxbundle 223 | *.appxupload 224 | 225 | # Visual Studio cache files 226 | # files ending in .cache can be ignored 227 | *.[Cc]ache 228 | # but keep track of directories ending in .cache 229 | !?*.[Cc]ache/ 230 | 231 | # Others 232 | ClientBin/ 233 | ~$* 234 | *~ 235 | *.dbmdl 236 | *.dbproj.schemaview 237 | *.jfm 238 | *.pfx 239 | *.publishsettings 240 | orleans.codegen.cs 241 | 242 | # Including strong name files can present a security risk 243 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 244 | #*.snk 245 | 246 | # Since there are multiple workflows, uncomment next line to ignore bower_components 247 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 248 | #bower_components/ 249 | 250 | # RIA/Silverlight projects 251 | Generated_Code/ 252 | 253 | # Backup & report files from converting an old project file 254 | # to a newer Visual Studio version. Backup files are not needed, 255 | # because we have git ;-) 256 | _UpgradeReport_Files/ 257 | Backup*/ 258 | UpgradeLog*.XML 259 | UpgradeLog*.htm 260 | ServiceFabricBackup/ 261 | *.rptproj.bak 262 | 263 | # SQL Server files 264 | *.mdf 265 | *.ldf 266 | *.ndf 267 | 268 | # Business Intelligence projects 269 | *.rdl.data 270 | *.bim.layout 271 | *.bim_*.settings 272 | *.rptproj.rsuser 273 | *- [Bb]ackup.rdl 274 | *- [Bb]ackup ([0-9]).rdl 275 | *- [Bb]ackup ([0-9][0-9]).rdl 276 | 277 | # Microsoft Fakes 278 | FakesAssemblies/ 279 | 280 | # GhostDoc plugin setting file 281 | *.GhostDoc.xml 282 | 283 | # Node.js Tools for Visual Studio 284 | .ntvs_analysis.dat 285 | node_modules/ 286 | 287 | # Visual Studio 6 build log 288 | *.plg 289 | 290 | # Visual Studio 6 workspace options file 291 | *.opt 292 | 293 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 294 | *.vbw 295 | 296 | # Visual Studio LightSwitch build output 297 | **/*.HTMLClient/GeneratedArtifacts 298 | **/*.DesktopClient/GeneratedArtifacts 299 | **/*.DesktopClient/ModelManifest.xml 300 | **/*.Server/GeneratedArtifacts 301 | **/*.Server/ModelManifest.xml 302 | _Pvt_Extensions 303 | 304 | # Paket dependency manager 305 | .paket/paket.exe 306 | paket-files/ 307 | 308 | # FAKE - F# Make 309 | .fake/ 310 | 311 | # CodeRush personal settings 312 | .cr/personal 313 | 314 | # Python Tools for Visual Studio (PTVS) 315 | __pycache__/ 316 | *.pyc 317 | 318 | # Cake - Uncomment if you are using it 319 | # tools/** 320 | # !tools/packages.config 321 | 322 | # Tabs Studio 323 | *.tss 324 | 325 | # Telerik's JustMock configuration file 326 | *.jmconfig 327 | 328 | # BizTalk build output 329 | *.btp.cs 330 | *.btm.cs 331 | *.odx.cs 332 | *.xsd.cs 333 | 334 | # OpenCover UI analysis results 335 | OpenCover/ 336 | 337 | # Azure Stream Analytics local run output 338 | ASALocalRun/ 339 | 340 | # MSBuild Binary and Structured Log 341 | *.binlog 342 | 343 | # NVidia Nsight GPU debugger configuration file 344 | *.nvuser 345 | 346 | # MFractors (Xamarin productivity tool) working folder 347 | .mfractor/ 348 | 349 | # Local History for Visual Studio 350 | .localhistory/ 351 | 352 | # BeatPulse healthcheck temp database 353 | healthchecksdb 354 | 355 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 356 | MigrationBackup/ 357 | 358 | # Ionide (cross platform F# VS Code tools) working folder 359 | .ionide/ 360 | 361 | # Fody - auto-generated XML schema 362 | FodyWeavers.xsd 363 | /playnite 364 | -------------------------------------------------------------------------------- /App.xaml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Common/Constants/App.cs: -------------------------------------------------------------------------------- 1 | namespace PlayniteSounds.Common.Constants 2 | { 3 | public static class App 4 | { 5 | public const string AppName = "Playnite Sounds"; 6 | public const string MainMenuName = "@" + AppName; 7 | public const string ExtraMetaGuid = "705fdbca-e1fc-4004-b839-1d040b8b4429"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Common/Constants/Directory.cs: -------------------------------------------------------------------------------- 1 | namespace PlayniteSounds.Common.Constants 2 | { 3 | public static class SoundDirectory 4 | { 5 | public const string NoPlatform = "No Platform"; 6 | public const string Music = "Music Files"; 7 | public const string Game = "Game"; 8 | public const string Platform = "Platform"; 9 | public const string Filter = "Filter"; 10 | public const string Default = "Default"; 11 | public const string Sound = "Sound Files"; 12 | public const string SoundManager = "Sound Manager"; 13 | public const string Localization = "Localization"; 14 | public const string Orphans = "Orphans"; 15 | public const string ExtraMetaData = "ExtraMetadata"; 16 | public const string GamesFolder = "Games"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Common/Constants/SoundFile.cs: -------------------------------------------------------------------------------- 1 | using Playnite.SDK; 2 | 3 | namespace PlayniteSounds.Common.Constants 4 | { 5 | public class SoundFile 6 | { 7 | public static IPlayniteInfoAPI ApplicationInfo { get; set; } 8 | 9 | 10 | public const string DefaultMusicName = "_music_.mp3"; 11 | public const string LocalizationSource = "LocSource"; 12 | public const string DefaultNormArgs = "-lrt 20 -c:a libmp3lame"; 13 | 14 | public static string ApplicationStartedSound => CurrentPrefix + BaseApplicationStartedSound; 15 | public static string ApplicationStoppedSound => CurrentPrefix + BaseApplicationStoppedSound; 16 | public static string GameInstalledSound => CurrentPrefix + BaseGameInstalledSound; 17 | public static string GameSelectedSound => CurrentPrefix + BaseGameSelectedSound; 18 | public static string GameStartedSound => CurrentPrefix + BaseGameStartedSound; 19 | public static string GameStartingSound => CurrentPrefix + BaseGameStartingSound; 20 | public static string GameStoppedSound => CurrentPrefix + BaseGameStoppedSound; 21 | public static string GameUninstalledSound => CurrentPrefix + BaseGameUninstalledSound; 22 | public static string LibraryUpdatedSound => CurrentPrefix + BaseLibraryUpdatedSound; 23 | 24 | //TODO: Move bool logic to some common location 25 | public static string CurrentPrefix => ApplicationInfo.Mode == ApplicationMode.Desktop ? DesktopPrefix : FullScreenPrefix; 26 | public const string DesktopPrefix = "D_"; 27 | public const string FullScreenPrefix = "F_"; 28 | 29 | public const string BaseApplicationStartedSound = "ApplicationStarted.wav"; 30 | public const string BaseApplicationStoppedSound = "ApplicationStopped.wav"; 31 | public const string BaseGameInstalledSound = "GameInstalled.wav"; 32 | public const string BaseGameSelectedSound = "GameSelected.wav"; 33 | public const string BaseGameStartedSound = "GameStarted.wav"; 34 | public const string BaseGameStartingSound = "GameStarting.wav"; 35 | public const string BaseGameStoppedSound = "GameStopped.wav"; 36 | public const string BaseGameUninstalledSound = "GameUninstalled.wav"; 37 | public const string BaseLibraryUpdatedSound = "LibraryUpdated.wav"; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Common/EnumConverter.cs: -------------------------------------------------------------------------------- 1 | using PlayniteSounds.Models; 2 | using System; 3 | using System.Globalization; 4 | using System.Windows.Data; 5 | using System.Windows.Markup; 6 | 7 | //TODO: Properly investigate way to make generic EnumConverter work with wpf/xaml 8 | // Possible solution may involve factory: https://stackoverflow.com/questions/8235421/how-do-i-set-wpf-xaml-forms-design-datacontext-to-class-that-uses-generic-type/8235459#8235459 9 | namespace PlayniteSounds.Common 10 | { 11 | public class MusicTypeConverter : BaseValueConverter 12 | { 13 | public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) => (int)value; 14 | 15 | public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => (MusicType)value; 16 | } 17 | 18 | public class AudioStateConverter : BaseValueConverter 19 | { 20 | public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) => (int)value; 21 | 22 | public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => (AudioState)value; 23 | } 24 | 25 | public abstract class BaseValueConverter : MarkupExtension, IValueConverter where T : class, new() 26 | { 27 | private static T _converter; 28 | 29 | public override object ProvideValue(IServiceProvider serviceProvider) => _converter ?? (_converter = new T()); 30 | 31 | public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture); 32 | 33 | public abstract object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture); 34 | } 35 | } -------------------------------------------------------------------------------- /Common/Extensions/List.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | 4 | namespace PlayniteSounds.Common.Extensions 5 | { 6 | public static class List 7 | { 8 | public static TItem Pop(this IList list) 9 | { 10 | var item = list.LastOrDefault(); 11 | 12 | if (list.Count > 0) 13 | { 14 | list.RemoveAt(list.Count - 1); 15 | } 16 | 17 | return item; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Common/StringUtilities.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text.RegularExpressions; 6 | using PlayniteSounds.Common.Extensions; 7 | 8 | namespace PlayniteSounds.Common 9 | { 10 | internal class StringUtilities 11 | { 12 | private static readonly string[] StringsToRemove = { "-", ":"}; 13 | private static readonly IDictionary StringsToReplace = new Dictionary { { " & ", @" (&|and) " } }; 14 | private static readonly IDictionary ReplaceExtraWhitespace = new Dictionary { { " ", " " } }; 15 | private static readonly string InvalidCharacters = new string(Path.GetInvalidFileNameChars()); 16 | private static readonly Regex InvalidCharsRegex = new Regex($"[{Regex.Escape(InvalidCharacters)}]"); 17 | 18 | public static string StripStrings(string stringToStrip, string[] stringsToRemove = null) 19 | { 20 | stringsToRemove = stringsToRemove ?? StringsToRemove; 21 | stringToStrip = stringsToRemove.Aggregate(stringToStrip, (current, str) => current.Replace(str, "")); 22 | return ReplaceStrings(stringToStrip, ReplaceExtraWhitespace); 23 | } 24 | 25 | public static string ReplaceStrings(string stringToSub, IDictionary stringsToReplace = null) 26 | { 27 | stringsToReplace = stringsToReplace ?? StringsToReplace; 28 | return stringsToReplace.Aggregate(stringToSub, (current, stringToReplace) 29 | => current.Replace(stringToReplace.Key, stringToReplace.Value)); 30 | } 31 | 32 | public static string SanitizeGameName(string gameName) => InvalidCharsRegex.Replace(gameName, string.Empty); 33 | 34 | public static TimeSpan? GetTimeSpan(string time) 35 | { 36 | if (string.IsNullOrEmpty(time)) return null; 37 | 38 | var times = time.Split(':').ToList(); 39 | 40 | var seconds = PopToInt(times); 41 | var minutes = PopToInt(times); 42 | var hours = PopToInt(times); 43 | 44 | return new TimeSpan(hours, minutes, seconds); 45 | } 46 | 47 | private static int PopToInt(IList strings) 48 | { 49 | var str = strings.Pop(); 50 | return string.IsNullOrWhiteSpace(str) ? 0 : int.Parse(str); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Contributors.md: -------------------------------------------------------------------------------- 1 | | **NAME** | **USERNAME** | **STATUS** | 2 | | --- | --- | --- | 3 | | Willems Davy | @joyrider3774 | Active | 4 | | Cameron Napolitano | @cnapolit | Active | 5 | | Daniel Firsht | @dfirsht | - | 6 | | - | Lacro59 | - | 7 | -------------------------------------------------------------------------------- /Downloaders/DownloadManager.cs: -------------------------------------------------------------------------------- 1 | using HtmlAgilityPack; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net.Http; 5 | using System.Text.RegularExpressions; 6 | using System; 7 | using PlayniteSounds.Models; 8 | 9 | namespace PlayniteSounds.Downloaders 10 | { 11 | internal class DownloadManager : IDownloadManager 12 | { 13 | private static readonly TimeSpan MaxTime = new TimeSpan(0, 8, 0); 14 | private static readonly HtmlWeb Web = new HtmlWeb(); 15 | private static readonly HttpClient HttpClient = new HttpClient(); 16 | 17 | private static readonly List SongTitleEnds = new List { "Theme", "Title", "Menu" }; 18 | 19 | private readonly PlayniteSoundsSettings _settings; 20 | 21 | private readonly IDownloader _khDownloader; 22 | private readonly IDownloader _ytDownloader; 23 | 24 | public DownloadManager(PlayniteSoundsSettings settings) 25 | { 26 | _settings = settings; 27 | _khDownloader = new KhDownloader(HttpClient, Web); 28 | _ytDownloader = new YtDownloader(HttpClient, _settings); 29 | } 30 | 31 | public IEnumerable GetAlbumsForGame(string gameName, Source source, bool auto = false) 32 | { 33 | if ((source is Source.All || source is Source.Youtube) && string.IsNullOrWhiteSpace(_settings.FFmpegPath)) 34 | { 35 | throw new Exception("Cannot download from Youtube without the FFmpeg Path specified in settings."); 36 | } 37 | 38 | if (source is Source.All) 39 | return (_settings.AutoParallelDownload && auto) || (_settings.ManualParallelDownload && !auto) 40 | ? _settings.Downloaders.SelectMany(d => GetAlbumFromSource(gameName, d, auto)) 41 | : _settings.Downloaders.Select(d => GetAlbumFromSource(gameName, d, auto)).FirstOrDefault(dl => dl.Any()); 42 | 43 | return SourceToDownloader(source).GetAlbumsForGame(gameName, auto); 44 | } 45 | 46 | public IEnumerable GetSongsFromAlbum(Album album) 47 | => SourceToDownloader(album.Source).GetSongsFromAlbum(album); 48 | 49 | public bool DownloadSong(Song song, string path) 50 | => SourceToDownloader(song.Source).DownloadSong(song, path); 51 | 52 | public Album BestAlbumPick(IEnumerable albums, string gameName, string regexGameName) 53 | { 54 | var albumsList = albums.ToList(); 55 | 56 | if (albumsList.Count is 1) 57 | { 58 | return albumsList.First(); 59 | } 60 | 61 | var ostRegex = new Regex($@"{regexGameName}.*(Soundtrack|OST|Score)", RegexOptions.IgnoreCase); 62 | var ostMatch = albumsList.FirstOrDefault(a => ostRegex.IsMatch(a.Name)); 63 | if (ostMatch != null) 64 | { 65 | return ostMatch; 66 | } 67 | 68 | var exactMatch = albumsList.FirstOrDefault(a => string.Equals(a.Name, gameName, StringComparison.OrdinalIgnoreCase)); 69 | if (exactMatch != null) 70 | { 71 | return exactMatch; 72 | } 73 | 74 | var closeMatch = albumsList.FirstOrDefault(a => a.Name.StartsWith(gameName, StringComparison.OrdinalIgnoreCase)); 75 | return closeMatch ?? albumsList.FirstOrDefault(); 76 | } 77 | 78 | public Song BestSongPick(IEnumerable songs, string regexGameName) 79 | { 80 | var songsList = songs.Where(s => !s.Length.HasValue || s.Length.Value < MaxTime).ToList(); 81 | 82 | if (songsList.Count is 1) 83 | { 84 | return songsList.First(); 85 | } 86 | 87 | var titleMatch = songsList.FirstOrDefault(s => SongTitleEnds.Any(e => s.Name.EndsWith(e))); 88 | if (titleMatch != null) 89 | { 90 | return titleMatch; 91 | } 92 | 93 | var nameRegex = new Regex(regexGameName, RegexOptions.IgnoreCase); 94 | var gameNameMatch = songsList.FirstOrDefault(s => nameRegex.IsMatch(s.Name)); 95 | return gameNameMatch ?? songsList.FirstOrDefault(); 96 | } 97 | 98 | private IDownloader SourceToDownloader(Source source) 99 | { 100 | switch (source) 101 | { 102 | case Source.KHInsider: return _khDownloader; 103 | case Source.Youtube: return _ytDownloader; 104 | default: throw new ArgumentException($"Unrecognized download source: {source}"); 105 | } 106 | } 107 | 108 | private IEnumerable GetAlbumFromSource(string gameName, Source source, bool auto) 109 | => SourceToDownloader(source).GetAlbumsForGame(gameName, auto); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /Downloaders/IDownloadManager.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using PlayniteSounds.Models; 3 | 4 | namespace PlayniteSounds.Downloaders 5 | { 6 | internal interface IDownloadManager 7 | { 8 | Album BestAlbumPick(IEnumerable albums, string gameName, string regexGameName); 9 | Song BestSongPick(IEnumerable songs, string regexGameName); 10 | IEnumerable GetAlbumsForGame(string gameName, Source source, bool auto = false); 11 | IEnumerable GetSongsFromAlbum(Album album); 12 | bool DownloadSong(Song song, string path); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Downloaders/IDownloader.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using PlayniteSounds.Models; 3 | 4 | namespace PlayniteSounds.Downloaders 5 | { 6 | internal interface IDownloader 7 | { 8 | string BaseUrl(); 9 | Source DownloadSource(); 10 | IEnumerable GetAlbumsForGame(string gameName, bool auto = false); 11 | IEnumerable GetSongsFromAlbum(Album album); 12 | bool DownloadSong(Song song, string path); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Downloaders/KHDownloader.cs: -------------------------------------------------------------------------------- 1 | using Playnite.SDK; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Net.Http; 6 | using HtmlAgilityPack; 7 | using PlayniteSounds.Common; 8 | using PlayniteSounds.Models; 9 | 10 | namespace PlayniteSounds.Downloaders 11 | { 12 | internal class KhDownloader : IDownloader 13 | { 14 | private static readonly ILogger Logger = LogManager.GetLogger(); 15 | 16 | private readonly HttpClient _httpClient; 17 | private readonly HtmlWeb _web; 18 | 19 | private const string KhInsiderBaseUrl = @"https://downloads.khinsider.com/"; 20 | public string BaseUrl() => KhInsiderBaseUrl; 21 | 22 | private const Source Source = Models.Source.KHInsider; 23 | public Source DownloadSource() => Source; 24 | 25 | public KhDownloader(HttpClient httpClient, HtmlWeb web) 26 | { 27 | _httpClient = httpClient; 28 | _web = web; 29 | } 30 | 31 | public IEnumerable GetAlbumsForGame(string gameName, bool auto = false) 32 | { 33 | 34 | var albumsToPartialUrls = new List(); 35 | 36 | var htmlDoc = _web.Load($"{KhInsiderBaseUrl}search?search={gameName}"); 37 | 38 | var tableRows = htmlDoc.DocumentNode.Descendants("tr").Skip(1); 39 | foreach (var row in tableRows) 40 | { 41 | var columnEntries = row.Descendants("td").ToList(); 42 | 43 | var iconUrl = string.Empty; 44 | var iconField = columnEntries.FirstOrDefault(); 45 | if (iconField != null) 46 | { 47 | var img = iconField.Descendants("img").FirstOrDefault(); 48 | if (img != null) 49 | { 50 | iconUrl = img.GetAttributeValue("src", string.Empty); 51 | } 52 | } 53 | 54 | var titleField = columnEntries.ElementAtOrDefault(1); 55 | if (titleField == null) 56 | { 57 | Logger.Info($"Found album entry of game '{gameName}' without title field"); 58 | continue; 59 | } 60 | 61 | var htmlLink = titleField.Descendants("a").FirstOrDefault(); 62 | if (htmlLink == null) 63 | { 64 | Logger.Info($"Found entry for album entry of game '{gameName}' without title"); 65 | continue; 66 | } 67 | 68 | var albumName = htmlLink.InnerHtml; 69 | var albumPartialLink = htmlLink.GetAttributeValue("href", null); 70 | if (albumPartialLink == null) 71 | { 72 | Logger.Info($"Found entry for album '{albumName}' of game '{gameName}' without link in title"); 73 | continue; 74 | } 75 | 76 | var album = new Album 77 | { 78 | Name = StringUtilities.StripStrings(albumName), 79 | Id = albumPartialLink, 80 | Source = Source.KHInsider, 81 | IconUrl = iconUrl 82 | }; 83 | 84 | var platformEntry = columnEntries.ElementAtOrDefault(1); 85 | if (platformEntry != null) 86 | { 87 | var platforms = platformEntry.Descendants("a") 88 | .Select(d => d.InnerHtml) 89 | .Where(platform => !string.IsNullOrWhiteSpace(platform)).ToList(); 90 | 91 | if (platforms.Any()) 92 | { 93 | album.Platforms = platforms; 94 | } 95 | } 96 | 97 | albumsToPartialUrls.Add(album); 98 | } 99 | 100 | return albumsToPartialUrls; 101 | } 102 | 103 | public IEnumerable GetSongsFromAlbum(Album album) 104 | { 105 | var songs = new List(); 106 | 107 | var htmlDoc = _web.Load($"{KhInsiderBaseUrl}{album.Id}"); 108 | 109 | // Validate Html 110 | var headerRow = htmlDoc.GetElementbyId("songlist_header"); 111 | var headers = headerRow.Descendants("th").Select(n => n.InnerHtml); 112 | if (headers.All(h => !h.Contains("MP3"))) 113 | { 114 | Logger.Info($"No mp3 in album '{album.Name}'"); 115 | return songs; 116 | } 117 | 118 | var table = htmlDoc.GetElementbyId("songlist"); 119 | 120 | // Get table and skip header 121 | var tableRows = table.Descendants("tr").Skip(1).ToList(); 122 | if (tableRows.Count < 2) 123 | { 124 | Logger.Info($"No songs in album '{album.Name}'"); 125 | return songs; 126 | } 127 | 128 | // Remove footer 129 | tableRows.RemoveAt(tableRows.Count - 1); 130 | 131 | foreach (var row in tableRows) 132 | { 133 | var rowEntries = row.Descendants("a").ToList(); 134 | 135 | var songNameEntry = rowEntries.FirstOrDefault(); 136 | if (songNameEntry == null) 137 | { 138 | continue; 139 | } 140 | 141 | var partialUrl = songNameEntry.GetAttributeValue("href", null); 142 | if (string.IsNullOrWhiteSpace(partialUrl)) 143 | { 144 | continue; 145 | } 146 | 147 | var song = new Song 148 | { 149 | Name = StringUtilities.StripStrings(songNameEntry.InnerHtml), 150 | Id = partialUrl, 151 | Source = Source.KHInsider 152 | }; 153 | 154 | var lengthEntry = rowEntries.ElementAtOrDefault(1); 155 | if (lengthEntry != null && !string.IsNullOrWhiteSpace(lengthEntry.InnerHtml)) 156 | { 157 | song.Length = StringUtilities.GetTimeSpan(lengthEntry.InnerHtml); 158 | } 159 | 160 | var sizeEntry = rowEntries.ElementAtOrDefault(2); 161 | if (sizeEntry != null && !string.IsNullOrWhiteSpace(sizeEntry.InnerHtml)) 162 | { 163 | song.SizeInMb = sizeEntry.InnerHtml; 164 | } 165 | 166 | songs.Add(song); 167 | } 168 | 169 | return songs; 170 | } 171 | 172 | public bool DownloadSong(Song song, string path) 173 | { 174 | // Get Url to file from Song html page 175 | var htmlDoc = _web.Load($"{KhInsiderBaseUrl}{song.Id}"); 176 | 177 | var fileUrl = htmlDoc.GetElementbyId("audio").GetAttributeValue("src", null); 178 | if (fileUrl == null) 179 | { 180 | Logger.Info($"Did not find file url for song '{song.Name}'"); 181 | return false; 182 | } 183 | 184 | var httpMessage = _httpClient.GetAsync(fileUrl).Result; 185 | using (var fs = File.Create(path)) 186 | { 187 | httpMessage.Content.CopyToAsync(fs).Wait(); 188 | } 189 | 190 | return true; 191 | } 192 | } 193 | } 194 | -------------------------------------------------------------------------------- /Downloaders/YtDownloader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net.Http; 5 | using System.Threading.Tasks; 6 | using Playnite.SDK; 7 | using PlayniteSounds.Models; 8 | using YoutubeExplode; 9 | using YoutubeExplode.Common; 10 | using YoutubeExplode.Converter; 11 | using YoutubeExplode.Search; 12 | 13 | namespace PlayniteSounds.Downloaders 14 | { 15 | internal class YtDownloader : IDownloader 16 | { 17 | private static readonly ILogger Logger = LogManager.GetLogger(); 18 | 19 | private readonly YoutubeClient _youtubeClient; 20 | private readonly PlayniteSoundsSettings _settings; 21 | 22 | public YtDownloader(HttpClient httpClient, PlayniteSoundsSettings settings) 23 | { 24 | _youtubeClient = new YoutubeClient(httpClient); 25 | _settings = settings; 26 | } 27 | 28 | private const string BaseYtUrl = "https://www.youtube.com"; 29 | public string BaseUrl() => BaseYtUrl; 30 | 31 | private const Source DlSource = Source.Youtube; 32 | public Source DownloadSource() => DlSource; 33 | 34 | public IEnumerable GetAlbumsForGame(string gameName, bool auto = false) 35 | => GetAlbumsFromExplodeApiAsync(gameName, auto).Result; 36 | 37 | public IEnumerable GetSongsFromAlbum(Album album) 38 | => album.Songs ?? GetSongsFromExplodeApiAsync(album).ToEnumerable(); 39 | 40 | public bool DownloadSong(Song song, string path) => DownloadSongExplodeAsync(song, path).Result; 41 | 42 | private async Task> GetAlbumsFromExplodeApiAsync(string gameName, bool auto) 43 | { 44 | if (auto) 45 | { 46 | gameName += " Soundtrack"; 47 | } 48 | 49 | var albums = new List(); 50 | var videos = new List(); 51 | 52 | var videoResults = _youtubeClient.Search.GetResultBatchesAsync(gameName, SearchFilter.Video); 53 | var videoEnumerator = videoResults.GetAsyncEnumerator(); 54 | 55 | for (var i = 0; i < 1 && await videoEnumerator.MoveNextAsync(); i++) 56 | { 57 | var batchOfVideos = 58 | from VideoSearchResult videoSearchResult in videoEnumerator.Current.Items 59 | select new Song 60 | { 61 | Name = videoSearchResult.Title, 62 | Id = videoSearchResult.Id, 63 | Length = videoSearchResult.Duration, 64 | Source = DlSource, 65 | IconUrl = videoSearchResult.Thumbnails.FirstOrDefault()?.Url 66 | }; 67 | 68 | videos.AddRange(batchOfVideos); 69 | 70 | await videoEnumerator.MoveNextAsync(); 71 | } 72 | 73 | if (videos.Any()) albums.Add(new Album 74 | { 75 | Name = Common.Constants.Resource.YoutubeSearch, 76 | Songs = videos, 77 | Source = DlSource 78 | }); 79 | 80 | if (_settings.YtPlaylists) 81 | { 82 | var playlistResults = _youtubeClient.Search.GetResultBatchesAsync(gameName, SearchFilter.Playlist); 83 | 84 | var playlistEnumerator = playlistResults.GetAsyncEnumerator(); 85 | for (var i = 0; i < 1 && await playlistEnumerator.MoveNextAsync(); i++) 86 | { 87 | var batchOfPlaylists = 88 | from PlaylistSearchResult playlistSearchResult in playlistEnumerator.Current.Items 89 | select new Album 90 | { 91 | Name = playlistSearchResult.Title, 92 | Id = playlistSearchResult.Id, 93 | Source = DlSource, 94 | IconUrl = playlistSearchResult.Thumbnails.FirstOrDefault()?.Url 95 | }; 96 | 97 | albums.AddRange(batchOfPlaylists); 98 | } 99 | } 100 | 101 | return albums; 102 | } 103 | 104 | private IAsyncEnumerable GetSongsFromExplodeApiAsync(Album album) 105 | => _youtubeClient.Playlists.GetVideosAsync(album.Id).Select(video => new Song 106 | { 107 | Name = video.Title, 108 | Id = video.Id, 109 | Length = video.Duration, 110 | Source = DlSource, 111 | IconUrl= video.Thumbnails.FirstOrDefault()?.Url 112 | }); 113 | 114 | private async Task DownloadSongExplodeAsync(Song song, string path) 115 | { 116 | try 117 | { 118 | await _youtubeClient.Videos.DownloadAsync(song.Id, path, o => o.SetFFmpegPath(_settings.FFmpegPath)); 119 | return true; 120 | } 121 | catch (Exception e) 122 | { 123 | Logger.Error(e, $"Something went wrong when attempting to download from Youtube with Id '{song.Id}' and Path '{path}'"); 124 | return false; 125 | } 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Joyrider3774 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Localization.cs: -------------------------------------------------------------------------------- 1 | using Playnite.SDK; 2 | using System; 3 | using System.IO; 4 | using System.Windows; 5 | using System.Windows.Markup; 6 | using PlayniteSounds.Common.Constants; 7 | 8 | namespace PlayniteSounds 9 | 10 | { 11 | 12 | //based on code from lacro59 from 13 | //https://github.com/Lacro59/playnite-plugincommon/blob/master/Localization.cs 14 | // 15 | public class Localization 16 | { 17 | private static readonly ILogger Logger = LogManager.GetLogger(); 18 | 19 | public static void SetPluginLanguage(string pluginFolder, string language = SoundFile.LocalizationSource) 20 | { 21 | var dictionaries = Application.Current.Resources.MergedDictionaries; 22 | var langFile = Path.Combine(pluginFolder, SoundDirectory.Localization, language + ".xaml"); 23 | 24 | // Load localization 25 | if (File.Exists(langFile)) 26 | { 27 | ResourceDictionary res; 28 | try 29 | { 30 | using (var stream = new StreamReader(langFile)) 31 | { 32 | res = (ResourceDictionary)XamlReader.Load(stream.BaseStream); 33 | res.Source = new Uri(langFile, UriKind.Absolute); 34 | } 35 | 36 | foreach (var key in res.Keys) 37 | { 38 | if (res[key] is string locString && string.IsNullOrEmpty(locString)) 39 | { 40 | res.Remove(key); 41 | } 42 | } 43 | } 44 | catch (Exception ex) 45 | { 46 | Logger.Error(ex, $"Failed to parse localization file {langFile}."); 47 | return; 48 | } 49 | 50 | dictionaries.Add(res); 51 | } 52 | else 53 | { 54 | Logger.Warn($"File {langFile} not found."); 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Localization/af_ZA.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/ar_SA.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | تشغيل الصوت حيث: 8 | تشغيل الصوت حيث: 9 | نوع الموسيقى: 10 | 11 | موسيقى واحدة لجميع الألعاب والمنصات 12 | موسيقى واحدة لكل منصة 13 | موسيقى واحدة لكل منصة ولعبة 14 | تخطي أول 'اختيار صوت' بعد بدء تشغيل Playnite 15 | إيقاف الموسيقى مؤقتاً عند تعطيل أو تصغير نافذة Playnite 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | ابدأ 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | إعدادات 46 | اجراءات 47 | إعادة تحميل ملفات الصوت 48 | فتح مجلد الأصوات 49 | فتح مجلد الموسيقى 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | مساعدة 53 | إظهار اسم ملف الموسيقى 54 | تحديد ملف الموسيقى 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | تم إعادة تحميل الملفات الصوتية! 66 | الرجاء تحديد لعبة واحدة! 67 | Paths to files: 68 | 69 | أصوات Playnite هي إضافة لتشغيل الملفات الصوتية أثناء أحداث Playnite. 70 | يمكنها فقط تشغيل ملفات صوت WAV وملفات mp3 للموسيقى. 71 | هناك مجموعتان منفصلتان من ملفات الصوت. ملفات الصوت التي تبدأ بـ "D_" وملفات تبدأ بـ "F_". 72 | ملفات 'D_' هي ملفات صوتية لوضع Desktop، ملفات 'F_' لوضع Fullscreen. 73 | إذا كنت لا ترغب في سماع ملف معين يمكنك فقط حذف ملف الموجة للحدث الذي لا تريد سماعه. يمكنك تغيير الملفات مع الملفات الخاصة بك. تأكد من استخدام قائمة "فتح مجلد الملفات الصوتية" للقيام بذلك. سوف يجعل الملفات الصوتية المحملة مغلقة حتى تتمكن من الكتابة فوقها. تأكد من أن المشغل لا يقوم بتشغيل أي صوت بعد فتح المجلد أو أنه من الممكن أن لا يمكنك الكتابة فوق ذلك الملف المحدد. مع الاختبارات التي أجريها، يبدو أنك لا تزال تستطيع مسح الملفات أولاً. بعد تغيير الملفات الصوتية استخدم قائمة "إعادة تحميل ملفات الصوت" لمسح أي ملفات تم تحميلها واستخدام ملفاتك الجديدة، أو فقط إعادة تشغيل Playnite. لا تستخدم ملف صوتي طويل للتطبيق توقفت لأن Playnite لن يترك العمل حتى ينتهي تشغيل الملف الصوتي. وينطبق نفس الشيء على التبديل بين سطح المكتب ووضع ملء الشاشة. 74 | هذه هي الملفات الصوتية التي يمكن استخدامها 75 | ملفات الموسيقى يجب أن تكون ملفات mp3، اعتماداً على الإعدادات يجب أن تسمى "music_.mp3_" أو لديك اسم اللعبة مع حذف أحرف غير صالحة ووضعها في مجلد لكل منصة. إذا كنت غير متأكد تماما من اسم الملف والموقع يمكنك النقر بزر الماوس الأيمن على اللعبة واختيار خيار "إظهار اسم ملف الموسيقى". كن على علم ، يتم تغيير أسماء الملفات ومواقع ملفات الموسيقى اعتماداً على الإعدادات المختارة! 76 | 77 | مستوى الصوت: 78 | 79 | إدارة الصوت 80 | تحميل 81 | حفظ 82 | تم حفظ حزمة الصوت بنجاح: 83 | تم تحميل حزمة الصوت بنجاح: 84 | تم حذف حزمة الصوت بنجاح: 85 | إزالة 86 | استيراد 87 | فتح مجلد إدارة الصوت 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/ca_ES.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/da_DK.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/el_GR.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/eo_UY.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/et_EE.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/fa_IR.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/fi_FI.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/he_IL.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/hr_HR.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/id_ID.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/ja_JP.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/ko_KR.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | 음악 유형: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | 안 함 24 | 데스크톱 25 | 전체 화면 26 | 데스크톱 + 전체 화면 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | 설정 46 | 작업 47 | 음성 파일 새로고침 48 | 사운드 폴더 열기 49 | 음악 폴더 열기 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | 도움말 53 | 음악 파일 이름 보기 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | 음악 볼륨: 78 | 79 | 사운드 관리자 80 | 불러오기 81 | 저장 82 | 성공적으로 사운드 팩을 저장: 83 | 성공적으로 사운드 팩을 로드: 84 | 성공적으로 사운드 팩을 제거: 85 | 제거 86 | 가져오기 87 | 사운드 관리자 폴더 열기 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/lt_LT.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Play Sound where: 8 | Play Music where: 9 | Music Type: 10 | 11 | One music for all games and platforms 12 | One music per platform 13 | One music per platform and game 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | Never 24 | Desktop 25 | Fullscreen 26 | Desktop + Fullscreen 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | Settings 46 | Actions 47 | Reload Audio Files 48 | Open Sounds Folder 49 | Open Music Folder 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | Help 53 | Show Music Filename 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | Audio files reloaded! 66 | Please select a single game! 67 | Paths to files: 68 | 69 | Playnite Sounds is an extension to play audio files during Playnite events. 70 | It can only play WAV audio files, mp3 files for music and nothing else. 71 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 72 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 73 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. You can change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 74 | These are the audio files that can be used 75 | Music files need to be mp3 files, depending on the settings be named "_music_.mp3" or have the name of the game with invalid characters removed and be placed in a folder per platform. If you are not exactly sure of the filename and location you can right click on a game and choose the "Show music filename" option. Be Aware, filenames and locations of music files change depending on the settings chosen! 76 | 77 | Music Volume: 78 | 79 | Sound Manager 80 | Load 81 | Save 82 | Successfully Saved Sound Pack: 83 | Successfully Loaded Sound Pack: 84 | Successfully Deleted Sound Pack: 85 | Remove 86 | Import 87 | Open Sound Manager Folder 88 | 89 | 90 | -------------------------------------------------------------------------------- /Localization/zh_CN.xaml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 何处播放声音: 8 | 何处播放音乐: 9 | 音乐类型: 10 | 11 | 所有游戏和平台一个音乐 12 | 一个平台一个音乐 13 | 一个平台和游戏一种音乐 14 | Skip first 'select sound' after playnite startup 15 | Pause music when Playnite deactivates or minimizes 16 | Tag titles that fail to download 17 | Automatically download music for newly added games on library update 18 | Randomize music file on music end 19 | Randomize music file on every 'musictype' selection 20 | Play background music when no games are selected 21 | Stop music when 22 | 23 | 永不 24 | 桌面 25 | 全屏 26 | 桌面 + 全屏 27 | 28 | Game is starting 29 | Game has started 30 | 31 | 32 | 33 | [PS] Missing Background Music 34 | Download files 35 | Downloading files... 36 | Do you want to manually select albums? 37 | Do you want to manually select songs? 38 | Please select an album for game {0} 39 | Please select a song for album {0} 40 | Do you want to overwrite any existing files? 41 | Select option 42 | Done 43 | Automatically Downloading files... 44 | 45 | 设置 46 | 指令 47 | 重载音频文件 48 | 打开声音文件夹 49 | 打开音乐文件夹 50 | Open Selected Music Directories 51 | Delete Selected Music Directories 52 | 帮助 53 | 显示音乐文件名 54 | Select Music File 55 | Delete Music File 56 | Play Music File 57 | Songs 58 | Update Legacy Directory 59 | Platforms 60 | Default 61 | Are you sure you want to delete these directories? This action cannot be undone. 62 | Are you sure you want to delete {0}? This action cannot be undone 63 | While converting a legacy music directory, orphaned files were found. These files have been moved to: {0}. Would you like to view them? 64 | 65 | 已重载音频文件! 66 | 请选择一个游戏! 67 | Paths to files: 68 | 69 | Playnite Sounds 是一个在 Playnite 事件中播放音频文件的扩展。 70 | 它只能播放 WAV 音频文件、mp3 文件的音乐。 71 | 有两套独立的声音文件,分别以“D_”和“F_”开头。 72 | “D_”开头的文件适用于桌面模式,“F_”开头的文件适用于全屏模式。 73 | 若您不想听见某事件下某个特定的文件,将该文件删除即可。您可以用自己的文件替换这些文件。确保使用“打开音频文件目录”菜单来做这件事。它将确保已加载的音频文件关闭,使得您可以覆盖它们。在打开文件夹时,确保 Playnite 已经不在播放任何音频文件,否则您可能无法覆盖特定文件。我的测试显示,您似乎依然可以先清除这些文件。在更改音频文件后,使用“重载音频文件”菜单,以清理任何已加载文件并使用您的新文件,或者也可重开 Playnite。不要为 ApplicationStopped 使用长的音频文件,因为 Playnite 直到该文件停止播放时才会关闭。这同样适用于在桌面和全屏模式间切换。 74 | 这些是可以使用的音频文件 75 | 音乐文件须为 mp3 文件,且根据设置命名为“_music_.mp3”或删除了游戏名中无效字符的游戏名称,并放入对应平台的文件夹。如果您不确定文件名和位置,可以右键点击游戏并选择“显示音乐文件名”选项。注意,文件名和音乐文件的位置会根据所选择的设置而改变! 76 | 77 | 音乐音量: 78 | 79 | 声音管理器 80 | 载入 81 | 保存 82 | 已成功保存声音包: 83 | 已成功加载声音包: 84 | 已成功删除声音包: 85 | 移除 86 | 导入 87 | 打开声音管理器文件夹 88 | 89 | 90 | -------------------------------------------------------------------------------- /Models/Album.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Reflection; 4 | 5 | namespace PlayniteSounds.Models 6 | { 7 | internal class Album : DownloadItem 8 | { 9 | public string Type { get; set; } 10 | public string Url { get; set; } 11 | public string Artist { get; set; } 12 | public uint? Count { get; set; } 13 | public uint? Year { get; set; } 14 | public IEnumerable Platforms { get; set; } 15 | public IEnumerable Songs { get; set; } 16 | protected override IEnumerable Properties => typeof(Album).GetProperties(); 17 | 18 | public override string ToString() 19 | { 20 | var baseString = base.ToString(); 21 | 22 | if (Platforms != null) 23 | { 24 | var platformsValue = string.Join(",", 25 | Platforms.Where(platform => !string.IsNullOrWhiteSpace(platform))); 26 | 27 | if (!string.IsNullOrWhiteSpace(platformsValue)) 28 | { 29 | baseString += $", {nameof(Platforms)}: {platformsValue}"; 30 | } 31 | } 32 | 33 | return baseString; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Models/AudioState.cs: -------------------------------------------------------------------------------- 1 | namespace PlayniteSounds.Models 2 | { 3 | public enum AudioState 4 | { 5 | Never, 6 | Desktop, 7 | Fullscreen, 8 | Always 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Models/DownloadItem.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Reflection; 4 | 5 | namespace PlayniteSounds.Models 6 | { 7 | public abstract class DownloadItem 8 | { 9 | public string Name { get; set; } 10 | public string Id { get; set; } 11 | public string IconUrl { get; set; } 12 | public Source Source { get; set; } 13 | 14 | 15 | protected abstract IEnumerable Properties { get; } 16 | 17 | protected static readonly IEnumerable IgnoredFields = new[] 18 | { 19 | // Ignored Types 20 | "Name", 21 | "Url", 22 | "Songs", 23 | "IconUrl", 24 | // Needs Custom Handling 25 | "Id", 26 | "Platforms" 27 | }; 28 | 29 | public override string ToString() 30 | { 31 | var strings = 32 | from property in Properties 33 | let propertyValue = property.GetValue(this) 34 | where IsValidField(property, propertyValue) 35 | select $"{property.Name}: {propertyValue}"; 36 | 37 | return string.Join(", ", strings); 38 | } 39 | 40 | private static bool IsValidField(PropertyInfo property, object propertyValue) 41 | => propertyValue != null 42 | && !IgnoredFields.ContainsString(property.Name) 43 | && !(propertyValue is string propertyString && string.IsNullOrWhiteSpace(propertyString)); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Models/GenericObjectOption.cs: -------------------------------------------------------------------------------- 1 | using Playnite.SDK; 2 | 3 | namespace PlayniteSounds.Models 4 | { 5 | internal class GenericObjectOption : GenericItemOption 6 | { 7 | public Source Source { get; set; } 8 | public object Object { get; set; } 9 | 10 | public GenericObjectOption(string name, string description, object obj) : base(name, description) => Object = obj; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Models/MusicType.cs: -------------------------------------------------------------------------------- 1 | namespace PlayniteSounds.Models 2 | { 3 | public enum MusicType 4 | { 5 | Default, 6 | Platform, 7 | Game, 8 | Filter 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Models/PlayniteSoundSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace PlayniteSounds.Models 5 | { 6 | public class PlayniteSoundsSettings 7 | { 8 | public AudioState MusicState { get; set; } = AudioState.Always; 9 | public AudioState SoundState { get; set; } = AudioState.Always; 10 | public MusicType MusicType { get; set; } = MusicType.Game; 11 | public int MusicVolume { get; set; } = 25; 12 | public bool StopMusic { get; set; } = true; 13 | public bool SkipFirstSelectSound { get; set; } 14 | public bool PlayBackupMusic { get; set; } 15 | public bool PauseOnDeactivate { get; set; } = true; 16 | public bool RandomizeOnEverySelect { get; set; } 17 | public bool RandomizeOnMusicEnd { get; set; } = true; 18 | public bool TagMissingEntries { get; set; } 19 | public bool AutoDownload { get; set; } 20 | public bool AutoParallelDownload { get; set; } 21 | public bool ManualParallelDownload { get; set; } = true; 22 | public bool YtPlaylists { get; set; } = true; 23 | public bool NormalizeMusic { get; set; } = true; 24 | public bool TagNormalizedGames { get; set; } 25 | public string FFmpegPath { get; set; } 26 | public string FFmpegNormalizePath { get; set; } 27 | public string FFmpegNormalizeArgs { get; set; } 28 | public IList Downloaders { get; set; } = new List { Source.Youtube }; 29 | public DateTime LastAutoLibUpdateAssetsDownload { get; set; } = DateTime.Now; 30 | public bool PromptedForMigration { get; set; } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Models/Song.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Reflection; 5 | 6 | namespace PlayniteSounds.Models 7 | { 8 | internal class Song : DownloadItem 9 | { 10 | public string Description { get; set; } 11 | public string SizeInMb { get; set; } 12 | public TimeSpan? Length { get; set; } 13 | protected override IEnumerable Properties => typeof(Song).GetProperties(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Models/Source.cs: -------------------------------------------------------------------------------- 1 | namespace PlayniteSounds.Models 2 | { 3 | public enum Source 4 | { 5 | All, 6 | KHInsider, 7 | Youtube 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /PlayerEntry.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Media; 2 | using System.Media; 3 | 4 | namespace PlayniteSounds 5 | { 6 | class PlayerEntry 7 | { 8 | public MediaPlayer MediaPlayer { get; set; } 9 | public SoundPlayer SoundPlayer { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /PlayniteSounds.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.2.32616.157 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlayniteSounds", "PlayniteSounds.csproj", "{4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {64D64144-3041-47BD-9FA4-4551ABAC9CCD} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /PlayniteSounds.yaml: -------------------------------------------------------------------------------- 1 | AddonId: 'Playnite.Sounds.WD' 2 | Packages: 3 | - Version: 5.6 4 | RequiredApiVersion: 6.4.0 5 | ReleaseDate: 2022-10-31 6 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v5.6/PlayniteSounds-v5.6.pext 7 | Changelog: 8 | - Error message no longer displays sometimes when plugin attempted to play backup music from a filter 9 | - GameStarted sound has been restored 10 | - Version: 5.4 11 | RequiredApiVersion: 6.4.0 12 | ReleaseDate: 2022-10-31 13 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v5.4/PlayniteSounds-v5.4.pext 14 | Changelog: 15 | - Migration process now only prompts exactly once (can be re-enabled via editing the config file) 16 | - The Sounds directory in ExtraMetaData folder is now deleted if one is found during migration process 17 | - Version: 5.2 18 | RequiredApiVersion: 6.4.0 19 | ReleaseDate: 2022-10-31 20 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v5.2/PlayniteSounds-v5.2.pext 21 | Changelog: 22 | - Fixed issues with migration process 23 | - Fixed filter music not playing as backup music 24 | - Version: 5.0 25 | RequiredApiVersion: 6.4.0 26 | ReleaseDate: 2022-10-29 27 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v5.0/PlayniteSounds-v5.0.pext 28 | Changelog: 29 | - The below two changes require a migration process upon next app start, if given user approval 30 | - Re-organized game music file layout to use unique IDs instead of game names 31 | - Moved all audio files into the ExtraMetaData folder 32 | - Added ability to download game music from YouTube 33 | - Added support for filter support 34 | - Can now specify multiple music files per source (Filter, Platform, Game, Default) 35 | - Replaced default sound files 36 | - Backup music can now be played (Game -> Filter -> Default) 37 | - Re-organized all UI options 38 | - Added Play/Pause Uri support 39 | - Version: 4.6 40 | RequiredApiVersion: 6.1.0 41 | ReleaseDate: 2022-04-03 42 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v4.6/PlayniteSounds-v4.6.pext 43 | Changelog: 44 | - Fix Music not always stopping anymore when a game is launched 45 | - Version: 4.4 46 | RequiredApiVersion: 6.1.0 47 | ReleaseDate: 2022-04-03 48 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v4.4/PlayniteSounds-v4.4.pext 49 | Changelog: 50 | - Add option to choose when music stops (game is starting / game has started) 51 | - Version: 4.3 52 | RequiredApiVersion: 6.1.0 53 | ReleaseDate: 2022-04-02 54 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v4.3/PlayniteSounds-v4.3.pext 55 | Changelog: 56 | - Add option to "select / Copy" currently active music file(name) 57 | - Add option to pause music when Playnite deactivates or minimizes 58 | - Version: 4.2 59 | RequiredApiVersion: 6.1.0 60 | ReleaseDate: 2022-04-02 61 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/v4.2/PlayniteSounds-v4.2.pext 62 | Changelog: 63 | - Fix Potential Null Source Value Error after waking up from sleep / hibernate 64 | - Added Option to Skip first select sound at playnite startup 65 | - Fix music resuming after sleep (while game is running) 66 | - Korean translation by Min-Ki Jeong 67 | - Chinese Simplified translation by ATNewHope 68 | - Arabic translation by X4Lo 69 | - Version: 4.0 70 | RequiredApiVersion: 6.1.0 71 | ReleaseDate: 2021-11-05 72 | PackageUrl: https://github.com/joyrider3774/PlayniteSound/releases/download/V4.0/Playnite.Sounds.WD_4_0.pext 73 | Changelog: 74 | - Playnite 9 Support 75 | - First Platform will be used for games having multiple platforms set !!! 76 | - Be aware platform "PC" changed to "PC (Windows)" in playnite 9 so change your music folder for that platform accordingly in extension data folder. 77 | - Updated Localizations 78 | -------------------------------------------------------------------------------- /PlayniteSoundsSettingsView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace PlayniteSounds 4 | { 5 | public partial class PlayniteSoundsSettingsView 6 | { 7 | private readonly PlayniteSounds _plugin; 8 | 9 | public PlayniteSoundsSettingsView(PlayniteSounds plugin) 10 | { 11 | _plugin = plugin; 12 | InitializeComponent(); 13 | } 14 | 15 | private void ButReloadAudio_Click(object sender, RoutedEventArgs e) 16 | { 17 | _plugin.ReloadAudioFiles(); 18 | } 19 | 20 | private void ButOpenSoundsFolder_Click(object sender, RoutedEventArgs e) 21 | { 22 | _plugin.OpenSoundsFolder(); 23 | } 24 | 25 | private void ButOpenMusicFolder_Click(object sender, RoutedEventArgs e) 26 | { 27 | _plugin.OpenMusicFolder(); 28 | } 29 | 30 | private void ButOpenInfo_Click(object sender, RoutedEventArgs e) 31 | { 32 | _plugin.HelpMenu(); 33 | } 34 | 35 | private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) 36 | { 37 | _plugin.ResetMusicVolume(); 38 | } 39 | 40 | private void ButSaveSounds_Click(object sender, RoutedEventArgs e) 41 | { 42 | _plugin.SaveSounds(); 43 | } 44 | 45 | private void ButLoadSounds_Click(object sender, RoutedEventArgs e) 46 | { 47 | _plugin.LoadSounds(); 48 | } 49 | 50 | private void ButImportSounds_Click(object sender, RoutedEventArgs e) 51 | { 52 | _plugin.ImportSounds(); 53 | } 54 | 55 | private void ButRemoveSounds_Click(object sender, RoutedEventArgs e) 56 | { 57 | _plugin.RemoveSounds(); 58 | } 59 | 60 | private void ButOpenSoundManagerFolder_Click(object sender, RoutedEventArgs e) 61 | { 62 | _plugin.OpenSoundManagerFolder(); 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /PlayniteSoundsSettingsViewModel.cs: -------------------------------------------------------------------------------- 1 | using Playnite.SDK; 2 | using Playnite.SDK.Data; 3 | using PlayniteSounds.Models; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Diagnostics; 7 | using System.IO; 8 | 9 | namespace PlayniteSounds 10 | { 11 | public class PlayniteSoundsSettingsViewModel : ObservableObject, ISettings 12 | { 13 | private PlayniteSoundsSettings _settings; 14 | public PlayniteSoundsSettings Settings 15 | { 16 | get => _settings; 17 | set 18 | { 19 | _settings = value; 20 | OnPropertyChanged(); 21 | } 22 | } 23 | 24 | public RelayCommand BrowseForFFmpegFile 25 | { 26 | get => new RelayCommand((a) => 27 | { 28 | var filePath = _plugin.PlayniteApi.Dialogs.SelectFile(string.Empty); 29 | if (!string.IsNullOrWhiteSpace(filePath)) 30 | { 31 | Settings.FFmpegPath = filePath; 32 | } 33 | }); 34 | } 35 | 36 | public RelayCommand BrowseForFFmpegNormalizeFile 37 | { 38 | get => new RelayCommand((a) => 39 | { 40 | var filePath = _plugin.PlayniteApi.Dialogs.SelectFile(string.Empty); 41 | if (!string.IsNullOrWhiteSpace(filePath)) 42 | { 43 | Settings.FFmpegNormalizePath = filePath; 44 | } 45 | }); 46 | } 47 | public RelayCommand NavigateUrlCommand 48 | { 49 | get => new RelayCommand((url) => 50 | { 51 | _plugin.Try(() => Process.Start((url as Uri).AbsoluteUri)); 52 | }); 53 | } 54 | 55 | private PlayniteSoundsSettings EditingClone { get; set; } 56 | 57 | private readonly PlayniteSounds _plugin; 58 | 59 | 60 | public PlayniteSoundsSettingsViewModel(PlayniteSounds plugin) 61 | { 62 | try 63 | { 64 | // Injecting your plugin instance is required for Save/Load method because Playnite saves data to a location based on what plugin requested the operation. 65 | _plugin = plugin; 66 | 67 | // Load saved settings. 68 | var savedSettings = plugin.LoadPluginSettings(); 69 | 70 | // LoadPluginSettings returns null if no saved data is available. 71 | Settings = savedSettings ?? new PlayniteSoundsSettings(); 72 | } 73 | catch (Exception e) 74 | { 75 | plugin.HandleException(e); 76 | } 77 | } 78 | 79 | public void BeginEdit() 80 | { 81 | // Code executed when settings view is opened and user starts editing values. 82 | try 83 | { 84 | EditingClone = Serialization.GetClone(Settings); 85 | } 86 | catch (Exception e) 87 | { 88 | _plugin.HandleException(e); 89 | } 90 | } 91 | 92 | public void CancelEdit() 93 | { 94 | // Code executed when user decides to cancel any changes made since BeginEdit was called. 95 | // This method should revert any changes made to Option1 and Option2. 96 | Settings = EditingClone; 97 | } 98 | 99 | public void EndEdit() 100 | { 101 | // Code executed when user decides to confirm changes made since BeginEdit was called. 102 | try 103 | { 104 | _plugin.SavePluginSettings(Settings); 105 | 106 | var musicTypeChanged = Settings.MusicType != EditingClone.MusicType; 107 | var musicStateChanged = Settings.MusicState != EditingClone.MusicState; 108 | 109 | _plugin.ReloadMusic = _plugin.ReloadMusic || musicTypeChanged || musicStateChanged; 110 | 111 | _plugin.UpdateDownloadManager(Settings); 112 | _plugin.ReplayMusic(); 113 | _plugin.ResetMusicVolume(); 114 | } 115 | catch (Exception e) 116 | { 117 | _plugin.HandleException(e); 118 | } 119 | 120 | } 121 | 122 | public bool VerifySettings(out List errors) 123 | { 124 | // Code execute when user decides to confirm changes made since BeginEdit was called. 125 | // Executed before EndEdit is called and EndEdit is not called if false is returned. 126 | // List of errors is presented to user if verification fails. 127 | errors = new List(); 128 | var outcome = true; 129 | 130 | if (!string.IsNullOrEmpty(Settings.FFmpegPath) && !File.Exists(Settings.FFmpegPath)) 131 | { 132 | errors.Add($"The path to FFmpeg '{Settings.FFmpegPath}' is invalid"); 133 | outcome = false; 134 | } 135 | 136 | return outcome; 137 | } 138 | } 139 | } -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("PlayniteSounds")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("PlayniteSounds")] 12 | [assembly: AssemblyCopyright("Copyright © 2019")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("9c960604-b8bc-4407-a4e4-e291c6097c7d")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Build and Revision Numbers 32 | // by using the '*' as shown below: 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Playnite Sounds Extension 2 | ![DownloadCountTotal](https://img.shields.io/github/downloads/joyrider3774/PlayniteSound/total?label=total%20downloads&style=plastic) ![DownloadCountLatest](https://img.shields.io/github/downloads/joyrider3774/PlayniteSound/latest/total?style=plastic) ![LatestVersion](https://img.shields.io/github/v/tag/joyrider3774/PlayniteSound?label=Latest%20version&style=plastic) ![License](https://img.shields.io/github/license/joyrider3774/PlayniteSound?style=plastic) 3 | 4 | Playnite Sounds is an extension to play audio files during Playnite events. 5 | It can only play WAV audio files and mp3 for music, nothing else. 6 | 7 | [Latest Release](https://github.com/joyrider3774/PlayniteSound/releases/latest) 8 | 9 | ## Buy me a "koffie" if you feel like supporting 10 | I do everything in my spare time for free, if you feel something aided you and you want to support me, you can always buy me a "koffie" as we say in dutch, no obligations whatsoever... 11 | 12 | Buy Me a Coffee at ko-fi.com 13 | 14 | ## Audio Files 15 | 16 | ### Generic Info 17 | There are 2 seperate set of sound files. Audio Files starting with 'D_' and files starting with 'F_'. 18 | The 'D_' files are the audio files for desktop mode, the 'F_' files for fullscreen mode. 19 | If you don't want to hear a certain file you can just delete the wav file of the event you don't want to hear. 20 | You can also change the files with your own files. Be sure to use the 'Open Audio Files Folder' menu for doing so. 21 | It will make sure loaded audio files get closed so you can overwrite them. Make sure playnite does not play any audio anymore after opening the folder or it's possible you can't overwrite that specific file. With my testings it did seem you could still first erase the files. After changing the audio files use the 'Reload Audio Files' menu to clear any loaded files and use your new files, or just restart Playnite. Do NOT use a long audio file for ApplicationStopped as Playnite will not quit until that audio file has finished playing. The same applies for switching between desktop and fullscreen mode. 22 | 23 | ### Audio files that can be used 24 | They are located in the sounds folder of the extension, you can open that folder using the main playnite menu -> Extensions -> Playnite sounds -> Open Audio Files Folder 25 | 26 | | Event | Desktop | Fullscreen | 27 | | ------------- |---------------|-------| 28 | | Playnite Startup | D_ApplicationStarted.wav | F_ApplicationStarted.wav | 29 | | Playnite Exit | D_ApplicationStopped.wav | F_ApplicationStopped.wav | 30 | | Game Installed | D_GameInstalled.wav | F_GameInstalled.wav | 31 | | Game UnInstalled | D_GameUninstalled.wav | F_GameUninstalled.wav | 32 | | Game Selected | D_GameSelected.wav | F_GameSelected.wav | 33 | | Game Starting | D_GameStarting.wav | F_GameStarting.wav | 34 | | Game Started | D_GameStarted.wav | F_GameStarted.wav | 35 | | Game Stopped | D_GameStopped.wav | F_GameStopped.wav | 36 | | Game LibraryUpdated | D_LibraryUpdated.wav | F_LibraryUpdated.wav | 37 | 38 | ### Create your own Audio files 39 | A very simple and free tool to create (game) sounds is SFXR, you can use it to create certain blip and blop sounds and perhaps use it to create your own sound files to be used with Playnite Sound extension. If you want to record your own sounds or edit existing sounds you could use audacity 40 | 41 | SFXR: https://www.drpetter.se/project_sfxr.html 42 | 43 | Audacity: https://www.audacityteam.org/ 44 | 45 | ### Example video 46 | [![Playnite Sound Example Video](http://img.youtube.com/vi/zXzSdLrOmtw/0.jpg)](http://www.youtube.com/watch?v=zXzSdLrOmtw "Playnite Sound Example Video") 47 | 48 | ### Playnite Sound V2.0 Release Video 49 | [![Playnite Sound V2.0 Release Video](http://img.youtube.com/vi/iTZ9JbswN3M/0.jpg)](https://youtu.be/iTZ9JbswN3M "Playnite Sound V2.0 Release Video") 50 | 51 | ### Playnite Sound V3.0 Release Video 52 | [![Playnite Sound V2.0 Release Video](http://img.youtube.com/vi/NL1c7puTPz8/0.jpg)](https://youtu.be/NL1c7puTPz8 "Playnite Sound V3.0 Release Video") 53 | 54 | ### Playnite Sound V4.0 Release 55 | * Playnite 9 Support 56 | * First Platform will be used for games having multiple platforms set !!! 57 | * Be aware platform "PC" changed to "PC (Windows)" in playnite 9 so change your music folder for that platform accordingly in extension data folder. 58 | * Updated Localizations 59 | 60 | 61 | ## Translation 62 | The project is translatable on [Crowdin](https://crowdin.com/project/playnite-game-speak) 63 | 64 | Thanks to the following people who have contributed with translations: 65 | * Spanish: Darklinpower 66 | * French: M0ylik 67 | * Polish: Renia 68 | * Italian: Federico Pezzuolo (3XistencE-STUDIO), StarFang208 69 | * German: kristheb 70 | * Hungarian: myedition8 71 | * Porutgese, Brazillian: atemporal_ (Atemporal), JCraftPlay 72 | * Ukrainian: SmithMD24 73 | * Norwegian: MeatBoy 74 | * Czech: SilverRoll (silveroll) 75 | * Korean: Min-Ki Jeong 76 | * Chinese Simplified: ATNewHope 77 | * Arabic: X4Lo 78 | 79 | ## Credits 80 | * Used Icon made by [Freepik](http://www.freepik.com/) 81 | * Original Localization file loader by [Lacro59](https://github.com/Lacro59) 82 | * Sound Manager by [dfirsht](https://github.com/dfirsht) 83 | * Downloader Manager by [cnapolit](https://github.com/cnapolit) 84 | -------------------------------------------------------------------------------- /Scripts/UpdatePlaynite.ps1: -------------------------------------------------------------------------------- 1 | msbuild PlayniteSounds.sln /p:Configuration=Release 2 | playnite\toolbox.exe pack "bin\release" "release" 3 | .\release\Playnite.Sounds.WD_4_6.pext -------------------------------------------------------------------------------- /Scripts/XamlUpdater.ps1: -------------------------------------------------------------------------------- 1 | using namespace System 2 | using namespace System.Collections.Generic 3 | 4 | param( 5 | [switch] $UpdateXaml, 6 | [switch] $GenerateResource, 7 | $RootDir = ".\" 8 | ) 9 | 10 | $LocalizationDir = $rootDir + "Localization\" 11 | $SourceLocalFileName = "LocSource.xaml" 12 | $SourceLocalFilePath = $LocalizationDir + $SourceLocalFileName 13 | $ResourceFilePath = $rootDir + "Common\Constants\Resource.cs" 14 | $SourceLines = Get-Content -Path $SourceLocalFilePath 15 | $SourceLines = [List[string]]$SourceLines 16 | 17 | function Get-IndexKey { 18 | param ( 19 | [List[string]] $lines 20 | ) 21 | $keys = New-Object 'Collections.Generic.List[Tuple[int,string]]' 22 | 23 | for ($i = 0; $i -lt $lines.Count; $i++) 24 | { 25 | $str = $lines[$i] 26 | if ($str -match "") 27 | { 28 | $keys.Add([Tuple]::Create($i, $Matches[1])) 29 | } 30 | } 31 | 32 | return $keys 33 | } 34 | 35 | function Add-LineIntoFile { 36 | param ( 37 | [List[string]] $lines, 38 | [string] $line, 39 | [int] $index 40 | ) 41 | $location = $index - 1 42 | [List[String]] $newLines = $lines[0..$location] 43 | 44 | $newLines.Add($line) 45 | 46 | $end = $lines.Count - 1 47 | $newLines.AddRange([List[String]]$lines[$index..$end]) 48 | 49 | return $newLines 50 | } 51 | 52 | 53 | function Set-XamlFiles { 54 | $sourceKeys = Get-IndexKey -lines $SourceLines 55 | 56 | $files = Get-ChildItem $LocalizationDir 57 | $files = $files | Where-Object {$_ -notmatch $SourceLocalFileName} 58 | 59 | foreach ($file in $files) 60 | { 61 | $fullPath = $LocalizationDir + $file.PSChildName 62 | $fileContent = Get-Content -Path $fullPath 63 | [List[Tuple[int,string]]] $fileKeys = Get-IndexKey -lines $fileContent 64 | foreach($keyTuple in $sourceKeys) 65 | { 66 | if ($fileKeys.Where({$_.Item2 -eq $keyTuple.Item2}).Count -eq 0) 67 | { 68 | $fileContent = Add-LineIntoFile -lines $fileContent -line $SourceLines[$keyTuple.Item1] -index $keyTuple.Item1 69 | } 70 | } 71 | 72 | Set-Content -Path $fullPath -Value $fileContent 73 | } 74 | } 75 | 76 | function New-Resource { 77 | $start = $SourceLines.FindLastIndex({$args[0] -match ""}); 78 | if ($start -eq -1) 79 | { 80 | return 81 | } 82 | 83 | $resourceLines = [List[String]]@( 84 | "using Playnite.SDK;`r", 85 | "using System;`r", 86 | "`r", 87 | "namespace PlayniteSounds.Common.Constants`r", 88 | "{`r", 89 | " public class Resource`r", 90 | " {`r" 91 | ) 92 | 93 | for ($i = $start; $i -lt $SourceLines.Count; $i++) 94 | { 95 | $line = $SourceLines[$i]; 96 | if ($line -match "") 97 | { 98 | $resourceId = $Matches[1] 99 | $varName = $Matches[2] 100 | $lazyVarName = "_" + $varName.substring(0,1).tolower() + $varName.substring(1) 101 | $resourceLines.Add(" public static string ${varName} => ${lazyVarName}.Value;`r") 102 | $resourceLines.Add(" private static readonly Lazy ${lazyVarName} = new Lazy(() => ToId(`"${resourceId}`"));`r") 103 | $resourceLines.Add("`r"); 104 | } 105 | } 106 | 107 | $resourceLines.Add([List[String]]@( 108 | " private static string ToId(string id) => ResourceProvider.GetString(id);`r", 109 | " }`r", 110 | "}`r" 111 | )) 112 | 113 | Set-Content -Path $ResourceFilePath -Value $resourceLines -NoNewline 114 | } 115 | 116 | 117 | function Main { 118 | if ($UpdateXaml) 119 | { 120 | Set-XamlFiles 121 | } 122 | 123 | if ($GenerateResource) 124 | { 125 | New-Resource 126 | } 127 | } 128 | 129 | Main -------------------------------------------------------------------------------- /Sound Files/D_ApplicationStarted.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/D_ApplicationStarted.wav -------------------------------------------------------------------------------- /Sound Files/D_ApplicationStopped.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/D_ApplicationStopped.wav -------------------------------------------------------------------------------- /Sound Files/D_GameInstalled.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/D_GameInstalled.wav -------------------------------------------------------------------------------- /Sound Files/D_GameSelected.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/D_GameSelected.wav -------------------------------------------------------------------------------- /Sound Files/D_GameStarting.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/D_GameStarting.wav -------------------------------------------------------------------------------- /Sound Files/D_GameUninstalled.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/D_GameUninstalled.wav -------------------------------------------------------------------------------- /Sound Files/D_LibraryUpdated.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/D_LibraryUpdated.wav -------------------------------------------------------------------------------- /Sound Files/F_ApplicationStarted.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/F_ApplicationStarted.wav -------------------------------------------------------------------------------- /Sound Files/F_ApplicationStopped.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/F_ApplicationStopped.wav -------------------------------------------------------------------------------- /Sound Files/F_GameInstalled.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/F_GameInstalled.wav -------------------------------------------------------------------------------- /Sound Files/F_GameSelected.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/F_GameSelected.wav -------------------------------------------------------------------------------- /Sound Files/F_GameStarting.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/F_GameStarting.wav -------------------------------------------------------------------------------- /Sound Files/F_GameUninstalled.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/F_GameUninstalled.wav -------------------------------------------------------------------------------- /Sound Files/F_LibraryUpdated.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/F_LibraryUpdated.wav -------------------------------------------------------------------------------- /Sound Files/SoundCredits.txt: -------------------------------------------------------------------------------- 1 | Application Started: "Corporate Logo Intro1.wav" by Original Sound 2 | Link: https://freesound.org/people/original_sound/sounds/493544/ 3 | License: Attribution 3.0 License (https://creativecommons.org/licenses/by/3.0/) 4 | 5 | Game Starting: "Atmospheric Notification 2.mp3" by Original Sound 6 | Link: https://freesound.org/people/original_sound/sounds/494978/ 7 | License: Attribution 3.0 License (https://creativecommons.org/licenses/by/3.0/) 8 | 9 | Game Installed: "Achievement Confirmation » Confirmation Upward" by Original Sound 10 | Link: https://freesound.org/people/original_sound/sounds/366102/ 11 | License: Attribution 3.0 License (https://creativecommons.org/licenses/by/3.0/) 12 | 13 | Game UnInstalled: "Achievement Confirmation » Confirmation Downward" by Original Sound 14 | Link: https://freesound.org/people/original_sound/sounds/366104/ 15 | License: Attribution 3.0 License (https://creativecommons.org/licenses/by/3.0/) 16 | 17 | Application Stopped: "Error Wooden" by Original Sound 18 | Link: https://freesound.org/people/original_sound/sounds/366103/ 19 | License: Attribution 3.0 License (https://creativecommons.org/licenses/by/3.0/) 20 | 21 | Library Updated: "100% synthesis » Ping!" by unfa 22 | Link: https://freesound.org/people/unfa/sounds/215415/ 23 | License: CC0 1.0 Universal Public Domain Dedication (https://creativecommons.org/publicdomain/zero/1.0/) 24 | 25 | Default Music: "Ambient Sounds & Loops (Pack 3) » Ambient Wave 36" by Erokia 26 | Link: https://freesound.org/people/Erokia/sounds/424026/ 27 | License: Attribution 4.0 International (https://creativecommons.org/licenses/by/4.0/) 28 | -------------------------------------------------------------------------------- /Sound Files/_music_.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/Sound Files/_music_.mp3 -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-midnight -------------------------------------------------------------------------------- /app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /extension.yaml: -------------------------------------------------------------------------------- 1 | Id: Playnite.Sounds.WD 2 | Name: Playnite Sounds 3 | Author: Joyrider3774,cnapolit 4 | Version: 5.6 5 | Module: PlayniteSounds.dll 6 | Type: GenericPlugin 7 | Icon: icon.png 8 | Links: 9 | - Name: Github 10 | Url: https://github.com/joyrider3774/PlayniteSound 11 | - Name: Forum Thread 12 | Url: https://playnite.link/forum/thread-432.html 13 | - Name: Translate 14 | Url: https://crowdin.com/project/playnite-game-speak 15 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyrider3774/PlayniteSound/b23d11a398b4d1497bdd979ed068174d77bb1af2/icon.png -------------------------------------------------------------------------------- /packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | --------------------------------------------------------------------------------