예제 #1
0
        public FansubFile Transform(FansubFile file)
        {
            var indexOfLastBreak = file.SeriesName.LastIndexOf(' ');
            if (indexOfLastBreak == -1)
            {
                return new FansubFile(file.FansubGroup, string.Empty, file.EpisodeNumber, file.Extension);
            }

            var newSeriesName = file.SeriesName.Substring(0, indexOfLastBreak);

            return new FansubFile(file.FansubGroup, newSeriesName, file.EpisodeNumber, file.Extension);
        }
        public string Compare(FansubFile file, IEnumerable<string> folders, Strategy.ComparisonStrategy strategy)
        {
            var justFolderNamesMap = folders.ToDictionary(key => key, value => StringUtilities.GetJustFolderName(value));
            var seriesName = file.SeriesName;

            foreach (var folder in justFolderNamesMap)
            {
                var stringsToCompare = strategy.Invoke(seriesName, folder.Value);
                var transformedSeriesName = stringsToCompare.Item1;
                var transformedFolderName = stringsToCompare.Item2;

                if(transformedSeriesName.Equals(transformedFolderName, StringComparison.Ordinal))
                {
                    return folder.Key;
                }
            }

            return null;
        }
        private static IEnumerable<KeyValuePair<string, double>> CalculateDistances(FansubFile file, IEnumerable<string> folders, Strategy.ComparisonStrategy strategy)
        {
            var bagOfResults = new ConcurrentDictionary<string, double>();
            var justFolders = folders.ToDictionary(key => key, value => StringUtilities.GetJustFolderName(value));

            Parallel.ForEach(justFolders, folder =>
            {
                var projectedStrategy = strategy.Invoke(file.SeriesName, folder.Value);
                var seriesName = projectedStrategy.Item1;
                var projectedFolderName = projectedStrategy.Item2;

                bagOfResults.TryAdd(folder.Key, StringMetricsCalculator.Instance.MeasureSimilarity(seriesName, projectedFolderName));
            });

            var listResult = bagOfResults.ToList();
            listResult.Sort(KeyValuePairComparison);

            return listResult;
        }
        public string Compare(FansubFile file, IEnumerable<string> folders, Strategy.ComparisonStrategy strategy)
        {
            var distances = CalculateDistances(file, folders, strategy);

            if (!distances.Any())
            {
                return null;
            }

            var headItem = distances.First();

            var comparison = headItem.Value - _smudgeFactor;
            var comparisonMagnitude = Math.Abs(comparison);

            if (comparison >= 0.0 && comparisonMagnitude >= _epsilon)
            {
                return headItem.Key;
            }

            return null;
        }
        private IList<KeyValuePair<string, double>> MeasureDistances(FansubFile file, Func<string, string, double> metricFunc, IEnumerable<string> knownFolders)
        {
            var bagOfResults = new ConcurrentDictionary<string, double>();
            var seriesName = file.SeriesName;

            Parallel.ForEach(knownFolders, folder =>
            {
                var folderName = GetJustFolderName(folder);

                bagOfResults.TryAdd(folder, metricFunc.Invoke(seriesName, folderName));
            });

            var listResult = bagOfResults.ToList();
            listResult.Sort((a, b) =>
            {
                //We want to sort from largest to smallest, so we reverse the comparison
                var result = b.Value - a.Value;
                if (result < 0) return -1;
                if (result > 0) return 1;
                return 0;
            });

            return listResult;
        }
예제 #6
0
 /// <summary>
 /// Try to get the folder the <see cref="FansubFile"/> belongs to. 
 /// </summary>
 /// <param name="file">The <see cref="FansubFile"/> you want to submit.</param>
 /// <param name="folder">Out parameter where the folder location will be written to.</param>
 /// <returns>True if the folder was found. False otherwise.</returns>
 public bool TrySubmitFansubFile(FansubFile file, out string folder)
 {
     folder = default(string);
     foreach (FansubFile currentFile in ChompingEnumerable(file))
     {
         foreach (var transformation in _stageOneTransformations)
         {
             var transformedFile = transformation.Transform(currentFile);
             foreach (var comparator in _comparators)
             {
                 foreach (var strategy in _comparisonStrategies)
                 {
                     var result = comparator.Compare(transformedFile, _knownFolders, strategy);
                     if (result != null)
                     {
                         folder = result;
                         return true;
                     }
                 }
             }
         }
     }
     return false;
 }
 public IList<KeyValuePair<string, double>> MeasureStringDistanceIgnoreCase(FansubFile file, IEnumerable<string> knownFolders)
 {
     return MeasureDistances(file, StringMetricsCalculator.Instance.MeasureSimilarityIgnoreCase, knownFolders);
 }
예제 #8
0
        private static IEnumerable<FansubFile> ChompingEnumerable(FansubFile file)
        {
            FansubFile currentFile = file.DeepCopy();
            while (!currentFile.SeriesName.Equals(string.Empty))
            {
                yield return currentFile;

                currentFile = _chompingTransformation.Transform(currentFile);
            }
        }
        public FansubFile Transform(FansubFile file)
        {
            var nameWithoutPunc = ReplacePunctuationAndSymbolsWithSpaces(file.SeriesName);

            return new FansubFile(file.FansubGroup, nameWithoutPunc, file.EpisodeNumber, file.Extension);
        }
 public FansubFile Transform(FansubFile file)
 {
     var punctuationRemoved = _punctuationTransformation.Transform(file);
     return new FansubFile(file.FansubGroup, NormalizeSpaces(punctuationRemoved.SeriesName), file.EpisodeNumber, file.Extension);
 }
예제 #11
0
 public FansubFile Transform(FansubFile file)
 {
     return file.DeepCopy();
 }