Esempio n. 1
0
    public LocalizationFile getCurrentLangFile()
    {
#if UNITY_EDITOR
        loadFiles();
#endif

        string           lang = getSavedIsoLanguage().ToString();
        LocalizationFile file = getLangFileByLangLabel(lang);

        if (file == null)
        {
            Debug.LogWarning(" !!! <color=red>no file</color> for current lang : " + lang);
            Debug.LogWarning(" !!! <color=red>this needs to be fixed before release</color> !!! ");

            IsoLanguages iso = getSystemLanguageToIso();
            Debug.LogWarning(" DEBUG <b>force</b> switching lang to '" + iso + "'");
            setSavedLanguage(iso);

            file = getLangFileByLangLabel(lang);
        }

        Debug.Assert(file != null, "file  " + lang + " should be assigned at this point ...");

        return(file);
    }
Esempio n. 2
0
    static public void nextLanguage()
    {
        IsoLanguages cur = getSavedIsoLanguage();

        int supportIndex = -1;

        for (int i = 0; i < allSupportedLanguages.Length; i++)
        {
            if (cur == allSupportedLanguages[i])
            {
                supportIndex = i;
            }
        }

        Debug.Assert(supportIndex > -1, "unsupported language ?");

        supportIndex++;

        if (supportIndex >= allSupportedLanguages.Length)
        {
            supportIndex = 0;
        }

        cur = allSupportedLanguages[supportIndex];

        Debug.Log("next language is : " + cur + " / " + allSupportedLanguages.Length);

        setSavedLanguage(cur, true);
    }
Esempio n. 3
0
        private string GetLanguageTitle(Movie movie, string isoCodes)
        {
            if (isoCodes.IsNotNullOrWhiteSpace())
            {
                foreach (var isoCode in isoCodes.Split('|'))
                {
                    var language = IsoLanguages.Find(isoCode.ToLower())?.Language;

                    if (language == null)
                    {
                        continue;
                    }

                    var titles = movie.Translations.Where(t => t.Language == language).ToList();

                    if (!movie.Translations.Any())
                    {
                        titles = _movieTranslationService.GetAllTranslationsForMovie(movie.Id).Where(t => t.Language == language).ToList();
                    }

                    return(titles.FirstOrDefault()?.Title ?? movie.Title);
                }
            }

            return(movie.Title);
        }
Esempio n. 4
0
    /// <summary>
    /// uses sys language as default
    /// </summary>
    static public IsoLanguages getSavedIsoLanguage()
    {
        SystemLanguage langDefault = Application.systemLanguage;

#if loca_en
        langDefault = SystemLanguage.English;
#elif loca_fr
        langDefault = SystemLanguage.French;
#elif local_zh
        langDefault = SystemLanguage.Chinese;
#endif

        //default value
        IsoLanguages lang = sysToIso(langDefault);

        //how to load
        //IsoLanguages lang = (IsoLanguages)LabySaveManager.getStream().getOption(LANG_PREFIX, (int)sysToIso(langDefault));

        if (!isIsoLanguageSupported(lang))
        {
            lang = getSystemLanguageToIso(); // sys OR fallback if sys is not supported
        }

        return(lang);
    }
Esempio n. 5
0
        public string GetLocalizedString(string phrase, string language)
        {
            if (string.IsNullOrEmpty(phrase))
            {
                throw new ArgumentNullException(nameof(phrase));
            }

            if (language.IsNullOrWhiteSpace())
            {
                language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode;
            }

            if (language == null)
            {
                language = DefaultCulture;
            }

            var dictionary = GetLocalizationDictionary(language);

            if (dictionary.TryGetValue(phrase, out var value))
            {
                return(value);
            }

            return(phrase);
        }
Esempio n. 6
0
    static public void setSavedLanguage(IsoLanguages iso, bool applySwap = false)
    {
        //how to save
        //...
        //LabySaveManager.getStream().setOption(LANG_PREFIX, (float)iso); // save

        if (applySwap)
        {
            applyLanguage(iso);        // apply
        }
    }
Esempio n. 7
0
 static public bool isIsoLanguageSupported(IsoLanguages iso)
 {
     for (int i = 0; i < allSupportedLanguages.Length; i++)
     {
         if (allSupportedLanguages[i] == iso)
         {
             return(true);
         }
     }
     return(false);
 }
Esempio n. 8
0
 static public int getLanguageIndex(IsoLanguages lang)
 {
     for (int i = 0; i < allSupportedLanguages.Length; i++)
     {
         if (allSupportedLanguages[i] == lang)
         {
             return(i);
         }
     }
     return(-1);
 }
Esempio n. 9
0
        private static MovieTranslation MapTranslation(TranslationResource arg)
        {
            var newAlternativeTitle = new MovieTranslation
            {
                Title      = arg.Title,
                Overview   = arg.Overview,
                CleanTitle = arg.Title.CleanMovieTitle(),
                Language   = IsoLanguages.Find(arg.Language.ToLower())?.Language
            };

            return(newAlternativeTitle);
        }
Esempio n. 10
0
        private string GetSetLanguageFileName()
        {
            var isoLanguage = IsoLanguages.Get((Language)_configService.UILanguage);
            var language    = isoLanguage.TwoLetterCode;

            if (isoLanguage.CountryCode.IsNotNullOrWhiteSpace())
            {
                language = string.Format("{0}_{1}", language, isoLanguage.CountryCode);
            }

            return(language);
        }
Esempio n. 11
0
        private static AlternativeTitle MapAlternativeTitle(AlternativeTitleResource arg)
        {
            var newAlternativeTitle = new AlternativeTitle
            {
                Title      = arg.Title,
                SourceType = SourceType.TMDB,
                CleanTitle = arg.Title.CleanMovieTitle(),
                Language   = IsoLanguages.Find(arg.Language.ToLower())?.Language ?? Language.English
            };

            return(newAlternativeTitle);
        }
Esempio n. 12
0
    static public string getContent(string id, IsoLanguages filterLang, bool warning = true)
    {
        if (manager == null)
        {
            manager = create();
        }

        LocalizationFile file = manager.getFileByLang(filterLang.ToString());

        Debug.Assert(file != null, "no file found for language : " + filterLang);

        return(file.getContentById(id, warning));
    }
Esempio n. 13
0
    static public string getContent(string id, bool warning = false)
    {
        if (manager == null)
        {
            manager = create();
        }

        IsoLanguages lang = getSavedIsoLanguage();

        LocalizationFile file = manager.getFileByLang(lang.ToString());

        Debug.Assert(file != null, "no file found for language : " + lang);

        return(file.getContentById(id, warning));
    }
