Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "2 Click Install" feature #232

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions ModAssistant/App.config
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="ModAssistant.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="ModAssistant.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
Expand Down Expand Up @@ -69,4 +70,30 @@
</setting>
</ModAssistant.Settings1>
</userSettings>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="callmethod" xsi:type="MethodCall" className="ModAssistant.Utils, ModAssistant" methodName="Log">
<parameter layout="${message}" />
<parameter layout="${level}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="callmethod">
<when condition="equals('${logger}','SoundFingerprinting.Emy.FFmpeg.Loader.WindowsLoader')" action="Ignore" />
<when condition="equals('${logger}','FFmpeg')" action="Ignore" />
</logger>
</rules>
</nlog>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
25 changes: 25 additions & 0 deletions ModAssistant/Classes/External Interfaces/BeatSaver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http.Headers;
using System.Runtime.InteropServices;
Expand Down Expand Up @@ -181,6 +182,30 @@ public static async Task<string> InstallMap(BeatSaverApiResponseMap Map, bool sh
}
throw new Exception("Zip file not found.");
}

// Verify and patch separate audio file if needed
var hasFingerprintFile = File.Exists(Path.Combine(directory, "fingerprint.bin"));
if (hasFingerprintFile)
{
var noAudioFile = !Directory.EnumerateFiles(directory).Any(file =>
{
var ext = Path.GetExtension(file);
return ext == ".egg" || ext == ".ogg" || ext == ".wav";
});
if (noAudioFile)
{
var patchSucccess = await SongPatcher.PromptAndPatchSongFromDisk(directory);
if (!patchSucccess)
{
if (showNotification)
{
MessageBox.Show($"{Application.Current.FindResource("OneClick:PatchSong:Failed")}");
}
throw new Exception("Verification and patching failed.");
}
}
}

return mapName;
}

Expand Down
91 changes: 91 additions & 0 deletions ModAssistant/Classes/External Interfaces/SongPatcher.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SaberSongPatcher;
using Application = System.Windows.Application;

namespace ModAssistant.API
{
public class SongPatcher
{
public static async Task<bool> PromptAndPatchSongFromDisk(string directory)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
var supportedExtensions = new[]
{
"mp3",
"m4a",
"ogg",
"wav",
"flac",
"aiff",
"wma",
};
var audioExtensions = string.Join(";", supportedExtensions.Select(ext => $"*.{ext}"));
openFileDialog.Title = (string)Application.Current.FindResource("OneClick:PatchSong:SelectFile");
openFileDialog.Filter = $"Audio files ({audioExtensions})|{audioExtensions}|All files (*.*)|*.*";
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);

var success = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
success = await PerformPatch(openFileDialog.FileName, directory);
}
return success;
}

private static async Task<bool> PerformPatch(string inputFile, string mapDirectory)
{
var config = ConfigParser.ParseConfig(true, mapDirectory);
var context = new Context(config);
var inputValidator = new InputValidator(context);
var inputTransformer = new InputTransformer(context);

var seemsCorrect = await inputValidator.ValidateInput(inputFile, mapDirectory);
if (!seemsCorrect)
{
return false;
}

var filename = "song.egg";
var infoFile = Path.Combine(mapDirectory, "info.dat");
if (!File.Exists(infoFile))
{
infoFile = Path.Combine(mapDirectory, "Info.dat");
}
if (File.Exists(infoFile))
{
try
{
// Try to use the output filename from the info.dat file
using (StreamReader file = File.OpenText(infoFile))
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject info = JObject.Load(reader);
var filenameToken = info.Value<string>("_songFilename");
if (!string.IsNullOrEmpty(filenameToken))
{
filename = filenameToken;
}
}
}
catch (Exception)
{
}
}

var outputFile = Path.Combine(mapDirectory, filename);
var success = await inputTransformer.TransformInput(inputFile, outputFile);
if (!success)
{
throw new Exception("Failed to transform audio.");
}

