using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; using SabreTools.FileTypes; using SabreTools.IO.Extensions; namespace SabreTools.DatItems.Formats { /// /// Represents Aaruformat images which use internal hashes /// [JsonObject("media"), XmlRoot("media")] public sealed class Media : DatItem { #region Fields /// /> protected override ItemType ItemType => ItemType.Media; /// /> protected override string? NameKey => Models.Metadata.Media.NameKey; #endregion #region Constructors public Media() : base() { SetFieldValue(DatItem.DupeTypeKey, 0x00); } public Media(Models.Metadata.Media item) : base(item) { SetFieldValue(DatItem.DupeTypeKey, 0x00); } public Media(BaseFile baseFile) : base() { SetName(baseFile.Filename); if (baseFile is FileTypes.Aaru.AaruFormat aif) { SetFieldValue(Models.Metadata.Media.MD5Key, aif.InternalMD5.ToHexString()); SetFieldValue(Models.Metadata.Media.SHA1Key, aif.InternalSHA1.ToHexString()); SetFieldValue(Models.Metadata.Media.SHA256Key, aif.InternalSHA256.ToHexString()); SetFieldValue(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(aif.InternalSpamSum ?? [])); } else { SetFieldValue(Models.Metadata.Media.MD5Key, baseFile.MD5.ToHexString()); SetFieldValue(Models.Metadata.Media.SHA1Key, baseFile.SHA1.ToHexString()); SetFieldValue(Models.Metadata.Media.SHA256Key, baseFile.SHA256.ToHexString()); SetFieldValue(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? [])); } SetFieldValue(DatItem.DupeTypeKey, 0x00); } #endregion #region Cloning Methods /// /// Convert Media object to a BaseFile /// public BaseFile ConvertToBaseFile() { return new BaseFile() { Filename = GetName(), Parent = GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey), MD5 = GetStringFieldValue(Models.Metadata.Media.MD5Key).FromHexString(), SHA1 = GetStringFieldValue(Models.Metadata.Media.SHA1Key).FromHexString(), SHA256 = GetStringFieldValue(Models.Metadata.Media.SHA256Key).FromHexString(), SpamSum = System.Text.Encoding.UTF8.GetBytes(GetStringFieldValue(Models.Metadata.Media.SpamSumKey) ?? string.Empty), }; } /// /// Convert a media to the closest Rom approximation /// /// public Rom ConvertToRom() { var rom = new Rom(_internal.ConvertToRom()!); rom.SetFieldValue(DatItem.DupeTypeKey, GetFieldValue(DatItem.DupeTypeKey)); rom.SetFieldValue(DatItem.MachineKey, GetFieldValue(DatItem.MachineKey)); rom.SetFieldValue(DatItem.RemoveKey, GetBoolFieldValue(DatItem.RemoveKey)); rom.SetFieldValue(DatItem.SourceKey, GetFieldValue(DatItem.SourceKey)); return rom; } #endregion #region Comparision Methods /// /// Fill any missing size and hash information from another Media /// /// Media to fill information from public void FillMissingInformation(Media other) => _internal.FillMissingHashes(other?._internal); /// /// Get unique duplicate suffix on name collision /// /// String representing the suffix public string GetDuplicateSuffix() => _internal.GetDuplicateSuffix(); #endregion #region Sorting and Merging /// public override string GetKey(ItemKey bucketedBy, bool lower = true, bool norename = true) { // Set the output key as the default blank string string? key; // Now determine what the key should be based on the bucketedBy value switch (bucketedBy) { case ItemKey.MD5: key = GetStringFieldValue(Models.Metadata.Media.MD5Key); break; case ItemKey.SHA1: key = GetStringFieldValue(Models.Metadata.Media.SHA1Key); break; case ItemKey.SHA256: key = GetStringFieldValue(Models.Metadata.Media.SHA256Key); break; case ItemKey.SpamSum: key = GetStringFieldValue(Models.Metadata.Media.SpamSumKey); break; // Let the base handle generic stuff default: return base.GetKey(bucketedBy, lower, norename); } // Double and triple check the key for corner cases key ??= string.Empty; return key; } #endregion } }