[CLI] Refactor

- Made some classes static
This commit is contained in:
VaDiM 2023-08-03 15:39:10 +03:00
parent 9784df0e16
commit e1d883adf6
5 changed files with 163 additions and 167 deletions

View File

@ -1,9 +1,9 @@
using AssetStudio; using AssetStudio;
using AssetStudioCLI.Options;
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using AssetStudioCLI.Options;
namespace AssetStudioCLI namespace AssetStudioCLI
{ {
@ -21,16 +21,16 @@ namespace AssetStudioCLI
public string LogName; public string LogName;
public string LogPath; public string LogPath;
public CLILogger(CLIOptions options) public CLILogger()
{ {
logOutput = options.o_logOutput.Value; logOutput = CLIOptions.o_logOutput.Value;
logMinLevel = options.o_logLevel.Value; logMinLevel = CLIOptions.o_logLevel.Value;
LogName = $"AssetStudioCLI_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.log"; LogName = $"AssetStudioCLI_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.log";
LogPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, LogName); LogPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, LogName);
var ver = typeof(Program).Assembly.GetName().Version; var ver = typeof(Program).Assembly.GetName().Version;
LogToFile(LoggerEvent.Verbose, $"---AssetStudioCLI v{ver} | Logger launched---\n" + LogToFile(LoggerEvent.Verbose, $"---AssetStudioCLI v{ver} | Logger launched---\n" +
$"CMD Args: {string.Join(" ", options.cliArgs)}"); $"CMD Args: {string.Join(" ", CLIOptions.cliArgs)}");
} }
private static string ColorLogLevel(LoggerEvent logLevel) private static string ColorLogLevel(LoggerEvent logLevel)

View File

