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); }
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); }
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); }
/// <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); }
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); }
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 } }
static public bool isIsoLanguageSupported(IsoLanguages iso) { for (int i = 0; i < allSupportedLanguages.Length; i++) { if (allSupportedLanguages[i] == iso) { return(true); } } return(false); }
static public int getLanguageIndex(IsoLanguages lang) { for (int i = 0; i < allSupportedLanguages.Length; i++) { if (allSupportedLanguages[i] == lang) { return(i); } } return(-1); }
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); }
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); }
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); }
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)); }
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)); }
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); }
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()); }
//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(); }
/// <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()); } }
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)); }
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)); } } } } }
public string GetLocalizedString(string phrase) { var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; return(GetLocalizedString(phrase, language)); }
public Dictionary <string, string> GetLocalizationDictionary() { var language = IsoLanguages.Get((Language)_configService.UILanguage).TwoLetterCode; return(GetLocalizationDictionary(language)); }
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); }
public void should_return_portuguese(string isoCode) { var result = IsoLanguages.Find(isoCode); result.Language.Should().Be(Language.Portuguese); }
public void should_not_return_portuguese(string isoCode) { var result = IsoLanguages.Find(isoCode); result.Should().Be(null); }
public LocalizationFile(IsoLanguages lang) { Init(lang.ToString()); }
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); }
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()))); }
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(); } } }