Esempio n. 14
0
        public AlternativeTitle AddNewAlternativeTitle(AlternativeTitle title, int TmdbId)
        {
            var request = RadarrAPI.Create().SetSegment("route", "mappings").SetSegment("action", "add")
                          .AddQueryParam("tmdbid", TmdbId).AddQueryParam("type", "title")
                          .AddQueryParam("language", IsoLanguages.Get(title.Language).TwoLetterCode)
                          .AddQueryParam("aka_title", title.Title).Build();

            var newMapping = Execute <AddTitleMapping>(request);

            var newTitle = new AlternativeTitle(newMapping.Info.AkaTitle, SourceType.Mappings, newMapping.Id, title.Language);

            newTitle.VoteCount = newMapping.VoteCount;
            newTitle.Votes     = newMapping.Votes;

            return(newTitle);
        }
Esempio n. 15
0
        private string GetSuffix(Language language, int copy, bool multipleCopies = false)
        {
            var suffixBuilder = new StringBuilder();

            if (multipleCopies)
            {
                suffixBuilder.Append(".");
                suffixBuilder.Append(copy);
            }

            if (language != Language.Unknown)
            {
                suffixBuilder.Append(".");
                suffixBuilder.Append(IsoLanguages.Get(language).TwoLetterCode);
            }

            return(suffixBuilder.ToString());
        }
Esempio n. 16
0
    //public Action<string> onLanguageChange;

    public LocalizationManager()
    {
        //CultureInfo.GetCultureInfo(CultureTypes.NeutralCultures)

        IsoLanguages iso = getSavedIsoLanguage(); //au cas ou, set default (fr)

        if (Application.isPlaying)
        {
            Debug.Log("~Language~ starting language is <b>" + iso + "</b>");
        }

        loadFiles();

        //Debug.Log("loaded " + lang_files.Length + " files");

        //remonte les erreurs
        //checkIntegrity();
    }
Esempio n. 17
0
    /// <summary>
    /// A apl quand on change la lang
    /// </summary>
    static public void applyLanguage(IsoLanguages newLang)
    {
        Debug.Log("<color=cyan>applyLanguage</color> to <b>" + newLang + "</b>!");

        IsoLanguages iso = getSavedIsoLanguage();

        if (!Application.isPlaying)
        {
            reacts.Clear();
            reacts.AddRange(HalperInterfaces.getCandidates <iLanguageChangeReact>());
        }

        Debug.Log("applying new lang (" + iso + ") to x" + reacts.Count + " reacts");

        for (int i = 0; i < reacts.Count; i++)
        {
            reacts[i].onLanguageChange(iso.ToString());
        }
    }
Esempio n. 18
0
        private string GetExtension(SubtitleFile extraFile, string existingFileName, int copy, bool multipleCopies = false)
        {
            var fileExtension    = Path.GetExtension(existingFileName);
            var extensionBuilder = new StringBuilder();

            if (multipleCopies)
            {
                extensionBuilder.Append(copy);
                extensionBuilder.Append(".");
            }

            if (extraFile.Language != Language.Unknown)
            {
                extensionBuilder.Append(IsoLanguages.Get(extraFile.Language).TwoLetterCode);
                extensionBuilder.Append(".");
            }

            extensionBuilder.Append(fileExtension.TrimStart('.'));

            return(extensionBuilder.ToString());
        }
        public AugmentLanguageResult AugmentLanguage(LocalMovie localMovie, DownloadClientItem downloadClientItem)
        {
            if (localMovie.MediaInfo == null)
            {
                return(null);
            }

            var audioLanguages = localMovie.MediaInfo.AudioLanguages.Split('/').Select(l => l.Trim()).Distinct().ToList();

            var languages = new List <Languages.Language>();

            foreach (var audioLanguage in audioLanguages)
            {
                var language = IsoLanguages.FindByName(audioLanguage)?.Language;
                languages.AddIfNotNull(language);
            }

            if (languages.Count == 0)
            {
                return(null);
            }

            return(new AugmentLanguageResult(languages, Confidence.MediaInfo));
        }
Esempio n. 20
0
        private IEnumerable <ImageFileResult> ProcessMovieImages(Movie movie, MovieFile movieFile)
        {
            _logger.Debug("Generating Movie Images for: {0}", Path.Combine(movie.Path, movieFile.RelativePath));

            var    movieMetadataLanguage    = (Settings.MovieMetadataLanguage == (int)Language.Original) ? (int)movie.OriginalLanguage : Settings.MovieMetadataLanguage;
            var    selectedSettingsLanguage = Language.FindById(movieMetadataLanguage);
            var    isoLanguage = IsoLanguages.Get(selectedSettingsLanguage);
            var    isoLanguageTwoLetterCode = isoLanguage.TwoLetterCode;
            var    countryCode = isoLanguage.CountryCode;
            string originalIsoLanguageTwoLetterCode = null;

            if (TmdbClient == null)
            {
                TmdbClient = new TMDbClient(Settings.ApiKey)
                {
                    DefaultCountry  = countryCode,
                    DefaultLanguage = isoLanguageTwoLetterCode
                };
            }

            var tmdbMovie = TmdbClient.GetMovieAsync(movie.TmdbId).Result;

            if (tmdbMovie != null)
            {
                originalIsoLanguageTwoLetterCode = tmdbMovie.OriginalLanguage;

                var baseDestination = new StringBuilder();

                if (!Settings.UseMovieImages)
                {
                    baseDestination.Append(Path.GetFileNameWithoutExtension(movieFile.RelativePath));
                    baseDestination.Append('-');
                }

                if (tmdbMovie.BackdropPath != null)
                {
                    yield return(new ImageFileResult(GetMovieCoverType(movieFile.RelativePath, CoverType.fanart), BaseImageUrl + "/original" + tmdbMovie.BackdropPath));
                }

                if (tmdbMovie.PosterPath != null)
                {
                    yield return(new ImageFileResult(GetMovieCoverType(movieFile.RelativePath, CoverType.poster), BaseImageUrl + "/original" + tmdbMovie.PosterPath));
                }
            }

            if (Settings.FanartApiKey.IsNotNullOrWhiteSpace())
            {
                string content = null;

                try
                {
                    var fanartRequest  = new HttpRequest($"http://webservice.fanart.tv/v3/movies/{movie.TmdbId}?api_key={Settings.FanartApiKey}", HttpAccept.Json);
                    var fanartResponse = _client.Execute(fanartRequest);

                    content = fanartResponse.Content;
                }
                catch (Exception e)
                {
                    _logger.Error(e, "Can't obtain data from Fanart for Movie: {0}", Path.Combine(movie.Path, movieFile.RelativePath));
                }

                if (content.IsNotNullOrWhiteSpace())
                {
                    var fanartMovie = Json.Deserialize <FanartMovie>(content);

                    if (fanartMovie != null)
                    {
                        var moviebanner = GetBestOptionForFanartMovieArt(fanartMovie.moviebanner, isoLanguageTwoLetterCode, originalIsoLanguageTwoLetterCode);
                        if (moviebanner != null)
                        {
                            yield return(new ImageFileResult(GetMovieCoverType(movieFile.RelativePath, CoverType.banner), moviebanner.url));
                        }

                        var hdmovieclearart = GetBestOptionForFanartMovieArt(fanartMovie.hdmovieclearart, isoLanguageTwoLetterCode, originalIsoLanguageTwoLetterCode);
                        if (hdmovieclearart != null)
                        {
                            yield return(new ImageFileResult(GetMovieCoverType(movieFile.RelativePath, CoverType.clearart, true), hdmovieclearart.url));
                        }

                        var hdmovielogo = GetBestOptionForFanartMovieArt(fanartMovie.hdmovielogo, isoLanguageTwoLetterCode, originalIsoLanguageTwoLetterCode);
                        if (hdmovielogo != null)
                        {
                            yield return(new ImageFileResult(GetMovieCoverType(movieFile.RelativePath, CoverType.clearlogo, true), hdmovielogo.url));
                        }

                        if (fanartMovie.moviedisc != null)
                        {
                            var moviedisc = GetBestOptionForFanartMovieArt(fanartMovie.moviedisc.Cast <FanartMovieArt>().ToList(), isoLanguageTwoLetterCode, originalIsoLanguageTwoLetterCode);
                            if (moviedisc != null)
                            {
                                yield return(new ImageFileResult(GetMovieCoverType(movieFile.RelativePath, CoverType.discart, true), moviedisc.url));
                            }
                        }

                        var moviethumb = GetBestOptionForFanartMovieArt(fanartMovie.moviethumb, isoLanguageTwoLetterCode, originalIsoLanguageTwoLetterCode);
                        if (moviethumb != null)
                        {
                            yield return(new ImageFileResult(GetMovieCoverType(movieFile.RelativePath, CoverType.landscape), moviethumb.url));
                        }
                    }
                }
            }
        }
