MMConverter.cs 4.2 KB

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