/// <summary> /// Download the new series and update the information /// </summary> /// <param name="_series">Series to update</param> /// <param name="_lastUpdated">When was the last update made</param> /// <param name="_progress">The progress done until now</param> /// <returns>true if the series has been upated false if not</returns> private bool UpdateSeries(TvdbSeries _series, DateTime _lastUpdated, int _progress) { //get series info bool updateDone = false; TvdbLanguage currentLanguage = _series.Language; foreach (KeyValuePair<TvdbLanguage, TvdbSeriesFields> kvp in _series.SeriesTranslations) { if (kvp.Value.LastUpdated < _lastUpdated) {//the local content is older than the update time in the updates xml files TvdbSeries newSeries = null; try {//try to get the series newSeries = GetSeries(_series.Id, kvp.Key, false, false, false); } catch (TvdbContentNotFoundException ex) {//couldn't download the series Log.Warn("Problem downloading series (id: " + _series.Id + "): " + ex.ToString()); } if (newSeries != null) {//download of the series successfull -> do updating if (UpdateProgressed != null) {//update has started, we're downloading the updated content from tvdb UpdateProgressed(new UpdateProgressEventArgs(UpdateProgressEventArgs.UpdateStage.seriesupdate, "Updating series " + _series.SeriesName, _progress, 25 + (int)(_progress / 4))); } newSeries.LastUpdated = _lastUpdated; //don't replace episodes, since they're kvp.Value.UpdateTvdbFields(newSeries, false); //kvp.Value.Update (newSeries); Log.Info("Updated Series " + _series.SeriesName + " (id: " + _series.Id + ")"); updateDone = true; } } } _series.SetLanguage(currentLanguage);//to copy the episode-fields to the base series return updateDone; }
/// <summary> /// Update the series with the episode (Add it to the series if it doesn't already exist or update the episode if the current episode is older than the updated one) /// </summary> /// <param name="_series">Series of the updating episode</param> /// <param name="_episode">Episode that is updated</param> /// <param name="_progress">Progress of the update run</param> /// <returns>true if episode has been updated, false if not (e.g. timestamp of updated episode older than /// timestamp of existing episode</returns> private bool UpdateEpisode(TvdbSeries _series, TvdbEpisode _episode, int _progress) { bool updateDone = false; TvdbLanguage currentLanguage = _series.Language; foreach (KeyValuePair<TvdbLanguage, TvdbSeriesFields> kvp in _series.SeriesTranslations) { if (_series.EpisodesLoaded) { bool found = false; List<TvdbEpisode> eps = kvp.Value.Episodes; if (eps != null && eps.Count > 0) { //check all episodes if the updated episode is in it foreach (TvdbEpisode e in eps) { if (e.Id == _episode.Id) { found = true; if (e.LastUpdated < _episode.LastUpdated) { //download episode which has been updated TvdbEpisode newEpisode = null; try { newEpisode = m_downloader.DownloadEpisode(e.Id, kvp.Key); } catch (TvdbContentNotFoundException) { Log.Warn("Couldn't download episode " + e.Id + "(" + e.EpisodeName + ")"); } //update information of episode with new episodes informations if (newEpisode != null) { newEpisode.LastUpdated = _episode.LastUpdated; e.UpdateEpisodeInfo(newEpisode); if (UpdateProgressed != null) {//update has started, we're downloading the updated content from tvdb UpdateProgressed(new UpdateProgressEventArgs(UpdateProgressEventArgs.UpdateStage.episodesupdate, "Updating episode " + _series.SeriesName + " " + e.SeasonNumber + "x" + e.EpisodeNumber + "(id: " + _episode.Id + ")", _progress, 50 + (int)(_progress / 4))); } Log.Info("Updated Episode " + e.SeasonNumber + "x" + e.EpisodeNumber + " for series " + _series.SeriesName + "(id: " + e.Id + ", lang: " + e.Language.Abbriviation + ")"); updateDone = true; } } break; } } } if (!found) { //episode hasn't been found //hasn't been found -> add it to series TvdbEpisode ep = null; try { ep = m_downloader.DownloadEpisode(_episode.Id, kvp.Key); } catch (TvdbContentNotFoundException ex) { Log.Warn("Problem downloading " + _episode.Id + ": " + ex.ToString()); } if (ep != null) { kvp.Value.Episodes.Add(ep); //todo: sort here!!!! -> create episode comparer //kvp.Value.Episodes.Sort(new Comparison<TvdbEpisode>(v if (UpdateProgressed != null) {//update has started, we're downloading the updated content from tvdb UpdateProgressed(new UpdateProgressEventArgs(UpdateProgressEventArgs.UpdateStage.episodesupdate, "Added episode " + _series.SeriesName + " " + ep.SeasonNumber + "x" + ep.EpisodeNumber + "(id: " + ep.Id + ")", _progress, 50 + (int)(_progress / 4))); } Log.Info("Added Episode " + ep.SeasonNumber + "x" + ep.EpisodeNumber + " for series " + _series.SeriesName + "(id: " + ep.Id + ", lang: " + ep.Language.Abbriviation + ")"); updateDone = true; } } } else { Log.Debug("Not adding episode " + _episode.Id + ", because series " + _series.SeriesName + " hasn't loaded episodes"); updateDone = false; } } _series.SetLanguage(currentLanguage); return updateDone; }
/// <summary> /// Load the give series from cache /// </summary> /// <param name="_seriesId">Id of the series to load</param> /// <returns>Series that has been loaded or null if series doesn't exist</returns> public TvdbSeries LoadSeriesFromCache(int _seriesId) { String seriesRoot = m_rootFolder + Path.DirectorySeparatorChar + _seriesId; if (!Directory.Exists(seriesRoot)) return null; TvdbSeries series = new TvdbSeries(); #region load series in all available languages String[] seriesLanguages = Directory.GetFiles(seriesRoot, "*.xml"); foreach (String l in seriesLanguages) { if (!l.EndsWith("actors.xml") && !l.EndsWith("banners.xml")) { String content = File.ReadAllText(l); List<TvdbSeriesFields> seriesList = m_xmlReader.ExtractSeriesFields(content); if (seriesList != null && seriesList.Count == 1) { TvdbSeriesFields s = seriesList[0]; //Load episodes if (l.EndsWith("full.xml")) { List<TvdbEpisode> epList = m_xmlReader.ExtractEpisodes(content); s.EpisodesLoaded = true; s.Episodes.Clear(); s.Episodes.AddRange(epList); } series.AddLanguage(s); } } } if (series.SeriesTranslations.Count > 0) {//change language of the series to the default language series.SetLanguage(series.SeriesTranslations.Keys.First()); } else {//no series info could be loaded return null; } if (!series.BannerPath.Equals("")) { series.Banners.Add(new TvdbSeriesBanner(series.Id, series.BannerPath, series.Language, TvdbSeriesBanner.Type.graphical)); } if (!series.PosterPath.Equals("")) { series.Banners.Add(new TvdbPosterBanner(series.Id, series.PosterPath, series.Language)); } if (!series.FanartPath.Equals("")) { series.Banners.Add(new TvdbFanartBanner(series.Id, series.FanartPath, series.Language)); } Regex rex = new Regex("S(\\d+)E(\\d+)"); if (Directory.Exists(seriesRoot + Path.DirectorySeparatorChar + "EpisodeImages")) { String[] episodeFiles = Directory.GetFiles(seriesRoot + Path.DirectorySeparatorChar + "EpisodeImages", "ep_*.jpg"); foreach (String epImageFile in episodeFiles) { try { Match match = rex.Match(epImageFile); int season = Int32.Parse(match.Groups[1].Value); int episode = Int32.Parse(match.Groups[2].Value); foreach (TvdbEpisode e in series.Episodes) { if (e.SeasonNumber == season && e.EpisodeNumber == episode) { if (epImageFile.Contains("thumb")) { e.Banner.LoadThumb(Image.FromFile(epImageFile)); } else { e.Banner.LoadBanner(Image.FromFile(epImageFile)); } break; } } } catch (Exception) { Log.Warn("Couldn't load episode image file " + epImageFile); } } } #endregion #region Banner loading String bannerFile = seriesRoot + Path.DirectorySeparatorChar + "banners.xml"; //load cached banners if (File.Exists(bannerFile)) {//banners have been already loaded List<TvdbBanner> bannerList = m_xmlReader.ExtractBanners(File.ReadAllText(bannerFile)); String[] banners = Directory.GetFiles(seriesRoot, "banner*.jpg"); foreach (String b in banners) { try { int bannerId = Int32.Parse(b.Remove(b.IndexOf(".")).Remove(0, b.LastIndexOf("_") + 1)); foreach (TvdbBanner banner in bannerList) { if (banner.Id == bannerId) { if (b.Contains("thumb") && banner.GetType().BaseType == typeof(TvdbBannerWithThumb)) { ((TvdbBannerWithThumb)banner).LoadThumb(Image.FromFile(b)); } else if (b.Contains("vignette") && banner.GetType() == typeof(TvdbFanartBanner)) { ((TvdbFanartBanner)banner).LoadVignette(Image.FromFile(b)); } else { banner.LoadBanner(Image.FromFile(b)); } } } } catch (Exception) { Log.Warn("Couldn't load image file " + b); } } series.Banners = bannerList; } #endregion #region actor loading //load actor info String actorFile = seriesRoot + Path.DirectorySeparatorChar + "actors.xml"; if (File.Exists(actorFile)) { List<TvdbActor> actorList = m_xmlReader.ExtractActors(File.ReadAllText(actorFile)); String[] banners = Directory.GetFiles(seriesRoot, "actor_*.jpg"); foreach (String b in banners) { try { int actorId = Int32.Parse(b.Remove(b.IndexOf(".")).Remove(0, b.LastIndexOf("_") + 1)); foreach (TvdbActor actor in actorList) { if (actor.Id == actorId) { actor.ActorImage.LoadBanner(Image.FromFile(b)); } } } catch (Exception) { Log.Warn("Couldn't load image file " + b); } } series.TvdbActors = actorList; } #endregion return series; }
/// <summary> /// Download the new series and update the information /// </summary> /// <param name="_series">Series to update</param> /// <param name="_lastUpdated">When was the last update made</param> /// <param name="_progress">The progress done until now</param> /// <returns>true if the series has been upated false if not</returns> private bool UpdateSeries(TvdbSeries _series, DateTime _lastUpdated, int _progress) { //get series info bool updateDone = false; TvdbLanguage currentLanguage = _series.Language; foreach (KeyValuePair<TvdbLanguage, TvdbSeriesFields> kvp in _series.SeriesTranslations) { if (kvp.Value.LastUpdated < _lastUpdated) {//the local content is older than the update time in the updates xml files TvdbSeries newSeries = null; try {//try to get the series newSeries = m_downloader.DownloadSeries(_series.Id, kvp.Key, false, false, false); } catch (TvdbContentNotFoundException ex) {//couldn't download the series Log.Warn("Problem downloading series (id: " + _series.Id + "): " + ex.ToString()); } if (newSeries != null) {//download of the series successfull -> do updating newSeries.LastUpdated = _lastUpdated; //don't replace episodes, since we're only loading basic series kvp.Value.UpdateTvdbFields(newSeries, false); //kvp.Value.Update (newSeries); Log.Info("Updated Series " + _series.SeriesName + " (id: " + _series.Id + ", " + kvp.Key.Abbriviation + ")"); updateDone = true; } } } _series.SetLanguage(currentLanguage);//to copy the episode-fields to the base series return updateDone; }
/// <summary> /// Update the series with the episode (Add it to the series if it doesn't already exist or update the episode if the current episode is older than the updated one) /// </summary> /// <param name="_series">Series of the updating episode</param> /// <param name="_episode">Episode that is updated</param> /// <param name="_progress">Progress of the update run</param> /// <param name="_text">Description of the current update</param> /// <returns>true if episode has been updated, false if not (e.g. timestamp of updated episode older than /// timestamp of existing episode</returns> private bool UpdateEpisode(TvdbSeries _series, TvdbEpisode _episode, int _progress, out String _text) { bool updateDone = false; _text = ""; TvdbLanguage currentLanguage = _series.Language; foreach (KeyValuePair<TvdbLanguage, TvdbSeriesFields> kvp in _series.SeriesTranslations) { if (_series.EpisodesLoaded) { bool found = false; List<TvdbEpisode> eps = kvp.Value.Episodes; if (eps != null && eps.Count > 0) { //check all episodes if the updated episode is in it foreach (TvdbEpisode e in eps) { if (e.Id == _episode.Id) { found = true; if (e.LastUpdated < _episode.LastUpdated) { //download episode which has been updated TvdbEpisode newEpisode = null; try { newEpisode = m_downloader.DownloadEpisode(e.Id, kvp.Key); } catch (TvdbContentNotFoundException) { Log.Warn("Couldn't download episode " + e.Id + "(" + e.EpisodeName + ")"); } //update information of episode with new episodes informations if (newEpisode != null) { newEpisode.LastUpdated = _episode.LastUpdated; #region fix for http://forums.thetvdb.com/viewtopic.php?f=8&t=3993 //xml of single episodes doesn't contain CombinedSeason and CombinedEpisodeNumber, so if //we have values for those, don't override them //-> http://forums.thetvdb.com/viewtopic.php?f=8&t=3993 //todo: remove this once tvdb fixed that issue if (e.CombinedSeason != -99 && newEpisode.CombinedSeason == 0) { newEpisode.CombinedSeason = e.CombinedSeason; } if (e.CombinedEpisodeNumber != -99 && newEpisode.CombinedEpisodeNumber == 0) { newEpisode.CombinedEpisodeNumber = e.CombinedEpisodeNumber; } #endregion e.UpdateEpisodeInfo(newEpisode); e.Banner.CacheProvider = m_cacheProvider; e.Banner.SeriesId = _series.Id; e.Banner.UnloadBanner(false); e.Banner.UnloadThumb(false); _text = "Added/Updated episode " + _series.SeriesName + " " + e.SeasonNumber + "x" + e.EpisodeNumber + "(id: " + e.Id + ")"; Log.Info("Updated Episode " + e.SeasonNumber + "x" + e.EpisodeNumber + " for series " + _series.SeriesName + "(id: " + e.Id + ", lang: " + e.Language.Abbriviation + ")"); updateDone = true; } } break; } } } if (!found) { //episode hasn't been found //hasn't been found -> add it to series TvdbEpisode ep = null; try { ep = m_downloader.DownloadEpisode(_episode.Id, kvp.Key); } catch (TvdbContentNotFoundException ex) { Log.Warn("Problem downloading " + _episode.Id + ": " + ex.ToString()); } if (ep != null) { kvp.Value.Episodes.Add(ep); //sort the episodes according to default (aired) order kvp.Value.Episodes.Sort(new EpisodeComparerAired()); _text = "Added/Updated episode " + _series.SeriesName + " " + ep.SeasonNumber + "x" + ep.EpisodeNumber + "(id: " + ep.Id + ")"; Log.Info("Added Episode " + ep.SeasonNumber + "x" + ep.EpisodeNumber + " for series " + _series.SeriesName + "(id: " + ep.Id + ", lang: " + ep.Language.Abbriviation + ")"); updateDone = true; } } } else { Log.Debug("Not handling episode " + _episode.Id + ", because series " + _series.SeriesName + " hasn't loaded episodes"); updateDone = false; } } _series.SetLanguage(currentLanguage); return updateDone; }
/// <summary> /// Saves the series to cache /// </summary> /// <param name="_series">The series to save</param> public void SaveToCache(TvdbSeries _series) { String root = m_rootFolder + Path.DirectorySeparatorChar + _series.Id; if (!Directory.Exists(root)) Directory.CreateDirectory(root); try {//delete old cached content String[] files = Directory.GetFiles(root, "*.xml"); foreach (String f in files) { File.Delete(f); } } catch (Exception ex) { Log.Warn("Couldn't delete old cache files", ex); } foreach (TvdbLanguage l in _series.GetAvailableLanguages()) {//write all languages to file String fName = root + Path.DirectorySeparatorChar + l.Abbriviation + (_series.EpisodesLoaded ? "_full" : "") + ".xml"; _series.SetLanguage(l); m_xmlWriter.WriteSeriesContent(_series, fName); } if (_series.BannersLoaded) {//write the banners file m_xmlWriter.WriteSeriesBannerContent(_series.Banners, root + Path.DirectorySeparatorChar + "banners.xml"); } if (_series.TvdbActorsLoaded) {//write the actors file m_xmlWriter.WriteActorFile(_series.TvdbActors, root + Path.DirectorySeparatorChar + "actors.xml"); } }