diff --git a/Aaru.Images/Localization/Localization.Designer.cs b/Aaru.Images/Localization/Localization.Designer.cs
index ad511e728..cceab5663 100644
--- a/Aaru.Images/Localization/Localization.Designer.cs
+++ b/Aaru.Images/Localization/Localization.Designer.cs
@@ -6087,5 +6087,53 @@ namespace Aaru.Images {
return ResourceManager.GetString("Ewf_Identify_Signature_0", resourceCulture);
}
}
+
+ internal static string MagicIso_disc_image {
+ get {
+ return ResourceManager.GetString("MagicIso_disc_image", resourceCulture);
+ }
+ }
+
+ internal static string MagicIso_bbis_signature_not_found {
+ get {
+ return ResourceManager.GetString("MagicIso_bbis_signature_not_found", resourceCulture);
+ }
+ }
+
+ internal static string MagicIso_blhr_signature_not_found {
+ get {
+ return ResourceManager.GetString("MagicIso_blhr_signature_not_found", resourceCulture);
+ }
+ }
+
+ internal static string MagicIso_password_protected_images_are_not_supported {
+ get {
+ return ResourceManager.GetString("MagicIso_password_protected_images_are_not_supported", resourceCulture);
+ }
+ }
+
+ internal static string MagicIso_unsupported_image_type_0 {
+ get {
+ return ResourceManager.GetString("MagicIso_unsupported_image_type_0", resourceCulture);
+ }
+ }
+
+ internal static string MagicIso_unsupported_block_type_0 {
+ get {
+ return ResourceManager.GetString("MagicIso_unsupported_block_type_0", resourceCulture);
+ }
+ }
+
+ internal static string MagicIso_NRG_trailer_not_found {
+ get {
+ return ResourceManager.GetString("MagicIso_NRG_trailer_not_found", resourceCulture);
+ }
+ }
+
+ internal static string MagicIso_NRG_trailer_has_no_tracks {
+ get {
+ return ResourceManager.GetString("MagicIso_NRG_trailer_has_no_tracks", resourceCulture);
+ }
+ }
}
}
diff --git a/Aaru.Images/Localization/Localization.es.resx b/Aaru.Images/Localization/Localization.es.resx
index bf361e78f..6de37284d 100644
--- a/Aaru.Images/Localization/Localization.es.resx
+++ b/Aaru.Images/Localization/Localization.es.resx
@@ -3036,4 +3036,28 @@
Firma: {0}
+
+ Imagen de disco UIF de MagicISO
+
+
+ No se encontró la firma del pie UIF de MagicISO.
+
+
+ No se encontró la cabecera BLHR en la imagen UIF de MagicISO.
+
+
+ Las imágenes UIF de MagicISO protegidas con contraseña no están soportadas.
+
+
+ El tipo de imagen UIF de MagicISO {0} no está soportado.
+
+
+ El tipo de bloque UIF de MagicISO {0} no está soportado.
+
+
+ No se encontró el ancla NRG dentro de la imagen UIF de MagicISO.
+
+
+ El bloque NRG incrustado en la imagen UIF de MagicISO no contiene pistas.
+
\ No newline at end of file
diff --git a/Aaru.Images/Localization/Localization.resx b/Aaru.Images/Localization/Localization.resx
index a96075015..69b7f6491 100644
--- a/Aaru.Images/Localization/Localization.resx
+++ b/Aaru.Images/Localization/Localization.resx
@@ -3055,4 +3055,28 @@
Signature: {0}
+
+ MagicISO UIF disc image
+
+
+ MagicISO UIF footer signature not found.
+
+
+ MagicISO UIF BLHR block list header not found.
+
+
+ Password-protected MagicISO UIF images are not supported.
+
+
+ MagicISO UIF image type {0} is not supported.
+
+
+ MagicISO UIF block type {0} is not supported.
+
+
+ NRG trailer anchor was not found inside the MagicISO UIF image.
+
+
+ The NRG trailer embedded in the MagicISO UIF image has no tracks.
+
\ No newline at end of file
diff --git a/Aaru.Images/MagicIso/Constants.cs b/Aaru.Images/MagicIso/Constants.cs
new file mode 100644
index 000000000..dd8749cfe
--- /dev/null
+++ b/Aaru.Images/MagicIso/Constants.cs
@@ -0,0 +1,73 @@
+// /***************************************************************************
+// Aaru Data Preservation Suite
+// ----------------------------------------------------------------------------
+//
+// Filename : Constants.cs
+// Author(s) : Natalia Portillo
+//
+// Component : Disc image plugins.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Contains constants for MagicISO UIF disc images.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 2.1 of the
+// License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2011-2026 Natalia Portillo
+// ****************************************************************************/
+
+namespace Aaru.Images;
+
+public sealed partial class MagicIso
+{
+ const string MODULE_NAME = "MagicISO plugin";
+ const uint MAX_CACHE_SIZE = 16777216;
+
+ // Descriptor signatures, stored little-endian in the UIF file.
+ // ASCII "bbis", "blhr", "bsdr", "blms", "blss" as 32-bit little-endian integers.
+ const uint BBIS_SIGNATURE = 0x73696262;
+ const uint BLHR_SIGNATURE = 0x72686C62;
+ const uint BSDR_SIGNATURE = 0x72647362;
+ const uint BLMS_SIGNATURE = 0x736D6C62;
+ const uint BLSS_SIGNATURE = 0x73736C62;
+
+ // Image variants recorded in BBIS.imageType
+ const ushort IMAGE_TYPE_ISO = 8;
+ const ushort IMAGE_TYPE_MIXED = 9;
+
+ // Block entry compression types
+ const uint BLOCK_TYPE_RAW = 1;
+ const uint BLOCK_TYPE_ZERO = 3;
+ const uint BLOCK_TYPE_ZLIB = 5;
+
+ // NRG trailer chunk tags, stored big-endian. Equal to the ASCII four-byte id.
+ const uint NRG_ANCHOR_NERO = 0x4E45524F; // "NERO"
+ const uint NRG_ANCHOR_NER5 = 0x4E455235; // "NER5"
+ const uint NRG_CHUNK_DAOI = 0x44414F49; // "DAOI"
+ const uint NRG_CHUNK_DAOX = 0x44414F58; // "DAOX"
+ const uint NRG_CHUNK_ETNF = 0x45544E46; // "ETNF"
+ const uint NRG_CHUNK_ETN2 = 0x45544E32; // "ETN2"
+ const uint NRG_CHUNK_CDTX = 0x43445458; // "CDTX"
+ const uint NRG_CHUNK_SINF = 0x53494E46; // "SINF"
+ const uint NRG_CHUNK_END = 0x454E4421; // "END!"
+
+ // Nero DAO mode byte values
+ const byte NRG_MODE_MODE1 = 0x00;
+ const byte NRG_MODE_MODE2_FORM1 = 0x02;
+ const byte NRG_MODE_MODE2_RAW = 0x03;
+ const byte NRG_MODE_AUDIO = 0x07;
+}
\ No newline at end of file
diff --git a/Aaru.Images/MagicIso/Enums.cs b/Aaru.Images/MagicIso/Enums.cs
new file mode 100644
index 000000000..b51182035
--- /dev/null
+++ b/Aaru.Images/MagicIso/Enums.cs
@@ -0,0 +1,49 @@
+// /***************************************************************************
+// Aaru Data Preservation Suite
+// ----------------------------------------------------------------------------
+//
+// Filename : Enums.cs
+// Author(s) : Natalia Portillo
+//
+// Component : Disc image plugins.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Contains enumerations for MagicISO UIF disc images.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 2.1 of the
+// License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2011-2026 Natalia Portillo
+// ****************************************************************************/
+
+namespace Aaru.Images;
+
+public sealed partial class MagicIso
+{
+#region Nested type: UifVariant
+
+ /// Describes how the decompressed data fork should be interpreted.
+ enum UifVariant
+ {
+ /// Single cooked ISO data track, 2048 bytes per sector.
+ Iso = 0,
+ /// Mixed disc whose track layout is described by an embedded NRG trailer.
+ NrgTrailer = 1
+ }
+
+#endregion
+}
\ No newline at end of file
diff --git a/Aaru.Images/MagicIso/Identify.cs b/Aaru.Images/MagicIso/Identify.cs
new file mode 100644
index 000000000..f49cc6764
--- /dev/null
+++ b/Aaru.Images/MagicIso/Identify.cs
@@ -0,0 +1,58 @@
+// /***************************************************************************
+// Aaru Data Preservation Suite
+// ----------------------------------------------------------------------------
+//
+// Filename : Identify.cs
+// Author(s) : Natalia Portillo
+//
+// Component : Disc image plugins.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Identifies MagicISO UIF disc images.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 2.1 of the
+// License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2011-2026 Natalia Portillo
+// ****************************************************************************/
+
+using System;
+using System.IO;
+using Aaru.CommonTypes.Interfaces;
+using Aaru.Helpers;
+
+namespace Aaru.Images;
+
+public sealed partial class MagicIso
+{
+ /// Footer size as stored on disc (packed, 64 bytes).
+ const int BBIS_FOOTER_SIZE = 64;
+
+ ///
+ public bool Identify(IFilter imageFilter)
+ {
+ Stream stream = imageFilter.GetDataForkStream();
+
+ if(stream.Length < BBIS_FOOTER_SIZE) return false;
+
+ stream.Seek(-BBIS_FOOTER_SIZE, SeekOrigin.End);
+ var footer = new byte[BBIS_FOOTER_SIZE];
+ stream.EnsureRead(footer, 0, BBIS_FOOTER_SIZE);
+
+ return BitConverter.ToUInt32(footer, 0) == BBIS_SIGNATURE;
+ }
+}
\ No newline at end of file
diff --git a/Aaru.Images/MagicIso/MagicIso.cs b/Aaru.Images/MagicIso/MagicIso.cs
new file mode 100644
index 000000000..6f4587166
--- /dev/null
+++ b/Aaru.Images/MagicIso/MagicIso.cs
@@ -0,0 +1,78 @@
+// /***************************************************************************
+// Aaru Data Preservation Suite
+// ----------------------------------------------------------------------------
+//
+// Filename : MagicIso.cs
+// Author(s) : Natalia Portillo
+//
+// Component : Disc image plugins.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Manages MagicISO UIF disc images.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 2.1 of the
+// License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2011-2026 Natalia Portillo
+// ****************************************************************************/
+
+using System.Collections.Generic;
+using System.IO;
+using Aaru.CommonTypes.Interfaces;
+using Aaru.CommonTypes.Structs;
+using Aaru.Decoders.CD;
+
+namespace Aaru.Images;
+
+public sealed partial class MagicIso : IOpticalMediaImage
+{
+ SortedList _blhrEntries;
+ uint[] _blhrStartSectors;
+ byte[] _cdText;
+ Dictionary _chunkCache;
+ uint _currentChunkCacheSize;
+ BbisFooter _footer;
+ IFilter _imageFilter;
+ ImageInfo _imageInfo;
+ Stream _imageStream;
+ List _magicIsoTracks;
+ SectorBuilder _sectorBuilder;
+ Dictionary _sectorCache;
+ byte[] _upc;
+ UifVariant _variant;
+
+ public MagicIso() => _imageInfo = new ImageInfo
+ {
+ ReadableSectorTags = [],
+ ReadableMediaTags = [],
+ HasPartitions = true,
+ HasSessions = true,
+ Version = null,
+ ApplicationVersion = null,
+ MediaTitle = null,
+ Creator = null,
+ MediaManufacturer = null,
+ MediaModel = null,
+ MediaPartNumber = null,
+ MediaSequence = 0,
+ LastMediaSequence = 0,
+ DriveManufacturer = null,
+ DriveModel = null,
+ DriveSerialNumber = null,
+ DriveFirmwareRevision = null
+ };
+}
\ No newline at end of file
diff --git a/Aaru.Images/MagicIso/Properties.cs b/Aaru.Images/MagicIso/Properties.cs
new file mode 100644
index 000000000..01e84fc0b
--- /dev/null
+++ b/Aaru.Images/MagicIso/Properties.cs
@@ -0,0 +1,68 @@
+// /***************************************************************************
+// Aaru Data Preservation Suite
+// ----------------------------------------------------------------------------
+//
+// Filename : Properties.cs
+// Author(s) : Natalia Portillo
+//
+// Component : Disc image plugins.
+//
+// --[ Description ] ----------------------------------------------------------
+//
+// Exposes properties for MagicISO UIF disc images.
+//
+// --[ License ] --------------------------------------------------------------
+//
+// This library is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 2.1 of the
+// License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, see .
+//
+// ----------------------------------------------------------------------------
+// Copyright © 2011-2026 Natalia Portillo
+// ****************************************************************************/
+
+using System;
+using System.Collections.Generic;
+using Aaru.CommonTypes.AaruMetadata;
+using Aaru.CommonTypes.Interfaces;
+using Aaru.CommonTypes.Structs;
+using Partition = Aaru.CommonTypes.Partition;
+using Track = Aaru.CommonTypes.Structs.Track;
+
+namespace Aaru.Images;
+
+public sealed partial class MagicIso : IOpticalMediaImage
+{
+ ///
+ public string Author => Authors.NataliaPortillo;
+ ///
+ public Metadata AaruMetadata => null;
+ ///
+ public List DumpHardware => null;
+ ///
+ public string Format => "MagicISO UIF";
+ ///
+ public Guid Id => new("EF5CBF5E-0F9F-4C57-9F6B-ADE4F4D4C0B1");
+ ///
+
+ // ReSharper disable once ConvertToAutoProperty
+ public ImageInfo Info => _imageInfo;
+
+ ///
+ public string Name => Localization.MagicIso_disc_image;
+ ///
+ public List Partitions { get; set; }
+ ///
+ public List