Esempio n. 21
0
        public string GetLocalizedString(string phrase)
        {
            var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode;

            return(GetLocalizedString(phrase, language));
        }
Esempio n. 22
0
        public Dictionary <string, string> GetLocalizationDictionary()
        {
            var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode;

            return(GetLocalizationDictionary(language));
        }
Esempio n. 23
0
        public Movie GetMovieInfo(int TmdbId, Profile profile = null, bool hasPreDBEntry = false)
        {
            var langCode = profile != null?IsoLanguages.Get(profile.Language)?.TwoLetterCode ?? "en" : "en";

            var request = _movieBuilder.Create()
                          .SetSegment("route", "movie")
                          .SetSegment("id", TmdbId.ToString())
                          .SetSegment("secondaryRoute", "")
                          .AddQueryParam("append_to_response", "alternative_titles,release_dates,videos")
                          .AddQueryParam("language", langCode.ToUpper())
                          // .AddQueryParam("country", "US")
                          .Build();

            request.AllowAutoRedirect = true;
            request.SuppressHttpError = true;

            var response = _httpClient.Get <MovieResourceRoot>(request);

            if (response.StatusCode == HttpStatusCode.NotFound)
            {
                throw new MovieNotFoundException("Movie not found.");
            }
            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new HttpException(request, response);
            }

            if (response.Headers.ContentType != HttpAccept.JsonCharset.Value)
            {
                throw new HttpException(request, response);
            }

            // The dude abides, so should us, Lets be nice to TMDb
            // var allowed = int.Parse(response.Headers.GetValues("X-RateLimit-Limit").First()); // get allowed
            // var reset = long.Parse(response.Headers.GetValues("X-RateLimit-Reset").First()); // get time when it resets
            if (response.Headers.ContainsKey("X-RateLimit-Remaining"))
            {
                var remaining = int.Parse(response.Headers.GetValues("X-RateLimit-Remaining").First());
                if (remaining <= 5)
                {
                    _logger.Trace("Waiting 5 seconds to get information for the next 35 movies");
                    Thread.Sleep(5000);
                }
            }

            var resource = response.Resource;

            if (resource.status_message != null)
            {
                if (resource.status_code == 34)
                {
                    _logger.Warn("Movie with TmdbId {0} could not be found. This is probably the case when the movie was deleted from TMDB.", TmdbId);
                    return(null);
                }

                _logger.Warn(resource.status_message);
                return(null);
            }

            var movie     = new Movie();
            var altTitles = new List <AlternativeTitle>();

            if (langCode != "en")
            {
                var iso = IsoLanguages.Find(resource.original_language);
                if (iso != null)
                {
                    altTitles.Add(new AlternativeTitle(resource.original_title, SourceType.TMDB, TmdbId, iso.Language));
                }

                //movie.AlternativeTitles.Add(resource.original_title);
            }

            foreach (var alternativeTitle in resource.alternative_titles.titles)
            {
                if (alternativeTitle.iso_3166_1.ToLower() == langCode)
                {
                    altTitles.Add(new AlternativeTitle(alternativeTitle.title, SourceType.TMDB, TmdbId, IsoLanguages.Find(alternativeTitle.iso_3166_1.ToLower())?.Language ?? Language.English));
                }
                else if (alternativeTitle.iso_3166_1.ToLower() == "us")
                {
                    altTitles.Add(new AlternativeTitle(alternativeTitle.title, SourceType.TMDB, TmdbId, Language.English));
                }
            }

            movie.TmdbId     = TmdbId;
            movie.ImdbId     = resource.imdb_id;
            movie.Title      = resource.title;
            movie.TitleSlug  = Parser.Parser.ToUrlSlug(resource.title);
            movie.CleanTitle = resource.title.CleanSeriesTitle();
            movie.SortTitle  = Parser.Parser.NormalizeTitle(resource.title);
            movie.Overview   = resource.overview;
            movie.Website    = resource.homepage;

            if (resource.release_date.IsNotNullOrWhiteSpace())
            {
                movie.InCinemas = DateTime.Parse(resource.release_date);

                // get the lowest year in all release date
                var lowestYear = new List <int>();
                foreach (ReleaseDates releaseDates in resource.release_dates.results)
                {
                    foreach (ReleaseDate releaseDate in releaseDates.release_dates)
                    {
                        lowestYear.Add(DateTime.Parse(releaseDate.release_date).Year);
                    }
                }
                movie.Year = lowestYear.Min();
            }

            movie.TitleSlug += "-" + movie.TmdbId.ToString();

            movie.Images.AddIfNotNull(MapImage(resource.poster_path, MediaCoverTypes.Poster));//TODO: Update to load image specs from tmdb page!
            movie.Images.AddIfNotNull(MapImage(resource.backdrop_path, MediaCoverTypes.Fanart));

            movie.Runtime = resource.runtime;

            //foreach(Title title in resource.alternative_titles.titles)
            //{
            //    movie.AlternativeTitles.Add(title.title);
            //}

            foreach (ReleaseDates releaseDates in resource.release_dates.results)
            {
                foreach (ReleaseDate releaseDate in releaseDates.release_dates)
                {
                    if (releaseDate.type == 5 || releaseDate.type == 4)
                    {
                        if (movie.PhysicalRelease.HasValue)
                        {
                            if (movie.PhysicalRelease.Value.After(DateTime.Parse(releaseDate.release_date)))
                            {
                                movie.PhysicalRelease     = DateTime.Parse(releaseDate.release_date); //Use oldest release date available.
                                movie.PhysicalReleaseNote = releaseDate.note;
                            }
                        }
                        else
                        {
                            movie.PhysicalRelease     = DateTime.Parse(releaseDate.release_date);
                            movie.PhysicalReleaseNote = releaseDate.note;
                        }
                    }
                }
            }

            movie.Ratings       = new Ratings();
            movie.Ratings.Votes = resource.vote_count;
            movie.Ratings.Value = (decimal)resource.vote_average;

            foreach (Genre genre in resource.genres)
            {
                movie.Genres.Add(genre.name);
            }

            //this is the way it should be handled
            //but unfortunately it seems
            //tmdb lacks alot of release date info
            //omdbapi is actually quite good for this info
            //except omdbapi has been having problems recently
            //so i will just leave this in as a comment
            //and use the 3 month logic that we were using before

            /*var now = DateTime.Now;
             * if (now < movie.InCinemas)
             *  movie.Status = MovieStatusType.Announced;
             * if (now >= movie.InCinemas)
             *  movie.Status = MovieStatusType.InCinemas;
             * if (now >= movie.PhysicalRelease)
             *  movie.Status = MovieStatusType.Released;
             */


            var now = DateTime.Now;

            //handle the case when we have both theatrical and physical release dates
            if (movie.InCinemas.HasValue && movie.PhysicalRelease.HasValue)
            {
                if (now < movie.InCinemas)
                {
                    movie.Status = MovieStatusType.Announced;
                }
                else if (now >= movie.InCinemas)
                {
                    movie.Status = MovieStatusType.InCinemas;
                }
                if (now >= movie.PhysicalRelease)
                {
                    movie.Status = MovieStatusType.Released;
                }
            }
            //handle the case when we have theatrical release dates but we dont know the physical release date
            else if (movie.InCinemas.HasValue && (now >= movie.InCinemas))
            {
                movie.Status = MovieStatusType.InCinemas;
            }
            //handle the case where we only have a physical release date
            else if (movie.PhysicalRelease.HasValue && (now >= movie.PhysicalRelease))
            {
                movie.Status = MovieStatusType.Released;
            }
            //otherwise the title has only been announced
            else
            {
                movie.Status = MovieStatusType.Announced;
            }

            //since TMDB lacks alot of information lets assume that stuff is released if its been in cinemas for longer than 3 months.
            if (!movie.PhysicalRelease.HasValue && (movie.Status == MovieStatusType.InCinemas) && (((DateTime.Now).Subtract(movie.InCinemas.Value)).TotalSeconds > 60 * 60 * 24 * 30 * 3))
            {
                movie.Status = MovieStatusType.Released;
            }

            if (!hasPreDBEntry)
            {
                if (_predbService.HasReleases(movie))
                {
                    movie.HasPreDBEntry = true;
                }
                else
                {
                    movie.HasPreDBEntry = false;
                }
            }

            //this matches with the old behavior before the creation of the MovieStatusType.InCinemas

            /*if (resource.status == "Released")
             * {
             *  if (movie.InCinemas.HasValue && (((DateTime.Now).Subtract(movie.InCinemas.Value)).TotalSeconds <= 60 * 60 * 24 * 30 * 3))
             *  {
             *      movie.Status = MovieStatusType.InCinemas;
             *  }
             *  else
             *  {
             *      movie.Status = MovieStatusType.Released;
             *  }
             * }
             * else
             * {
             *  movie.Status = MovieStatusType.Announced;
             * }*/

            if (resource.videos != null)
            {
                foreach (Video video in resource.videos.results)
                {
                    if (video.type == "Trailer" && video.site == "YouTube")
                    {
                        if (video.key != null)
                        {
                            movie.YouTubeTrailerId = video.key;
                            break;
                        }
                    }
                }
            }

            if (resource.production_companies != null)
            {
                if (resource.production_companies.Any())
                {
                    movie.Studio = resource.production_companies[0].name;
                }
            }

            movie.AlternativeTitles.AddRange(altTitles);

            return(movie);
        }
