Beispiel #1
0
        /// <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;
        }
Beispiel #2
0
        /// <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;
        }
Beispiel #3
0
        /// <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;
        }
Beispiel #4
0
        /// <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;
        }
Beispiel #5
0
        /// <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;
        }
Beispiel #6
0
        /// <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");
              }
        }