/// <summary> /// Fetches the episode data. /// </summary> /// <param name="id">The identifier.</param> /// <param name="searchNumbers">The search numbers.</param> /// <param name="seriesDataPath">The series data path.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> private MetadataResult <Episode> FetchEpisodeData(EpisodeInfo id, EpisodeNumbers searchNumbers, string seriesDataPath, CancellationToken cancellationToken) { var result = new MetadataResult <Episode>() { Item = new Episode { IndexNumber = id.IndexNumber, ParentIndexNumber = id.ParentIndexNumber, IndexNumberEnd = id.IndexNumberEnd } }; var xmlNodes = GetEpisodeXmlNodes(seriesDataPath, id); if (xmlNodes.Count > 0) { FetchMainEpisodeInfo(result, xmlNodes[0], cancellationToken); result.HasMetadata = true; } foreach (var node in xmlNodes.Skip(1)) { FetchAdditionalPartInfo(result, node, cancellationToken); } return(result); }
public override string ToString() { string episodeString = "[Unknown Episode]"; if (IsDaily && EpisodeNumbers.Empty()) { episodeString = string.Format("{0}", AirDate); } else if (FullSeason) { episodeString = string.Format("Season {0:00}", SeasonNumber); } else if (EpisodeNumbers != null && EpisodeNumbers.Any()) { episodeString = string.Format("S{0:00}E{1}", SeasonNumber, string.Join("-", EpisodeNumbers.Select(c => c.ToString("00")))); } else if (AbsoluteEpisodeNumbers != null && AbsoluteEpisodeNumbers.Any()) { episodeString = string.Format("{0}", string.Join("-", AbsoluteEpisodeNumbers.Select(c => c.ToString("000")))); } else if (Special) { if (SeasonNumber != 0) { episodeString = string.Format("[Unknown Season {0:00} Special]", SeasonNumber); } else { episodeString = "[Unknown Special]"; } } return(string.Format("{0} - {1} {2}", SeriesTitle, episodeString, Quality)); }
public async Task <IEnumerable <RemoteSearchResult> > GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken) { var list = new List <RemoteSearchResult>(); // The search query must either provide an episode number or date if (!searchInfo.IndexNumber.HasValue && !searchInfo.PremiereDate.HasValue) { return(list); } if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds)) { var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, searchInfo.SeriesProviderIds); var searchNumbers = new EpisodeNumbers(); if (searchInfo.IndexNumber.HasValue) { searchNumbers.EpisodeNumber = searchInfo.IndexNumber.Value; } searchNumbers.SeasonNumber = searchInfo.ParentIndexNumber; searchNumbers.EpisodeNumberEnd = searchInfo.IndexNumberEnd ?? searchNumbers.EpisodeNumber; try { var metadataResult = FetchEpisodeData(searchInfo, searchNumbers, seriesDataPath, cancellationToken); if (metadataResult.HasMetadata) { var item = metadataResult.Item; list.Add(new RemoteSearchResult { IndexNumber = item.IndexNumber, Name = item.Name, ParentIndexNumber = item.ParentIndexNumber, PremiereDate = item.PremiereDate, ProductionYear = item.ProductionYear, ProviderIds = item.ProviderIds, SearchProviderName = Name, IndexNumberEnd = item.IndexNumberEnd }); } } catch (FileNotFoundException) { // Don't fail the provider because this will just keep on going and going. } catch (DirectoryNotFoundException) { // Don't fail the provider because this will just keep on going and going. } } return(list); }
public string FormatString(string format) { if (IsCompleteMatch) { return(string.Format(format, Series, SeasonNumber.ToString().PadLeft(2, '0'), StringUtils.Join(", ", EpisodeNumbers.Select(episodeNumber => episodeNumber.ToString().PadLeft(2, '0'))), Episode)); } return("SeriesInfo: No complete match"); }
public async Task <MetadataResult <Episode> > GetMetadata(EpisodeInfo searchInfo, CancellationToken cancellationToken) { var result = new MetadataResult <Episode>(); result.QueriedById = true; if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds) && (searchInfo.IndexNumber.HasValue || searchInfo.PremiereDate.HasValue)) { var seriesDataPath = await TvdbSeriesProvider.Current.EnsureSeriesInfo(searchInfo.SeriesProviderIds, null, null, searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false); if (string.IsNullOrEmpty(seriesDataPath)) { return(result); } var searchNumbers = new EpisodeNumbers(); if (searchInfo.IndexNumber.HasValue) { searchNumbers.EpisodeNumber = searchInfo.IndexNumber.Value; } searchNumbers.SeasonNumber = searchInfo.ParentIndexNumber; searchNumbers.EpisodeNumberEnd = searchInfo.IndexNumberEnd ?? searchNumbers.EpisodeNumber; try { result = FetchEpisodeData(searchInfo, searchNumbers, seriesDataPath, cancellationToken); } catch (FileNotFoundException) { // Don't fail the provider because this will just keep on going and going. } catch (IOException) { // Don't fail the provider because this will just keep on going and going. } } else { _logger.Debug("No series identity found for {0}", searchInfo.Name); } return(result); }
public override string ToString() { string episodeString = "[Unknown Episode]"; if (AirDate != null && EpisodeNumbers == null) { episodeString = string.Format("{0}", AirDate.Value.ToString("yyyy-MM-dd")); } else if (FullSeason) { episodeString = string.Format("Season {0:00}", SeasonNumber); } else if (EpisodeNumbers != null && EpisodeNumbers.Any()) { episodeString = string.Format("S{0:00}E{1}", SeasonNumber, String.Join("-", EpisodeNumbers.Select(c => c.ToString("00")))); } return(string.Format("{0} - {1} {2}", SeriesTitle, episodeString, Quality)); }
public async Task <MetadataResult <Episode> > GetMetadata(EpisodeInfo searchInfo, CancellationToken cancellationToken) { var result = new MetadataResult <Episode>(); if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds) && (searchInfo.IndexNumber.HasValue || searchInfo.PremiereDate.HasValue)) { var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, searchInfo.SeriesProviderIds); var searchNumbers = new EpisodeNumbers(); if (searchInfo.IndexNumber.HasValue) { searchNumbers.EpisodeNumber = searchInfo.IndexNumber.Value; } searchNumbers.SeasonNumber = searchInfo.ParentIndexNumber; searchNumbers.EpisodeNumberEnd = searchInfo.IndexNumberEnd ?? searchNumbers.EpisodeNumber; try { result = FetchEpisodeData(searchInfo, searchNumbers, seriesDataPath, cancellationToken); } catch (FileNotFoundException) { // Don't fail the provider because this will just keep on going and going. } catch (DirectoryNotFoundException) { // Don't fail the provider because this will just keep on going and going. } } else { _logger.Debug("No series identity found for {0}", searchInfo.Name); } return(result); }
public async Task <MetadataResult <Episode> > GetMetadata(EpisodeInfo searchInfo, CancellationToken cancellationToken) { var identity = Identity.ParseIdentity(searchInfo.GetProviderId(FullIdKey)); if (identity == null) { await Identify(searchInfo).ConfigureAwait(false); identity = Identity.ParseIdentity(searchInfo.GetProviderId(FullIdKey)); } var result = new MetadataResult <Episode>(); if (identity != null) { var seriesProviderIds = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); seriesProviderIds[MetadataProviders.Tvdb.ToString()] = identity.Value.SeriesId; var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, seriesProviderIds); var searchNumbers = new EpisodeNumbers(); searchNumbers.EpisodeNumber = identity.Value.EpisodeNumber; var seasonOffset = TvdbSeriesProvider.GetSeriesOffset(searchInfo.SeriesProviderIds) ?? 0; searchNumbers.SeasonNumber = identity.Value.SeasonIndex + seasonOffset; searchNumbers.EpisodeNumberEnd = identity.Value.EpisodeNumberEnd ?? searchNumbers.EpisodeNumber; try { result = FetchEpisodeData(searchInfo, searchNumbers, seriesDataPath, cancellationToken); } catch (FileNotFoundException) { // Don't fail the provider because this will just keep on going and going. } catch (DirectoryNotFoundException) { // Don't fail the provider because this will just keep on going and going. } } else if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds) && searchInfo.IndexNumber.HasValue) { var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, searchInfo.SeriesProviderIds); var searchNumbers = new EpisodeNumbers(); searchNumbers.EpisodeNumber = searchInfo.IndexNumber.Value; searchNumbers.SeasonNumber = searchInfo.ParentIndexNumber; searchNumbers.EpisodeNumberEnd = searchInfo.IndexNumberEnd ?? searchNumbers.EpisodeNumber; try { result = FetchEpisodeData(searchInfo, searchNumbers, seriesDataPath, cancellationToken); } catch (FileNotFoundException) { // Don't fail the provider because this will just keep on going and going. } catch (DirectoryNotFoundException) { // Don't fail the provider because this will just keep on going and going. } } else { _logger.Debug("No series identity found for {0}", searchInfo.Name); } return(result); }
/// <summary> /// Fetches the episode data. /// </summary> /// <param name="id">The identifier.</param> /// <param name="searchNumbers">The search numbers.</param> /// <param name="seriesDataPath">The series data path.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> private MetadataResult <Episode> FetchEpisodeData(EpisodeInfo id, EpisodeNumbers searchNumbers, string seriesDataPath, CancellationToken cancellationToken) { var episodeNumber = searchNumbers.EpisodeNumber; var seasonNumber = searchNumbers.SeasonNumber; string file; var usingAbsoluteData = false; var result = new MetadataResult <Episode>() { Item = new Episode { IndexNumber = id.IndexNumber, ParentIndexNumber = id.ParentIndexNumber, IndexNumberEnd = id.IndexNumberEnd } }; try { if (seasonNumber != null) { file = Path.Combine(seriesDataPath, string.Format("episode-{0}-{1}.xml", seasonNumber.Value, episodeNumber)); FetchMainEpisodeInfo(result, file, cancellationToken); result.HasMetadata = true; } } catch (FileNotFoundException) { // Could be using absolute numbering if (seasonNumber.HasValue && seasonNumber.Value != 1) { throw; } } if (!result.HasMetadata) { file = Path.Combine(seriesDataPath, string.Format("episode-abs-{0}.xml", episodeNumber)); FetchMainEpisodeInfo(result, file, cancellationToken); result.HasMetadata = true; usingAbsoluteData = true; } var end = searchNumbers.EpisodeNumberEnd; episodeNumber++; while (episodeNumber <= end) { if (usingAbsoluteData) { file = Path.Combine(seriesDataPath, string.Format("episode-abs-{0}.xml", episodeNumber)); } else { file = Path.Combine(seriesDataPath, string.Format("episode-{0}-{1}.xml", seasonNumber.Value, episodeNumber)); } try { FetchAdditionalPartInfo(result, file, cancellationToken); } catch (FileNotFoundException) { break; } catch (DirectoryNotFoundException) { break; } episodeNumber++; } return(result); }