public bool IsUpgradeAllowed(QualityProfile qualityProfile, LanguageProfile languageProfile, QualityModel currentQuality, Language currentLanguage, QualityModel newQuality, Language newLanguage)
        {
            var isQualityUpgrade  = new QualityModelComparer(qualityProfile).Compare(newQuality, currentQuality) > 0;
            var isLanguageUpgrade = new LanguageComparer(languageProfile).Compare(newLanguage, currentLanguage) > 0;

            if (isQualityUpgrade && qualityProfile.UpgradeAllowed ||
                isLanguageUpgrade && languageProfile.UpgradeAllowed)
            {
                _logger.Debug("At least one profile allows upgrading");
                return(true);
            }

            if (isQualityUpgrade && !qualityProfile.UpgradeAllowed)
            {
                _logger.Debug("Quality profile does not allow upgrades, skipping");
                return(false);
            }

            if (isLanguageUpgrade && !languageProfile.UpgradeAllowed)
            {
                _logger.Debug("Language profile does not allow upgrades, skipping");
                return(false);
            }

            return(true);
        }
Example #2
0
        public bool IsUpgradable(QualityProfile qualityProfile, LanguageProfile languageProfile, QualityModel currentQuality, Language currentLanguage, int currentScore, QualityModel newQuality, Language newLanguage, int newScore)
        {
            var qualityComparer           = new QualityModelComparer(qualityProfile);
            var qualityCompare            = qualityComparer.Compare(newQuality?.Quality, currentQuality.Quality);
            var downloadPropersAndRepacks = _configService.DownloadPropersAndRepacks;

            if (qualityCompare > 0)
            {
                _logger.Debug("New item has a better quality");
                return(true);
            }

            if (qualityCompare < 0)
            {
                _logger.Debug("Existing item has better quality, skipping");
                return(false);
            }

            var qualityRevisionComapre = newQuality?.Revision.CompareTo(currentQuality.Revision);

            // Accept unless the user doesn't want to prefer propers, optionally they can
            // use preferred words to prefer propers/repacks over non-propers/repacks.
            if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
                qualityRevisionComapre > 0)
            {
                _logger.Debug("New item has a better quality revision");
                return(true);
            }

            // Reject unless the user does not prefer propers/repacks and it's a revision downgrade.
            if (downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
                qualityRevisionComapre < 0)
            {
                _logger.Debug("Existing item has a better quality revision, skipping");
                return(false);
            }

            var languageCompare = new LanguageComparer(languageProfile).Compare(newLanguage, currentLanguage);

            if (languageCompare > 0)
            {
                _logger.Debug("New item has a more preferred language");
                return(true);
            }

            if (languageCompare < 0)
            {
                _logger.Debug("Existing item has better language, skipping");
                return(false);
            }

            if (!IsPreferredWordUpgradable(currentScore, newScore))
            {
                _logger.Debug("Existing item has an equal or better preferred word score, skipping");
                return(false);
            }

            _logger.Debug("New item has a better preferred word score");
            return(true);
        }