Esempio n. 24
0
        public void should_return_portuguese(string isoCode)
        {
            var result = IsoLanguages.Find(isoCode);

            result.Language.Should().Be(Language.Portuguese);
        }
Esempio n. 25
0
        public void should_not_return_portuguese(string isoCode)
        {
            var result = IsoLanguages.Find(isoCode);

            result.Should().Be(null);
        }
Esempio n. 26
0
 public LocalizationFile(IsoLanguages lang)
 {
     Init(lang.ToString());
 }
Esempio n. 27
0
        public static async Task <bool> InitAsync()
        {
            // First install
            if (LocalSettings.LanguageListHash == null)
            {
                using (Stream stream = CacheUtils.GetCacheStream(CacheUtils.TatoebaConfigFileName))
                {
                    StreamReader reader = new StreamReader(stream);
                    string       text   = await reader.ReadToEndAsync().ConfigureAwait(false);

                    TatoebaConfig = JsonConvert.DeserializeObject <TatoebaConfig>(text);
                    LocalSettings.LanguageListHash = TatoebaConfig.LanguageListHash;
                }

                using (Stream stream = CacheUtils.GetCacheStream(CacheUtils.LanguageListFile))
                {
                    StreamReader reader = new StreamReader(stream);
                    string       text   = await reader.ReadToEndAsync().ConfigureAwait(false);

                    var file = await LocalStorage.CreateFileAsync("Languages.json", PCLStorage.CreationCollisionOption.ReplaceExisting).ConfigureAwait(false);

                    await file.WriteAllTextAsync(text).ConfigureAwait(false);
                }
            }

            TatoebaConfig = await GetTatoebaConfig().ConfigureAwait(false);

            if (LocalSettings.LanguageListHash != TatoebaConfig.LanguageListHash)
            {
                IsoLanguages = await GetLanguagesFromDistantJson().ConfigureAwait(false);
            }
            else
            {
                IsoLanguages = await GetLanguagesFromLocalJson().ConfigureAwait(false);
            }

            LocalSettings.LanguageListHash = TatoebaConfig.LanguageListHash;
            TatoebaScraper.XpathConfig     = TatoebaConfig.XpathConfig;

            Languages = IsoLanguages.ToList();
            Languages.Insert(0, new Language {
                Flag = null, Iso = null, Label = "All languages"
            });

            BrowsableLanguages = IsoLanguages.ToList();
            BrowsableLanguages.Add(new Language {
                Flag = null, Iso = "unknown", Label = "Unknown language"
            });

            TransBrowsableLanguages = IsoLanguages.ToList();
            TransBrowsableLanguages.Insert(0, new Language {
                Flag = null, Iso = "und", Label = "All languages"
            });
            TransBrowsableLanguages.Insert(0, new Language {
                Flag = null, Iso = "none", Label = "None"
            });

            var existence = await LocalStorage.CheckExistsAsync(cookies_file_name).ConfigureAwait(false);

            var exists = existence == PCLStorage.ExistenceCheckResult.FileExists;

            if (exists)
            {
                client.Cookies = await ReadCookiesFromDisk(cookies_file_name).ConfigureAwait(false);
            }

            return(exists);
        }
