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); } }
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); }
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"); }
private void AddNewFullSearchThread(AudioLibrary audioLibrary, AODLoadSheetRow currentLSR) { currentLSR.FullSearchForSuggestedAudioFile_Async(audioLibrary); _ActiveSearches.Add(currentLSR); PrintUpdatedSearchStats(); }
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); }
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); }
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); }
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(); }
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); } }
public void FullSearchForSuggestedAudioFile_Async(AudioLibrary audioLibrary) { Task.Run(() => FullSearchForSuggestedAudioFile(audioLibrary)); }
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"; } }
private void FullSearchForSuggestedAudioFile(AudioLibrary audioLibrary) { _SearchCollection = AudioFileSearch.GetBestSearchCollection(audioLibrary, this); AssignSuggestedAudioFile(); }
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); }
static void DropAudioLibrary(ref AudioLibrary audioLibrary) { //Audio Library no longer needed, save memory audioLibrary = null; GC.Collect(); }