Example #3
0
        public Decision IsSatisfiedBy(LocalEpisode localEpisode, DownloadClientItem downloadClientItem)
        {
            var downloadPropersAndRepacks = _configService.DownloadPropersAndRepacks;
            var qualityComparer           = new QualityModelComparer(localEpisode.Series.QualityProfile);
            var languageComparer          = new LanguageComparer(localEpisode.Series.LanguageProfile);
            var preferredWordScore        = localEpisode.PreferredWordScore;

            foreach (var episode in localEpisode.Episodes.Where(e => e.EpisodeFileId > 0))
            {
                var episodeFile = episode.EpisodeFile.Value;

                if (episodeFile == null)
                {
                    _logger.Trace("Unable to get episode file details from the DB. EpisodeId: {0} EpisodeFileId: {1}", episode.Id, episode.EpisodeFileId);
                    continue;
                }

                var qualityCompare  = qualityComparer.Compare(localEpisode.Quality.Quality, episodeFile.Quality.Quality);
                var languageCompare = languageComparer.Compare(localEpisode.Language, episodeFile.Language);

                if (qualityCompare < 0)
                {
                    _logger.Debug("This file isn't a quality upgrade for all episodes. Skipping {0}", localEpisode.Path);
                    return(Decision.Reject("Not an upgrade for existing episode file(s)"));
                }

                // Same quality, is not a language upgrade, propers/repacks are preferred and it is not a revision update
                // This will allow language upgrades of a lower revision to be imported, which are allowed to be grabbed,
                // they just don't import automatically.

                if (qualityCompare == 0 &&
                    languageCompare <= 0 &&
                    downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
                    localEpisode.Quality.Revision.CompareTo(episodeFile.Quality.Revision) < 0)
                {
                    _logger.Debug("This file isn't a quality revision upgrade for all episodes. Skipping {0}", localEpisode.Path);
                    return(Decision.Reject("Not a quality revision upgrade for existing episode file(s)"));
                }

                if (languageCompare < 0 && qualityCompare == 0)
                {
                    _logger.Debug("This file isn't a language upgrade for all episodes. Skipping {0}", localEpisode.Path);
                    return(Decision.Reject("Not a language upgrade for existing episode file(s)"));
                }

                var episodeFilePreferredWordScore = _episodeFilePreferredWordCalculator.Calculate(localEpisode.Series, episodeFile);

                if (qualityCompare == 0 && languageCompare == 0 && preferredWordScore < episodeFilePreferredWordScore)
                {
                    _logger.Debug("This file isn't a preferred word upgrade for all episodes. Skipping {0}", localEpisode.Path);
                    return(Decision.Reject("Not a preferred word upgrade for existing episode file(s)"));
                }
            }

            return(Decision.Accept());
        }
Example #4
0
        public bool LanguageCutoffNotMet(LanguageProfile languageProfile, Language currentLanguage)
        {
            var cutoff = languageProfile.UpgradeAllowed
                ? languageProfile.Cutoff
                : languageProfile.FirstAllowedLanguage();

            var languageCompare = new LanguageComparer(languageProfile).Compare(currentLanguage, cutoff);

            return(languageCompare < 0);
        }
Example #5
0
        public QueueModule(IBroadcastSignalRMessage broadcastSignalRMessage,
                           IQueueService queueService,
                           IPendingReleaseService pendingReleaseService,
                           ILanguageProfileService languageProfileService,
                           QualityProfileService qualityProfileService)
            : base(broadcastSignalRMessage)
        {
            _queueService          = queueService;
            _pendingReleaseService = pendingReleaseService;
            GetResourcePaged       = GetQueue;

            LANGUAGE_COMPARER = new LanguageComparer(languageProfileService.GetDefaultProfile(string.Empty));
            QUALITY_COMPARER  = new QualityModelComparer(qualityProfileService.GetDefaultProfile(string.Empty));
        }
Example #6
0
        public EditGameViewModel(Window parentWindow, GameCopy gameCopy)
        {
            this.gameCopy = gameCopy;

            ParentWindow = parentWindow;

            using var database = Application.Current.Database();

            Publishers = new ObservableCollection <Publisher>(database.Publishers);
            Developers = new ObservableCollection <Developer>(database.Developers);

            if (!gameCopy.IsNew)
            {
                InitializeData(gameCopy);
            }

            FilteredDevelopers = new ListCollectionView(Developers)
            {
                CustomSort = new SelectedDevelopersComparer(() => GameDevelopers),
                Filter     = obj =>
                {
                    if (obj is Developer developer)
                    {
                        return(developer.Name.IndexOf(DeveloperSearchTerm ?? string.Empty,
                                                      StringComparison.InvariantCultureIgnoreCase) >= 0);
                    }

                    return(false);
                }
            };

            FilteredLanguages = new ListCollectionView(Languages.ToList())
            {
                CustomSort = new LanguageComparer(() => GameLanguages),
                Filter     = obj =>
                {
                    if (obj is CultureInfo cultureInfo)
                    {
                        return(cultureInfo.EnglishName.IndexOf(LanguageSearchTerm ?? string.Empty,
                                                               StringComparison.InvariantCultureIgnoreCase) >= 0);
                    }

                    return(false);
                }
            };

            PropertyChanged += RefreshFilteredLanguages;
            PropertyChanged += RefreshFilteredDevelopers;
        }
