mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-06-03 00:58:13 -04:00
[CLI] Refactor
- Made some classes static
This commit is contained in:
parent
9784df0e16
commit
e1d883adf6
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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]");
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user