mirror of
https://github.com/SabreTools/MPF.git
synced 2026-07-02 17:24:48 +00:00
Generate cuesheet using new classes for Aaru
This commit is contained in:
@@ -6,6 +6,7 @@ using System.Text.RegularExpressions;
|
||||
using System.Xml;
|
||||
using System.Xml.Schema;
|
||||
using System.Xml.Serialization;
|
||||
using DICUI.CueSheets;
|
||||
using DICUI.Data;
|
||||
using DICUI.Utilities;
|
||||
using DICUI.Web;
|
||||
@@ -2162,6 +2163,57 @@ namespace DICUI.Aaru
|
||||
|
||||
#region Information Extraction Methods
|
||||
|
||||
/// <summary>
|
||||
/// Convert the TrackTypeTrackType value to a CueTrackDataType
|
||||
/// </summary>
|
||||
private CueTrackDataType ConvertToDataType(TrackTypeTrackType trackType, uint bytesPerSector)
|
||||
{
|
||||
switch (trackType)
|
||||
{
|
||||
case TrackTypeTrackType.audio:
|
||||
return CueTrackDataType.AUDIO;
|
||||
|
||||
case TrackTypeTrackType.mode1:
|
||||
if (bytesPerSector == 2048)
|
||||
return CueTrackDataType.MODE1_2048;
|
||||
else
|
||||
return CueTrackDataType.MODE1_2352;
|
||||
|
||||
case TrackTypeTrackType.mode2:
|
||||
case TrackTypeTrackType.m2f1:
|
||||
case TrackTypeTrackType.m2f2:
|
||||
if (bytesPerSector == 2336)
|
||||
return CueTrackDataType.MODE2_2336;
|
||||
else
|
||||
return CueTrackDataType.MODE2_2352;
|
||||
|
||||
default:
|
||||
return CueTrackDataType.MODE1_2352;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert the TrackFlagsType value to a CueTrackFlag
|
||||
/// </summary>
|
||||
private CueTrackFlag ConvertToTrackFlag(TrackFlagsType trackFlagsType)
|
||||
{
|
||||
if (trackFlagsType == null)
|
||||
return 0;
|
||||
|
||||
CueTrackFlag flag = 0;
|
||||
|
||||
if (trackFlagsType.CopyPermitted)
|
||||
flag |= CueTrackFlag.DCP;
|
||||
|
||||
if (trackFlagsType.Quadraphonic)
|
||||
flag |= CueTrackFlag.FourCH;
|
||||
|
||||
if (trackFlagsType.PreEmphasis)
|
||||
flag |= CueTrackFlag.PRE;
|
||||
|
||||
return flag;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generate a cuesheet string based on CICM sidecar data
|
||||
/// </summary>
|
||||
@@ -2176,7 +2228,8 @@ namespace DICUI.Aaru
|
||||
|
||||
// Required variables
|
||||
uint totalTracks = 0;
|
||||
string cuesheet = string.Empty;
|
||||
CueSheet cueSheet = new CueSheet();
|
||||
cueSheet.Files = new List<CueFile>();
|
||||
|
||||
// Only care about OpticalDisc types
|
||||
if (cicmSidecar.OpticalDisc == null || cicmSidecar.OpticalDisc.Length == 0)
|
||||
@@ -2193,83 +2246,72 @@ namespace DICUI.Aaru
|
||||
if (opticalDisc.Track == null || opticalDisc.Track.Length == 0)
|
||||
continue;
|
||||
|
||||
// Get cuesheet-level information
|
||||
cueSheet.Catalog = opticalDisc.MediaCatalogueNumber;
|
||||
|
||||
// Loop through each track
|
||||
foreach (TrackType track in opticalDisc.Track)
|
||||
{
|
||||
uint trackNumber = track.Sequence?.TrackNumber ?? 0;
|
||||
TrackTypeTrackType trackType = track.TrackType1;
|
||||
// Create cue file entry
|
||||
CueFile cueFile = new CueFile();
|
||||
cueFile.FileType = CueFileType.BINARY;
|
||||
cueFile.Tracks = new List<CueTrack>();
|
||||
|
||||
// Create cue track entry
|
||||
CueTrack cueTrack = new CueTrack();
|
||||
cueTrack.Number = (int)(track.Sequence?.TrackNumber ?? 0);
|
||||
cueTrack.DataType = ConvertToDataType(track.TrackType1, track.BytesPerSector);
|
||||
cueTrack.Flags = ConvertToTrackFlag(track.Flags);
|
||||
cueTrack.ISRC = track.ISRC;
|
||||
|
||||
// Build the track datfile data and append
|
||||
string trackName = basePath;
|
||||
cueFile.FileName = basePath;
|
||||
if (totalTracks == 1)
|
||||
trackName = $"{trackName}.bin";
|
||||
cueFile.FileName = $"{cueFile.FileName}.bin";
|
||||
else if (totalTracks > 1 && totalTracks < 10)
|
||||
trackName = $"{trackName} (Track {trackNumber}).bin";
|
||||
cueFile.FileName = $"{cueFile.FileName} (Track {cueTrack.Number}).bin";
|
||||
else
|
||||
trackName = $"{trackName} (Track {trackNumber.ToString().PadLeft(2, '0')}).bin";
|
||||
|
||||
// Handle track flags
|
||||
if (track.Flags != null)
|
||||
{
|
||||
string flagString = "FLAGS";
|
||||
if (track.Flags.CopyPermitted)
|
||||
flagString += " DCP";
|
||||
if (track.Flags.Quadraphonic)
|
||||
flagString += " 4CH";
|
||||
if (track.Flags.PreEmphasis)
|
||||
flagString += " PRE";
|
||||
|
||||
cuesheet += $"{flagString}\n";
|
||||
}
|
||||
|
||||
// Handle ISRC
|
||||
if (track.ISRC != null)
|
||||
cuesheet += $"ISRC {track.ISRC}\n";
|
||||
|
||||
// Add track for each file
|
||||
cuesheet += $"FILE \"{trackName}\" BINARY\n";
|
||||
|
||||
// Add track type
|
||||
string trackTypeString = string.Empty;
|
||||
switch (trackType)
|
||||
{
|
||||
case TrackTypeTrackType.audio:
|
||||
trackTypeString = "AUDIO";
|
||||
break;
|
||||
case TrackTypeTrackType.mode0:
|
||||
trackTypeString = $"MODE0/{track.BytesPerSector}";
|
||||
break;
|
||||
case TrackTypeTrackType.mode1:
|
||||
trackTypeString = $"MODE1/{track.BytesPerSector}";
|
||||
break;
|
||||
case TrackTypeTrackType.mode2:
|
||||
case TrackTypeTrackType.m2f1:
|
||||
case TrackTypeTrackType.m2f2:
|
||||
trackTypeString = $"MODE2/{track.BytesPerSector}";
|
||||
break;
|
||||
}
|
||||
|
||||
cuesheet += $" TRACK {trackNumber.ToString().PadLeft(2, '0')} {trackTypeString}\n";
|
||||
cueFile.FileName = $"{cueFile.FileName } (Track {cueTrack.Number:D2}).bin";
|
||||
|
||||
// Add index data
|
||||
if (track.Indexes != null && track.Indexes.Length > 0)
|
||||
{
|
||||
cueTrack.Indices = new List<CueIndex>();
|
||||
|
||||
// Loop through each index
|
||||
foreach (TrackIndexType trackIndex in track.Indexes)
|
||||
{
|
||||
// TODO: Convert Value to timecode
|
||||
cuesheet += $" INDEX {trackIndex.index} {trackIndex.Value}\n";
|
||||
cueTrack.Indices.Add(new CueIndex(trackIndex.index.ToString(), trackIndex.Value.ToString()));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Default if index data missing from sidecar
|
||||
cuesheet += " INDEX 01 00:00:00\n";
|
||||
cueTrack.Indices.Add(new CueIndex("01", "00:00:00"));
|
||||
}
|
||||
|
||||
// Add the track to the file
|
||||
cueFile.Tracks.Add(cueTrack);
|
||||
|
||||
// Add the file to the cuesheet
|
||||
cueSheet.Files.Add(cueFile);
|
||||
}
|
||||
}
|
||||
|
||||
return cuesheet;
|
||||
// If we have a cuesheet to write out, do so
|
||||
if (cueSheet != null && cueSheet != default)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
cueSheet.Write(ms);
|
||||
ms.Position = 0;
|
||||
using (var sr = new StreamReader(ms))
|
||||
{
|
||||
return sr.ReadToEnd();
|
||||
}
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user