/// <summary> /// Fetches the episode data. /// </summary> /// <param name="episode">The episode.</param> /// <param name="seriesId">The series id.</param> /// <returns>Task{System.Boolean}.</returns> private async Task <bool> FetchEpisodeData(Episode episode, string seriesId, CancellationToken cancellationToken) { string name = episode.Name; string location = episode.Path; Logger.Debug("TvDbProvider: Fetching episode data for: " + name); string epNum = TVUtils.EpisodeNumberFromFile(location, episode.Season != null); if (epNum == null) { Logger.Warn("TvDbProvider: Could not determine episode number for: " + episode.Path); return(false); } var episodeNumber = Int32.Parse(epNum); episode.IndexNumber = episodeNumber; var usingAbsoluteData = false; if (string.IsNullOrEmpty(seriesId)) { return(false); } var seasonNumber = ""; if (episode.Parent is Season) { seasonNumber = episode.Parent.IndexNumber.ToString(); } if (string.IsNullOrEmpty(seasonNumber)) { seasonNumber = TVUtils.SeasonNumberFromEpisodeFile(location); // try and extract the season number from the file name for S1E1, 1x04 etc. } if (!string.IsNullOrEmpty(seasonNumber)) { seasonNumber = seasonNumber.TrimStart('0'); if (string.IsNullOrEmpty(seasonNumber)) { seasonNumber = "0"; // Specials } var url = string.Format(episodeQuery, TVUtils.TVDBApiKey, seriesId, seasonNumber, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage); var doc = new XmlDocument(); try { using (var result = await HttpClient.Get(url, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false)) { doc.Load(result); } } catch (HttpException) { } //episode does not exist under this season, try absolute numbering. //still assuming it's numbered as 1x01 //this is basicly just for anime. if (!doc.HasChildNodes && Int32.Parse(seasonNumber) == 1) { url = string.Format(absEpisodeQuery, TVUtils.TVDBApiKey, seriesId, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage); try { using (var result = await HttpClient.Get(url, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false)) { if (result != null) { doc.Load(result); } usingAbsoluteData = true; } } catch (HttpException) { } } if (doc.HasChildNodes) { var p = doc.SafeGetString("//filename"); if (p != null) { if (!Directory.Exists(episode.MetaLocation)) { Directory.CreateDirectory(episode.MetaLocation); } try { episode.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(episode, TVUtils.BannerUrl + p, Path.GetFileName(p), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken); } catch (HttpException) { } catch (IOException) { } } episode.Overview = doc.SafeGetString("//Overview"); if (usingAbsoluteData) { episode.IndexNumber = doc.SafeGetInt32("//absolute_number", -1); } if (episode.IndexNumber < 0) { episode.IndexNumber = doc.SafeGetInt32("//EpisodeNumber"); } episode.Name = episode.IndexNumber.Value.ToString("000") + " - " + doc.SafeGetString("//EpisodeName"); episode.CommunityRating = doc.SafeGetSingle("//Rating", -1, 10); var firstAired = doc.SafeGetString("//FirstAired"); DateTime airDate; if (DateTime.TryParse(firstAired, out airDate) && airDate.Year > 1850) { episode.PremiereDate = airDate.ToUniversalTime(); episode.ProductionYear = airDate.Year; } var actors = doc.SafeGetString("//GuestStars"); if (actors != null) { episode.AddPeople(actors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = "Actor", Name = str })); } var directors = doc.SafeGetString("//Director"); if (directors != null) { episode.AddPeople(directors.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = "Director", Name = str })); } var writers = doc.SafeGetString("//Writer"); if (writers != null) { episode.AddPeople(writers.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = "Writer", Name = str })); } if (ConfigurationManager.Configuration.SaveLocalMeta) { if (!Directory.Exists(episode.MetaLocation)) { Directory.CreateDirectory(episode.MetaLocation); } var ms = new MemoryStream(); doc.Save(ms); await _providerManager.SaveToLibraryFilesystem(episode, Path.Combine(episode.MetaLocation, Path.GetFileNameWithoutExtension(episode.Path) + ".xml"), ms, cancellationToken).ConfigureAwait(false); } return(true); } } return(false); }
public void TestSeasonFromEpisodeName() { Assert.AreEqual("12", TVUtils.SeasonNumberFromEpisodeFile(@"c:\videos\TV\South Park\Season 12\South.Park.S12E11.OTHERSTUFF.avi")); }