Example #7
0
        public Decision IsSatisfiedBy(LocalEpisode localEpisode, DownloadClientItem downloadClientItem)
        {
            var downloadPropersAndRepacks = _configService.DownloadPropersAndRepacks;
            var qualityComparer           = new QualityModelComparer(localEpisode.Series.QualityProfile);
            var languageComparer          = new LanguageComparer(localEpisode.Series.LanguageProfile);

            foreach (var episode in localEpisode.Episodes.Where(e => e.EpisodeFileId > 0))
            {
                var episodeFile = episode.EpisodeFile.Value;

                if (episodeFile == null)
                {
                    _logger.Trace("Unable to get episode file details from the DB. EpisodeId: {0} EpisodeFileId: {1}", episode.Id, episode.EpisodeFileId);
                    continue;
                }

                var qualityCompare = qualityComparer.Compare(localEpisode.Quality.Quality, episodeFile.Quality.Quality);

                if (qualityCompare < 0)
                {
                    _logger.Debug("This file isn't a quality upgrade for all episodes. Skipping {0}", localEpisode.Path);
                    return(Decision.Reject("Not an upgrade for existing episode file(s)"));
                }

                if (qualityCompare == 0 && downloadPropersAndRepacks != ProperDownloadTypes.DoNotPrefer &&
                    localEpisode.Quality.Revision.CompareTo(episodeFile.Quality.Revision) < 0)
                {
                    _logger.Debug("This file isn't a quality upgrade for all episodes. Skipping {0}", localEpisode.Path);
                    return(Decision.Reject("Not an upgrade for existing episode file(s)"));
                }

                if (languageComparer.Compare(localEpisode.Language, episodeFile.Language) < 0 && qualityCompare == 0)
                {
                    _logger.Debug("This file isn't a language upgrade for all episodes. Skipping {0}", localEpisode.Path);
                    return(Decision.Reject("Not an upgrade for existing episode file(s)"));
                }
            }

            return(Decision.Accept());
        }
