├── .gitignore
├── App.config
├── Classes
├── AppResources.cs
├── AppVariables.cs
├── PckToWem.cs
├── WavConverter.cs
└── WemToWav.cs
├── FodyWeavers.xml
├── FodyWeavers.xsd
├── Forms
├── MainForm.Designer.cs
├── MainForm.cs
└── MainForm.resx
├── LICENSE.md
├── Program.cs
├── Properties
├── AssemblyInfo.cs
├── Resources.Designer.cs
├── Resources.resx
├── Settings.Designer.cs
└── Settings.settings
├── README.md
├── Resources
├── icon.ico
├── libs.zip
└── svnzip.dll
├── example.gif
├── genshin-audio-exporter.csproj
├── genshin-audio-exporter.sln
└── packages.config
/.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 | [Aa][Rr][Mm]/
27 | [Aa][Rr][Mm]64/
28 | bld/
29 | [Bb]in/
30 | [Oo]bj/
31 | [Ll]og/
32 |
33 | # Visual Studio 2015/2017 cache/options directory
34 | .vs/
35 | # Uncomment if you have tasks that create the project's static files in wwwroot
36 | #wwwroot/
37 |
38 | # Visual Studio 2017 auto generated files
39 | Generated\ Files/
40 |
41 | # MSTest test Results
42 | [Tt]est[Rr]esult*/
43 | [Bb]uild[Ll]og.*
44 |
45 | # NUnit
46 | *.VisualState.xml
47 | TestResult.xml
48 | nunit-*.xml
49 |
50 | # Build Results of an ATL Project
51 | [Dd]ebugPS/
52 | [Rr]eleasePS/
53 | dlldata.c
54 |
55 | # Benchmark Results
56 | BenchmarkDotNet.Artifacts/
57 |
58 | # .NET Core
59 | project.lock.json
60 | project.fragment.lock.json
61 | artifacts/
62 |
63 | # StyleCop
64 | StyleCopReport.xml
65 |
66 | # Files built by Visual Studio
67 | *_i.c
68 | *_p.c
69 | *_h.h
70 | *.ilk
71 | *.meta
72 | *.obj
73 | *.iobj
74 | *.pch
75 | *.pdb
76 | *.ipdb
77 | *.pgc
78 | *.pgd
79 | *.rsp
80 | *.sbr
81 | *.tlb
82 | *.tli
83 | *.tlh
84 | *.tmp
85 | *.tmp_proj
86 | *_wpftmp.csproj
87 | *.log
88 | *.vspscc
89 | *.vssscc
90 | .builds
91 | *.pidb
92 | *.svclog
93 | *.scc
94 |
95 | # Chutzpah Test files
96 | _Chutzpah*
97 |
98 | # Visual C++ cache files
99 | ipch/
100 | *.aps
101 | *.ncb
102 | *.opendb
103 | *.opensdf
104 | *.sdf
105 | *.cachefile
106 | *.VC.db
107 | *.VC.VC.opendb
108 |
109 | # Visual Studio profiler
110 | *.psess
111 | *.vsp
112 | *.vspx
113 | *.sap
114 |
115 | # Visual Studio Trace Files
116 | *.e2e
117 |
118 | # TFS 2012 Local Workspace
119 | $tf/
120 |
121 | # Guidance Automation Toolkit
122 | *.gpState
123 |
124 | # ReSharper is a .NET coding add-in
125 | _ReSharper*/
126 | *.[Rr]e[Ss]harper
127 | *.DotSettings.user
128 |
129 | # JustCode is a .NET coding add-in
130 | .JustCode
131 |
132 | # TeamCity is a build add-in
133 | _TeamCity*
134 |
135 | # DotCover is a Code Coverage Tool
136 | *.dotCover
137 |
138 | # AxoCover is a Code Coverage Tool
139 | .axoCover/*
140 | !.axoCover/settings.json
141 |
142 | # Visual Studio code coverage results
143 | *.coverage
144 | *.coveragexml
145 |
146 | # NCrunch
147 | _NCrunch_*
148 | .*crunch*.local.xml
149 | nCrunchTemp_*
150 |
151 | # MightyMoose
152 | *.mm.*
153 | AutoTest.Net/
154 |
155 | # Web workbench (sass)
156 | .sass-cache/
157 |
158 | # Installshield output folder
159 | [Ee]xpress/
160 |
161 | # DocProject is a documentation generator add-in
162 | DocProject/buildhelp/
163 | DocProject/Help/*.HxT
164 | DocProject/Help/*.HxC
165 | DocProject/Help/*.hhc
166 | DocProject/Help/*.hhk
167 | DocProject/Help/*.hhp
168 | DocProject/Help/Html2
169 | DocProject/Help/html
170 |
171 | # Click-Once directory
172 | publish/
173 |
174 | # Publish Web Output
175 | *.[Pp]ublish.xml
176 | *.azurePubxml
177 | # Note: Comment the next line if you want to checkin your web deploy settings,
178 | # but database connection strings (with potential passwords) will be unencrypted
179 | *.pubxml
180 | *.publishproj
181 |
182 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
183 | # checkin your Azure Web App publish settings, but sensitive information contained
184 | # in these scripts will be unencrypted
185 | PublishScripts/
186 |
187 | # NuGet Packages
188 | *.nupkg
189 | # NuGet Symbol Packages
190 | *.snupkg
191 | # The packages folder can be ignored because of Package Restore
192 | **/[Pp]ackages/*
193 | # except build/, which is used as an MSBuild target.
194 | !**/[Pp]ackages/build/
195 | # Uncomment if necessary however generally it will be regenerated when needed
196 | #!**/[Pp]ackages/repositories.config
197 | # NuGet v3's project.json files produces more ignorable files
198 | *.nuget.props
199 | *.nuget.targets
200 |
201 | # Microsoft Azure Build Output
202 | csx/
203 | *.build.csdef
204 |
205 | # Microsoft Azure Emulator
206 | ecf/
207 | rcf/
208 |
209 | # Windows Store app package directories and files
210 | AppPackages/
211 | BundleArtifacts/
212 | Package.StoreAssociation.xml
213 | _pkginfo.txt
214 | *.appx
215 | *.appxbundle
216 | *.appxupload
217 |
218 | # Visual Studio cache files
219 | # files ending in .cache can be ignored
220 | *.[Cc]ache
221 | # but keep track of directories ending in .cache
222 | !?*.[Cc]ache/
223 |
224 | # Others
225 | ClientBin/
226 | ~$*
227 | *~
228 | *.dbmdl
229 | *.dbproj.schemaview
230 | *.jfm
231 | *.pfx
232 | *.publishsettings
233 | orleans.codegen.cs
234 |
235 | # Including strong name files can present a security risk
236 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
237 | #*.snk
238 |
239 | # Since there are multiple workflows, uncomment next line to ignore bower_components
240 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
241 | #bower_components/
242 |
243 | # RIA/Silverlight projects
244 | Generated_Code/
245 |
246 | # Backup & report files from converting an old project file
247 | # to a newer Visual Studio version. Backup files are not needed,
248 | # because we have git ;-)
249 | _UpgradeReport_Files/
250 | Backup*/
251 | UpgradeLog*.XML
252 | UpgradeLog*.htm
253 | ServiceFabricBackup/
254 | *.rptproj.bak
255 |
256 | # SQL Server files
257 | *.mdf
258 | *.ldf
259 | *.ndf
260 |
261 | # Business Intelligence projects
262 | *.rdl.data
263 | *.bim.layout
264 | *.bim_*.settings
265 | *.rptproj.rsuser
266 | *- [Bb]ackup.rdl
267 | *- [Bb]ackup ([0-9]).rdl
268 | *- [Bb]ackup ([0-9][0-9]).rdl
269 |
270 | # Microsoft Fakes
271 | FakesAssemblies/
272 |
273 | # GhostDoc plugin setting file
274 | *.GhostDoc.xml
275 |
276 | # Node.js Tools for Visual Studio
277 | .ntvs_analysis.dat
278 | node_modules/
279 |
280 | # Visual Studio 6 build log
281 | *.plg
282 |
283 | # Visual Studio 6 workspace options file
284 | *.opt
285 |
286 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
287 | *.vbw
288 |
289 | # Visual Studio LightSwitch build output
290 | **/*.HTMLClient/GeneratedArtifacts
291 | **/*.DesktopClient/GeneratedArtifacts
292 | **/*.DesktopClient/ModelManifest.xml
293 | **/*.Server/GeneratedArtifacts
294 | **/*.Server/ModelManifest.xml
295 | _Pvt_Extensions
296 |
297 | # Paket dependency manager
298 | .paket/paket.exe
299 | paket-files/
300 |
301 | # FAKE - F# Make
302 | .fake/
303 |
304 | # CodeRush personal settings
305 | .cr/personal
306 |
307 | # Python Tools for Visual Studio (PTVS)
308 | __pycache__/
309 | *.pyc
310 |
311 | # Cake - Uncomment if you are using it
312 | # tools/**
313 | # !tools/packages.config
314 |
315 | # Tabs Studio
316 | *.tss
317 |
318 | # Telerik's JustMock configuration file
319 | *.jmconfig
320 |
321 | # BizTalk build output
322 | *.btp.cs
323 | *.btm.cs
324 | *.odx.cs
325 | *.xsd.cs
326 |
327 | # OpenCover UI analysis results
328 | OpenCover/
329 |
330 | # Azure Stream Analytics local run output
331 | ASALocalRun/
332 |
333 | # MSBuild Binary and Structured Log
334 | *.binlog
335 |
336 | # NVidia Nsight GPU debugger configuration file
337 | *.nvuser
338 |
339 | # MFractors (Xamarin productivity tool) working folder
340 | .mfractor/
341 |
342 | # Local History for Visual Studio
343 | .localhistory/
344 |
345 | # BeatPulse healthcheck temp database
346 | healthchecksdb
347 |
348 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
349 | MigrationBackup/
350 |
--------------------------------------------------------------------------------
/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | True
19 |
20 |
21 | True
22 |
23 |
24 | False
25 |
26 |
27 | False
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | True
39 |
40 |
41 | True
42 |
43 |
44 | False
45 |
46 |
47 | False
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/Classes/AppResources.cs:
--------------------------------------------------------------------------------
1 | using SevenZipExtractor;
2 | using System.IO;
3 | using System.Reflection;
4 |
5 | namespace genshin_audio_exporter
6 | {
7 | public static class AppResources
8 | {
9 | private static bool isUnpacked = false;
10 |
11 | public static bool IsUnpacked { get => isUnpacked; set => isUnpacked = value; }
12 |
13 | public static void UnpackResources()
14 | {
15 | if (!IsUnpacked)
16 | {
17 | string zipPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "libs.zip");
18 | string unzipPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "7z.dll");
19 | File.WriteAllBytes(zipPath, Properties.Resources.libs);
20 | File.WriteAllBytes(unzipPath, Properties.Resources.svnzip);
21 |
22 | using (ArchiveFile archiveFile = new ArchiveFile(zipPath, unzipPath))
23 | {
24 | archiveFile.Extract(Path.GetDirectoryName(zipPath));
25 | }
26 | File.Delete(zipPath);
27 | File.Delete(unzipPath);
28 | }
29 | IsUnpacked = true;
30 | }
31 | }
32 | }
--------------------------------------------------------------------------------
/Classes/AppVariables.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.IO;
3 | using System.Reflection;
4 |
5 | namespace genshin_audio_exporter
6 | {
7 | public static class AppVariables
8 | {
9 | private static string outputDir = "";
10 | private static string processingDir = "";
11 | private static string libsDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "libs");
12 | private static bool createWav = true, createMp3 = true, createOgg = false, createFlac = false;
13 | private static bool overwriteExisting = true;
14 |
15 | private static List pckFiles = new List();
16 | private static List wemFiles = new List();
17 | private static List wavFiles = new List();
18 | public static void UpdateProcessingFolder()
19 | {
20 | ProcessingDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "processing");
21 | }
22 |
23 | public static string OutputDir { get => outputDir; set => outputDir = value; }
24 | public static string ProcessingDir { get => processingDir; set => processingDir = value; }
25 | public static string LibsDir { get => libsDir; set => libsDir = value; }
26 | public static bool CreateWav { get => createWav; set => createWav = value; }
27 | public static bool CreateMp3 { get => createMp3; set => createMp3 = value; }
28 | public static bool CreateOgg { get => createOgg; set => createOgg = value; }
29 | public static bool CreateFlac { get => createFlac; set => createFlac = value; }
30 | public static bool OverwriteExisting { get => overwriteExisting; set => overwriteExisting = value; }
31 | public static List PckFiles { get => pckFiles; set => pckFiles = value; }
32 | public static List WemFiles { get => wemFiles; set => wemFiles = value; }
33 | public static List WavFiles { get => wavFiles; set => wavFiles = value; }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Classes/PckToWem.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.IO;
4 | using System.Reflection;
5 | using System.Windows.Forms;
6 |
7 | namespace genshin_audio_exporter
8 | {
9 | public class PckToWem
10 | {
11 | public static void StartPckToWem(string inputFile, MainForm callback)
12 | {
13 | Process pckToWemProcess;
14 | string quickBmsPath = Path.Combine(AppVariables.LibsDir, "quickbms.exe");
15 | string waveScanBms = Path.Combine(AppVariables.LibsDir, "wavescan.bms");
16 | string wemFolder = Path.Combine(AppVariables.ProcessingDir, "wem");
17 | Directory.CreateDirectory(wemFolder);
18 | var startInfo = new ProcessStartInfo(quickBmsPath)
19 | {
20 | WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
21 | Arguments = $"\"{waveScanBms}\" \"{inputFile}\" \"{wemFolder}\"",
22 | CreateNoWindow = true,
23 | UseShellExecute = false,
24 | };
25 |
26 | using (pckToWemProcess = new Process())
27 | {
28 | try
29 | {
30 | pckToWemProcess.StartInfo = startInfo;
31 | pckToWemProcess.Start();
32 |
33 | pckToWemProcess.WaitForExit();
34 | }
35 | catch (Exception ex)
36 | {
37 | callback.WriteStatus($"Could not start quickbms.exe process:\n\n{ex.Message}\n\nIn case of a permissions issue try running this program as Administrator.");
38 | MessageBox.Show($"Could not start quickbms.exe process:\n\n{ex.Message}\n\nIn case of a permissions issue try running this program as Administrator.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
39 |
40 | }
41 | }
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Classes/WavConverter.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 | using System.IO;
3 |
4 | namespace genshin_audio_exporter
5 | {
6 | public static class WavConverter
7 | {
8 | private static string ffmpegPath = Path.Combine(AppVariables.LibsDir, "ffmpeg.exe");
9 | public static void ConvertWav(string inputFilePath, string format)
10 | {
11 | Process wavConvertProc;
12 | ProcessStartInfo startInfo = new ProcessStartInfo();
13 | string outputFilePath = Path.Combine(AppVariables.ProcessingDir, format, Path.GetFileNameWithoutExtension(inputFilePath) + $".{format}");
14 | switch (format)
15 | {
16 | case "mp3":
17 | startInfo = new ProcessStartInfo(ffmpegPath)
18 | {
19 | Arguments = $"-i \"{inputFilePath}\" -y -b:a 320k \"{outputFilePath}\"",
20 | CreateNoWindow = true,
21 | UseShellExecute = false,
22 | };
23 | break;
24 | case "ogg":
25 | startInfo = new ProcessStartInfo(ffmpegPath)
26 | {
27 | Arguments = $"-i \"{inputFilePath}\" -y -acodec libvorbis -qscale:a 10 \"{outputFilePath}\"",
28 | CreateNoWindow = true,
29 | UseShellExecute = false,
30 | };
31 | break;
32 | case "flac":
33 | startInfo = new ProcessStartInfo(ffmpegPath)
34 | {
35 | Arguments = $"-i \"{inputFilePath}\" -y -af aformat=s16:44100 \"{outputFilePath}\"",
36 | CreateNoWindow = true,
37 | UseShellExecute = false,
38 | };
39 | break;
40 | }
41 | using (wavConvertProc = new Process())
42 | {
43 | wavConvertProc.StartInfo = startInfo;
44 | wavConvertProc.Start();
45 | wavConvertProc.WaitForExit();
46 | }
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/Classes/WemToWav.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.IO;
4 | using System.Reflection;
5 | using System.Windows.Forms;
6 |
7 | namespace genshin_audio_exporter
8 | {
9 | public static class WemToWav
10 | {
11 | public static void StartWemToWav(string inputFile, MainForm callback)
12 | {
13 | Process wemToWavProcess;
14 | string vgmstreamPath = Path.Combine(AppVariables.LibsDir, "vgmstream-cli.exe");
15 | string outputFilePath = Path.Combine(AppVariables.ProcessingDir, "wav", Path.GetFileNameWithoutExtension(inputFile) + ".wav");
16 | string wavFolder = Path.Combine(AppVariables.ProcessingDir, "wav");
17 | Directory.CreateDirectory(wavFolder);
18 | var startInfo = new ProcessStartInfo(vgmstreamPath)
19 | {
20 | WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
21 | Arguments = $"-o \"{outputFilePath}\" \"{inputFile}\"",
22 | CreateNoWindow = true,
23 | UseShellExecute = false,
24 | };
25 |
26 | using (wemToWavProcess = new Process())
27 | {
28 | try
29 | {
30 | wemToWavProcess.StartInfo = startInfo;
31 | wemToWavProcess.Start();
32 | wemToWavProcess.WaitForExit();
33 |
34 | }
35 | catch (Exception ex)
36 | {
37 | callback.WriteStatus($"Could not start vgmstream-cli.exe process:\n\n{ex.Message}\n\nIn case of a permissions issue try running this program as Administrator.");
38 | MessageBox.Show($"Could not start vgmstream-cli.exe process:\n\n{ex.Message}\n\nIn case of a permissions issue try running this program as Administrator.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
39 |
40 | }
41 | }
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/FodyWeavers.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks
13 |
14 |
15 |
16 |
17 | A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.
18 |
19 |
20 |
21 |
22 | A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks
23 |
24 |
25 |
26 |
27 | A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.
28 |
29 |
30 |
31 |
32 | A list of unmanaged 32 bit assembly names to include, delimited with line breaks.
33 |
34 |
35 |
36 |
37 | A list of unmanaged 64 bit assembly names to include, delimited with line breaks.
38 |
39 |
40 |
41 |
42 | The order of preloaded assemblies, delimited with line breaks.
43 |
44 |
45 |
46 |
47 |
48 | This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.
49 |
50 |
51 |
52 |
53 | Controls if .pdbs for reference assemblies are also embedded.
54 |
55 |
56 |
57 |
58 | Controls if runtime assemblies are also embedded.
59 |
60 |
61 |
62 |
63 | Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.
64 |
65 |
66 |
67 |
68 | Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.
69 |
70 |
71 |
72 |
73 | As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.
74 |
75 |
76 |
77 |
78 | Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.
79 |
80 |
81 |
82 |
83 | Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.
84 |
85 |
86 |
87 |
88 | A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |
89 |
90 |
91 |
92 |
93 | A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.
94 |
95 |
96 |
97 |
98 | A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |
99 |
100 |
101 |
102 |
103 | A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.
104 |
105 |
106 |
107 |
108 | A list of unmanaged 32 bit assembly names to include, delimited with |.
109 |
110 |
111 |
112 |
113 | A list of unmanaged 64 bit assembly names to include, delimited with |.
114 |
115 |
116 |
117 |
118 | The order of preloaded assemblies, delimited with |.
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
127 |
128 |
129 |
130 |
131 | A comma-separated list of error codes that can be safely ignored in assembly verification.
132 |
133 |
134 |
135 |
136 | 'false' to turn off automatic generation of the XML Schema file.
137 |
138 |
139 |
140 |
141 |
--------------------------------------------------------------------------------
/Forms/MainForm.Designer.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace genshin_audio_exporter
3 | {
4 | partial class MainForm
5 | {
6 | ///
7 | /// Required designer variable.
8 | ///
9 | private System.ComponentModel.IContainer components = null;
10 |
11 | ///
12 | /// Clean up any resources being used.
13 | ///
14 | /// true if managed resources should be disposed; otherwise, false.
15 | protected override void Dispose(bool disposing)
16 | {
17 | if (disposing && (components != null))
18 | {
19 | components.Dispose();
20 | }
21 | base.Dispose(disposing);
22 | }
23 |
24 | #region Windows Form Designer generated code
25 |
26 | ///
27 | /// Required method for Designer support - do not modify
28 | /// the contents of this method with the code editor.
29 | ///
30 | private void InitializeComponent()
31 | {
32 | this.components = new System.ComponentModel.Container();
33 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
34 | this.SettingsGroupBox = new System.Windows.Forms.GroupBox();
35 | this.FormatFlacCheckBox = new System.Windows.Forms.CheckBox();
36 | this.FormatOggCheckBox = new System.Windows.Forms.CheckBox();
37 | this.FormatMp3CheckBox = new System.Windows.Forms.CheckBox();
38 | this.ExportToLabel = new System.Windows.Forms.Label();
39 | this.OutputFolderBrowseButton = new System.Windows.Forms.Button();
40 | this.OutputDirTextBox = new System.Windows.Forms.TextBox();
41 | this.OutputDirectoryLabel = new System.Windows.Forms.Label();
42 | this.PckDirectoryBrowseButton = new System.Windows.Forms.Button();
43 | this.PckFilesInfo = new System.Windows.Forms.TextBox();
44 | this.PckFilesLabel = new System.Windows.Forms.Label();
45 | this.FormatWavCheckBox = new System.Windows.Forms.CheckBox();
46 | this.StatusGroupBox = new System.Windows.Forms.GroupBox();
47 | this.StatusTextBox = new System.Windows.Forms.TextBox();
48 | this.ExportButton = new System.Windows.Forms.Button();
49 | this.OverallExportProgressBar = new System.Windows.Forms.ProgressBar();
50 | this.CurrentExportProgressBar = new System.Windows.Forms.ProgressBar();
51 | this.DragDropPCKFilesToolTip = new System.Windows.Forms.ToolTip(this.components);
52 | this.SettingsGroupBox.SuspendLayout();
53 | this.StatusGroupBox.SuspendLayout();
54 | this.SuspendLayout();
55 | //
56 | // SettingsGroupBox
57 | //
58 | this.SettingsGroupBox.Controls.Add(this.FormatFlacCheckBox);
59 | this.SettingsGroupBox.Controls.Add(this.FormatOggCheckBox);
60 | this.SettingsGroupBox.Controls.Add(this.FormatMp3CheckBox);
61 | this.SettingsGroupBox.Controls.Add(this.ExportToLabel);
62 | this.SettingsGroupBox.Controls.Add(this.OutputFolderBrowseButton);
63 | this.SettingsGroupBox.Controls.Add(this.OutputDirTextBox);
64 | this.SettingsGroupBox.Controls.Add(this.OutputDirectoryLabel);
65 | this.SettingsGroupBox.Controls.Add(this.PckDirectoryBrowseButton);
66 | this.SettingsGroupBox.Controls.Add(this.PckFilesInfo);
67 | this.SettingsGroupBox.Controls.Add(this.PckFilesLabel);
68 | this.SettingsGroupBox.Controls.Add(this.FormatWavCheckBox);
69 | this.SettingsGroupBox.Location = new System.Drawing.Point(15, 15);
70 | this.SettingsGroupBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
71 | this.SettingsGroupBox.Name = "SettingsGroupBox";
72 | this.SettingsGroupBox.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
73 | this.SettingsGroupBox.Size = new System.Drawing.Size(700, 138);
74 | this.SettingsGroupBox.TabIndex = 0;
75 | this.SettingsGroupBox.TabStop = false;
76 | this.SettingsGroupBox.Text = "Settings";
77 | //
78 | // FormatFlacCheckBox
79 | //
80 | this.FormatFlacCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
81 | this.FormatFlacCheckBox.AutoSize = true;
82 | this.FormatFlacCheckBox.Location = new System.Drawing.Point(310, 99);
83 | this.FormatFlacCheckBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
84 | this.FormatFlacCheckBox.Name = "FormatFlacCheckBox";
85 | this.FormatFlacCheckBox.Size = new System.Drawing.Size(51, 29);
86 | this.FormatFlacCheckBox.TabIndex = 10;
87 | this.FormatFlacCheckBox.Text = "FLAC";
88 | this.FormatFlacCheckBox.UseVisualStyleBackColor = true;
89 | this.FormatFlacCheckBox.CheckedChanged += new System.EventHandler(this.UpdateAudioFormatStatus);
90 | //
91 | // FormatOggCheckBox
92 | //
93 | this.FormatOggCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
94 | this.FormatOggCheckBox.AutoSize = true;
95 | this.FormatOggCheckBox.Location = new System.Drawing.Point(250, 99);
96 | this.FormatOggCheckBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
97 | this.FormatOggCheckBox.Name = "FormatOggCheckBox";
98 | this.FormatOggCheckBox.Size = new System.Drawing.Size(50, 29);
99 | this.FormatOggCheckBox.TabIndex = 9;
100 | this.FormatOggCheckBox.Text = "OGG";
101 | this.FormatOggCheckBox.UseVisualStyleBackColor = true;
102 | this.FormatOggCheckBox.CheckedChanged += new System.EventHandler(this.UpdateAudioFormatStatus);
103 | //
104 | // FormatMp3CheckBox
105 | //
106 | this.FormatMp3CheckBox.Appearance = System.Windows.Forms.Appearance.Button;
107 | this.FormatMp3CheckBox.AutoSize = true;
108 | this.FormatMp3CheckBox.Location = new System.Drawing.Point(194, 99);
109 | this.FormatMp3CheckBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
110 | this.FormatMp3CheckBox.Name = "FormatMp3CheckBox";
111 | this.FormatMp3CheckBox.Size = new System.Drawing.Size(48, 29);
112 | this.FormatMp3CheckBox.TabIndex = 8;
113 | this.FormatMp3CheckBox.Text = "MP3";
114 | this.FormatMp3CheckBox.UseVisualStyleBackColor = true;
115 | this.FormatMp3CheckBox.CheckedChanged += new System.EventHandler(this.UpdateAudioFormatStatus);
116 | //
117 | // ExportToLabel
118 | //
119 | this.ExportToLabel.AutoSize = true;
120 | this.ExportToLabel.Location = new System.Drawing.Point(8, 105);
121 | this.ExportToLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
122 | this.ExportToLabel.Name = "ExportToLabel";
123 | this.ExportToLabel.Size = new System.Drawing.Size(119, 19);
124 | this.ExportToLabel.TabIndex = 7;
125 | this.ExportToLabel.Text = "Export to formats:";
126 | //
127 | // OutputFolderBrowseButton
128 | //
129 | this.OutputFolderBrowseButton.Location = new System.Drawing.Point(599, 62);
130 | this.OutputFolderBrowseButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
131 | this.OutputFolderBrowseButton.Name = "OutputFolderBrowseButton";
132 | this.OutputFolderBrowseButton.Size = new System.Drawing.Size(94, 30);
133 | this.OutputFolderBrowseButton.TabIndex = 6;
134 | this.OutputFolderBrowseButton.Text = "Browse...";
135 | this.OutputFolderBrowseButton.UseVisualStyleBackColor = true;
136 | this.OutputFolderBrowseButton.Click += new System.EventHandler(this.BrowseOutputFolder);
137 | //
138 | // OutputDirTextBox
139 | //
140 | this.OutputDirTextBox.Location = new System.Drawing.Point(135, 64);
141 | this.OutputDirTextBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
142 | this.OutputDirTextBox.Name = "OutputDirTextBox";
143 | this.OutputDirTextBox.ReadOnly = true;
144 | this.OutputDirTextBox.Size = new System.Drawing.Size(455, 26);
145 | this.OutputDirTextBox.TabIndex = 5;
146 | //
147 | // OutputDirectoryLabel
148 | //
149 | this.OutputDirectoryLabel.AutoSize = true;
150 | this.OutputDirectoryLabel.Location = new System.Drawing.Point(8, 70);
151 | this.OutputDirectoryLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
152 | this.OutputDirectoryLabel.Name = "OutputDirectoryLabel";
153 | this.OutputDirectoryLabel.Size = new System.Drawing.Size(115, 19);
154 | this.OutputDirectoryLabel.TabIndex = 4;
155 | this.OutputDirectoryLabel.Text = "Output directory:";
156 | //
157 | // PckDirectoryBrowseButton
158 | //
159 | this.PckDirectoryBrowseButton.Location = new System.Drawing.Point(599, 25);
160 | this.PckDirectoryBrowseButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
161 | this.PckDirectoryBrowseButton.Name = "PckDirectoryBrowseButton";
162 | this.PckDirectoryBrowseButton.Size = new System.Drawing.Size(94, 30);
163 | this.PckDirectoryBrowseButton.TabIndex = 3;
164 | this.PckDirectoryBrowseButton.Text = "Browse...";
165 | this.PckDirectoryBrowseButton.UseVisualStyleBackColor = true;
166 | this.PckDirectoryBrowseButton.Click += new System.EventHandler(this.BrowsePckFiles);
167 | //
168 | // PckFilesInfo
169 | //
170 | this.PckFilesInfo.AllowDrop = true;
171 | this.PckFilesInfo.Location = new System.Drawing.Point(135, 26);
172 | this.PckFilesInfo.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
173 | this.PckFilesInfo.Name = "PckFilesInfo";
174 | this.PckFilesInfo.ReadOnly = true;
175 | this.PckFilesInfo.Size = new System.Drawing.Size(455, 26);
176 | this.PckFilesInfo.TabIndex = 2;
177 | this.PckFilesInfo.TabStop = false;
178 | this.PckFilesInfo.Text = "No PCK files are currently selected.";
179 | this.PckFilesInfo.DragDrop += new System.Windows.Forms.DragEventHandler(this.PckFilesInfo_DragDrop);
180 | this.PckFilesInfo.DragEnter += new System.Windows.Forms.DragEventHandler(this.PckFilesInfo_DragEnter);
181 | this.PckFilesInfo.MouseLeave += new System.EventHandler(this.PckFilesInfo_Leave);
182 | this.PckFilesInfo.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PckFilesInfo_MouseMove);
183 | //
184 | // PckFilesLabel
185 | //
186 | this.PckFilesLabel.AutoSize = true;
187 | this.PckFilesLabel.Location = new System.Drawing.Point(8, 32);
188 | this.PckFilesLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
189 | this.PckFilesLabel.Name = "PckFilesLabel";
190 | this.PckFilesLabel.Size = new System.Drawing.Size(117, 19);
191 | this.PckFilesLabel.TabIndex = 1;
192 | this.PckFilesLabel.Text = "PCK files selected:";
193 | //
194 | // FormatWavCheckBox
195 | //
196 | this.FormatWavCheckBox.Appearance = System.Windows.Forms.Appearance.Button;
197 | this.FormatWavCheckBox.AutoSize = true;
198 | this.FormatWavCheckBox.Checked = true;
199 | this.FormatWavCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
200 | this.FormatWavCheckBox.Location = new System.Drawing.Point(135, 99);
201 | this.FormatWavCheckBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
202 | this.FormatWavCheckBox.Name = "FormatWavCheckBox";
203 | this.FormatWavCheckBox.Size = new System.Drawing.Size(48, 29);
204 | this.FormatWavCheckBox.TabIndex = 7;
205 | this.FormatWavCheckBox.Text = "WAV";
206 | this.FormatWavCheckBox.UseVisualStyleBackColor = true;
207 | this.FormatWavCheckBox.CheckedChanged += new System.EventHandler(this.UpdateAudioFormatStatus);
208 | //
209 | // StatusGroupBox
210 | //
211 | this.StatusGroupBox.Controls.Add(this.StatusTextBox);
212 | this.StatusGroupBox.Location = new System.Drawing.Point(15, 160);
213 | this.StatusGroupBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
214 | this.StatusGroupBox.Name = "StatusGroupBox";
215 | this.StatusGroupBox.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
216 | this.StatusGroupBox.Size = new System.Drawing.Size(700, 219);
217 | this.StatusGroupBox.TabIndex = 1;
218 | this.StatusGroupBox.TabStop = false;
219 | this.StatusGroupBox.Text = "Status";
220 | //
221 | // StatusTextBox
222 | //
223 | this.StatusTextBox.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
224 | this.StatusTextBox.Location = new System.Drawing.Point(8, 26);
225 | this.StatusTextBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
226 | this.StatusTextBox.Multiline = true;
227 | this.StatusTextBox.Name = "StatusTextBox";
228 | this.StatusTextBox.ReadOnly = true;
229 | this.StatusTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
230 | this.StatusTextBox.Size = new System.Drawing.Size(684, 184);
231 | this.StatusTextBox.TabIndex = 0;
232 | //
233 | // ExportButton
234 | //
235 | this.ExportButton.Enabled = false;
236 | this.ExportButton.Location = new System.Drawing.Point(621, 386);
237 | this.ExportButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
238 | this.ExportButton.Name = "ExportButton";
239 | this.ExportButton.Size = new System.Drawing.Size(94, 50);
240 | this.ExportButton.TabIndex = 12;
241 | this.ExportButton.Text = "Export";
242 | this.ExportButton.UseVisualStyleBackColor = true;
243 | this.ExportButton.Click += new System.EventHandler(this.ExportOrAbort);
244 | //
245 | // OverallExportProgressBar
246 | //
247 | this.OverallExportProgressBar.Location = new System.Drawing.Point(15, 416);
248 | this.OverallExportProgressBar.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
249 | this.OverallExportProgressBar.MarqueeAnimationSpeed = 1;
250 | this.OverallExportProgressBar.Name = "OverallExportProgressBar";
251 | this.OverallExportProgressBar.Size = new System.Drawing.Size(599, 19);
252 | this.OverallExportProgressBar.Step = 1;
253 | this.OverallExportProgressBar.TabIndex = 13;
254 | //
255 | // CurrentExportProgressBar
256 | //
257 | this.CurrentExportProgressBar.Location = new System.Drawing.Point(15, 388);
258 | this.CurrentExportProgressBar.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
259 | this.CurrentExportProgressBar.Name = "CurrentExportProgressBar";
260 | this.CurrentExportProgressBar.Size = new System.Drawing.Size(599, 19);
261 | this.CurrentExportProgressBar.TabIndex = 14;
262 | //
263 | // DragDropPCKFilesToolTip
264 | //
265 | this.DragDropPCKFilesToolTip.AutoPopDelay = 5000;
266 | this.DragDropPCKFilesToolTip.BackColor = System.Drawing.Color.White;
267 | this.DragDropPCKFilesToolTip.InitialDelay = 0;
268 | this.DragDropPCKFilesToolTip.ReshowDelay = 100;
269 | this.DragDropPCKFilesToolTip.ShowAlways = true;
270 | this.DragDropPCKFilesToolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
271 | this.DragDropPCKFilesToolTip.ToolTipTitle = "Selecting files";
272 | this.DragDropPCKFilesToolTip.UseAnimation = false;
273 | this.DragDropPCKFilesToolTip.UseFading = false;
274 | //
275 | // MainForm
276 | //
277 | this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F);
278 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
279 | this.ClientSize = new System.Drawing.Size(730, 451);
280 | this.Controls.Add(this.CurrentExportProgressBar);
281 | this.Controls.Add(this.OverallExportProgressBar);
282 | this.Controls.Add(this.ExportButton);
283 | this.Controls.Add(this.StatusGroupBox);
284 | this.Controls.Add(this.SettingsGroupBox);
285 | this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
286 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
287 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
288 | this.Margin = new System.Windows.Forms.Padding(2);
289 | this.MaximizeBox = false;
290 | this.Name = "MainForm";
291 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
292 | this.Text = "genshin-audio-exporter";
293 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.CloseApplication);
294 | this.SettingsGroupBox.ResumeLayout(false);
295 | this.SettingsGroupBox.PerformLayout();
296 | this.StatusGroupBox.ResumeLayout(false);
297 | this.StatusGroupBox.PerformLayout();
298 | this.ResumeLayout(false);
299 |
300 | }
301 |
302 | #endregion
303 |
304 | private System.Windows.Forms.GroupBox SettingsGroupBox;
305 | private System.Windows.Forms.TextBox PckFilesInfo;
306 | private System.Windows.Forms.Label PckFilesLabel;
307 | private System.Windows.Forms.Button PckDirectoryBrowseButton;
308 | private System.Windows.Forms.Button OutputFolderBrowseButton;
309 | private System.Windows.Forms.TextBox OutputDirTextBox;
310 | private System.Windows.Forms.Label OutputDirectoryLabel;
311 | private System.Windows.Forms.CheckBox FormatMp3CheckBox;
312 | private System.Windows.Forms.Label ExportToLabel;
313 | private System.Windows.Forms.CheckBox FormatOggCheckBox;
314 | private System.Windows.Forms.CheckBox FormatFlacCheckBox;
315 | private System.Windows.Forms.CheckBox FormatWavCheckBox;
316 | private System.Windows.Forms.GroupBox StatusGroupBox;
317 | private System.Windows.Forms.Button ExportButton;
318 | private System.Windows.Forms.ProgressBar OverallExportProgressBar;
319 | internal System.Windows.Forms.TextBox StatusTextBox;
320 | private System.Windows.Forms.ProgressBar CurrentExportProgressBar;
321 | private System.Windows.Forms.ToolTip DragDropPCKFilesToolTip;
322 | }
323 | }
324 |
325 |
--------------------------------------------------------------------------------
/Forms/MainForm.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using System.IO;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows.Forms;
8 |
9 | namespace genshin_audio_exporter
10 | {
11 | public partial class MainForm : Form
12 | {
13 | private readonly bool doUpdateFormatSettings = false;
14 | private bool isBusy = false;
15 | private bool isAborted = false;
16 | private int exportedAudioFiles = 0;
17 |
18 | public MainForm()
19 | {
20 | InitializeComponent();
21 | OutputDirTextBox.Text = Properties.Settings.Default.OutputDirectory;
22 | FormatWavCheckBox.Checked = Properties.Settings.Default.CreateWav;
23 | FormatMp3CheckBox.Checked = Properties.Settings.Default.CreateMp3;
24 | FormatOggCheckBox.Checked = Properties.Settings.Default.CreateOgg;
25 | FormatFlacCheckBox.Checked = Properties.Settings.Default.CreateFlac;
26 | doUpdateFormatSettings = true;
27 |
28 | if (Environment.GetCommandLineArgs().Length > 1)
29 | {
30 | string pckArg = Environment.GetCommandLineArgs()[1];
31 | AppVariables.PckFiles = new List { pckArg };
32 | PckFilesInfo.Text = $"Selected {AppVariables.PckFiles.Count} PCK file{(AppVariables.PckFiles.Count > 1 ? "s" : "")} to process.";
33 | }
34 |
35 | UpdateCanExportStatus();
36 | }
37 |
38 | public void WriteStatus(string text, bool prefix = true)
39 | {
40 | StatusTextBox.AppendText($"{((text.Length > 0 && prefix) ? "> " + text : " " + text)}" + Environment.NewLine);
41 | }
42 |
43 | private void BrowsePckFiles(object sender, EventArgs e)
44 | {
45 | OpenFileDialog ofd = new OpenFileDialog
46 | {
47 | Multiselect = true,
48 | Filter = "PCK Files|*.pck"
49 | };
50 | DialogResult fbdResult = ofd.ShowDialog();
51 | if (fbdResult == DialogResult.OK)
52 | {
53 | AppVariables.PckFiles.Clear();
54 | AppVariables.PckFiles = ofd.FileNames.ToList();
55 | PckFilesInfo.Text = $"Selected {AppVariables.PckFiles.Count} PCK file{(AppVariables.PckFiles.Count > 1 ? "s" : "")} to process.";
56 | }
57 | UpdateCanExportStatus();
58 | }
59 |
60 | private void BrowseOutputFolder(object sender, EventArgs e)
61 | {
62 | FolderBrowserDialog fbd = new FolderBrowserDialog
63 | {
64 | ShowNewFolderButton = true
65 | };
66 | DialogResult fbdResult = fbd.ShowDialog();
67 | if (fbdResult == DialogResult.OK)
68 | {
69 | AppVariables.OutputDir = fbd.SelectedPath;
70 | OutputDirTextBox.Text = fbd.SelectedPath;
71 |
72 | }
73 | UpdateCanExportStatus();
74 | }
75 |
76 | private void UpdateAudioFormatStatus(object sender, EventArgs e)
77 | {
78 | if (doUpdateFormatSettings)
79 | UpdateCanExportStatus();
80 | }
81 |
82 | private void UpdateCanExportStatus()
83 | {
84 | bool canExport = true;
85 |
86 | AppVariables.CreateWav = FormatWavCheckBox.Checked;
87 | AppVariables.CreateMp3 = FormatMp3CheckBox.Checked;
88 | AppVariables.CreateOgg = FormatOggCheckBox.Checked;
89 | AppVariables.CreateFlac = FormatFlacCheckBox.Checked;
90 |
91 | if (!AppVariables.CreateWav && !AppVariables.CreateMp3 && !AppVariables.CreateOgg && !AppVariables.CreateFlac)
92 | canExport = false;
93 | if (AppVariables.PckFiles.Count == 0 || !Directory.Exists(OutputDirTextBox.Text))
94 | canExport = false;
95 | if (canExport)
96 | {
97 | Properties.Settings.Default.CreateWav = AppVariables.CreateWav;
98 | Properties.Settings.Default.CreateMp3 = AppVariables.CreateMp3;
99 | Properties.Settings.Default.CreateOgg = AppVariables.CreateOgg;
100 | Properties.Settings.Default.CreateFlac = AppVariables.CreateFlac;
101 | AppVariables.OutputDir = OutputDirTextBox.Text;
102 | Properties.Settings.Default.OutputDirectory = OutputDirTextBox.Text;
103 | ExportButton.Enabled = canExport;
104 | AppVariables.UpdateProcessingFolder();
105 | }
106 | else
107 | ExportButton.Enabled = false;
108 | }
109 |
110 | private async void ExportOrAbort(object sender, EventArgs e)
111 | {
112 | if (!isBusy)
113 | {
114 | isBusy = true;
115 | ExportButton.Text = "Abort";
116 | SettingsGroupBox.Enabled = false;
117 | Directory.CreateDirectory(AppVariables.ProcessingDir);
118 | Directory.CreateDirectory(AppVariables.LibsDir);
119 | ClearTempDirectories();
120 | StatusTextBox.Clear();
121 | if (!AppResources.IsUnpacked)
122 | {
123 | WriteStatus("Unpacking libraries", prefix: false);
124 | WriteStatus("");
125 | await Task.Run(() =>
126 | {
127 | AppResources.UnpackResources();
128 | });
129 |
130 | }
131 | OverallExportProgressBar.Value = 0;
132 | OverallExportProgressBar.Style = ProgressBarStyle.Marquee;
133 | CurrentExportProgressBar.Value = 0;
134 | CurrentExportProgressBar.Maximum = 0;
135 | int index = 0;
136 | int overallIndex = 0;
137 | Directory.CreateDirectory(AppVariables.ProcessingDir);
138 | Directory.CreateDirectory(Path.Combine(AppVariables.ProcessingDir, "wem"));
139 | if (AppVariables.CreateWav)
140 | Directory.CreateDirectory(Path.Combine(AppVariables.ProcessingDir, "wav"));
141 | if (AppVariables.CreateMp3)
142 | Directory.CreateDirectory(Path.Combine(AppVariables.ProcessingDir, "mp3"));
143 | if (AppVariables.CreateOgg)
144 | Directory.CreateDirectory(Path.Combine(AppVariables.ProcessingDir, "ogg"));
145 | if (AppVariables.CreateFlac)
146 | Directory.CreateDirectory(Path.Combine(AppVariables.ProcessingDir, "flac"));
147 |
148 | if (!isAborted)
149 | {
150 | WriteStatus("Exporting PCK => WEM (Required)", prefix: false);
151 | WriteStatus("");
152 | await Task.Run(() =>
153 | {
154 | IProgress progress = new Progress(value =>
155 | {
156 | BeginInvoke((System.Action)(() =>
157 | {
158 | CurrentExportProgressBar.Maximum = AppVariables.PckFiles.Count;
159 | CurrentExportProgressBar.Value = value;
160 | }));
161 | });
162 | foreach (string pckFile in AppVariables.PckFiles)
163 | {
164 | if (!isAborted)
165 | {
166 | PckToWem.StartPckToWem(pckFile, this);
167 | BeginInvoke((System.Action)(() =>
168 | {
169 | WriteStatus($"{Path.GetFileName(pckFile)} => {Path.GetFileNameWithoutExtension(pckFile)}.wem");
170 | }));
171 | index += 1;
172 | progress.Report(index);
173 | }
174 | else
175 | break;
176 | }
177 | });
178 | }
179 | if (!isAborted)
180 | {
181 | WriteStatus("");
182 | WriteStatus("Exporting WEM => WAV (Required)", prefix: false);
183 | WriteStatus("");
184 | index = 0;
185 | await Task.Run(() =>
186 | {
187 | AppVariables.WemFiles = Directory.GetFiles(Path.Combine(AppVariables.ProcessingDir, "wem"), "*.wem").ToList();
188 | BeginInvoke((System.Action)(() =>
189 | {
190 | OverallExportProgressBar.Style = ProgressBarStyle.Blocks;
191 | int overallMaximum = AppVariables.WemFiles.Count;
192 | foreach (CheckBox formatCheckBox in SettingsGroupBox.Controls.OfType())
193 | {
194 | if (formatCheckBox.Checked)
195 | overallMaximum += AppVariables.WemFiles.Count;
196 | }
197 |
198 | OverallExportProgressBar.Maximum = overallMaximum;
199 | }));
200 | IProgress progress = new Progress(value =>
201 | {
202 | BeginInvoke((System.Action)(() =>
203 | {
204 | CurrentExportProgressBar.Maximum = AppVariables.WemFiles.Count;
205 | CurrentExportProgressBar.Value = value;
206 | OverallExportProgressBar.Value = overallIndex;
207 | }));
208 | });
209 | foreach (string wemFile in AppVariables.WemFiles)
210 | {
211 | if (!isAborted)
212 | {
213 | WemToWav.StartWemToWav(wemFile, this);
214 | BeginInvoke((System.Action)(() =>
215 | {
216 | WriteStatus($"{Path.GetFileName(wemFile)} => {Path.GetFileNameWithoutExtension(wemFile)}.wav");
217 | }));
218 | index += 1;
219 | overallIndex += 1;
220 | progress.Report(index);
221 | }
222 | else
223 | break;
224 | }
225 | });
226 | }
227 |
228 | AppVariables.WavFiles = Directory.GetFiles(Path.Combine(AppVariables.ProcessingDir, "wav"), "*.wav").ToList();
229 |
230 | if (AppVariables.CreateWav && !isAborted)
231 | await ExportAudioFormat("wav");
232 | if (AppVariables.CreateMp3 && !isAborted)
233 | await ExportAudioFormat("mp3");
234 | if (AppVariables.CreateOgg && !isAborted)
235 | await ExportAudioFormat("ogg");
236 | if (AppVariables.CreateFlac && !isAborted)
237 | await ExportAudioFormat("flac");
238 | }
239 | else
240 | {
241 | isAborted = true;
242 | ExportButton.Text = "Aborting...";
243 | ExportButton.Enabled = false;
244 | return;
245 | }
246 | Application.DoEvents();
247 | OnExportEnded(isAborted);
248 | }
249 |
250 | private async Task ExportAudioFormat(string format)
251 | {
252 | Directory.CreateDirectory(Path.Combine(AppVariables.OutputDir, format));
253 | int index = 0;
254 | int overallIndex = OverallExportProgressBar.Value;
255 |
256 | WriteStatus("");
257 | if (format == "wav")
258 | WriteStatus("Copying WAV Files to destination directory", prefix: false);
259 | else
260 | WriteStatus($"Exporting WAV => {format.ToUpper()}", prefix: false);
261 | WriteStatus("");
262 |
263 | await Task.Run(() =>
264 | {
265 | IProgress progress = new Progress(value =>
266 | {
267 | BeginInvoke((System.Action)(() =>
268 | {
269 | CurrentExportProgressBar.Maximum = AppVariables.WavFiles.Count;
270 | CurrentExportProgressBar.Value = value;
271 | OverallExportProgressBar.Value = overallIndex;
272 | }));
273 | });
274 | foreach (string wavFile in AppVariables.WavFiles)
275 | {
276 | if (!isAborted)
277 | {
278 | if (format != "wav")
279 | WavConverter.ConvertWav(wavFile, format);
280 | string srcFile = Path.Combine(AppVariables.ProcessingDir, format, Path.GetFileNameWithoutExtension(wavFile) + $".{format}");
281 | string destFile = Path.Combine(AppVariables.OutputDir, format, Path.GetFileNameWithoutExtension(wavFile) + $".{format}");
282 |
283 | File.Copy(srcFile, destFile, true);
284 | BeginInvoke((System.Action)(() =>
285 | {
286 | WriteStatus($"{Path.GetFileName(wavFile)} => {Path.GetFileName(srcFile)}");
287 | exportedAudioFiles += 1;
288 | index += 1;
289 | overallIndex += 1;
290 | progress.Report(index);
291 | }));
292 | }
293 | else
294 | break;
295 | }
296 | });
297 | }
298 |
299 | private void OnExportEnded(bool aborted)
300 | {
301 | CurrentExportProgressBar.Value = 0;
302 | OverallExportProgressBar.Value = 0;
303 | OverallExportProgressBar.Style = ProgressBarStyle.Blocks;
304 | ExportButton.Enabled = true;
305 | ExportButton.Text = "Export";
306 | SettingsGroupBox.Enabled = true;
307 | ClearTempDirectories();
308 | isAborted = false;
309 | isBusy = false;
310 | WriteStatus("");
311 | if (!aborted)
312 | WriteStatus($"{exportedAudioFiles} audio files have been exported ({AppVariables.WavFiles.Count} unique sounds)", prefix: false);
313 | else
314 | WriteStatus($"Task has been aborted, {exportedAudioFiles} audio files were exported", prefix: false);
315 | WriteStatus("");
316 | exportedAudioFiles = 0;
317 | }
318 |
319 | private static void ClearTempDirectories()
320 | {
321 | while (Process.GetProcessesByName("quickbms").Length > 0)
322 | foreach (var process in Process.GetProcessesByName("quickbms"))
323 | process.Kill();
324 |
325 | while (Process.GetProcessesByName("vgmstream-cli").Length > 0)
326 | foreach (var process in Process.GetProcessesByName("vgmstream-cli"))
327 | process.Kill();
328 |
329 | while (Process.GetProcessesByName("ffmpeg").Length > 0)
330 | foreach (var process in Process.GetProcessesByName("ffmpeg"))
331 | process.Kill();
332 |
333 | DirectoryInfo processingDir = new DirectoryInfo(AppVariables.ProcessingDir);
334 | foreach (FileInfo file in processingDir.GetFiles()) file.Delete();
335 | foreach (DirectoryInfo subDirectory in processingDir.GetDirectories()) subDirectory.Delete(true);
336 | }
337 |
338 | private async void CloseApplication(object sender, FormClosingEventArgs e)
339 | {
340 | e.Cancel = true;
341 | Properties.Settings.Default.Save();
342 |
343 | if (isBusy && !isAborted)
344 | ExportOrAbort(null, null);
345 |
346 | while (isAborted)
347 | await Task.Delay(100);
348 |
349 | try
350 | {
351 | Directory.Delete(AppVariables.LibsDir, true);
352 | Directory.Delete(AppVariables.ProcessingDir, true);
353 | }
354 | catch { }
355 | Application.DoEvents();
356 | Environment.Exit(0);
357 | }
358 |
359 | private void PckFilesInfo_DragDrop(object sender, DragEventArgs e)
360 | {
361 | string[] droppedFiles = (string[])e.Data.GetData(DataFormats.FileDrop);
362 | List pckFiles = droppedFiles.Where(x => x.EndsWith(".pck")).ToList();
363 | if (pckFiles.Count > 0)
364 | {
365 | AppVariables.PckFiles.Clear();
366 | AppVariables.PckFiles.AddRange(pckFiles);
367 | PckFilesInfo.Text = $"Selected {AppVariables.PckFiles.Count} PCK file{(AppVariables.PckFiles.Count > 1 ? "s" : "")} to process.";
368 | UpdateCanExportStatus();
369 | }
370 | }
371 |
372 | private void PckFilesInfo_DragEnter(object sender, DragEventArgs e)
373 | {
374 | if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
375 | }
376 |
377 | private void PckFilesInfo_Leave(object sender, EventArgs e)
378 | {
379 | DragDropPCKFilesToolTip.Hide(PckFilesInfo);
380 | }
381 |
382 | private void PckFilesInfo_MouseMove(object sender, MouseEventArgs e)
383 | {
384 | DragDropPCKFilesToolTip.InitialDelay = 0;
385 | DragDropPCKFilesToolTip.ShowAlways = true;
386 | DragDropPCKFilesToolTip.Show("Browse or drag-and-drop files into this box.", PckFilesInfo);
387 | }
388 | }
389 | }
--------------------------------------------------------------------------------
/Forms/MainForm.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | 17, 17
122 |
123 |
124 | 52
125 |
126 |
127 |
128 |
129 | AAABAAEAKSkAAAEAIAC0GwAAFgAAACgAAAApAAAAUgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
130 | AAAAAAAAAAAAAAAAAAAAAAAAc3NzAHV1dQB5eXkAe3t7AH5+fgCBgYEAg4ODAISEhACHh4cAiYmJAIuL
131 | iwCMjIwAjY2NAI6OjgCsrKwAwsLCALy8vAChoaEAkZGRAJCQkACQkJAAkJCQAI6OjgCNjY0Ai4uLAIqK
132 | igCIiIgAh4eHAISEhACDg4MAgYGBAH5+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
133 | AAB1dXUAeXl5AHt7ewB+fn4AgICAAIODgwCFhYUAh4eHAIqKigCMjIwAj4+PAI+PjwCRkZEAkpKSAKys
134 | rBHAwMBWvLy8VqOjoxGUlJQAlJSUAJOTkwCSkpIAkZGRAJGRkQCPj48AjY2NAIuLiwCKiooAiIiIAIaG
135 | hgCEhIQAgoKCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHl5eQB8fHwAf39/AIGB
136 | gQCEhIQAh4eHAImJiQCMjIwAjo6OAJGRkQCTk5MAlJSUAJWVlQCXl5cAvr6+M9LS0v/FxcX/o6OjM5mZ
137 | mQCZmZkAmJiYAJaWlgCVlZUAlJSUAJOTkwCRkZEAkJCQAI6OjgCLi4sAiYmJAIaGhgCEhIQAAAAAAAAA
138 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe3t7AH9/fwCBgYEAhISEAIiIiACLi4sAjIyMAJCQ
139 | kACSkpIAlJSUAJaWlgCYmJgAmZmZAKioqADY2Ngz6Ojo/9LS0v+vr68zpaWlAJycnACbm5sAmpqaAJmZ
140 | mQCYmJgAlpaWAJSUlACTk5MAkZGRAI+PjwCMjIwAioqKAIeHhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
141 | AAAAAAAAAAAAAAAAAAB9fX0AgYGBAISEhACIiIgAi4uLAI2NjQCQkJAAk5OTAJWVlQCXl5cAmpqaAJub
142 | mwCcnJwApqamDrm5uej29vb/6urq/7CwsOihoaEOoKCgAJ6engCcnJwAm5ubAJubmwCZmZkAl5eXAJaW
143 | lgCTk5MAkZGRAI+PjwCMjIwAioqKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
144 | gACDg4MAh4eHAIqKigCNjY0AkJCQAJOTkwCWlpYAmJiYAJubmwCdnZ0AnZ2dAJubmwCoqKg/09PT+/7+
145 | /v/7+/v/xcXF+6ioqCibm5sAoaGhAKCgoACfn58Anp6eAJ2dnQCbm5sAmZmZAJeXlwCUlJQAkpKSAJCQ
146 | kACMjIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgoKCAIaGhgCKiooAjY2NAJCQ
147 | kACTk5MAlpaWAJmZmQCcnJwAnp6eAK2trQCioqIAvLy8ALS0tOfx8fH///////7+/v/q6ur+tra2rLm5
148 | uQC8vLwAo6OjAKKiogCioqIAoKCgAJ2dnQCbm5sAmZmZAJeXlwCUlJQAkZGRAI+PjwAAAAAAAAAAAAAA
149 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFhYUAiIiIAIyMjACQkJAAk5OTAJaWlgCampoAnJycAJ+f
150 | nwDCwsIApKSkAKCgoCW9vb2N5ubm9f39/f////////////39/f/h4eH3uLi4drq6ugDCwsIApaWlAKWl
151 | pQCjo6MAoaGhAJ6engCbm5sAmZmZAJaWlgCTk5MAkpKSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
152 | AAAAAAAAAAAAAIaGhgCKiooAj4+PAJKSkgCWlpYAmZmZAJycnACfn58AoqKiAKSkpACioqIXu7u7oeXl
153 | 5fv6+vr//v7+///////+/v7//v7+//r6+v/g4OD2vLy8cPHx8QCSkpIAqKioAKampgCjo6MAoaGhAJ6e
154 | ngCbm5sAmJiYAJWVlQCSkpIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiYmJAIyM
155 | jACRkZEAlJSUAJeXlwCbm5sAnp6eAKKiogCTk5MAn5+fBKmpqWPPz8//8fHx/+rq6v/w8PD///////v7
156 | +//x8fH/8PDw//Dw8P/MzMz+r6+vYaampgSkpKQAqKioAKWlpQCioqIAoaGhAJ2dnQCbm5sAl5eXAJOT
157 | kwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKiooAjo6OAJKSkgCVlZUAmZmZAJyc
158 | nACurq4Anp6eAP39/QCurq5iv7+//93d3f/o6Oj/4uLi/+jo6P//////+Pj4/+Dg4P/n5+f/6Ojo/97e
159 | 3v/Gxsb/vLy8YuTk5ACqqqoAtLS0AKOjowCioqIAn5+fAJycnACZmZkAlZWVAAAAAAAAAAAAAAAAAAAA
160 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjACQkJAAlJSUAJeXlwCbm5sAn5+fAJubmwCXl5cYxsbGednZ
161 | 2f319fX//v7+//7+/v/+/v7//Pz8//v7+//29vb/9fX1//7+/v///////v7+//f39//h4eH9yMjIfaen
162 | pyeoqKgAs7OzAKOjowChoaEAnZ2dAJqamgCXl5cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
163 | AAAAAAAAjo6OAJKSkgCWlpYAmpqaAJ2dnQDT09MAycnJAMjIyIbq6ur6/Pz8///////+/v7//v7+//7+
164 | /v//////+Pj4//Ly8v/8/Pz//v7+//7+/v////////////39/f/q6ur8w8PDuaSkpC+oqKgApKSkAKGh
165 | oQCenp4Am5ubAJmZmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPj48AkpKSAJaW
166 | lgCampoAn5+fAI6OjgLBwcFq6Ojo+f39/f/+/v7//////////////////v7+//7+/v/7+/v/+vr6//7+
167 | /v/////////////////+/v7///////39/f/o6Oj/ysrKcbq6ugKlpaUAoqKiAJ+fnwCcnJwAmZmZAAAA
168 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI+PjwCTk5MAmJiYAJycnACfn58ErKysX9PT
169 | 0//7+/v//v7+//7+/v///////////////////////Pz8/+Dg4P/h4eH//f39////////////////////
170 | ///+/v7///////39/f/g4OD/vLy8X6ampgSjo6MAoKCgAJ6engCampoAAAAAAAAAAAAAAAAAAAAAAAAA
171 | AAAAAAAAAAAAAAAAAAAAAAAAkJCQAJSUlACZmZkAi4uLAK6urhC8vLz/9PT0//7+/v//////////////
172 | ///////////////////4+Pj/zMzM1c7OztX4+Pj///////////////////////////////////////j4
173 | +P/Dw8P/tra2EJGRkQChoaEAnp6eAJqamgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
174 | AACQkJAAlZWVAJqamgCfn58Ap6enl93d3f7+/v7//////////////////////////////////f39/+rq
175 | 6v+2traXtLS0l+3t7f/+/v7//////////////////////////////////v7+/+Hh4f6tra2XpqamAKGh
176 | oQCenp4AmpqaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCQkACVlZUAhYWFAKCg
177 | oAGtra3p8/Pz///////////////////////////////////////09PT/xcXF0qOjoxiioqIYy8vL1fj4
178 | +P/9/f3/////////////////////////////////9vb2/76+vumnp6cDm5ubAJ6engCampoAAAAAAAAA
179 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk5OTAJWVlQqoqKgeubm5NcvLy+38/Pz/////////
180 | //////////////7+/v/9/f3/8vLy/8fHx9e7u7sPuLi4AKioqACqqqpp0tLS3vPz8//8/Pz/////////
181 | /////////v7+///////9/f3/1NTU9aysrHOqqqoOqqqqAKenpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
182 | AAAAAAAAAAAAAAAAAACmpqYApKSkVbu7u//d3d3/9/f3//7+/v/+/v7//v7+//39/f/6+vr/8vLy/+Dg
183 | 4P++vr7LsLCwE7CwsACurq4Avb29AKampgC1tbUTwsLCw+Li4vTy8vL/+/v7//39/f////////////7+
184 | /v/19fX/2dnZ/729va+pqakWq6urAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMXF
185 | xQDDw8NW3d3d//r6+v///////v7+///////+/v7/8fHx/9fX1//KysrXtbW1eq+vrx6xsbEAxMTEAMPD
186 | wwDDw8MAw8PDALa2tgCrq6sPs7OzX8rKytja2tr/8PDw//////////////////7+/v/29vb/zs7O+K6u
187 | rkuwsLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwcHBAMHBwRbIyMiv5ubm//z8
188 | /P////////////7+/v/39/f/6enp/+Hh4ejR0dG1x8fHMMrKygDOzs4Azc3NAM3NzQCjo6MAyMjIAMTE
189 | xDDOzs613d3d6Onp6f/29vb/////////////////+/v7/9vb2/++vr6ltLS0DrS0tAAAAAAAAAAAAAAA
190 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLy8sAwMDAALm5uQzNzc3A9PT0/v7+/v/+/v7//v7+//7+
191 | /v/+/v7/+/v7//Hx8f/Y2Njqz8/PJM7OzgDNzc0Avr6+AMbGxgXKysp83Nzc6vLy8v/7+/v//f39//7+
192 | /v////////////7+/v/u7u7+xcXFwLOzswy4uLgAvr6+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
193 | AAAAAAAAAAAAAL29vQDBwcEAwcHBAMLCwjTh4eHu/f39///////////////////////+/v7//v7+//b2
194 | 9v/Y2NjuysrKKcXFxQDGxsYAyMjIUt3d3fP5+fn//v7+/////////////////////////////f39/9/f
195 | 3+29vb0qvLy8ALi4uAC0tLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvb29AMHB
196 | wQDOzs4AmZmZAM3Nzev39/f//v7+/////////////////////////////v7+//b29v/V1dXkvr6+NsHB
197 | wTbX19fj+Pj4//7+/v/////////////////+/v7//v7+///////39/f/z8/P6////wDLy8sAt7e3ALS0
198 | tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLwAwMDAAMPDwwDFxcUAysrKaejo
199 | 6P3+/v7//////////////////////////////////f39/+zs7P/JycmYyMjImO3t7f/+/v7/////////
200 | /////////////////////////v7+/+rq6v3IyMhpwcHBALq6ugC3t7cAtLS0AAAAAAAAAAAAAAAAAAAA
201 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAALu7uwC+vr4AwcHBAF1dXQDKysoS09PT+vb29v////////////7+
202 | /v/////////////////+/v7/+fn5/9fX1+rW1tbq+fn5//7+/v//////////////////////////////
203 | ///6+vr/1dXV+srKyhJlZWUAurq6ALe3twCzs7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
204 | AAAAAAAAubm5AL29vQC/v78AwsLCAMXFxQHOzs5A4+Pj9vv7+/////////////////////////////7+
205 | /v/8/Pz/29vb/9nZ2f/7+/v//////////////////////////////////f39/+bm5v/S0tJFxMTEAby8
206 | vAC4uLgAtbW1ALGxsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLgAu7u7AL6+
207 | vgDBwcEAxcXFAK6urgPV1dV57Ozs//z8/P////////////////////////////39/f/w8PD/7+/v//z8
208 | /P////////////////////////////39/f/v7+//zs7O3by8vCm9vb0Aurq6ALe3twCzs7MAsLCwAAAA
209 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALa2tgC6uroAvb29AMDAwADDw8MAw8PDAMLC
210 | wjbR0dHZ6+vr//z8/P/////////////////+/v7///////7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
211 | /v/9/f3/7u7u/9PT09m+vr4zv7+/ALu7uwC4uLgAtLS0ALGxsQCurq4AAAAAAAAAAAAAAAAAAAAAAAAA
212 | AAAAAAAAAAAAAAAAAAAAAAAAs7OzALe3twC6uroAvr6+AMHBwQDR0dEAwsLCAL6+vi/Ly8vc4eHh//r6
213 | +v/+/v7//v7+//7+/v/////////////////////////////////+/v7/+fn5/+Tk5P/Ly8vjwcHBLsLC
214 | wgDOzs4Aubm5ALa2tgCysrIAr6+vAK2trQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
215 | AACxsbEAtbW1ALi4uAC7u7sAvr6+AMDAwADn5+cAwMDAAMHBwRvLy8tS09PT9uvr6/z4+Pj//Pz8////
216 | //////////////7+/v/9/f3/+fn5/+3t7f/U1NT40dHRPb+/vxzAwMAA5+fnALq6ugC3t7cAtLS0ALCw
217 | sACtra0Aq6urAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+vrwCysrIAtbW1ALi4
218 | uAC7u7sAvb29AMDAwADDw8MA0dHRAMXFxQLDw8MdxMTEr8nJyf/w8PD//////////////////v7+//Dw
219 | 8P/MzMzzxsbG2MLCwkXIyMgBwMDAAL6+vgC7u7sAuLi4ALW1tQCxsbEArq6uAKurqwCpqakAAAAAAAAA
220 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAra2tALCwsACzs7MAtra2ALi4uAC6uroAvb29AL+/
221 | vwDBwcEA9/f3AMbGxgDIyMiC2tra//j4+P/////////////////+/v7/9vb2/9fX19O/v78pwsLCAPj4
222 | +AC8vLwAurq6ALe3twC1tbUAsrKyALCwsACtra0AqqqqAKenpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
223 | AAAAAAAAAAAAAAAAAACrq6sArq6uALCwsACzs7MAtbW1ALe3twC5ubkAvLy8AL6+vgC7u7sAt7e3F93d
224 | 3a329vb//v7+//////////////////7+/v/9/f3/7e3t/8TExIbHx8cAu7u7ALm5uQC3t7cAtLS0ALKy
225 | sgCwsLAAra2tAKqqqgCoqKgApKSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKio
226 | qACqqqoAra2tAK+vrwCysrIAs7OzALa2tgC4uLgAurq6ALe3twC2trYHysrKk+Xl5f/8/Pz/////////
227 | //////////////r6+v/f39//u7u7gr29vQC4uLgAtra2ALS0tACysrIAr6+vAK2trQCqqqoAqKioAKWl
228 | pQCioqIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApaWlAKmpqQCrq6sAra2tALCw
229 | sACysrIAtLS0ALW1tQC3t7cAubm5AMLCwgDKysoGurq6rtra2v36+vr///////7+/v/39/f/19fX+ri4
230 | uK68vLwGubm5ALS0tACzs7MAsrKyALCwsACtra0AqqqqAKioqAClpaUAo6OjAKGhoQAAAAAAAAAAAAAA
231 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACioqIApaWlAKioqACqqqoAra2tAK+vrwCwsLAAsbGxALOz
232 | swC1tbUAtra2AKOjowDDw8MAtra2sN3d3f/8/Pz/9/f3/9LS0v+ysrKZvb29AKGhoQCysrIAsbGxALCw
233 | sACurq4Aq6urAKmpqQCnp6cApaWlAKKiogChoaEAnp6eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
234 | AAAAAAAAAAAAAKCgoACjo6MApaWlAKenpwCqqqoArKysAK2trQCurq4AsLCwALGxsQCzs7MAs7OzAMbG
235 | xgCwsLAEvb29odzc3P/T09P/tbW1oa2trQXGxsYAsbGxALCwsACurq4Arq6uAKurqwCpqakAp6enAKSk
236 | pACioqIAoKCgAJ6engCampoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnJycAJ+f
237 | nwCioqIAo6OjAKampgCnp6cAqqqqAKqqqgCtra0Arq6uAK+vrwCwsLAAsLCwALKysgCysrIOvb29Vrq6
238 | ulaurq4Orq6uAK6urgCtra0ArKysAKurqwCrq6sAqKioAKampgCkpKQAoaGhAJ+fnwCdnZ0AmpqaAJeX
239 | lwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbm5sAnZ2dAJ+fnwCioqIAo6OjAKSk
240 | pACmpqYAqampAKmpqQCrq6sAq6urAKysrACtra0Ara2tALOzswC/v78AvLy8AK6urgCrq6sAqqqqAKqq
241 | qgCpqakAqKioAKenpwCmpqYAo6OjAKGhoQCgoKAAnZ2dAJqamgCXl5cAlZWVAAAAAAAAAAAAAAAAAAAA
242 | AAAAAAAA//////+AAAD//8P//4AAAP//w///gAAA///D//+AAAD//4H//4AAAP//gf//gAAA//+B//+A
243 | AAD//gD//4AAAP/8AH//gAAA//gAH/+AAAD/+AAf/4AAAP/gAAf/gAAA/+AAA/+AAAD/gAAB/4AAAP8A
244 | AAD/gAAA/wAAAP+AAAD/AAAA/4AAAP4AAAB/gAAA+AAYAD+AAAD4ADwAH4AAAPgAfgAfgAAA+AB+AB+A
245 | AAD8ADgAP4AAAP4AGAB/gAAA/wAAAP+AAAD/AAAA/4AAAP8AAAD/gAAA/wAAAP+AAAD/gAAB/4AAAP/A
246 | AAP/gAAA/+AAB/+AAAD/8AAP/4AAAP/4AB//gAAA//4Af/+AAAD//AB//4AAAP/8AH//gAAA//4Af/+A
247 | AAD//4H//4AAAP//gf//gAAA///D//+AAAD//////4AAAA==
248 |
249 |
250 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 |
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2021
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace genshin_audio_exporter
5 | {
6 | static class Program
7 | {
8 | ///
9 | /// The main entry point for the application.
10 | ///
11 | [STAThread]
12 | static void Main()
13 | {
14 | Application.EnableVisualStyles();
15 | Application.SetCompatibleTextRenderingDefault(false);
16 | Application.Run(new MainForm());
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/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("genshin-audio-exporter")]
8 | [assembly: AssemblyDescription("Export audio files from Genshin Impact game data to different audio formats.")]
9 | [assembly: AssemblyConfiguration("")]
10 | [assembly: AssemblyCompany("")]
11 | [assembly: AssemblyProduct("genshin-audio-exporter")]
12 | [assembly: AssemblyCopyright("Copyright © Dirk Vingerhoeds 2023")]
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("73a6280e-0e80-48eb-ad29-ce4be676f321")]
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.3")]
35 | [assembly: AssemblyFileVersion("1.3")]
36 |
--------------------------------------------------------------------------------
/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace genshin_audio_exporter.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | public class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | public static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("genshin_audio_exporter.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | public static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 |
63 | ///
64 | /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
65 | ///
66 | public static System.Drawing.Icon icon {
67 | get {
68 | object obj = ResourceManager.GetObject("icon", resourceCulture);
69 | return ((System.Drawing.Icon)(obj));
70 | }
71 | }
72 |
73 | ///
74 | /// Looks up a localized resource of type System.Byte[].
75 | ///
76 | public static byte[] libs {
77 | get {
78 | object obj = ResourceManager.GetObject("libs", resourceCulture);
79 | return ((byte[])(obj));
80 | }
81 | }
82 |
83 | ///
84 | /// Looks up a localized resource of type System.Byte[].
85 | ///
86 | public static byte[] svnzip {
87 | get {
88 | object obj = ResourceManager.GetObject("svnzip", resourceCulture);
89 | return ((byte[])(obj));
90 | }
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 |
122 | ..\Resources\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
123 |
124 |
125 | ..\Resources\libs.zip;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
126 |
127 |
128 | ..\Resources\svnzip.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
129 |
130 |
--------------------------------------------------------------------------------
/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace genshin_audio_exporter.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 |
26 | [global::System.Configuration.UserScopedSettingAttribute()]
27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
28 | [global::System.Configuration.DefaultSettingValueAttribute("")]
29 | public string OutputDirectory {
30 | get {
31 | return ((string)(this["OutputDirectory"]));
32 | }
33 | set {
34 | this["OutputDirectory"] = value;
35 | }
36 | }
37 |
38 | [global::System.Configuration.UserScopedSettingAttribute()]
39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
40 | [global::System.Configuration.DefaultSettingValueAttribute("True")]
41 | public bool CreateWav {
42 | get {
43 | return ((bool)(this["CreateWav"]));
44 | }
45 | set {
46 | this["CreateWav"] = value;
47 | }
48 | }
49 |
50 | [global::System.Configuration.UserScopedSettingAttribute()]
51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
52 | [global::System.Configuration.DefaultSettingValueAttribute("True")]
53 | public bool CreateMp3 {
54 | get {
55 | return ((bool)(this["CreateMp3"]));
56 | }
57 | set {
58 | this["CreateMp3"] = value;
59 | }
60 | }
61 |
62 | [global::System.Configuration.UserScopedSettingAttribute()]
63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
64 | [global::System.Configuration.DefaultSettingValueAttribute("False")]
65 | public bool CreateOgg {
66 | get {
67 | return ((bool)(this["CreateOgg"]));
68 | }
69 | set {
70 | this["CreateOgg"] = value;
71 | }
72 | }
73 |
74 | [global::System.Configuration.UserScopedSettingAttribute()]
75 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
76 | [global::System.Configuration.DefaultSettingValueAttribute("False")]
77 | public bool CreateFlac {
78 | get {
79 | return ((bool)(this["CreateFlac"]));
80 | }
81 | set {
82 | this["CreateFlac"] = value;
83 | }
84 | }
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | True
10 |
11 |
12 | True
13 |
14 |
15 | False
16 |
17 |
18 | False
19 |
20 |
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 🎼 Genshin Impact Audio Exporter
2 | This tool allows you to export audio files from Genshin Impact game data into different audio formats.
3 |
4 | - Single executable file, all required libraries are already included
5 | - Supports `.wav`, `.mp3`, `.ogg` and `.flac` audio formats
6 | - Easy to use interface, no command line needed
7 |
8 | ### How to use
9 |
10 | The audio files are saved as `.pck` data files within the Genshin Impact game data directory.
11 | Example audio files location:
12 | ```
13 | C:\Program Files\Genshin Impact\Genshin Impact Game\GenshinImpact_Data\StreamingAssets\AudioAssets
14 | ```
15 |
16 | 1. Open the program and select which `.pck` data files you would like to extract audio files from.
17 | 2. Select an output directory to save exported audio files to.
18 | 3. Choose your preferred audio formats to export to.
19 | 4. Click `Export` and wait for the program to finish exporting the audio files.
20 |
21 | ###### Tip! You can also drag-and-drop files into the textbox next to `PCK files selected`.
22 |
23 | ### Screenshots (may be out of date)
24 |
25 | 
26 |
27 | ### Notes
28 |
29 | When exporting has started, the program will create two directories named `libs` and `processing`. Do not remove or modify the contents of these directories as they are needed during the export process. They will be deleted automatically when the program is closed.
30 |
31 | All previously exported audio files in the output directory *will be overwritten* when the same audio files are being exported again.
32 |
--------------------------------------------------------------------------------
/Resources/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dvingerh/genshin-audio-exporter/241844156728d8fce6fce7d65bb8b885c8e99fa4/Resources/icon.ico
--------------------------------------------------------------------------------
/Resources/libs.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dvingerh/genshin-audio-exporter/241844156728d8fce6fce7d65bb8b885c8e99fa4/Resources/libs.zip
--------------------------------------------------------------------------------
/Resources/svnzip.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dvingerh/genshin-audio-exporter/241844156728d8fce6fce7d65bb8b885c8e99fa4/Resources/svnzip.dll
--------------------------------------------------------------------------------
/example.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dvingerh/genshin-audio-exporter/241844156728d8fce6fce7d65bb8b885c8e99fa4/example.gif
--------------------------------------------------------------------------------
/genshin-audio-exporter.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Debug
7 | AnyCPU
8 | {73A6280E-0E80-48EB-AD29-CE4BE676F321}
9 | WinExe
10 | genshin_audio_exporter
11 | genshin-audio-exporter
12 | v4.8.1
13 | 512
14 | true
15 | true
16 | publish\
17 | true
18 | Disk
19 | false
20 | Foreground
21 | 7
22 | Days
23 | false
24 | false
25 | true
26 | 0
27 | 1.0.0.%2a
28 | false
29 | false
30 | true
31 |
32 |
33 |
34 |
35 |
36 | AnyCPU
37 | true
38 | full
39 | false
40 | bin\Debug\
41 | DEBUG;TRACE
42 | prompt
43 | 4
44 |
45 |
46 | AnyCPU
47 | pdbonly
48 | true
49 | bin\Release\
50 | TRACE
51 | prompt
52 | 4
53 |
54 |
55 | Resources\icon.ico
56 |
57 |
58 |
59 |
60 |
61 |
62 | packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll
63 |
64 |
65 | packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll
66 | True
67 | True
68 |
69 |
70 | packages\SevenZipExtractor.1.0.17\lib\net45\SevenZipExtractor.dll
71 |
72 |
73 |
74 | packages\System.AppContext.4.3.0\lib\net463\System.AppContext.dll
75 | True
76 | True
77 |
78 |
79 | packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll
80 |
81 |
82 |
83 | packages\System.Console.4.3.1\lib\net46\System.Console.dll
84 | True
85 | True
86 |
87 |
88 |
89 | packages\System.Diagnostics.DiagnosticSource.7.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll
90 |
91 |
92 | packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll
93 | True
94 | True
95 |
96 |
97 | packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll
98 | True
99 | True
100 |
101 |
102 | packages\System.IO.4.3.0\lib\net462\System.IO.dll
103 | True
104 | True
105 |
106 |
107 | packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll
108 | True
109 | True
110 |
111 |
112 |
113 | packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll
114 | True
115 | True
116 |
117 |
118 | packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll
119 | True
120 | True
121 |
122 |
123 | packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll
124 | True
125 | True
126 |
127 |
128 | packages\System.Linq.4.3.0\lib\net463\System.Linq.dll
129 | True
130 | True
131 |
132 |
133 | packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll
134 | True
135 | True
136 |
137 |
138 | packages\System.Memory.4.5.5\lib\net461\System.Memory.dll
139 |
140 |
141 | packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll
142 | True
143 | True
144 |
145 |
146 | packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll
147 | True
148 | True
149 |
150 |
151 |
152 | packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll
153 |
154 |
155 | packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll
156 | True
157 | True
158 |
159 |
160 | packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll
161 | True
162 | True
163 |
164 |
165 | packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll
166 |
167 |
168 | packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll
169 | True
170 | True
171 |
172 |
173 | packages\System.Runtime.InteropServices.4.3.0\lib\net463\System.Runtime.InteropServices.dll
174 | True
175 | True
176 |
177 |
178 | packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll
179 | True
180 | True
181 |
182 |
183 | packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll
184 | True
185 | True
186 |
187 |
188 | packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll
189 | True
190 | True
191 |
192 |
193 | packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll
194 | True
195 | True
196 |
197 |
198 | packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll
199 | True
200 | True
201 |
202 |
203 | packages\System.Text.RegularExpressions.4.3.1\lib\net463\System.Text.RegularExpressions.dll
204 | True
205 | True
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 | packages\System.Xml.ReaderWriter.4.3.1\lib\net46\System.Xml.ReaderWriter.dll
217 | True
218 | True
219 |
220 |
221 |
222 |
223 |
224 |
225 | Form
226 |
227 |
228 | MainForm.cs
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 | MainForm.cs
237 |
238 |
239 | PublicResXFileCodeGenerator
240 | Resources.Designer.cs
241 | Designer
242 |
243 |
244 | True
245 | Resources.resx
246 | True
247 |
248 |
249 |
250 |
251 | SettingsSingleFileGenerator
252 | Settings.Designer.cs
253 |
254 |
255 | True
256 | Settings.settings
257 | True
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 | False
270 | Microsoft .NET Framework 4.6.1 %28x86 and x64%29
271 | true
272 |
273 |
274 | False
275 | .NET Framework 3.5 SP1
276 | false
277 |
278 |
279 |
280 |
281 |
282 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
--------------------------------------------------------------------------------
/genshin-audio-exporter.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.30717.126
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "genshin-audio-exporter", "genshin-audio-exporter.csproj", "{73A6280E-0E80-48EB-AD29-CE4BE676F321}"
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 | {73A6280E-0E80-48EB-AD29-CE4BE676F321}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {73A6280E-0E80-48EB-AD29-CE4BE676F321}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {73A6280E-0E80-48EB-AD29-CE4BE676F321}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {73A6280E-0E80-48EB-AD29-CE4BE676F321}.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 = {3AADC4B7-CE3E-4831-9E5A-3804F964A527}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------