Generate cuesheet using new classes for Aaru

This commit is contained in:
Matt Nadareski
2020-09-16 14:31:29 -07:00
parent 1da29464a8
commit b3db7c547f

View File

@@ -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>