Esempio n. 28
0
        public override MetadataFileResult MovieMetadata(Movie movie, MovieFile movieFile)
        {
            var xmlResult = string.Empty;

            if (Settings.MovieMetadata)
            {
                _logger.Debug("Generating Movie Metadata for: {0}", Path.Combine(movie.Path, movieFile.RelativePath));

                var movieMetadataLanguage    = (Settings.MovieMetadataLanguage == (int)Language.Original) ? (int)movie.OriginalLanguage : Settings.MovieMetadataLanguage;
                var selectedSettingsLanguage = Language.FindById(movieMetadataLanguage);
                var isoLanguage = IsoLanguages.Get(selectedSettingsLanguage);
                var isoLanguageTwoLetterCode = isoLanguage.TwoLetterCode;
                var countryCode = isoLanguage.CountryCode;

                if (TmdbClient == null)
                {
                    TmdbClient = new TMDbClient(Settings.ApiKey)
                    {
                        DefaultCountry     = countryCode,
                        DefaultLanguage    = isoLanguageTwoLetterCode,
                        ThrowApiExceptions = true
                    };
                }

                var extraMethods =
                    TMDbLibMovies.MovieMethods.Credits |
                    TMDbLibMovies.MovieMethods.Releases |
                    TMDbLibMovies.MovieMethods.Videos;

                TMDbLibMovies.Movie tmdbMovie = null;
                try
                {
                    tmdbMovie = TmdbClient.GetMovieAsync(movie.TmdbId, extraMethods).Result;
                }
                catch (Exception exception)
                {
                    _logger.Error(exception, "Fail to obtain Tmdb Movie Metadata for: {0}", Path.Combine(movie.Path, movieFile.RelativePath));
                }

                Collection tmdbMovieCollection = null;
                if (tmdbMovie.BelongsToCollection != null)
                {
                    try
                    {
                        tmdbMovieCollection = TmdbClient.GetCollectionAsync(tmdbMovie.BelongsToCollection.Id).Result;
                    }
                    catch (Exception exception)
                    {
                        _logger.Error(exception, "Fail to obtain Tmdb Movie Collection Metadata for: {0}", Path.Combine(movie.Path, movieFile.RelativePath));
                    }
                }

                var sb  = new StringBuilder();
                var xws = new XmlWriterSettings
                {
                    OmitXmlDeclaration = false,
                    Encoding           = Encoding.UTF8,
                    Indent             = false
                };

                if (tmdbMovie != null)
                {
                    using (var xw = XmlWriter.Create(sb, xws))
                    {
                        var doc = new XDocument();

                        var details = new XElement("movie");

                        details.Add(new XElement("title", tmdbMovie.Title));

                        details.Add(new XElement("originaltitle", tmdbMovie.OriginalTitle));

                        details.Add(new XElement("sorttitle", tmdbMovie.Title.ToLowerInvariant()));

                        if (tmdbMovie.VoteAverage > 0)
                        {
                            var setRating         = new XElement("ratings");
                            var setRatethemoviedb = new XElement("rating", new XAttribute("name", "themoviedb"), new XAttribute("max", "10"), new XAttribute("default", "true"));
                            setRatethemoviedb.Add(new XElement("value", tmdbMovie.VoteAverage));
                            setRatethemoviedb.Add(new XElement("votes", tmdbMovie.VoteCount));
                            setRating.Add(setRatethemoviedb);
                            details.Add(setRating);
                        }

                        details.Add(new XElement("rating", tmdbMovie.VoteAverage));

                        details.Add(new XElement("top250"));

                        var outlineEndPosition = tmdbMovie.Overview.IndexOf(". ");
                        details.Add(new XElement("outline", tmdbMovie.Overview.Substring(0, outlineEndPosition > 0 ? outlineEndPosition + 1 : tmdbMovie.Overview.Length)));

                        details.Add(new XElement("plot", tmdbMovie.Overview));

                        details.Add(new XElement("tagline", tmdbMovie.Tagline));

                        details.Add(new XElement("runtime", tmdbMovie.Runtime));

                        if (tmdbMovie.PosterPath != null)
                        {
                            details.Add(new XElement("thumb", new XAttribute("aspect", CoverType.poster), new XAttribute("preview", BaseImageUrl + "/w185" + tmdbMovie.PosterPath), BaseImageUrl + "/original" + tmdbMovie.PosterPath));
                        }

                        if (Settings.FanartApiKey.IsNotNullOrWhiteSpace())
                        {
                            string content = null;

                            try
                            {
                                var fanartRequest  = new HttpRequest($"http://webservice.fanart.tv/v3/movies/{movie.TmdbId}?api_key={Settings.FanartApiKey}", HttpAccept.Json);
                                var fanartResponse = _client.Execute(fanartRequest);

                                content = fanartResponse.Content;
                            }
                            catch (Exception e)
                            {
                                _logger.Error(e, "Can't obtain data from Fanart for Movie: {0}", Path.Combine(movie.Path, movieFile.RelativePath));
                            }

                            if (content.IsNotNullOrWhiteSpace())
                            {
                                var originalLanguageTwoLetterCode = tmdbMovie.OriginalLanguage;
                                var fanartMovie = Json.Deserialize <FanartMovie>(content);

                                if (fanartMovie != null)
                                {
                                    var moviebanner = GetBestOptionForFanartMovieArt(fanartMovie.moviebanner, isoLanguageTwoLetterCode, originalLanguageTwoLetterCode);
                                    if (moviebanner != null)
                                    {
                                        details.Add(new XElement("thumb", new XAttribute("aspect", CoverType.banner), new XAttribute("preview", moviebanner.url.Replace("/fanart/", "/preview/")), moviebanner.url));
                                    }

                                    var hdmovieclearart = GetBestOptionForFanartMovieArt(fanartMovie.hdmovieclearart, isoLanguageTwoLetterCode, originalLanguageTwoLetterCode);
                                    if (hdmovieclearart != null)
                                    {
                                        details.Add(new XElement("thumb", new XAttribute("aspect", CoverType.clearart), new XAttribute("preview", hdmovieclearart.url.Replace("/fanart/", "/preview/")), hdmovieclearart.url));
                                    }

                                    var hdmovielogo = GetBestOptionForFanartMovieArt(fanartMovie.hdmovielogo, isoLanguageTwoLetterCode, originalLanguageTwoLetterCode);
                                    if (hdmovielogo != null)
                                    {
                                        details.Add(new XElement("thumb", new XAttribute("aspect", CoverType.clearlogo), new XAttribute("preview", hdmovielogo.url.Replace("/fanart/", "/preview/")), hdmovielogo.url));
                                    }

                                    if (fanartMovie.moviedisc != null)
                                    {
                                        var moviedisc = GetBestOptionForFanartMovieArt(fanartMovie.moviedisc.Cast <FanartMovieArt>().ToList(), isoLanguageTwoLetterCode, originalLanguageTwoLetterCode);
                                        if (moviedisc != null)
                                        {
                                            details.Add(new XElement("thumb", new XAttribute("aspect", CoverType.discart), new XAttribute("preview", moviedisc.url.Replace("/fanart/", "/preview/")), moviedisc.url));
                                        }
                                    }

                                    var moviethumb = GetBestOptionForFanartMovieArt(fanartMovie.moviethumb, isoLanguageTwoLetterCode, originalLanguageTwoLetterCode);
                                    if (moviethumb != null)
                                    {
                                        details.Add(new XElement("thumb", new XAttribute("aspect", CoverType.landscape), new XAttribute("preview", moviethumb.url.Replace("/fanart/", "/preview/")), moviethumb.url));
                                    }
                                }
                            }
                        }

                        if (tmdbMovie.BackdropPath != null)
                        {
                            details.Add(new XElement("fanart", new XElement("thumb", new XAttribute("preview", BaseImageUrl + "/w300" + tmdbMovie.BackdropPath), BaseImageUrl + "/original" + tmdbMovie.BackdropPath)));
                        }

                        if (tmdbMovie.Releases?.Countries != null)
                        {
                            var releases   = tmdbMovie.Releases.Countries.Where(i => !string.IsNullOrWhiteSpace(i.Certification)).ToList();
                            var ourRelease = releases.FirstOrDefault(c => string.Equals(c.Iso_3166_1, isoLanguageTwoLetterCode, StringComparison.OrdinalIgnoreCase));
                            var usRelease  = releases.FirstOrDefault(c => string.Equals(c.Iso_3166_1, "US", StringComparison.OrdinalIgnoreCase));

                            if (ourRelease != null)
                            {
                                var ratingPrefix = string.Equals(isoLanguageTwoLetterCode, "US", StringComparison.OrdinalIgnoreCase) ? string.Empty : isoLanguageTwoLetterCode.ToUpperInvariant() + "-";
                                var newRating    = ratingPrefix + ourRelease.Certification.Replace("DE-", "FSK-");

                                details.Add(new XElement("mpaa", newRating));
                            }
                            else if (usRelease != null)
                            {
                                details.Add(new XElement("mpaa", usRelease.Certification));
                            }
                        }

                        var uniqueId = new XElement("uniqueid", tmdbMovie.Id);
                        uniqueId.SetAttributeValue("type", "tmdb");
                        uniqueId.SetAttributeValue("default", true);
                        details.Add(uniqueId);
                        details.Add(new XElement("tmdbid", tmdbMovie.Id));

                        if (tmdbMovie.ImdbId.IsNotNullOrWhiteSpace())
                        {
                            var imdbId = new XElement("uniqueid", tmdbMovie.ImdbId);
                            imdbId.SetAttributeValue("type", "imdb");
                            details.Add(imdbId);
                            details.Add(new XElement("imdbid", tmdbMovie.ImdbId));
                        }

                        foreach (var genre in tmdbMovie.Genres)
                        {
                            details.Add(new XElement("genre", genre.Name));
                        }

                        foreach (var country in tmdbMovie.ProductionCountries)
                        {
                            details.Add(new XElement("country", country.Name));
                        }

                        if (tmdbMovieCollection != null)
                        {
                            details.Add(new XElement("collectionnumber", tmdbMovieCollection.Id));

                            var setElement = new XElement("set");
                            setElement.SetAttributeValue("tmdbcolid", tmdbMovieCollection.Id);

                            setElement.Add(new XElement("name", tmdbMovieCollection.Name));
                            setElement.Add(new XElement("overview", tmdbMovieCollection.Overview));

                            details.Add(setElement);
                        }

                        foreach (var writer in tmdbMovie.Credits.Crew.Where(crew => (crew.Job == "Screenplay" || crew.Job == "Story" || crew.Job == "Novel" || crew.Job == "Writer") && crew.Name.IsNotNullOrWhiteSpace()))
                        {
                            details.Add(new XElement("credits", writer.Name));
                        }

                        foreach (var director in tmdbMovie.Credits.Crew.Where(crew => crew.Job == "Director" && crew.Name.IsNotNullOrWhiteSpace()))
                        {
                            details.Add(new XElement("director", director.Name));
                        }

                        if (tmdbMovie.ReleaseDate.HasValue)
                        {
                            details.Add(new XElement("releasedate", tmdbMovie.ReleaseDate.Value.ToString("yyyy-MM-dd")));
                            details.Add(new XElement("premiered", tmdbMovie.ReleaseDate.Value.ToString("yyyy-MM-dd")));
                            details.Add(new XElement("year", tmdbMovie.ReleaseDate.Value.Year));
                        }

                        details.Add(new XElement("status", tmdbMovie.Status));

                        foreach (var company in tmdbMovie.ProductionCompanies)
                        {
                            details.Add(new XElement("studio", company.Name));
                        }

                        details.Add(new XElement("trailer", GetYoutubeTrailer(tmdbMovie)));

                        if (movieFile.MediaInfo != null)
                        {
                            var sceneName = movieFile.GetSceneOrFileName();

                            var fileInfo      = new XElement("fileinfo");
                            var streamDetails = new XElement("streamdetails");

                            var video = new XElement("video");
                            video.Add(new XElement("aspect", movieFile.MediaInfo.Width / movieFile.MediaInfo.Height));
                            video.Add(new XElement("bitrate", movieFile.MediaInfo.VideoBitrate));
                            video.Add(new XElement("codec", MediaInfoFormatter.FormatVideoCodec(movieFile.MediaInfo, sceneName)));
                            video.Add(new XElement("framerate", movieFile.MediaInfo.VideoFps));
                            video.Add(new XElement("height", movieFile.MediaInfo.Height));
                            video.Add(new XElement("scantype", movieFile.MediaInfo.ScanType));
                            video.Add(new XElement("width", movieFile.MediaInfo.Width));

                            if (movieFile.MediaInfo.RunTime != default)
                            {
                                video.Add(new XElement("duration", movieFile.MediaInfo.RunTime.TotalMinutes));
                                video.Add(new XElement("durationinseconds", Math.Round(movieFile.MediaInfo.RunTime.TotalSeconds)));
                            }

                            streamDetails.Add(video);

                            var audio             = new XElement("audio");
                            var audioChannelCount = movieFile.MediaInfo.AudioChannels;
                            audio.Add(new XElement("bitrate", movieFile.MediaInfo.AudioBitrate));
                            audio.Add(new XElement("channels", audioChannelCount));
                            audio.Add(new XElement("codec", MediaInfoFormatter.FormatAudioCodec(movieFile.MediaInfo, sceneName)));
                            audio.Add(new XElement("language", movieFile.MediaInfo.AudioLanguages));
                            streamDetails.Add(audio);

                            if (movieFile.MediaInfo.Subtitles != null && movieFile.MediaInfo.Subtitles.Count > 0)
                            {
                                var subtitle = new XElement("subtitle");
                                subtitle.Add(new XElement("language", movieFile.MediaInfo.Subtitles));
                                streamDetails.Add(subtitle);
                            }

                            fileInfo.Add(streamDetails);
                            details.Add(fileInfo);

                            foreach (var cast in tmdbMovie.Credits.Cast)
                            {
                                if (cast.Name.IsNotNullOrWhiteSpace() && cast.Character.IsNotNullOrWhiteSpace())
                                {
                                    var actorElement = new XElement("actor");

                                    actorElement.Add(new XElement("name", cast.Name));
                                    actorElement.Add(new XElement("role", cast.Character));
                                    actorElement.Add(new XElement("order", cast.Order));

                                    if (cast.ProfilePath.IsNotNullOrWhiteSpace())
                                    {
                                        actorElement.Add(new XElement("thumb", BaseImageUrl + "/original" + cast.ProfilePath));
                                    }

                                    details.Add(actorElement);
                                }
                            }

                            details.Add(new XElement("dateadded", movieFile.DateAdded.ToString("s")));
                        }

                        doc.Add(details);
                        doc.Save(xw);

                        xmlResult += doc.ToString();
                        xmlResult += Environment.NewLine;
                    }
                }
            }

            if (Settings.MovieMetadataURL)
            {
                xmlResult += "https://www.themoviedb.org/movie/" + movie.TmdbId;
                xmlResult += Environment.NewLine;

                xmlResult += "https://www.imdb.com/title/" + movie.ImdbId;
                xmlResult += Environment.NewLine;
            }

            var metadataFileName = GetMovieMetadataFilename(movieFile.RelativePath);

            return(string.IsNullOrEmpty(xmlResult) ? null : new MetadataFileResult(metadataFileName, xmlResult.Trim(Environment.NewLine.ToCharArray())));
        }
