コード例 #1
0
        public static AudioFileSearchCollection GetBestSearchCollection(AudioLibrary audioLibrary, AODLoadSheetRow lsr)
        {
            if (lsr.OriginalSearchStrategy != lsr.Tokens.SearchStrategy)
            {
                lsr.Tokens.SetOriginalSearchStrategy();
            }

            AudioFileSearchCollection collection_1      = GetSearchCollection(audioLibrary, lsr); //SearchStrategyType defined by loadsheet (Original Search Strategy)
            AudioFileOption           candidateOption_1 = collection_1.BestOption;

            if (collection_1.IsOptionQuickSearchElligible(candidateOption_1, SearchMethodType.Both, Globals.AccurateThreshold))  //[Prefered result]  Accurate scoring and not too many options in final pool (skip alternative strategy search for performance)
            {
                return(collection_1);
            }

            if (lsr.Tokens.SearchStrategy == SearchStrategyType.CD)
            {
                lsr.Tokens.ConfigureSearchStrategy_OTHER(true);
            }
            else if (lsr.Tokens.SearchStrategy == SearchStrategyType.OTHER)
            {
                lsr.Tokens.ConfigureSearchStrategy_CD(true);
            }

            AudioFileSearchCollection collection_2      = GetSearchCollection(audioLibrary, lsr); //Alternative SearchStrategyType if needed
            AudioFileOption           candidateOption_2 = collection_2.BestOption;

            SuggestedAudioFile suggestedOption_1 = new SuggestedAudioFile(collection_1);
            SuggestedAudioFile suggestedOption_2 = new SuggestedAudioFile(collection_2);

            if (suggestedOption_1.AccuracyType == AccuracyType.Accurate && suggestedOption_2.AccuracyType != AccuracyType.Accurate)
            {
                if (suggestedOption_1.AccuracyScore >= suggestedOption_2.AccuracyScore)
                {
                    lsr.Tokens.SetOriginalSearchStrategy();

                    return(collection_1);
                }
            }

            if (suggestedOption_1.AccuracyType != AccuracyType.Accurate && suggestedOption_2.AccuracyType == AccuracyType.Accurate)
            {
                if (suggestedOption_1.AccuracyScore <= suggestedOption_2.AccuracyScore)
                {
                    return(collection_2);
                }
            }

            //Suggested Files (1 and 2) are either both accurate, or both inaccurate
            if (suggestedOption_1.AccuracyScore >= (suggestedOption_2.AccuracyScore - Globals.SearchStrategySwitchThreshold))  //Preference is given to the original search strategy
            {
                lsr.Tokens.SetOriginalSearchStrategy();

                return(collection_1);
            }
            else
            {
                return(collection_2);
            }
        }
コード例 #2
0
        private void Search_Pass2(AudioLibrary audioLibrary)
        {
            AODLoadSheetRow previousLSR = new AODLoadSheetRow();

            foreach (AODLoadSheetRow currentLSR in _LoadSheet.GetAODLoadSheetRows)
            {
                if (!currentLSR.IsSuggestedAudioFileAssigned)
                {
                    currentLSR.QuickSearchForSuggestedAudioFile(audioLibrary, previousLSR, _LoadSheet);

                    if (currentLSR.IsSuggestedAudioFileAssigned)
                    {
                        _SearchRowsRemaining--;

                        PrintUpdatedSearchStats();
                    }
                    else if (previousLSR.AirlineAlbumAudioTypeHash != currentLSR.AirlineAlbumAudioTypeHash)
                    {
                        AddNewFullSearchThread(audioLibrary, currentLSR);

                        CheckForFinishedSearches(Globals.MaxDegreeOfParallelism);
                    }
                }

                previousLSR = currentLSR;
            }

            CheckForFinishedSearches(1);
        }
