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 };
        }
Esempio n. 11
0
        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();
            }
        }
Esempio n. 12
0
        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();
        }