Esempio n. 29
0
        public Movie MapMovie(MovieResource resource)
        {
            var movie     = new Movie();
            var altTitles = new List <AlternativeTitle>();

            movie.TmdbId        = resource.TmdbId;
            movie.ImdbId        = resource.ImdbId;
            movie.Title         = resource.Title;
            movie.OriginalTitle = resource.OriginalTitle;
            movie.TitleSlug     = resource.TitleSlug;
            movie.CleanTitle    = resource.Title.CleanMovieTitle();
            movie.SortTitle     = Parser.Parser.NormalizeTitle(resource.Title);
            movie.Overview      = resource.Overview;

            movie.AlternativeTitles.AddRange(resource.AlternativeTitles.Select(MapAlternativeTitle));

            movie.Translations.AddRange(resource.Translations.Select(MapTranslation));

            movie.OriginalLanguage = IsoLanguages.Find(resource.OriginalLanguage.ToLower())?.Language ?? Language.English;

            movie.Website         = resource.Homepage;
            movie.InCinemas       = resource.InCinema;
            movie.PhysicalRelease = resource.PhysicalRelease;
            movie.DigitalRelease  = resource.DigitalRelease;

            movie.Year = resource.Year;

            //If the premier differs from the TMDB year, use it as a secondary year.
            if (resource.Premier.HasValue && resource.Premier?.Year != movie.Year)
            {
                movie.SecondaryYear = resource.Premier?.Year;
            }

            movie.Images = resource.Images.Select(MapImage).ToList();

            if (resource.Runtime != null)
            {
                movie.Runtime = resource.Runtime.Value;
            }

            var certificationCountry = _configService.CertificationCountry.ToString();

            movie.Certification   = resource.Certifications.FirstOrDefault(m => m.Country == certificationCountry)?.Certification;
            movie.Ratings         = resource.Ratings.Select(MapRatings).FirstOrDefault() ?? new Ratings();
            movie.Genres          = resource.Genres;
            movie.Recommendations = resource.Recommendations?.Select(r => r.TmdbId).ToList() ?? new List <int>();

            var now = DateTime.Now;

            movie.Status = MovieStatusType.Announced;

            if (resource.InCinema.HasValue && now > resource.InCinema)
            {
                movie.Status = MovieStatusType.InCinemas;

                if (!resource.PhysicalRelease.HasValue && !resource.DigitalRelease.HasValue && now > resource.InCinema.Value.AddDays(90))
                {
                    movie.Status = MovieStatusType.Released;
                }
            }

            if (resource.PhysicalRelease.HasValue && now >= resource.PhysicalRelease)
            {
                movie.Status = MovieStatusType.Released;
            }

            if (resource.DigitalRelease.HasValue && now >= resource.DigitalRelease)
            {
                movie.Status = MovieStatusType.Released;
            }

            movie.YouTubeTrailerId = resource.YoutubeTrailerId;
            movie.Studio           = resource.Studio;

            if (resource.Collection != null)
            {
                movie.Collection = new MovieCollection {
                    Name = resource.Collection.Name, TmdbId = resource.Collection.TmdbId
                };
            }

            return(movie);
        }
        private void UpdateLanguage(IDbConnection conn, IDbTransaction tran)
        {
            var languageConverter = new EmbeddedDocumentConverter <List <Language> >(new LanguageIntConverter());

            var profileLanguages = new Dictionary <int, int>();

            using (IDbCommand getProfileCmd = conn.CreateCommand())
            {
                getProfileCmd.Transaction = tran;
                getProfileCmd.CommandText = "SELECT Id, Language FROM Profiles";

                IDataReader profilesReader = getProfileCmd.ExecuteReader();
                while (profilesReader.Read())
                {
                    var profileId     = profilesReader.GetInt32(0);
                    var movieLanguage = Language.English.Id;
                    try
                    {
                        movieLanguage = profilesReader.GetInt32(1) != -1 ? profilesReader.GetInt32(1) : 1;
                    }
                    catch (InvalidCastException e)
                    {
                        _logger.Debug("Language field not found in Profiles, using English as default." + e.Message);
                    }

                    profileLanguages[profileId] = movieLanguage;
                }
            }

            var movieLanguages = new Dictionary <int, int>();

            using (IDbCommand getSeriesCmd = conn.CreateCommand())
            {
                getSeriesCmd.Transaction = tran;
                getSeriesCmd.CommandText = @"SELECT Id, ProfileId FROM Movies";
                using (IDataReader moviesReader = getSeriesCmd.ExecuteReader())
                {
                    while (moviesReader.Read())
                    {
                        var movieId        = moviesReader.GetInt32(0);
                        var movieProfileId = moviesReader.GetInt32(1);

                        movieLanguages[movieId] = profileLanguages.GetValueOrDefault(movieProfileId, Language.English.Id);
                    }
                }
            }

            var movieFileLanguages = new Dictionary <int, List <Language> >();
            var releaseLanguages   = new Dictionary <string, List <Language> >();

            using (IDbCommand getSeriesCmd = conn.CreateCommand())
            {
                getSeriesCmd.Transaction = tran;
                getSeriesCmd.CommandText = @"SELECT Id, MovieId, SceneName, MediaInfo FROM MovieFiles";
                using (IDataReader movieFilesReader = getSeriesCmd.ExecuteReader())
                {
                    while (movieFilesReader.Read())
                    {
                        var movieFileId        = movieFilesReader.GetInt32(0);
                        var movieId            = movieFilesReader.GetInt32(1);
                        var movieFileSceneName = movieFilesReader.IsDBNull(2) ? null : movieFilesReader.GetString(2);
                        var movieFileMediaInfo = movieFilesReader.IsDBNull(3) ? null : Json.Deserialize <MediaInfo154>(movieFilesReader.GetString(3));
                        var languages          = new List <Language>();

                        if (movieFileMediaInfo != null && movieFileMediaInfo.AudioLanguages.IsNotNullOrWhiteSpace())
                        {
                            var mediaInfolanguages = movieFileMediaInfo.AudioLanguages.Split('/').Select(l => l.Trim()).Distinct().ToList();

                            foreach (var audioLanguage in mediaInfolanguages)
                            {
                                var language = IsoLanguages.FindByName(audioLanguage)?.Language;
                                languages.AddIfNotNull(language);
                            }
                        }

                        if (!languages.Any(l => l.Id != 0) && movieFileSceneName.IsNotNullOrWhiteSpace())
                        {
                            languages = LanguageParser.ParseLanguages(movieFileSceneName);
                        }

                        if (!languages.Any(l => l.Id != 0))
                        {
                            languages = new List <Language> {
                                Language.FindById(movieLanguages[movieId])
                            };
                        }

                        if (movieFileSceneName.IsNotNullOrWhiteSpace())
                        {
                            // Store languages for this scenerelease so we can use in history later
                            releaseLanguages[movieFileSceneName] = languages;
                        }

                        movieFileLanguages[movieFileId] = languages;
                    }
                }
            }

            var historyLanguages = new Dictionary <int, List <Language> >();

            using (IDbCommand getSeriesCmd = conn.CreateCommand())
            {
                getSeriesCmd.Transaction = tran;
                getSeriesCmd.CommandText = @"SELECT Id, SourceTitle, MovieId FROM History";
                using (IDataReader historyReader = getSeriesCmd.ExecuteReader())
                {
                    while (historyReader.Read())
                    {
                        var historyId          = historyReader.GetInt32(0);
                        var historySourceTitle = historyReader.IsDBNull(1) ? null : historyReader.GetString(1);
                        var movieId            = historyReader.GetInt32(2);
                        var languages          = new List <Language>();

                        if (historySourceTitle.IsNotNullOrWhiteSpace() && releaseLanguages.ContainsKey(historySourceTitle))
                        {
                            languages = releaseLanguages[historySourceTitle];
                        }

                        if (!languages.Any(l => l.Id != 0) && historySourceTitle.IsNotNullOrWhiteSpace())
                        {
                            languages = LanguageParser.ParseLanguages(historySourceTitle);
                        }

                        if (!languages.Any(l => l.Id != 0))
                        {
                            languages = new List <Language> {
                                Language.FindById(movieLanguages[movieId])
                            };
                        }

                        historyLanguages[historyId] = languages;
                    }
                }
            }

            var blacklistLanguages = new Dictionary <int, List <Language> >();

            using (IDbCommand getSeriesCmd = conn.CreateCommand())
            {
                getSeriesCmd.Transaction = tran;
                getSeriesCmd.CommandText = @"SELECT Id, SourceTitle, MovieId FROM Blacklist";
                using (IDataReader blacklistReader = getSeriesCmd.ExecuteReader())
                {
                    while (blacklistReader.Read())
                    {
                        var blacklistId          = blacklistReader.GetInt32(0);
                        var blacklistSourceTitle = blacklistReader.IsDBNull(1) ? null : blacklistReader.GetString(1);
                        var movieId   = blacklistReader.GetInt32(2);
                        var languages = new List <Language>();

                        if (blacklistSourceTitle.IsNotNullOrWhiteSpace())
                        {
                            languages = LanguageParser.ParseLanguages(blacklistSourceTitle);
                        }

                        if (!languages.Any(l => l.Id != 0))
                        {
                            languages = new List <Language> {
                                Language.FindById(movieLanguages[movieId])
                            };
                        }

                        blacklistLanguages[blacklistId] = languages;
                    }
                }
            }

            foreach (var group in movieFileLanguages.GroupBy(v => v.Value, v => v.Key))
            {
                var languages = group.Key;

                var movieFileIds = group.Select(v => v.ToString()).Join(",");

                using (IDbCommand updateMovieFilesCmd = conn.CreateCommand())
                {
                    updateMovieFilesCmd.Transaction = tran;
                    updateMovieFilesCmd.CommandText = $"UPDATE MovieFiles SET Languages = ? WHERE Id IN ({movieFileIds})";
                    var param = updateMovieFilesCmd.CreateParameter();
                    languageConverter.SetValue(param, languages);
                    updateMovieFilesCmd.Parameters.Add(param);

                    updateMovieFilesCmd.ExecuteNonQuery();
                }
            }

            foreach (var group in historyLanguages.GroupBy(v => v.Value, v => v.Key))
            {
                var languages = group.Key;

                var historyIds = group.Select(v => v.ToString()).Join(",");

                using (IDbCommand updateHistoryCmd = conn.CreateCommand())
                {
                    updateHistoryCmd.Transaction = tran;
                    updateHistoryCmd.CommandText = $"UPDATE History SET Languages = ? WHERE Id IN ({historyIds})";
                    var param = updateHistoryCmd.CreateParameter();
                    languageConverter.SetValue(param, languages);
                    updateHistoryCmd.Parameters.Add(param);

                    updateHistoryCmd.ExecuteNonQuery();
                }
            }

            foreach (var group in blacklistLanguages.GroupBy(v => v.Value, v => v.Key))
            {
                var languages = group.Key;

                var blacklistIds = group.Select(v => v.ToString()).Join(",");

                using (IDbCommand updateBlacklistCmd = conn.CreateCommand())
                {
                    updateBlacklistCmd.Transaction = tran;
                    updateBlacklistCmd.CommandText = $"UPDATE Blacklist SET Languages = ? WHERE Id IN ({blacklistIds})";
                    var param = updateBlacklistCmd.CreateParameter();
                    languageConverter.SetValue(param, languages);
                    updateBlacklistCmd.Parameters.Add(param);

                    updateBlacklistCmd.ExecuteNonQuery();
                }
            }
        }