MMConverter.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using ExIni;
  5. using MeidoPhotoStudio.Converter.MultipleMaids;
  6. namespace MeidoPhotoStudio.Converter.Converters
  7. {
  8. public class MMConverter : IConverter
  9. {
  10. private const string InputDirectoryName = "Input";
  11. public const string ConverterName = "MultipleMaids";
  12. public void Convert(string workingDirectory)
  13. {
  14. var baseDirectory = Path.Combine(workingDirectory, ConverterName);
  15. var baseInputDirectory = Path.Combine(baseDirectory, InputDirectoryName);
  16. var baseOutputDirectory = Path.Combine(baseDirectory, MPSSceneSerializer.FormatDate(DateTime.Now));
  17. Convert(baseInputDirectory, baseOutputDirectory);
  18. }
  19. private static void Convert(string workingDirectory, string destination)
  20. {
  21. var directory = new DirectoryInfo(workingDirectory);
  22. if (!directory.Exists)
  23. return;
  24. Directory.CreateDirectory(destination);
  25. foreach (var iniFile in directory.GetFiles("*.ini"))
  26. ConvertIniFile(iniFile, destination);
  27. foreach (var subDirectory in directory.GetDirectories())
  28. {
  29. var subDestination = Path.Combine(destination, subDirectory.Name);
  30. Convert(subDirectory.FullName, subDestination);
  31. }
  32. }
  33. private static void ConvertIniFile(FileInfo iniFile, string destination)
  34. {
  35. var section = GetSceneSection(iniFile.FullName);
  36. if (section is null)
  37. return;
  38. var outputDirectory = Path.Combine(destination, Path.GetFileNameWithoutExtension(iniFile.Name));
  39. Directory.CreateDirectory(outputDirectory);
  40. foreach (var key in section.Keys.Where(
  41. key => !key.Key.StartsWith("ss") && !string.IsNullOrEmpty(key.Value)
  42. ))
  43. ConvertScene(section, key, Path.Combine(outputDirectory, GenerateFilename(iniFile.Name, key)));
  44. }
  45. private static void ConvertScene(IniSection section, IniKey key, string filePath)
  46. {
  47. var background = int.Parse(key.Key.Substring(1)) >= 10000;
  48. byte[] convertedData;
  49. MeidoPhotoStudio.Plugin.SceneMetadata sceneMetadata;
  50. try
  51. {
  52. convertedData = MMSceneConverter.Convert(key.Value, background);
  53. sceneMetadata = MMSceneConverter.GetSceneMetadata(key.Value, background);
  54. }
  55. catch (Exception e)
  56. {
  57. if (Plugin.Instance == null)
  58. return;
  59. Plugin.Instance.Logger.LogError($"Could not convert {Path.GetFileName(filePath)} scene because {e}");
  60. return;
  61. }
  62. var screenshotKey = $"s{key.Key}"; // ex. ss100=thumb_base64
  63. string? screenshotBase64 = null;
  64. if (section.HasKey(screenshotKey) && !string.IsNullOrEmpty(section[screenshotKey].Value))
  65. screenshotBase64 = section[screenshotKey].Value;
  66. MPSSceneSerializer.SaveToFile(filePath, sceneMetadata, convertedData, screenshotBase64);
  67. }
  68. private static string GenerateFilename(string iniFilePath, IniKey sceneKey)
  69. {
  70. var background = int.Parse(sceneKey.Key.Substring(1)) >= 10000;
  71. var iniFilename = Path.GetFileNameWithoutExtension(iniFilePath);
  72. var sceneName = sceneKey.Key;
  73. var data = sceneKey.Value;
  74. var date = DateTime.Parse(data.Substring(0, data.IndexOf(',')));
  75. var sceneDate = MPSSceneSerializer.FormatDate(date);
  76. return $"mm{(background ? "kankyo" : "scene")}_{iniFilename}_{sceneName}_{sceneDate}.png";
  77. }
  78. private static IniSection? GetSceneSection(string filePath)
  79. {
  80. IniFile iniFile;
  81. try
  82. {
  83. iniFile = IniFile.FromFile(filePath);
  84. }
  85. catch (Exception e)
  86. {
  87. if (Plugin.Instance != null)
  88. Plugin.Instance.Logger.LogWarning(
  89. $"Could not {(e is IOException ? "read" : "parse")} ini file {filePath}"
  90. );
  91. return null;
  92. }
  93. if (iniFile.HasSection("scene"))
  94. return iniFile.GetSection("scene");
  95. if (Plugin.Instance != null)
  96. Plugin.Instance.Logger.LogWarning(
  97. $"{filePath} is not a valid MM config because '[scene]' section is missing"
  98. );
  99. return null;
  100. }
  101. }
  102. }