Ejemplo n.º 1
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.Where(e => e.Id == episode.Id))
            {
              found = true;
              if (e.LastUpdated < episode.LastUpdated)
              {
                //download episode which has been updated
                TvdbEpisode newEpisode = null;
                try
                {
                  newEpisode = _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 != Util.NO_VALUE && newEpisode.CombinedSeason == 0)
                  {
                    newEpisode.CombinedSeason = e.CombinedSeason;
                  }
                  if (e.CombinedEpisodeNumber != Util.NO_VALUE && newEpisode.CombinedEpisodeNumber == 0)
                  {
                    newEpisode.CombinedEpisodeNumber = e.CombinedEpisodeNumber;
                  }
                  #endregion

                  e.UpdateEpisodeInfo(newEpisode);

                  e.Banner.CacheProvider = _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 = _downloader.DownloadEpisode(episode.Id, kvp.Key);
            }
            catch (TvdbContentNotFoundException ex)
            {
              Log.Warn("Problem downloading " + episode.Id + ": " + ex);
            }
            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;
    }
Ejemplo n.º 2
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 = _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);
          }

          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;
    }
Ejemplo n.º 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 = _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 = _xmlReader.ExtractSeriesFields(content);
          if (seriesList != null && seriesList.Count == 1)
          {
            TvdbSeriesFields s = seriesList[0];
            //Load episodes
            if (l.EndsWith("full.xml"))
            {
              List<TvdbEpisode> epList = _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.Where(e => 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 = _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.Where(banner => 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 = _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.Where(actor => 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;

    }