@ -9,12 +9,12 @@ namespace AssetStudioCLI
{ {
internal static class Exporter internal static class Exporter
{ {
public static bool ExportTexture2D(AssetItem item, string exportPath, CLIOptions options) public static bool ExportTexture2D(AssetItem item, string exportPath)
{ {
var m_Texture2D = (Texture2D)item.Asset; var m_Texture2D = (Texture2D)item.Asset;
if (options.convertTexture) if (CLIOptions.convertTexture)
{ {
var type = options.o_imageFormat.Value; var type = CLIOptions.o_imageFormat.Value;
if (!TryExportFile(exportPath, item, "." + type.ToString().ToLower(), out var exportFullPath)) if (!TryExportFile(exportPath, item, "." + type.ToString().ToLower(), out var exportFullPath))
return false; return false;
var image = m_Texture2D.ConvertToImage(flip: true); var image = m_Texture2D.ConvertToImage(flip: true);
@ -43,7 +43,7 @@ namespace AssetStudioCLI
} }
} }
public static bool ExportAudioClip(AssetItem item, string exportPath, CLIOptions options) public static bool ExportAudioClip(AssetItem item, string exportPath)
{ {
string exportFullPath; string exportFullPath;
var m_AudioClip = (AudioClip)item.Asset; var m_AudioClip = (AudioClip)item.Asset;
@ -54,7 +54,7 @@ namespace AssetStudioCLI
return false; return false;
} }
var converter = new AudioClipConverter(m_AudioClip); var converter = new AudioClipConverter(m_AudioClip);
if (options.o_audioFormat.Value != AudioFormat.None && converter.IsSupport) if (CLIOptions.o_audioFormat.Value != AudioFormat.None && converter.IsSupport)
{ {
if (!TryExportFile(exportPath, item, ".wav", out exportFullPath)) if (!TryExportFile(exportPath, item, ".wav", out exportFullPath))
return false; return false;
@ -132,12 +132,12 @@ namespace AssetStudioCLI
return true; return true;
} }
public static bool ExportTextAsset(AssetItem item, string exportPath, CLIOptions options) public static bool ExportTextAsset(AssetItem item, string exportPath)
{ {
var m_TextAsset = (TextAsset)item.Asset; var m_TextAsset = (TextAsset)item.Asset;
var extension = ".txt"; var extension = ".txt";
var assetExtension = Path.GetExtension(m_TextAsset.m_Name); var assetExtension = Path.GetExtension(m_TextAsset.m_Name);
if (!options.f_notRestoreExtensionName.Value) if (!CLIOptions.f_notRestoreExtensionName.Value)
{ {
if (!string.IsNullOrEmpty(assetExtension)) if (!string.IsNullOrEmpty(assetExtension))
{ {
@ -160,7 +160,7 @@ namespace AssetStudioCLI
return true; return true;
} }
public static bool ExportMonoBehaviour(AssetItem item, string exportPath, AssemblyLoader assemblyLoader) public static bool ExportMonoBehaviour(AssetItem item, string exportPath)
{ {
if (!TryExportFile(exportPath, item, ".json", out var exportFullPath)) if (!TryExportFile(exportPath, item, ".json", out var exportFullPath))
return false; return false;
@ -168,7 +168,7 @@ namespace AssetStudioCLI
var type = m_MonoBehaviour.ToType(); var type = m_MonoBehaviour.ToType();
if (type == null) if (type == null)
{ {
var m_Type = m_MonoBehaviour.ConvertToTypeTree(assemblyLoader); var m_Type = m_MonoBehaviour.ConvertToTypeTree(Studio.assemblyLoader);
type = m_MonoBehaviour.ToType(m_Type); type = m_MonoBehaviour.ToType(m_Type);
} }
if (type != null) if (type != null)
@ -202,9 +202,9 @@ namespace AssetStudioCLI
return false; return false;
} }
public static bool ExportSprite(AssetItem item, string exportPath, CLIOptions options) public static bool ExportSprite(AssetItem item, string exportPath)
{ {
var type = options.o_imageFormat.Value; var type = CLIOptions.o_imageFormat.Value;
var alphaMask = SpriteMaskMode.On; var alphaMask = SpriteMaskMode.On;
if (!TryExportFile(exportPath, item, "." + type.ToString().ToLower(), out var exportFullPath)) if (!TryExportFile(exportPath, item, "." + type.ToString().ToLower(), out var exportFullPath))
return false; return false;
@ -234,14 +234,14 @@ namespace AssetStudioCLI
return true; return true;
} }
public static bool ExportDumpFile(AssetItem item, string exportPath, AssemblyLoader assemblyLoader) public static bool ExportDumpFile(AssetItem item, string exportPath)
{ {
if (!TryExportFile(exportPath, item, ".txt", out var exportFullPath)) if (!TryExportFile(exportPath, item, ".txt", out var exportFullPath))
return false; return false;
var str = item.Asset.Dump(); var str = item.Asset.Dump();
if (str == null && item.Asset is MonoBehaviour m_MonoBehaviour) if (str == null && item.Asset is MonoBehaviour m_MonoBehaviour)
{ {
var m_Type = m_MonoBehaviour.ConvertToTypeTree(assemblyLoader); var m_Type = m_MonoBehaviour.ConvertToTypeTree(Studio.assemblyLoader);
str = m_MonoBehaviour.Dump(m_Type); str = m_MonoBehaviour.Dump(m_Type);
} }
if (str != null) if (str != null)
@ -369,14 +369,14 @@ namespace AssetStudioCLI
return true; return true;
} }
public static bool ExportConvertFile(AssetItem item, string exportPath, CLIOptions options, AssemblyLoader assemblyLoader) public static bool ExportConvertFile(AssetItem item, string exportPath)
{ {
switch (item.Type) switch (item.Type)
{ {
case ClassIDType.Texture2D: case ClassIDType.Texture2D:
return ExportTexture2D(item, exportPath, options); return ExportTexture2D(item, exportPath);
case ClassIDType.AudioClip: case ClassIDType.AudioClip:
return ExportAudioClip(item, exportPath, options); return ExportAudioClip(item, exportPath);
case ClassIDType.VideoClip: case ClassIDType.VideoClip:
return ExportVideoClip(item, exportPath); return ExportVideoClip(item, exportPath);
case ClassIDType.MovieTexture: case ClassIDType.MovieTexture:
@ -384,13 +384,13 @@ namespace AssetStudioCLI
case ClassIDType.Shader: case ClassIDType.Shader:
return ExportShader(item, exportPath); return ExportShader(item, exportPath);
case ClassIDType.TextAsset: case ClassIDType.TextAsset:
return ExportTextAsset(item, exportPath, options); return ExportTextAsset(item, exportPath);
case ClassIDType.MonoBehaviour: case ClassIDType.MonoBehaviour:
return ExportMonoBehaviour(item, exportPath, assemblyLoader); return ExportMonoBehaviour(item, exportPath);
case ClassIDType.Font: case ClassIDType.Font:
return ExportFont(item, exportPath); return ExportFont(item, exportPath);
case ClassIDType.Sprite: case ClassIDType.Sprite:
return ExportSprite(item, exportPath, options); return ExportSprite(item, exportPath);
case ClassIDType.Mesh: case ClassIDType.Mesh:
return ExportMesh(item, exportPath); return ExportMesh(item, exportPath);
default: default:

View File

@ -57,57 +57,83 @@ namespace AssetStudioCLI.Options
internal class GroupedOption<T> : Option<T> internal class GroupedOption<T> : Option<T>
{ {
public GroupedOption(T optionDefaultValue, string optionName, string optionDescription, HelpGroups optionHelpGroup, bool isFlag = false) : base(optionDefaultValue, optionName, optionDescription, optionHelpGroup, isFlag) internal GroupedOption(T optionDefaultValue, string optionName, string optionDescription, HelpGroups optionHelpGroup, bool isFlag = false) : base(optionDefaultValue, optionName, optionDescription, optionHelpGroup, isFlag)
{ {
CLIOptions.OptionGrouping(optionName, optionDescription, optionHelpGroup, isFlag); CLIOptions._OptionGrouping(optionName, optionDescription, optionHelpGroup, isFlag);
} }
} }
internal class CLIOptions internal static class CLIOptions
{ {
public bool isParsed; public static bool isParsed;
public bool showHelp; public static bool showHelp;
public string[] cliArgs; public static string[] cliArgs;
public string inputPath; public static string inputPath;
public FilterBy filterBy; public static FilterBy filterBy;
private static Dictionary<string, string> optionsDict; private static Dictionary<string, string> optionsDict;
private static Dictionary<string, string> flagsDict; private static Dictionary<string, string> flagsDict;
private static Dictionary<HelpGroups, Dictionary<string, string>> optionGroups; private static Dictionary<HelpGroups, Dictionary<string, string>> optionGroups;
private List<ClassIDType> supportedAssetTypes; private static List<ClassIDType> supportedAssetTypes;
//general //general
public Option<WorkMode> o_workMode; public static Option<WorkMode> o_workMode;
public Option<List<ClassIDType>> o_exportAssetTypes; public static Option<List<ClassIDType>> o_exportAssetTypes;
public Option<AssetGroupOption> o_groupAssetsBy; public static Option<AssetGroupOption> o_groupAssetsBy;
public Option<string> o_outputFolder; public static Option<string> o_outputFolder;
public Option<bool> o_displayHelp; public static Option<bool> o_displayHelp;
//logger //logger
public Option<LoggerEvent> o_logLevel; public static Option<LoggerEvent> o_logLevel;
public Option<LogOutputMode> o_logOutput; public static Option<LogOutputMode> o_logOutput;
//convert //convert
public bool convertTexture; public static bool convertTexture;
public Option<ImageFormat> o_imageFormat; public static Option<ImageFormat> o_imageFormat;
public Option<AudioFormat> o_audioFormat; public static Option<AudioFormat> o_audioFormat;
//advanced //advanced
public Option<ExportListType> o_exportAssetList; public static Option<ExportListType> o_exportAssetList;
public Option<List<string>> o_filterByName; public static Option<List<string>> o_filterByName;
public Option<List<string>> o_filterByContainer; public static Option<List<string>> o_filterByContainer;
public Option<List<string>> o_filterByPathID; public static Option<List<string>> o_filterByPathID;
public Option<List<string>> o_filterByText; public static Option<List<string>> o_filterByText;
public Option<string> o_assemblyPath; public static Option<string> o_assemblyPath;
public Option<string> o_unityVersion; public static Option<string> o_unityVersion;
public Option<bool> f_notRestoreExtensionName; public static Option<bool> f_notRestoreExtensionName;
public CLIOptions(string[] args) static CLIOptions()
{ {
cliArgs = args;
InitOptions(); InitOptions();
ParseArgs(args);
} }
private void InitOptions() internal static void _OptionGrouping(string name, string desc, HelpGroups group, bool isFlag) //TODO
{
if (string.IsNullOrEmpty(name))
{
return;
}
var optionDict = new Dictionary<string, string>() { { name, desc } };
if (!optionGroups.ContainsKey(group))
{
optionGroups.Add(group, optionDict);
}
else
{
optionGroups[group].Add(name, desc);
}
if (isFlag)
{
flagsDict.Add(name, desc);
}
else
{
optionsDict.Add(name, desc);
}
}
private static void InitOptions()
{ {
isParsed = false; isParsed = false;
showHelp = false; showHelp = false;
cliArgs = null;
inputPath = ""; inputPath = "";
filterBy = FilterBy.None; filterBy = FilterBy.None;
optionsDict = new Dictionary<string, string>(); optionsDict = new Dictionary<string, string>();
@ -303,35 +329,10 @@ namespace AssetStudioCLI.Options
#endregion #endregion
} }
internal static void OptionGrouping(string name, string desc, HelpGroups group, bool isFlag) public static void ParseArgs(string[] args)
{ {
if (string.IsNullOrEmpty(name)) cliArgs = args;
{
return;
}
var optionDict = new Dictionary<string, string>() { { name, desc } };
if (!optionGroups.ContainsKey(group))
{
optionGroups.Add(group, optionDict);
}
else
{
optionGroups[group].Add(name, desc);
}
if (isFlag)
{
flagsDict.Add(name, desc);
}
else
{
optionsDict.Add(name, desc);
}
}
private void ParseArgs(string[] args)
{
var brightYellow = CLIAnsiColors.BrightYellow; var brightYellow = CLIAnsiColors.BrightYellow;
var brightRed = CLIAnsiColors.BrightRed; var brightRed = CLIAnsiColors.BrightRed;
@ -658,6 +659,7 @@ namespace AssetStudioCLI.Options
if (Directory.Exists(value)) if (Directory.Exists(value))
{ {
o_assemblyPath.Value = value; o_assemblyPath.Value = value;
Studio.assemblyLoader.Load(value);
} }
else else
{ {
@ -703,8 +705,13 @@ namespace AssetStudioCLI.Options
return; return;
} }
} }
isParsed = true;
#endregion #endregion
if (!Studio.assemblyLoader.Loaded)
{
Studio.assemblyLoader.Loaded = true;
}
isParsed = true;
} }
private static string[] ValueSplitter(string value) private static string[] ValueSplitter(string value)
@ -713,7 +720,7 @@ namespace AssetStudioCLI.Options
return value.Split(separator); return value.Split(separator);
} }
private bool TryShowOptionDescription(string option, Dictionary<string, string> descDict) private static bool TryShowOptionDescription(string option, Dictionary<string, string> descDict)
{ {
var optionDesc = descDict.Where(x => x.Key.Contains(option)); var optionDesc = descDict.Where(x => x.Key.Contains(option));
if (optionDesc.Any()) if (optionDesc.Any())
@ -728,7 +735,7 @@ namespace AssetStudioCLI.Options
return false; return false;
} }
public void ShowHelp(bool showUsageOnly = false) public static void ShowHelp(bool showUsageOnly = false)
{ {
const int indent = 22; const int indent = 22;
var helpMessage = new StringBuilder(); var helpMessage = new StringBuilder();
@ -766,7 +773,7 @@ namespace AssetStudioCLI.Options
} }
} }
private string ShowCurrentFilter() private static string ShowCurrentFilter()
{ {
switch (filterBy) switch (filterBy)
{ {
@ -785,7 +792,7 @@ namespace AssetStudioCLI.Options
} }
} }
public void ShowCurrentOptions() public static void ShowCurrentOptions()
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
sb.AppendLine("[Current Options]"); sb.AppendLine("[Current Options]");

View File

@ -8,52 +8,51 @@ namespace AssetStudioCLI
{ {
public static void Main(string[] args) public static void Main(string[] args)
{ {
var options = new CLIOptions(args); CLIOptions.ParseArgs(args);
if (options.isParsed) if (CLIOptions.isParsed)
{ {
CLIRun(options); CLIRun();
} }
else if (options.showHelp) else if (CLIOptions.showHelp)
{ {
options.ShowHelp(); CLIOptions.ShowHelp();
} }
else else
{ {
Console.WriteLine(); Console.WriteLine();
options.ShowHelp(showUsageOnly: true); CLIOptions.ShowHelp(showUsageOnly: true);
} }
} }
private static void CLIRun(CLIOptions options) private static void CLIRun()
{ {
var cliLogger = new CLILogger(options); var cliLogger = new CLILogger();
Logger.Default = cliLogger; Logger.Default = cliLogger;
var studio = new Studio(options); CLIOptions.ShowCurrentOptions();
options.ShowCurrentOptions();
try try
{ {
if (studio.LoadAssets()) if (Studio.LoadAssets())
{ {
studio.ParseAssets(); Studio.ParseAssets();
if (options.filterBy != FilterBy.None && options.o_workMode.Value != WorkMode.ExportLive2D) if (CLIOptions.filterBy != FilterBy.None && CLIOptions.o_workMode.Value != WorkMode.ExportLive2D)
{ {
studio.FilterAssets(); Studio.FilterAssets();
} }
if (options.o_exportAssetList.Value != ExportListType.None) if (CLIOptions.o_exportAssetList.Value != ExportListType.None)
{ {
studio.ExportAssetList(); Studio.ExportAssetList();
} }
switch (options.o_workMode.Value) switch (CLIOptions.o_workMode.Value)
{ {
case WorkMode.Info: case WorkMode.Info:
studio.ShowExportableAssetsInfo(); Studio.ShowExportableAssetsInfo();
break; break;
case WorkMode.ExportLive2D: case WorkMode.ExportLive2D:
studio.ExportLive2D(); Studio.ExportLive2D();
break; break;
default: default:
studio.ExportAssets(); Studio.ExportAssets();
break; break;
} }
} }

View File

@ -11,40 +11,30 @@ using Ansi = AssetStudioCLI.CLIAnsiColors;
namespace AssetStudioCLI namespace AssetStudioCLI
{ {
internal class Studio internal static class Studio
{ {
public AssetsManager assetsManager = new AssetsManager(); public static AssetsManager assetsManager = new AssetsManager();
public List<AssetItem> parsedAssetsList = new List<AssetItem>(); public static List<AssetItem> parsedAssetsList = new List<AssetItem>();
public static AssemblyLoader assemblyLoader = new AssemblyLoader();
private static Dictionary<AssetStudio.Object, string> containers = new Dictionary<AssetStudio.Object, string>(); private static Dictionary<AssetStudio.Object, string> containers = new Dictionary<AssetStudio.Object, string>();
private static AssemblyLoader assemblyLoader = new AssemblyLoader();
private readonly CLIOptions options;
public Studio(CLIOptions cliOptions) static Studio()
{ {
Progress.Default = new Progress<int>(ShowCurProgressValue); Progress.Default = new Progress<int>(ShowCurProgressValue);
options = cliOptions;
if (options.o_assemblyPath.Value != "")
{
assemblyLoader.Load(options.o_assemblyPath.Value);
}
else
{
assemblyLoader.Loaded = true;
}
} }
private void ShowCurProgressValue(int value) private static void ShowCurProgressValue(int value)
{ {
Console.Write($"[{value:000}%]\r"); Console.Write($"[{value:000}%]\r");
} }
public bool LoadAssets() public static bool LoadAssets()
{ {
var isLoaded = false; var isLoaded = false;
assetsManager.SpecifyUnityVersion = options.o_unityVersion.Value; assetsManager.SpecifyUnityVersion = CLIOptions.o_unityVersion.Value;
assetsManager.SetAssetFilter(options.o_exportAssetTypes.Value); assetsManager.SetAssetFilter(CLIOptions.o_exportAssetTypes.Value);
assetsManager.LoadFilesAndFolders(options.inputPath); assetsManager.LoadFilesAndFolders(CLIOptions.inputPath);
if (assetsManager.assetsFileList.Count == 0) if (assetsManager.assetsFileList.Count == 0)
{ {
Logger.Warning("No Unity file can be loaded."); Logger.Warning("No Unity file can be loaded.");
@ -57,7 +47,7 @@ namespace AssetStudioCLI
return isLoaded; return isLoaded;
} }
public void ParseAssets() public static void ParseAssets()
{ {
Logger.Info("Parse assets..."); Logger.Info("Parse assets...");
@ -141,7 +131,7 @@ namespace AssetStudioCLI
assetItem.Text = assetItem.TypeString + assetItem.UniqueID; assetItem.Text = assetItem.TypeString + assetItem.UniqueID;
} }
isExportable = options.o_exportAssetTypes.Value.Contains(asset.type); isExportable = CLIOptions.o_exportAssetTypes.Value.Contains(asset.type);
if (isExportable) if (isExportable)
{ {
fileAssetsList.Add(assetItem); fileAssetsList.Add(assetItem);
@ -158,7 +148,7 @@ namespace AssetStudioCLI
} }
parsedAssetsList.AddRange(fileAssetsList); parsedAssetsList.AddRange(fileAssetsList);
fileAssetsList.Clear(); fileAssetsList.Clear();
if (options.o_workMode.Value != WorkMode.ExportLive2D) if (CLIOptions.o_workMode.Value != WorkMode.ExportLive2D)
{ {
containers.Clear(); containers.Clear();
} }
@ -170,14 +160,14 @@ namespace AssetStudioCLI
{ {
m_ObjectsCount = assetsManager.assetsFileList.Sum(x => x.m_Objects.LongCount(y => m_ObjectsCount = assetsManager.assetsFileList.Sum(x => x.m_Objects.LongCount(y =>
y.classID != (int)ClassIDType.Shader y.classID != (int)ClassIDType.Shader
&& options.o_exportAssetTypes.Value.Any(k => (int)k == y.classID)) && CLIOptions.o_exportAssetTypes.Value.Any(k => (int)k == y.classID))
); );
} }
else else
{ {
m_ObjectsCount = assetsManager.assetsFileList.Sum(x => x.m_Objects.LongCount(y => options.o_exportAssetTypes.Value.Any(k => (int)k == y.classID))); m_ObjectsCount = assetsManager.assetsFileList.Sum(x => x.m_Objects.LongCount(y => CLIOptions.o_exportAssetTypes.Value.Any(k => (int)k == y.classID)));
} }
var objectsCount = assetsManager.assetsFileList.Sum(x => x.Objects.LongCount(y => options.o_exportAssetTypes.Value.Any(k => k == y.type))); var objectsCount = assetsManager.assetsFileList.Sum(x => x.Objects.LongCount(y => CLIOptions.o_exportAssetTypes.Value.Any(k => k == y.type)));
if (m_ObjectsCount != objectsCount) if (m_ObjectsCount != objectsCount)
{ {
log += $" and {m_ObjectsCount - objectsCount} assets failed to read"; log += $" and {m_ObjectsCount - objectsCount} assets failed to read";
@ -185,7 +175,7 @@ namespace AssetStudioCLI
Logger.Info(log); Logger.Info(log);
} }
public void ShowExportableAssetsInfo() public static void ShowExportableAssetsInfo()
{ {
var exportableAssetsCountDict = new Dictionary<ClassIDType, int>(); var exportableAssetsCountDict = new Dictionary<ClassIDType, int>();
string info = ""; string info = "";
@ -218,7 +208,7 @@ namespace AssetStudioCLI
info += "No exportable assets found."; info += "No exportable assets found.";
} }
if (options.o_logLevel.Value > LoggerEvent.Info) if (CLIOptions.o_logLevel.Value > LoggerEvent.Info)
{ {
Console.WriteLine(info); Console.WriteLine(info);
} }
@ -228,53 +218,53 @@ namespace AssetStudioCLI
} }
} }
public void FilterAssets() public static void FilterAssets()
{ {
var assetsCount = parsedAssetsList.Count; var assetsCount = parsedAssetsList.Count;
var filteredAssets = new List<AssetItem>(); var filteredAssets = new List<AssetItem>();
switch(options.filterBy) switch(CLIOptions.filterBy)
{ {
case FilterBy.Name: case FilterBy.Name:
filteredAssets = parsedAssetsList.FindAll(x => options.o_filterByName.Value.Any(y => x.Text.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0)); filteredAssets = parsedAssetsList.FindAll(x => CLIOptions.o_filterByName.Value.Any(y => x.Text.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0));
Logger.Info( Logger.Info(
$"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " + $"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " +
$"that contain {$"\"{string.Join("\", \"", options.o_filterByName.Value)}\"".Color(Ansi.BrightYellow)} in their Names." $"that contain {$"\"{string.Join("\", \"", CLIOptions.o_filterByName.Value)}\"".Color(Ansi.BrightYellow)} in their Names."
); );
break; break;
case FilterBy.Container: case FilterBy.Container:
filteredAssets = parsedAssetsList.FindAll(x => options.o_filterByContainer.Value.Any(y => x.Container.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0)); filteredAssets = parsedAssetsList.FindAll(x => CLIOptions.o_filterByContainer.Value.Any(y => x.Container.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0));
Logger.Info( Logger.Info(
$"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " + $"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " +
$"that contain {$"\"{string.Join("\", \"", options.o_filterByContainer.Value)}\"".Color(Ansi.BrightYellow)} in their Containers." $"that contain {$"\"{string.Join("\", \"", CLIOptions.o_filterByContainer.Value)}\"".Color(Ansi.BrightYellow)} in their Containers."
); );
break; break;
case FilterBy.PathID: case FilterBy.PathID:
filteredAssets = parsedAssetsList.FindAll(x => options.o_filterByPathID.Value.Any(y => x.m_PathID.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0)); filteredAssets = parsedAssetsList.FindAll(x => CLIOptions.o_filterByPathID.Value.Any(y => x.m_PathID.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0));
Logger.Info( Logger.Info(
$"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " + $"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " +
$"that contain {$"\"{string.Join("\", \"", options.o_filterByPathID.Value)}\"".Color(Ansi.BrightYellow)} in their PathIDs." $"that contain {$"\"{string.Join("\", \"", CLIOptions.o_filterByPathID.Value)}\"".Color(Ansi.BrightYellow)} in their PathIDs."
); );
break; break;
case FilterBy.NameOrContainer: case FilterBy.NameOrContainer:
filteredAssets = parsedAssetsList.FindAll(x => filteredAssets = parsedAssetsList.FindAll(x =>
options.o_filterByText.Value.Any(y => x.Text.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0) || CLIOptions.o_filterByText.Value.Any(y => x.Text.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0) ||
options.o_filterByText.Value.Any(y => x.Container.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0) CLIOptions.o_filterByText.Value.Any(y => x.Container.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0)
); );
Logger.Info( Logger.Info(
$"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " + $"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " +
$"that contain {$"\"{string.Join("\", \"", options.o_filterByText.Value)}\"".Color(Ansi.BrightYellow)} in their Names or Contaniers." $"that contain {$"\"{string.Join("\", \"", CLIOptions.o_filterByText.Value)}\"".Color(Ansi.BrightYellow)} in their Names or Contaniers."
); );
break; break;
case FilterBy.NameAndContainer: case FilterBy.NameAndContainer:
filteredAssets = parsedAssetsList.FindAll(x => filteredAssets = parsedAssetsList.FindAll(x =>
options.o_filterByName.Value.Any(y => x.Text.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0) && CLIOptions.o_filterByName.Value.Any(y => x.Text.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0) &&
options.o_filterByContainer.Value.Any(y => x.Container.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0) CLIOptions.o_filterByContainer.Value.Any(y => x.Container.ToString().IndexOf(y, StringComparison.OrdinalIgnoreCase) >= 0)
); );
Logger.Info( Logger.Info(
$"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " + $"Found [{filteredAssets.Count}/{assetsCount}] asset(s) " +
$"that contain {$"\"{string.Join("\", \"", options.o_filterByContainer.Value)}\"".Color(Ansi.BrightYellow)} in their Containers " + $"that contain {$"\"{string.Join("\", \"", CLIOptions.o_filterByContainer.Value)}\"".Color(Ansi.BrightYellow)} in their Containers " +
$"and {$"\"{string.Join("\", \"", options.o_filterByName.Value)}\"".Color(Ansi.BrightYellow)} in their Names." $"and {$"\"{string.Join("\", \"", CLIOptions.o_filterByName.Value)}\"".Color(Ansi.BrightYellow)} in their Names."
); );
break; break;
} }
@ -282,13 +272,13 @@ namespace AssetStudioCLI
parsedAssetsList = filteredAssets; parsedAssetsList = filteredAssets;
} }
public void ExportAssets() public static void ExportAssets()
{ {
var savePath = options.o_outputFolder.Value; var savePath = CLIOptions.o_outputFolder.Value;
var toExportCount = parsedAssetsList.Count; var toExportCount = parsedAssetsList.Count;
var exportedCount = 0; var exportedCount = 0;
var groupOption = options.o_groupAssetsBy.Value; var groupOption = CLIOptions.o_groupAssetsBy.Value;
foreach (var asset in parsedAssetsList) foreach (var asset in parsedAssetsList)
{ {
string exportPath; string exportPath;
@ -330,25 +320,25 @@ namespace AssetStudioCLI
exportPath += Path.DirectorySeparatorChar; exportPath += Path.DirectorySeparatorChar;
try try
{ {
switch (options.o_workMode.Value) switch (CLIOptions.o_workMode.Value)
{ {
case WorkMode.ExportRaw: case WorkMode.ExportRaw:
Logger.Debug($"{options.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); Logger.Debug($"{CLIOptions.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}");
if (ExportRawFile(asset, exportPath)) if (ExportRawFile(asset, exportPath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case WorkMode.Dump: case WorkMode.Dump:
Logger.Debug($"{options.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); Logger.Debug($"{CLIOptions.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}");
if (ExportDumpFile(asset, exportPath, assemblyLoader)) if (ExportDumpFile(asset, exportPath))
{ {
exportedCount++; exportedCount++;
} }
break; break;
case WorkMode.Export: case WorkMode.Export:
Logger.Debug($"{options.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}"); Logger.Debug($"{CLIOptions.o_workMode}: {asset.Type} : {asset.Container} : {asset.Text}");
if (ExportConvertFile(asset, exportPath, options, assemblyLoader)) if (ExportConvertFile(asset, exportPath))
{ {
exportedCount++; exportedCount++;
} }
@ -369,11 +359,11 @@ namespace AssetStudioCLI
} }
else if (toExportCount > exportedCount) else if (toExportCount > exportedCount)
{ {
Logger.Default.Log(LoggerEvent.Info, $"Finished exporting {exportedCount} asset(s) to \"{options.o_outputFolder.Value.Color(Ansi.BrightYellow)}\".", ignoreLevel: true); Logger.Default.Log(LoggerEvent.Info, $"Finished exporting {exportedCount} asset(s) to \"{CLIOptions.o_outputFolder.Value.Color(Ansi.BrightYellow)}\".", ignoreLevel: true);
} }
else else
{ {
Logger.Default.Log(LoggerEvent.Info, $"Finished exporting {exportedCount} asset(s) to \"{options.o_outputFolder.Value.Color(Ansi.BrightGreen)}\".", ignoreLevel: true); Logger.Default.Log(LoggerEvent.Info, $"Finished exporting {exportedCount} asset(s) to \"{CLIOptions.o_outputFolder.Value.Color(Ansi.BrightGreen)}\".", ignoreLevel: true);
} }
if (toExportCount > exportedCount) if (toExportCount > exportedCount)
@ -382,11 +372,11 @@ namespace AssetStudioCLI
} }
} }
public void ExportAssetList() public static void ExportAssetList()
{ {
var savePath = options.o_outputFolder.Value; var savePath = CLIOptions.o_outputFolder.Value;
switch (options.o_exportAssetList.Value) switch (CLIOptions.o_exportAssetList.Value)
{ {
case ExportListType.XML: case ExportListType.XML:
var filename = Path.Combine(savePath, "assets.xml"); var filename = Path.Combine(savePath, "assets.xml");
@ -413,9 +403,9 @@ namespace AssetStudioCLI
Logger.Info($"Finished exporting asset list with {parsedAssetsList.Count} items."); Logger.Info($"Finished exporting asset list with {parsedAssetsList.Count} items.");
} }
public void ExportLive2D() public static void ExportLive2D()
{ {
var baseDestPath = Path.Combine(options.o_outputFolder.Value, "Live2DOutput"); var baseDestPath = Path.Combine(CLIOptions.o_outputFolder.Value, "Live2DOutput");
var useFullContainerPath = false; var useFullContainerPath = false;
Progress.Reset(); Progress.Reset();
@ -481,7 +471,7 @@ namespace AssetStudioCLI
Progress.Report(modelCounter, (int)totalModelCount); Progress.Report(modelCounter, (int)totalModelCount);
} }
var status = modelCounter > 0 ? var status = modelCounter > 0 ?
$"Finished exporting [{modelCounter}/{totalModelCount}] Live2D model(s) to \"{options.o_outputFolder.Value.Color(Ansi.BrightCyan)}\"" : $"Finished exporting [{modelCounter}/{totalModelCount}] Live2D model(s) to \"{CLIOptions.o_outputFolder.Value.Color(Ansi.BrightCyan)}\"" :
"Nothing exported."; "Nothing exported.";
Logger.Default.Log(LoggerEvent.Info, status, ignoreLevel: true); Logger.Default.Log(LoggerEvent.Info, status, ignoreLevel: true);
} }