コード例 #3
0
        public void SearchForSourceAudioFiles(AudioLibrary audioLibrary)
        {
            Stopwatch stopwatch = ConsolePrintHelpers.PrintHeaderAndStartStopWatch();

            ConsolePrintHelpers.PrintWhiteText("  Searching For Source Audio Files...\n\n\n");

            _ActiveSearches.Clear();

            _SearchRowsRemaining = _LoadSheet.GetAODLoadSheetRows.Count;

            ConsolePrintHelpers.PrintWhiteText("  Search Pass 1...\n\n");

            PrintSearchStatsHeaders();

            Search_Pass1(audioLibrary);

            ConsolePrintHelpers.PrintWhiteText("\n\n  Search Pass 2...\n\n");

            PrintSearchStatsHeaders();

            Search_Pass2(audioLibrary);

            ConsolePrintHelpers.PrintWhiteText("\n\n  Search Pass 3...\n\n");

            PrintSearchStatsHeaders();

            Search_Pass3(audioLibrary);

            ConsolePrintHelpers.PrintDurationAndWait(stopwatch, "Search");
        }
コード例 #4
0
        private void AddNewFullSearchThread(AudioLibrary audioLibrary, AODLoadSheetRow currentLSR)
        {
            currentLSR.FullSearchForSuggestedAudioFile_Async(audioLibrary);

            _ActiveSearches.Add(currentLSR);

            PrintUpdatedSearchStats();
        }
コード例 #5
0
        private void Search_Pass1(AudioLibrary audioLibrary)
        {
            AODLoadSheetRow previousLSR = new AODLoadSheetRow();

            foreach (AODLoadSheetRow currentLSR in _LoadSheet.GetAODLoadSheetRows)
            {
                if (previousLSR.AirlineAudioTypeHash != currentLSR.AirlineAudioTypeHash)
                {
                    AddNewFullSearchThread(audioLibrary, currentLSR);

                    CheckForFinishedSearches(Globals.MaxDegreeOfParallelism);
                }

                previousLSR = currentLSR;
            }

            CheckForFinishedSearches(1);
        }
コード例 #6
0
        private static AudioFileOptions Track_Pass1(AudioLibrary audioLibrary, TokensCollection tokens)
        {
            //Backwards Search
            AudioFileOptions pass1 = new AudioFileOptions();

            foreach (AudioLibraryFile file in audioLibrary.GetAudioLibraryFiles)
            {
                AudioFileOption newOption = new AudioFileOption(file, tokens);

                newOption.ScoreTrackNumberTrackPoints(SearchMethodType.Backwards);

                pass1.AddAudioFileOption(newOption);
            }

            pass1.KeepBetterOptions();

            return(pass1);
        }
コード例 #7
0
        private static AudioFileOptions ArtistAlbum_Pass1(AudioLibrary audioLibrary, TokensCollection tokens)
        {
            //Forwards Search
            AudioFileOptions pass1 = new AudioFileOptions();

            foreach (AudioLibraryFile file in audioLibrary.GetAudioLibraryFiles)
            {
                AudioFileOption newOption = new AudioFileOption(file, tokens);

                newOption.ScoreArtistAlbumPoints();

                pass1.AddAudioFileOption(newOption);
            }

            pass1.KeepBetterOptions();

            return(pass1);
        }
コード例 #8
0
        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();
        }
コード例 #9
0
        private static AudioFileSearchCollection GetSearchCollection(AudioLibrary audioLibrary, AODLoadSheetRow lsr)
        {
            AudioFileSearchCollection searchCollection = new AudioFileSearchCollection(lsr);

            searchCollection = ForwardsSearch(searchCollection, audioLibrary, lsr.Tokens);
            AudioFileOption candidateOption_1 = searchCollection.ForwardsFinalPass.GetCandidateOption();

            searchCollection = BackwardsSearch(searchCollection, audioLibrary, lsr.Tokens);
            AudioFileOption candidateOption_2 = searchCollection.BackwardsFinalPass.GetCandidateOption();

            int bestCandidateOption = ChooseBestCandidateOption(candidateOption_1, candidateOption_2);

            if (bestCandidateOption == 1) //CandidateOption_1
            {
                searchCollection.FinishCollection(SearchMethodType.Forwards);
                return(searchCollection);
            }
            else //CandidateOption_2
            {
                searchCollection.FinishCollection(SearchMethodType.Backwards);
                return(searchCollection);
            }
        }
コード例 #10
0
 public void FullSearchForSuggestedAudioFile_Async(AudioLibrary audioLibrary)
 {
     Task.Run(() => FullSearchForSuggestedAudioFile(audioLibrary));
 }
