private void WriteWorkbook(IWorkbook workbook, int cursorLeft) { if (!File.Exists(_Config.AODLoadSheetFilePath)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing AOD Loadsheet: "); ConsolePrintHelpers.PrintWhiteText(_Config.AODLoadSheetFilePath); ConsolePrintHelpers.PressAnyKeyToExit(); } try { using (FileStream fsWrite = new FileStream(_Config.AODLoadSheetFilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { workbook.Write(fsWrite); fsWrite.Close(); } workbook.Close(); Console.CursorLeft = cursorLeft; ConsolePrintHelpers.PrintYellowText("Updated"); } catch (Exception) { Console.WriteLine("\n\n"); ConsolePrintHelpers.PrintRedText(" ERROR: Unable To Update AOD Loadsheet Already Open In Excel\n\n\n"); ConsolePrintHelpers.PrintRedText(" This Software Will Continue Once The Open Loadsheet Is Closed : "); ConsolePrintHelpers.PrintWhiteText(_Config.AODLoadSheetFilePath); Console.WriteLine("\n\n"); bool updateSuccessful = false; while (!updateSuccessful) { try { using (FileStream fsWrite = new FileStream(_Config.AODLoadSheetFilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { workbook.Write(fsWrite); fsWrite.Close(); } workbook.Close(); Console.CursorTop -= 9; Console.CursorLeft = cursorLeft; ConsolePrintHelpers.PrintYellowText("Updated"); Console.CursorTop += 9; updateSuccessful = true; } catch (Exception) { ConsolePrintHelpers.Retry(); } } } IncrementalLoadSheetBackup(); }
private void AssignCycle() { string loadSheetFileName = Path.GetFileNameWithoutExtension(_AODLoadSheetFilePath); _Cycle = Regex.Match(loadSheetFileName, @"\d{4}$").ToString(); //Grab cycle digits at end of AOD Loadsheet filename if (!loadSheetFileName.EndsWith(_Cycle) || !CycleValidator.Validate4DigitCycle(_Cycle)) { ConsolePrintHelpers.PrintRedText("\n ERROR: Invalid Loadsheet cycle number at end of filename: " + _Cycle); ConsolePrintHelpers.PressAnyKeyToExit(); } }
private void ValidateLoadSheet() { ConsolePrintHelpers.PrintWhiteText(" Path: "); if (File.Exists(_Config.AODLoadSheetFilePath)) { ConsolePrintHelpers.PrintGreenText(_Config.AODLoadSheetFilePath + "\n\n"); } else { ConsolePrintHelpers.PrintRedText(_Config.AODLoadSheetFilePath); ConsolePrintHelpers.PrintWhiteText(" ERROR: Missing Loadsheet at this path"); ConsolePrintHelpers.PressAnyKeyToExit(); } }
private void AssignLoadSheet() { _AODLoadSheetFilePath = @"None"; DirectoryInfo di = new DirectoryInfo(_AODLoadSheetDirectoryPath); IEnumerable <FileInfo> finfo = di.GetFiles("*.xlsx"); if (finfo.Count() > 2) { ConsolePrintHelpers.PrintRedText("\n\n ERROR More Than 1 AOD Loadsheet Found In Directory: "); ConsolePrintHelpers.PrintWhiteText(_AODLoadSheetDirectoryPath); ConsolePrintHelpers.PressAnyKeyToExit(); } else if (finfo.Count() == 2) //Might have a hidden temporary file "~$file.xlsx" { bool foundTempFile = false; foreach (FileInfo fi in finfo) { if (fi.Name.Contains(@"~$")) { foundTempFile = true; } else { _AODLoadSheetFilePath = fi.FullName; } } if (!foundTempFile) { ConsolePrintHelpers.PrintRedText("\n\n ERROR More Than 1 AOD Loadsheet Found In Directory: "); ConsolePrintHelpers.PrintWhiteText(_AODLoadSheetDirectoryPath); ConsolePrintHelpers.PressAnyKeyToExit(); } } else if (finfo.Count() == 0) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing AOD Loadsheet In Directory: "); ConsolePrintHelpers.PrintWhiteText(_AODLoadSheetDirectoryPath); ConsolePrintHelpers.PressAnyKeyToExit(); } else //only 1 .xlsx file found { _AODLoadSheetFilePath = finfo.First().FullName; } }
static void Main() { AudioEncoderConfig config = new AudioEncoderConfig(); AudioLibrary audioLibrary = new AudioLibrary(config); audioLibrary.ScanAudioLibrary(); //DEBUG Methods------------------------------------------ //audioLibrary.PrintAudioLibraryFileInfo_DEBUG(); //audioLibrary.PrintUniqueTrackNumberPatterns_DEBUG(); //audioLibrary.PrintUniqueFileExtensions_DEBUG(); //------------------------------------------------------- AODLoadSheet loadSheet = new AODLoadSheet(config); loadSheet.ReadLoadSheet(); //DEBUG Methods------------------------------------------ //loadSheet.PrintAODLoadSheetPretty_DEBUG(); //loadSheet.PrintCharactersFoundList_DEBUG(); //loadSheet.PrintTokensPerRowAllRows_DEBUG(); //loadSheet.SortAODLoadSheetByLSRCharCount_DEBUG(); //------------------------------------------------------- AudioEncoderController controller = new AudioEncoderController(loadSheet); controller.SearchForSourceAudioFiles(audioLibrary); //DEBUG Methods------------------------------------------ //controller.PrintApprovedLoadSheetRows_DEBUG(); //controller.PrintAlreadyEncodedFiles_DEBUG(); //controller.PrintEncodingQueue_DEBUG(); //------------------------------------------------------- DropAudioLibrary(ref audioLibrary); controller.EncodeAudioFiles(); DropRemainingReferences(ref config, ref loadSheet, ref controller); ConsolePrintHelpers.PressAnyKeyToExit(); }
public void AssignSuggestedAudioFileFromManualApproval(AudioFileOption bestOption) { if (_SearchCollection != null) { _SearchCollection.AssignBestOptionFromManualOptions(bestOption); AssignSuggestedAudioFile(); _IsApproved = true; _SuggestedAudioFile.AccuracyNote = Globals.WasApprovedNote; } else { ConsolePrintHelpers.PrintRedText("\n\n ERROR Trying To Assign Suggested Audio File With Null Search Collection at LSR #: "); ConsolePrintHelpers.PrintWhiteText((_LoadSheetRowNumber + 1).ToString()); ConsolePrintHelpers.PressAnyKeyToExit(); } }
private IWorkbook ReadWorkBook() { if (!File.Exists(_Config.AODLoadSheetFilePath)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing AOD Loadsheet: "); ConsolePrintHelpers.PrintWhiteText(_Config.AODLoadSheetFilePath); ConsolePrintHelpers.PressAnyKeyToExit(); } IWorkbook workbook; using (FileStream fsRead = new FileStream(_Config.AODLoadSheetFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { workbook = WorkbookFactory.Create(fsRead); fsRead.Close(); } return(workbook); }
public void AssignSuggestedAudioFile() { if (_SearchCollection != null) { _SuggestedAudioFile = _SearchCollection.GetSuggestedAudioFile(); if (_SuggestedAudioFile == null) //should never be the case, and if so, something is wrong { ConsolePrintHelpers.PrintRedText("\n\n ERROR Unassigned Suggested Audio File at LSR #: "); ConsolePrintHelpers.PrintWhiteText((_LoadSheetRowNumber + 1).ToString()); ConsolePrintHelpers.PressAnyKeyToExit(); } _PotentialFile = new AlreadyEncodedFile(this, false); //Non-validated AlreadyEncodedFile (Used For Faster Queue Building) _IsSuggestedAudioFileAssigned = true; } else { ConsolePrintHelpers.PrintRedText("\n\n ERROR Trying To Assign Suggested Audio File With Null Search Collection at LSR #: "); ConsolePrintHelpers.PrintWhiteText((_LoadSheetRowNumber + 1).ToString()); ConsolePrintHelpers.PressAnyKeyToExit(); } }
private void PerformValidation() { if (!Directory.Exists(_ManualShortcutsDirectory)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing Manual Shortcuts Directory: "); ConsolePrintHelpers.PrintWhiteText(_ManualShortcutsDirectory); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!Directory.Exists(_AODLoadSheetDirectoryPath)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing AOD Loadsheet Directory: "); ConsolePrintHelpers.PrintWhiteText(_AODLoadSheetDirectoryPath); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!Directory.Exists(_AODLoadSheetBackupPath)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing AOD Loadsheet Backup Directory: "); ConsolePrintHelpers.PrintWhiteText(_AODLoadSheetBackupPath); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!Directory.Exists(_HistoryDatabaseDirectory)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing History Directory: "); ConsolePrintHelpers.PrintWhiteText(_HistoryDatabaseDirectory); ConsolePrintHelpers.PressAnyKeyToExit(); } if (_ApprovalHistoryFilePath.Length >= Globals.MaxPathLenth) { ConsolePrintHelpers.PrintRedText(@"\n\n ERROR Approvals History File Path > MaxPathLength: "); ConsolePrintHelpers.PrintWhiteText(_ApprovalHistoryFilePath); ConsolePrintHelpers.PressAnyKeyToExit(); } if (_EncodingHistoryFilePath.Length >= Globals.MaxPathLenth) { ConsolePrintHelpers.PrintRedText(@"\n\n ERROR Encoding History File Path > MaxPathLength: "); ConsolePrintHelpers.PrintWhiteText(_EncodingHistoryFilePath); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!Globals.IsDevelopmentEnvironment) //Don't check for these on development box { if (!Directory.Exists(_HistoryFilesArchiveDirectory)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing Already Encoded Files History Archive Directory: "); ConsolePrintHelpers.PrintWhiteText(_HistoryFilesArchiveDirectory); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!File.Exists(_FFMPEG_Executable)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing FFMPEG Executable: "); ConsolePrintHelpers.PrintWhiteText(_FFMPEG_Executable); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!File.Exists(_FFPROBE_Executable)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing FFPROBE Executable: "); ConsolePrintHelpers.PrintWhiteText(_FFPROBE_Executable); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!File.Exists(_Manzanita_Executable)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing Manzanita Executable: "); ConsolePrintHelpers.PrintWhiteText(_Manzanita_Executable); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!File.Exists(_PowerShellScriptPath)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing PowerShell Script: "); ConsolePrintHelpers.PrintWhiteText(_PowerShellScriptPath); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!File.Exists(_PowerShellCSVPath)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing PowerShell CSV: "); ConsolePrintHelpers.PrintWhiteText(_PowerShellCSVPath); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!Directory.Exists(_DestinationRootDirectory)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing FFMPEG_WRITE Directory: "); ConsolePrintHelpers.PrintWhiteText(_DestinationRootDirectory); ConsolePrintHelpers.PressAnyKeyToExit(); } if (!Directory.Exists(_TranscodeTempDirectory)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing TRANSCODE_TEMP Directory: "); ConsolePrintHelpers.PrintWhiteText(_TranscodeTempDirectory); ConsolePrintHelpers.PressAnyKeyToExit(); } } }
private void ApplyJSONConfigFile(string jsonConfigFilePath) { if (!File.Exists(jsonConfigFilePath)) { ConsolePrintHelpers.PrintRedText("\n\n ERROR Missing JSON Configuration File: "); ConsolePrintHelpers.PrintWhiteText(jsonConfigFilePath); ConsolePrintHelpers.PressAnyKeyToExit(); } string jsonConfigFile = File.ReadAllText(jsonConfigFilePath); dynamic jsonConfigOBJ = JObject.Parse(jsonConfigFile); Globals.ApplyJSONConfigFile(jsonConfigOBJ); //Configure Globals values _AODLoadSheetWorkSheetName = (string)jsonConfigOBJ.aodLoadSheetWorkSheetName; _AODLoadSheetDirectoryPath = (string)jsonConfigOBJ.aodLoadSheetDirectoryPath; _AODLoadSheetBackupPath = (string)jsonConfigOBJ.aodLoadSheetBackupPath; _ManualShortcutsDirectory = (string)jsonConfigOBJ.manualShortcutsDirectory; _FFMPEG_Executable = (string)jsonConfigOBJ.ffmpeg_Executable; _FFPROBE_Executable = (string)jsonConfigOBJ.ffprobe_Executable; _Manzanita_Executable = (string)jsonConfigOBJ.manzanita_Executable; _PowerShellScriptPath = (string)jsonConfigOBJ.powerShellScriptPath; _PowerShellCSVPath = (string)jsonConfigOBJ.powerShellCSVPath; _HistoryDatabaseDirectory = (string)jsonConfigOBJ.historyDatabaseDirectory; _ApprovalHistoryFilePath = (string)jsonConfigOBJ.approvalHistoryFilePath; _EncodingHistoryFilePath = (string)jsonConfigOBJ.encodingHistoryFilePath; _HistoryFilesArchiveDirectory = (string)jsonConfigOBJ.historyFilesArchiveDirectory; _DestinationRootDirectory = (string)jsonConfigOBJ.destinationRootDirectory; _TranscodeTempDirectory = (string)jsonConfigOBJ.transcodeTempDirectory; _AudioLibraryRoot = (string)jsonConfigOBJ.audioLibraryRoot; string[] productionAudioLibraryRootPaths = Globals.ConvertJSONArray_STR(jsonConfigOBJ.productionAudioLibraryRootPaths); if (Globals.IsDevelopmentEnvironment) { _AudioLibraryRootPaths.Add(@"\\10.7.22.11\CD_Repository\AOD CDs"); _AudioLibraryRootPaths.Add(@"\\10.7.22.11\Audio_Technical\Audio Programming"); } else { foreach (string path in productionAudioLibraryRootPaths) { _AudioLibraryRootPaths.Add(path); } } _AirlineColumn = (int)jsonConfigOBJ.columnConfig.airlineColumn; _AltCycleColumn = (int)jsonConfigOBJ.columnConfig.altCycleColumn; _ArtistColumn = (int)jsonConfigOBJ.columnConfig.artistColumn; _AlbumColumn = (int)jsonConfigOBJ.columnConfig.albumColumn; _TrackNumberColumn = (int)jsonConfigOBJ.columnConfig.trackNumberColumn; _TrackColumn = (int)jsonConfigOBJ.columnConfig.trackColumn; _OutputFileNameColumn = (int)jsonConfigOBJ.columnConfig.outputFileNameColumn; _AudioTypeColumn = (int)jsonConfigOBJ.columnConfig.audioTypeColumn; _ShipToColumn = (int)jsonConfigOBJ.columnConfig.shipToColumn; _SourceAudioFilePathColumn = (int)jsonConfigOBJ.columnConfig.sourceAudioFilePathColumn; _AccuracyScoreColumn = (int)jsonConfigOBJ.columnConfig.accuracyScoreColumn; _AccuracyNoteColumn = (int)jsonConfigOBJ.columnConfig.accuracyNoteColumn; _EncodedStatusColumn = (int)jsonConfigOBJ.columnConfig.encodedStatusColumn; _EncodedFilePathColumn = (int)jsonConfigOBJ.columnConfig.encodedFilePathColumn; _EncodedFileDurationPrettyColumn = (int)jsonConfigOBJ.columnConfig.encodedFileDurationPrettyColumn; _EncodedFileDurationSecondsColumn = (int)jsonConfigOBJ.columnConfig.encodedFileDurationSecondsColumn; _AODLoadSheetColumnNumsRead = new int[] { _AirlineColumn, _AltCycleColumn, _ArtistColumn, _AlbumColumn, _TrackNumberColumn, _TrackColumn, _OutputFileNameColumn, _AudioTypeColumn, _ShipToColumn, _EncodedStatusColumn }; _AODLoadSheetColumnNumsWrite = new int[] { _SourceAudioFilePathColumn, _AccuracyScoreColumn, _AccuracyNoteColumn, _EncodedStatusColumn, _EncodedFilePathColumn, _EncodedFileDurationPrettyColumn, _EncodedFileDurationSecondsColumn }; _AODLoadSheetOptionalColumnNumsRead = new int[] { _AltCycleColumn, _EncodedStatusColumn }; }
public void EncodeAudioFiles() { if (!_IsQueueBuilt) { BuildEncodingQueue(); } Stopwatch stopwatch = ConsolePrintHelpers.PrintHeaderAndStartStopWatch(); ConsolePrintHelpers.PrintWhiteText(" Encoding Audio Files..."); PrintEncodingQueueAndHistoryStats(); _History.WriteApprovalHistoryToFile(true); ConsolePrintHelpers.Wait(); CleanTranscodeTempDirectory(); _LoadSheetUpdateInterval = Globals.InitialLoadSheetUpdateInterval; _ActiveEncodings.Clear(); _FinishedEncodings.Clear(); _WaitingEncodings.Clear(); _EncodedFilesCount = 0; _CopiedFilesCount = 0; int encodingQueueCount = _EncodingQueues.EncodingQueue.Count; for (int i = 0; i < encodingQueueCount; i++) { AudioFileEncoding encoding = _EncodingQueues.EncodingQueue.Dequeue(); CopyOrEncodeAudioFile(encoding); AddToActiveOrWaitingList(encoding); IncrementalUpdateLoadSheet(); encoding.PrintAudioFileEncoding(); PrintEncodingStatsHeaders(); CheckForFinishedEncodings(Globals.MaxDegreeOfParallelism); } foreach (AudioFileEncoding waitingEncoding in _WaitingEncodings) { _ActiveEncodings.Add(waitingEncoding); } foreach (AODLoadSheetRow skippedLSR in _EncodingQueues.SkippedQueue) { _FinishedEncodings.Add(new AudioFileEncoding(skippedLSR, 0, false)); //Add skipped rows for updating back to loadsheet } if (encodingQueueCount > 0) { CheckForFinishedEncodings(1); } _History.WriteEncodingHistoryToFile(true); UpdateLoadSheet(); //final update to AOD Loadsheet with remaining rows not saved yet (including skipped rows) ConsolePrintHelpers.PrintDuration(stopwatch, "Encoding"); ConsolePrintHelpers.PrintYellowText("\n\n\n Encoding Run Completed"); if (_EncodingQueues.SkippedQueue.Count == 0) { ConsolePrintHelpers.PressAnyKeyToExit(); } else { _EncodingQueues.PrintAndEmptySkippedQueue(); } }
public void ScanAudioLibrary() { Stopwatch stopwatch = ConsolePrintHelpers.PrintHeaderAndStartStopWatch(); ConsolePrintHelpers.PrintWhiteText(" Scanning Audio Library Paths...\n\n"); int rootDirectoryPrintCount = 1; foreach (AudioLibraryRootDirectory rootDirectory in _AudioLibraryRootDirectories) { ConsolePrintHelpers.PrintWhiteText("\tPath (" + rootDirectoryPrintCount + " of " + _AudioLibraryRootDirectories.Count + "): "); rootDirectoryPrintCount++; if (Directory.Exists(rootDirectory.AudioLibraryRootDirectoryPath)) { ConsolePrintHelpers.PrintGreenText(rootDirectory.AudioLibraryRootDirectoryPath + " "); ConsolePrintHelpers.PrintWhiteText("File Count : "); rootDirectory.CursorTop = Console.CursorTop; rootDirectory.CursorLeft = Console.CursorLeft; Console.WriteLine("\n"); rootDirectory.ScanRootDirectoryPath(); if (rootDirectory.SubDirectories.Count < (Console.WindowHeight - Globals.AudioLibraryScanPrintMargin)) { Console.WriteLine("\n"); } else { Console.WriteLine(); } } else { ConsolePrintHelpers.PrintRedText(rootDirectory.AudioLibraryRootDirectoryPath); ConsolePrintHelpers.PrintWhiteText(" ERROR: Invalid Path"); ConsolePrintHelpers.PressAnyKeyToExit(); } } int cursorTop = Console.CursorTop - 3; foreach (AudioLibraryRootDirectory rootDirectory in _AudioLibraryRootDirectories) { rootDirectory.ScanSubDirectories_Async(); } string[] waitSequence = { "*", "**", "***", " " }; bool keepWaiting = true; while (keepWaiting) { foreach (string pattern in waitSequence) { foreach (AudioLibraryRootDirectory rootDirectory in _AudioLibraryRootDirectories) { Console.CursorTop = rootDirectory.CursorTop; Console.CursorLeft = rootDirectory.CursorLeft; if (rootDirectory.HasFinished == true) { ConsolePrintHelpers.PrintCyanText(rootDirectory.GetFileCount().ToString() + " "); } else { ConsolePrintHelpers.PrintCyanText(pattern); } if (rootDirectory.SubDirectories.Count < (Console.WindowHeight - Globals.AudioLibraryScanPrintMargin)) { foreach (AudioLibrarySubDirectory subDirectory in rootDirectory.SubDirectories) { Console.CursorTop = subDirectory.CursorTop; Console.CursorLeft = subDirectory.CursorLeft; if (subDirectory.HasFinished == true) { ConsolePrintHelpers.PrintCyanText(subDirectory.GetFileCount().ToString() + " "); } else { ConsolePrintHelpers.PrintCyanText(pattern); } } } } if (_AudioLibraryRootDirectories.All(rootDirectory => rootDirectory.HasFinished == true)) { keepWaiting = false; break; } Thread.Sleep(Globals.ProgressTickerDelayMilliseconds); } } foreach (AudioLibraryRootDirectory rootDirectory in _AudioLibraryRootDirectories) { Console.CursorTop = rootDirectory.CursorTop; Console.CursorLeft = rootDirectory.CursorLeft; ConsolePrintHelpers.PrintCyanText(rootDirectory.GetFileCount().ToString()); _AudioLibraryFiles = _AudioLibraryFiles.Concat(rootDirectory.GetAudioLibraryFiles).ToList(); } Console.CursorTop = cursorTop; ConsolePrintHelpers.PrintWhiteText("\n\n\n Total File Count : "); ConsolePrintHelpers.PrintCyanText(_AudioLibraryFiles.Count.ToString()); foreach (AudioLibraryRootDirectory rootDirectory in _AudioLibraryRootDirectories) { if (rootDirectory.AreShortcutsValid == false) { ConsolePrintHelpers.PrintRedText("\n\n\n ERROR Invalid Shortcuts Provided To Arbitrary Mapped Drive. Shortcuts Should Be Targeting Directories And Files In: "); ConsolePrintHelpers.PrintWhiteText(_Config.AudioLibraryRoot); ConsolePrintHelpers.PressAnyKeyToExit(); } } if (_AudioLibraryFiles.Count == 0) { ConsolePrintHelpers.PrintRedText("\n\n\n ERROR No Audio Library Files Found"); ConsolePrintHelpers.PressAnyKeyToExit(); } foreach (AudioLibraryRootDirectory rootDirectory in _AudioLibraryRootDirectories) { if (rootDirectory.HasDetectedError) { ConsolePrintHelpers.PrintRedText("\n\n\n ERROR Detected Bad Directory/File Name: [" + rootDirectory.ErrorItem + "]"); Console.WriteLine("\n\n"); ConsolePrintHelpers.PrintRedText(" A Fix Has Been Attempted. Please Restart This Application."); ConsolePrintHelpers.PressAnyKeyToExit(); } } _AudioLibraryFiles = _AudioLibraryFiles.OrderBy(libraryFile => libraryFile.NormalizedSubDirectoriesFilePath).ToList(); //Helps to give consistent search results ConsolePrintHelpers.PrintDurationAndWait(stopwatch, "Audio Library Scan"); GC.Collect(); }