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); }
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); }
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()); }
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 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); }
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 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()))); }