/// <summary> /// Runs the specified progress. /// </summary> /// <param name="progress">The progress.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> public async Task Run(IProgress <double> progress, CancellationToken cancellationToken) { if (!_config.Configuration.EnableInternetProviders) { progress.Report(100); return; } var path = RemoteSeriesProvider.GetSeriesDataPath(_config.CommonApplicationPaths); var timestampFile = Path.Combine(path, "time.txt"); var timestampFileInfo = new FileInfo(timestampFile); // Don't check for tvdb updates anymore frequently than 24 hours if (timestampFileInfo.Exists && (DateTime.UtcNow - timestampFileInfo.LastWriteTimeUtc).TotalDays < 1) { return; } // Find out the last time we queried tvdb for updates var lastUpdateTime = timestampFileInfo.Exists ? File.ReadAllText(timestampFile, Encoding.UTF8) : string.Empty; string newUpdateTime; var existingDirectories = Directory.EnumerateDirectories(path).Select(Path.GetFileName).ToList(); // If this is our first time, update all series if (string.IsNullOrEmpty(lastUpdateTime)) { // First get tvdb server time using (var stream = await _httpClient.Get(new HttpRequestOptions { Url = ServerTimeUrl, CancellationToken = cancellationToken, EnableHttpCompression = true, ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool }).ConfigureAwait(false)) { var doc = new XmlDocument(); doc.Load(stream); newUpdateTime = doc.SafeGetString("//Time"); } await UpdateSeries(existingDirectories, path, progress, cancellationToken).ConfigureAwait(false); } else { var seriesToUpdate = await GetSeriesIdsToUpdate(existingDirectories, lastUpdateTime, cancellationToken).ConfigureAwait(false); newUpdateTime = seriesToUpdate.Item2; await UpdateSeries(seriesToUpdate.Item1, path, progress, cancellationToken).ConfigureAwait(false); } File.WriteAllText(timestampFile, newUpdateTime, Encoding.UTF8); progress.Report(100); }
/// <summary> /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// </summary> /// <param name="item">The item.</param> /// <param name="force">if set to <c>true</c> [force].</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> public override async Task <bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var season = (Season)item; var seriesId = season.Series != null?season.Series.GetProviderId(MetadataProviders.Tvdb) : null; if (!string.IsNullOrEmpty(seriesId)) { // Process images var imagesXmlPath = Path.Combine(RemoteSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId), "banners.xml"); var imagesFileInfo = new FileInfo(imagesXmlPath); if (imagesFileInfo.Exists) { if (!season.HasImage(ImageType.Primary) || !season.HasImage(ImageType.Banner) || season.BackdropImagePaths.Count == 0) { var xmlDoc = new XmlDocument(); xmlDoc.Load(imagesXmlPath); await FetchImages(season, xmlDoc, cancellationToken).ConfigureAwait(false); } } SetLastRefreshed(item, DateTime.UtcNow); return(true); } return(false); }
protected override DateTime CompareDate(BaseItem item) { var seriesId = item.GetProviderId(MetadataProviders.Tvdb); if (!string.IsNullOrEmpty(seriesId)) { // Process images var imagesXmlPath = Path.Combine(RemoteSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId), "banners.xml"); var imagesFileInfo = new FileInfo(imagesXmlPath); if (imagesFileInfo.Exists) { return(imagesFileInfo.LastWriteTimeUtc); } } return(base.CompareDate(item)); }
protected override DateTime CompareDate(BaseItem item) { var episode = (Episode)item; var seriesId = episode.Series != null?episode.Series.GetProviderId(MetadataProviders.Tvdb) : null; if (!string.IsNullOrEmpty(seriesId)) { // Process images var seriesXmlPath = Path.Combine(RemoteSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId), ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower() + ".xml"); var seriesXmlFileInfo = new FileInfo(seriesXmlPath); if (seriesXmlFileInfo.Exists) { return(seriesXmlFileInfo.LastWriteTimeUtc); } } return(base.CompareDate(item)); }
/// <summary> /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// </summary> /// <param name="item">The item.</param> /// <param name="force">if set to <c>true</c> [force].</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{System.Boolean}.</returns> public override async Task <bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var episode = (Episode)item; var seriesId = episode.Series != null?episode.Series.GetProviderId(MetadataProviders.Tvdb) : null; if (!string.IsNullOrEmpty(seriesId)) { var seriesXmlPath = Path.Combine(RemoteSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId), ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower() + ".xml"); var seriesXmlFileInfo = new FileInfo(seriesXmlPath); var status = ProviderRefreshStatus.Success; if (seriesXmlFileInfo.Exists) { var xmlDoc = new XmlDocument(); xmlDoc.Load(seriesXmlPath); status = await FetchEpisodeData(xmlDoc, episode, seriesId, cancellationToken).ConfigureAwait(false); } BaseProviderInfo data; if (!item.ProviderData.TryGetValue(Id, out data)) { data = new BaseProviderInfo(); item.ProviderData[Id] = data; } SetLastRefreshed(item, DateTime.UtcNow, status); return(true); } Logger.Info("Episode provider not fetching because series does not have a tvdb id: " + item.Path); return(false); }
/// <summary> /// Downloads the image from series. /// </summary> /// <param name="item">The item.</param> /// <param name="series">The series.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> private async Task DownloadImageFromSeries(BaseItem item, Series series, CancellationToken cancellationToken) { var tvdbPath = RemoteSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, series.GetProviderId(MetadataProviders.Tvdb)); var actorXmlPath = Path.Combine(tvdbPath, "actors.xml"); var xmlDoc = new XmlDocument(); xmlDoc.Load(actorXmlPath); var actorNodes = xmlDoc.SelectNodes("//Actor"); if (actorNodes == null) { return; } foreach (var actorNode in actorNodes.OfType <XmlNode>()) { var name = actorNode.SafeGetString("Name"); if (string.Equals(item.Name, name, StringComparison.OrdinalIgnoreCase)) { var image = actorNode.SafeGetString("Image"); if (!string.IsNullOrEmpty(image)) { var url = TVUtils.BannerUrl + image; await _providerManager.SaveImage(item, url, RemoteSeriesProvider.Current.TvDbResourcePool, ImageType.Primary, null, cancellationToken).ConfigureAwait(false); } break; } } }