123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- using System;
- using System.IO;
- using System.Linq;
- using ExIni;
- using MeidoPhotoStudio.Converter.MultipleMaids;
- namespace MeidoPhotoStudio.Converter.Converters
- {
- public class MMConverter : IConverter
- {
- private const string InputDirectoryName = "Input";
- public const string ConverterName = "MultipleMaids";
- public void Convert(string workingDirectory)
- {
- var baseDirectory = Path.Combine(workingDirectory, ConverterName);
- var baseInputDirectory = Path.Combine(baseDirectory, InputDirectoryName);
- var baseOutputDirectory = Path.Combine(baseDirectory, MPSSceneSerializer.FormatDate(DateTime.Now));
- Convert(baseInputDirectory, baseOutputDirectory);
- }
- private static void Convert(string workingDirectory, string destination)
- {
- var directory = new DirectoryInfo(workingDirectory);
- if (!directory.Exists)
- return;
- Directory.CreateDirectory(destination);
- foreach (var iniFile in directory.GetFiles("*.ini"))
- ConvertIniFile(iniFile, destination);
- foreach (var subDirectory in directory.GetDirectories())
- {
- var subDestination = Path.Combine(destination, subDirectory.Name);
- Convert(subDirectory.FullName, subDestination);
- }
- }
- private static void ConvertIniFile(FileInfo iniFile, string destination)
- {
- var section = GetSceneSection(iniFile.FullName);
- if (section is null)
- return;
- var outputDirectory = Path.Combine(destination, Path.GetFileNameWithoutExtension(iniFile.Name));
- Directory.CreateDirectory(outputDirectory);
- foreach (var key in section.Keys.Where(
- key => !key.Key.StartsWith("ss") && !string.IsNullOrEmpty(key.Value)
- ))
- ConvertScene(section, key, Path.Combine(outputDirectory, GenerateFilename(iniFile.Name, key)));
- }
- private static void ConvertScene(IniSection section, IniKey key, string filePath)
- {
- var background = int.Parse(key.Key.Substring(1)) >= 10000;
- byte[] convertedData;
- MeidoPhotoStudio.Plugin.SceneMetadata sceneMetadata;
- try
- {
- convertedData = MMSceneConverter.Convert(key.Value, background);
- sceneMetadata = MMSceneConverter.GetSceneMetadata(key.Value, background);
- }
- catch (Exception e)
- {
- if (Plugin.Instance == null)
- return;
- Plugin.Instance.Logger.LogError($"Could not convert {Path.GetFileName(filePath)} scene because {e}");
- return;
- }
- var screenshotKey = $"s{key.Key}";
- string? screenshotBase64 = null;
- if (section.HasKey(screenshotKey) && !string.IsNullOrEmpty(section[screenshotKey].Value))
- screenshotBase64 = section[screenshotKey].Value;
- MPSSceneSerializer.SaveToFile(filePath, sceneMetadata, convertedData, screenshotBase64);
- }
- private static string GenerateFilename(string iniFilePath, IniKey sceneKey)
- {
- var background = int.Parse(sceneKey.Key.Substring(1)) >= 10000;
- var iniFilename = Path.GetFileNameWithoutExtension(iniFilePath);
- var sceneName = sceneKey.Key;
- var data = sceneKey.Value;
- var date = DateTime.Parse(data.Substring(0, data.IndexOf(',')));
- var sceneDate = MPSSceneSerializer.FormatDate(date);
- return $"mm{(background ? "kankyo" : "scene")}_{iniFilename}_{sceneName}_{sceneDate}.png";
- }
- private static IniSection? GetSceneSection(string filePath)
- {
- IniFile iniFile;
- try
- {
- iniFile = IniFile.FromFile(filePath);
- }
- catch (Exception e)
- {
- if (Plugin.Instance != null)
- Plugin.Instance.Logger.LogWarning(
- $"Could not {(e is IOException ? "read" : "parse")} ini file {filePath}"
- );
- return null;
- }
- if (iniFile.HasSection("scene"))
- return iniFile.GetSection("scene");
- if (Plugin.Instance != null)
- Plugin.Instance.Logger.LogWarning(
- $"{filePath} is not a valid MM config because '[scene]' section is missing"
- );
- return null;
- }
- }
- }
|