Example #8
0
        static void Main(string[] args)
        {
            var extractOptions = new ExtractOptions();
            var compareOptions = new CompareOptions();
            var parser = new CommandLineParser();

            if( args.Length > 0 )
            {
                if (args[0] == "extract")
                {
                    if (parser.ParseArguments(args, extractOptions))
                    {
                        extractOptions.RootDirectory = extractOptions.RootDirectory ??
                            Environment.CurrentDirectory;

                        Console.Out.WriteLine("");
                        Console.Out.WriteLine("Extracting entries from:");
                        Console.Out.WriteLine("\"" + extractOptions.RootDirectory + "\"");
                        Console.Out.WriteLine("Extensions: " + string.Join(", ", extractOptions.Extensions));
                        Console.Out.WriteLine("Exclude patterns: " + string.Join(", ", extractOptions.ExcludePatterns));
                        Console.Out.WriteLine();
                        Console.Out.WriteLine("Saving texts to: " + extractOptions.TargetFile);

                        var extractor = new CStyleLanguageTextExtractor();
                        extractor.MarkerLanguage = extractOptions.DefaultLanguage;

                        extractor.SourceFiles = new SourceFileList(
                            extractOptions.RootDirectory,
                            extractOptions.Extensions,
                            extractOptions.ExcludePatterns).GetFiles();

                        var target = new XmlTextSource();
                        target.Put(extractor.Get().Select(x =>
                            new LocalizedTextState { Text = x, Status = LocalizedTextStatus.New }), TextMergeOptions.KeepUnused);

                        target.Document.Save(extractOptions.TargetFile);

                        return;
                    }
                }
                else if (args[0] == "compare")
                {
                    if (parser.ParseArguments(args, compareOptions))
                    {

                        Console.WriteLine();

                        var texts = new TextSourceAggregator();
                        using (texts.BeginUpdate())
                        {
                            foreach (var file in compareOptions.Files)
                            {
                                texts.Sources.Add(new PrioritizedTextSource(new XmlTextSource(XDocument.Load(file)), 1));
                            }
                        }
                        

                        var comparer = new LanguageComparer(texts);
                        var result = comparer.Compare(
                            compareOptions.SourceLanguage, 
                            compareOptions.TargetLanguage);
                        
                        Console.WriteLine(result.Success ?
                            "OK - The text(s) defines the same keys for the languages" :
                            "The two languages differ");
                        Console.Out.WriteLine();                        
                        foreach (var text in result.MissingTexts)
                        {
                            Console.Out.WriteLine("Missing\t" + text.Key);                            
                        }
                        foreach (var text in result.UnmatchedTexts)
                        {
                            Console.Out.WriteLine("Unmatched\t" + text.Key);                            
                        }                        
                        return;
                    }
                }
            }

            Console.WriteLine();
            Console.WriteLine("Usage: ");
            Console.WriteLine();
            Console.WriteLine("Localization.exe extract");
            WriteHelp(extractOptions);
            Console.WriteLine();
            Console.WriteLine("Localization.exe compare");
            WriteHelp(compareOptions);
            Console.WriteLine();
        }
Example #9
0
        static void Main(string[] args)
        {
            var extractOptions = new ExtractOptions();
            var compareOptions = new CompareOptions();
            var parser         = new CommandLineParser();

            if (args.Length > 0)
            {
                if (args[0] == "extract")
                {
                    if (parser.ParseArguments(args, extractOptions))
                    {
                        extractOptions.RootDirectory = extractOptions.RootDirectory ??
                                                       Environment.CurrentDirectory;

                        Console.Out.WriteLine("");
                        Console.Out.WriteLine("Extracting entries from:");
                        Console.Out.WriteLine("\"" + extractOptions.RootDirectory + "\"");
                        Console.Out.WriteLine("Extensions: " + string.Join(", ", extractOptions.Extensions));
                        Console.Out.WriteLine("Exclude patterns: " + string.Join(", ", extractOptions.ExcludePatterns));
                        Console.Out.WriteLine();
                        Console.Out.WriteLine("Saving texts to: " + extractOptions.TargetFile);

                        var extractor = new CStyleLanguageTextExtractor();
                        extractor.MarkerLanguage = extractOptions.DefaultLanguage;

                        extractor.SourceFiles = new SourceFileList(
                            extractOptions.RootDirectory,
                            extractOptions.Extensions,
                            extractOptions.ExcludePatterns).GetFiles();

                        var target = new XmlTextSource();
                        target.Put(extractor.Get().Select(x =>
                                                          new LocalizedTextState {
                            Text = x, Status = LocalizedTextStatus.New
                        }), TextMergeOptions.KeepUnused);

                        target.Document.Save(extractOptions.TargetFile);

                        return;
                    }
                }
                else if (args[0] == "compare")
                {
                    if (parser.ParseArguments(args, compareOptions))
                    {
                        Console.WriteLine();

                        var texts = new TextSourceAggregator();
                        using (texts.BeginUpdate())
                        {
                            foreach (var file in compareOptions.Files)
                            {
                                texts.Sources.Add(new PrioritizedTextSource(new XmlTextSource(XDocument.Load(file)), 1));
                            }
                        }


                        var comparer = new LanguageComparer(texts);
                        var result   = comparer.Compare(
                            compareOptions.SourceLanguage,
                            compareOptions.TargetLanguage);

                        Console.WriteLine(result.Success ?
                                          "OK - The text(s) defines the same keys for the languages" :
                                          "The two languages differ");
                        Console.Out.WriteLine();
                        foreach (var text in result.MissingTexts)
                        {
                            Console.Out.WriteLine("Missing\t" + text.Key);
                        }
                        foreach (var text in result.UnmatchedTexts)
                        {
                            Console.Out.WriteLine("Unmatched\t" + text.Key);
                        }
                        return;
                    }
                }
            }

            Console.WriteLine();
            Console.WriteLine("Usage: ");
            Console.WriteLine();
            Console.WriteLine("Localization.exe extract");
            WriteHelp(extractOptions);
            Console.WriteLine();
            Console.WriteLine("Localization.exe compare");
            WriteHelp(compareOptions);
            Console.WriteLine();
        }
        public bool LanguageCutoffNotMet(LanguageProfile languageProfile, Language currentLanguage)
        {
            var languageCompare = new LanguageComparer(languageProfile).Compare(currentLanguage, languageProfile.Cutoff);

            return(languageCompare < 0);
        }