コード例 #11
0
        public void QuickSearchForSuggestedAudioFile(AudioLibrary audioLibrary, AODLoadSheetRow previousLSR, AODLoadSheet parentLoadsheet)
        {
            //quick search 1st attempt (lookup if any prior row had identical qualities (aka hash) and shortcut to past results)
            foreach (AODLoadSheetRow pastLSR in parentLoadsheet.GetAODLoadSheetRows)
            {
                if (pastLSR.LoadSheetRowNumber >= _LoadSheetRowNumber)
                {
                    if (_QuickSearchNotePastLSR == "None")
                    {
                        _QuickSearchNotePastLSR = "No Hash Matches";
                    }

                    break;
                }

                if (_LoadSheetRowHash == pastLSR.LoadSheetRowHash) //identical past loadsheet row (exact replica repeat row)
                {
                    if (pastLSR.IsSuggestedAudioFileAssigned)
                    {
                        _IsQuickSearchActive = true;

                        _QuickSearchNotePastLSR = "Replica Match";

                        _Tokens = pastLSR.Tokens;

                        _SearchCollection = pastLSR.SearchCollection;

                        AssignSuggestedAudioFile();

                        return;
                    }
                    else
                    {
                        _QuickSearchNotePastLSR = "Past Suggested File Not Assigned";
                    }
                }
            }

            //quick search 2nd attempt (scan previous row's parent directory)
            if (!previousLSR.IsSuggestedAudioFileAssigned)
            {
                AODLoadSheetRow mostRecentAssignedRow = parentLoadsheet.GetMostRecentAssignedRow(this);

                if (mostRecentAssignedRow != null)
                {
                    previousLSR = mostRecentAssignedRow;
                }
            }

            if (previousLSR.IsSuggestedAudioFileAssigned)
            {
                string previousLSRSubDirPath = previousLSR.SuggestedAudioFile.SubDirectoriesPath;

                AudioLibrary quickSearchLibrary = audioLibrary.GetQuickAudioLibrarySubset(previousLSRSubDirPath);

                _SearchCollection = AudioFileSearch.GetBestSearchCollection(quickSearchLibrary, this);

                if (_SearchCollection.IsOptionQuickSearchElligible(_SearchCollection.BestOption, SearchMethodType.Both, Globals.HighAccuracyThreshold))  //high scoring and not too many options in final pool
                {
                    _IsQuickSearchActive = true;

                    _QuickSearchNotePreviousLSR = "Met HighAccuracyThreshold";

                    AssignSuggestedAudioFile();

                    return;
                }
                else
                {
                    if (_SearchCollection.BestOption.AccuracyScore < Globals.HighAccuracyThreshold)
                    {
                        _QuickSearchNotePreviousLSR = "Missed HighAccuracyThreshold";
                    }
                    else if (_SearchCollection.ChosenFinalPassCount > 1)
                    {
                        _QuickSearchNotePreviousLSR = "Missed TooManyFinalOptionsThreshold";
                    }

                    _SearchCollection = null;

                    return;
                }
            }
            else
            {
                _QuickSearchNotePreviousLSR = "Previous Suggested File Not Assigned";
            }
        }
コード例 #12
0
        private void FullSearchForSuggestedAudioFile(AudioLibrary audioLibrary)
        {
            _SearchCollection = AudioFileSearch.GetBestSearchCollection(audioLibrary, this);

            AssignSuggestedAudioFile();
        }
コード例 #13
0
        private static AudioFileSearchCollection BackwardsSearch(AudioFileSearchCollection searchCollection, AudioLibrary audioLibrary, TokensCollection tokens)
        {
            //Backwards Search priority:  Track  --->  Artist/Album

            AudioFileOptions pass1 = Track_Pass1(audioLibrary, tokens);

            AudioFileOptions pass2 = ArtistAlbum_Pass2(pass1);

            pass2.FinishAllOptions();

            AudioFileOptions finalPass = pass2.Clone();

            finalPass.TieBreakAudioFileOptions(SearchMethodType.Backwards);

            searchCollection.AssignBackwardsSearchPasses(pass1, pass2, finalPass);

            return(searchCollection);
        }
コード例 #14
0
 static void DropAudioLibrary(ref AudioLibrary audioLibrary)
 {
     //Audio Library no longer needed, save memory
     audioLibrary = null;
     GC.Collect();
 }