return true;
}
}
}
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/de.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">Beat Saber Installationspfad nicht gefunden.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installiert: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Installation fehlgeschlagen.</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ Installation Handler registriert!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ Installation Handler entfernt!</sys:String>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String> <!-- NEEDS TRANSLATING -->
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/en-DEBUG.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">OneClick:InstallDirNotFound</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">{0} OneClick:InstalledAsset</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">OneClick:AssetInstallFailed</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">OneClick:PatchSong:Failed</sys:String>
<sys:String x:Key="OneClick:PatchSong:SelectFile">OneClick:PatchSong:SelectFile</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick:ProtocolHandler:Registered</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick:ProtocolHandler:Unregistered</sys:String>
<sys:String x:Key="OneClick:Installing">{0} OneClick:Installing</sys:String>
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/en.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">Beat Saber installation path not found.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installed: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Failed to install.</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String>
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ Install handlers registered!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ Install handlers unregistered!</sys:String>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String>
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/fr.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">Chemin de l'installation de Beat Saber non trouvé.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installé : {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Échec de l'installation.</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} : gestionnaires d'installation OneClick™ inscrits !</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} : gestionnaires d'installation OneClick™ désinscrits !</sys:String>
<sys:String x:Key="OneClick:Installing">Installation de : {0}</sys:String>
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/it.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">Directory d'installazione di Beat Saber non trovata.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installato: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Non sono riuscito ad installare la mappa.</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} Registrazione dei gestori OneClick™ riuscita!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} De-Regitrazione dei gestori OneClick™ riuscita!</sys:String>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String> <!-- NEEDS TRANSLATING -->
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/ko.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">비트세이버 설치 폴더를 찾을 수 없었습니다.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">설치됨: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">설치에 실패하였습니다.</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ 설치 관리자가 등록되었습니다!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ 설치 관리자가 등록 취소되었습니다!</sys:String>
<sys:String x:Key="OneClick:Installing">Installing: {0}</sys:String> <!-- NEEDS TRANSLATING -->
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/nl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">Kon het Beat Saber installatie pad niet vinden</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">{0} Geïnstalleerd</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Installatie mislukt</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ Installeer afhandelingen geregistreerd!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ Install afhandelingen uitgeregistreerd!</sys:String>
<sys:String x:Key="OneClick:Installing">{0} word geïnstalleerd</sys:String>
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/ru.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">Установочный путь к Beat Saber не найден.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Установлено: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Ошибка установки.</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ установки зарегистрированы</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ установки не зарегистрированы!</sys:String>
<sys:String x:Key="OneClick:Installing">Установка: {0}</sys:String>
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/sv.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@
<sys:String x:Key="OneClick:SongDownload:Failed">Det gick inte att ladda ned låten.</sys:String>
<sys:String x:Key="OneClick:SongDownload:NetworkIssues">Det kan vara strul med BeatSaver eller din internetuppkoppling.</sys:String>
<sys:String x:Key="OneClick:SongDownload:FailedTitle">Misslyckades med att ladda ned låtens ZIP-fil.</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:InstallDirNotFound">Det gick inte att hitta installationsvägen för Beat Saber.</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">Installerade: {0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">Misslyckades med att installera.</sys:String>
Expand Down
2 changes: 2 additions & 0 deletions ModAssistant/Localisation/zh.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@
<sys:String x:Key="OneClick:InstallDirNotFound">找不到Beat Saber安装路径。</sys:String>
<sys:String x:Key="OneClick:InstalledAsset">已添加:{0}</sys:String>
<sys:String x:Key="OneClick:AssetInstallFailed">添加失败。</sys:String>
<sys:String x:Key="OneClick:PatchSong:Failed">Input audio file does not match master audio file for this map.</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:PatchSong:SelectFile">Select master song audio file</sys:String> <!-- NEEDS TRANSLATING -->
<sys:String x:Key="OneClick:ProtocolHandler:Registered">{0} OneClick™ 一键添加处理程序已注册!</sys:String>
<sys:String x:Key="OneClick:ProtocolHandler:Unregistered">{0} OneClick™ 一键添加处理程序已移除!</sys:String>
<sys:String x:Key="OneClick:Installing">正在下载:{0}</sys:String>
Expand Down
Loading