Example #11
0
        public virtual Decision IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria)
        {
            if (searchCriteria != null && searchCriteria.UserInvokedSearch)
            {
                _logger.Debug("Ignoring delay for user invoked search");
                return(Decision.Accept());
            }

            var qualityProfile      = subject.Series.QualityProfile.Value;
            var languageProfile     = subject.Series.LanguageProfile.Value;
            var delayProfile        = _delayProfileService.BestForTags(subject.Series.Tags);
            var delay               = delayProfile.GetProtocolDelay(subject.Release.DownloadProtocol);
            var isPreferredProtocol = subject.Release.DownloadProtocol == delayProfile.PreferredProtocol;

            if (delay == 0)
            {
                _logger.Debug("QualityProfile does not require a waiting period before download for {0}.", subject.Release.DownloadProtocol);
                return(Decision.Accept());
            }

            var qualityComparer  = new QualityModelComparer(qualityProfile);
            var languageComparer = new LanguageComparer(languageProfile);

            if (isPreferredProtocol)
            {
                foreach (var file in subject.Episodes.Where(c => c.EpisodeFileId != 0).Select(c => c.EpisodeFile.Value))
                {
                    var currentQuality = file.Quality;
                    var newQuality     = subject.ParsedEpisodeInfo.Quality;
                    var qualityCompare = qualityComparer.Compare(newQuality?.Quality, currentQuality.Quality);

                    if (qualityCompare == 0 && newQuality?.Revision.CompareTo(currentQuality.Revision) > 0)
                    {
                        _logger.Debug("New quality is a better revision for existing quality, skipping delay");
                        return(Decision.Accept());
                    }
                }
            }

            // If quality meets or exceeds the best allowed quality in the profile accept it immediately
            var bestQualityInProfile    = qualityProfile.LastAllowedQuality();
            var isBestInProfile         = qualityComparer.Compare(subject.ParsedEpisodeInfo.Quality.Quality, bestQualityInProfile) >= 0;
            var isBestInProfileLanguage = languageComparer.Compare(subject.ParsedEpisodeInfo.Language, languageProfile.LastAllowedLanguage()) >= 0;

            if (isBestInProfile && isBestInProfileLanguage && isPreferredProtocol)
            {
                _logger.Debug("Quality and language is highest in profile for preferred protocol, will not delay");
                return(Decision.Accept());
            }

            var episodeIds = subject.Episodes.Select(e => e.Id);

            var oldest = _pendingReleaseService.OldestPendingRelease(subject.Series.Id, episodeIds.ToArray());

            if (oldest != null && oldest.Release.AgeMinutes > delay)
            {
                return(Decision.Accept());
            }

            if (subject.Release.AgeMinutes < delay)
            {
                _logger.Debug("Waiting for better quality release, There is a {0} minute delay on {1}", delay, subject.Release.DownloadProtocol);
                return(Decision.Reject("Waiting for better quality release"));
            }

            return(Decision.Accept());
        }