Esempio n. 1
0
 private void Populate(Raw_AniDB_Anime animeInfo)
 {
     this.AirDate = animeInfo.AirDate;
     this.AllCinemaID = animeInfo.AllCinemaID;
     this.AnimeID = animeInfo.AnimeID;
     //this.AnimeNfo = animeInfo.AnimeNfoID;
     this.AnimePlanetID = animeInfo.AnimePlanetID;
     this.AnimeTypeRAW = animeInfo.AnimeTypeRAW;
     this.ANNID = animeInfo.ANNID;
     this.AvgReviewRating = animeInfo.AvgReviewRating;
     this.AwardList = animeInfo.AwardList;
     this.BeginYear = animeInfo.BeginYear;
     this.DateTimeDescUpdated = DateTime.Now;
     this.DateTimeUpdated = DateTime.Now;
     this.Description = animeInfo.Description;
     this.EndDate = animeInfo.EndDate;
     this.EndYear = animeInfo.EndYear;
     this.MainTitle = animeInfo.MainTitle;
     this.AllTitles = "";
     this.AllCategories = "";
     this.AllTags = "";
     //this.EnglishName = animeInfo.EnglishName;
     this.EpisodeCount = animeInfo.EpisodeCount;
     this.EpisodeCountNormal = animeInfo.EpisodeCountNormal;
     this.EpisodeCountSpecial = animeInfo.EpisodeCountSpecial;
     //this.genre
     this.ImageEnabled = 1;
     //this.KanjiName = animeInfo.KanjiName;
     this.LatestEpisodeNumber = animeInfo.LatestEpisodeNumber;
     //this.OtherName = animeInfo.OtherName;
     this.Picname = animeInfo.Picname;
     this.Rating = animeInfo.Rating;
     //this.relations
     this.Restricted = animeInfo.Restricted;
     this.ReviewCount = animeInfo.ReviewCount;
     //this.RomajiName = animeInfo.RomajiName;
     //this.ShortNames = animeInfo.ShortNames.Replace("'", "|");
     //this.Synonyms = animeInfo.Synonyms.Replace("'", "|");
     this.TempRating = animeInfo.TempRating;
     this.TempVoteCount = animeInfo.TempVoteCount;
     this.URL = animeInfo.URL;
     this.VoteCount = animeInfo.VoteCount;
 }
Esempio n. 2
0
		public static Raw_AniDB_Anime ProcessAnimeDetails(XmlDocument docAnime, int animeID)
		{
			// most of the genral anime data will be over written by the UDP command
			Raw_AniDB_Anime anime = new Raw_AniDB_Anime();
			anime.AnimeID = animeID;

			// check if there is any data
			try
			{
				string id = docAnime["anime"].Attributes["id"].Value;
			}
			catch (Exception ex)
			{
				//BaseConfig.MyAnimeLog.Write("Invalid xml document: {0}", animeID.ToString());
				return null;
			}

			anime.Description = TryGetProperty(docAnime, "anime", "description");
			anime.AnimeTypeRAW = TryGetProperty(docAnime, "anime", "type");
			

			string episodecount = TryGetProperty(docAnime, "anime", "episodecount");
			int epCount = 0;
			int.TryParse(episodecount, out epCount);
			anime.EpisodeCount = epCount;
			anime.EpisodeCountNormal = epCount;

			int convertedAirDate = Utils.GetAniDBDateAsSeconds(TryGetProperty(docAnime, "anime", "startdate"), true);
			int convertedEndDate = Utils.GetAniDBDateAsSeconds(TryGetProperty(docAnime, "anime", "enddate"), false);

			//anime.AirDate = TryGetProperty(docAnime, "anime", "startdate");
			//anime.EndDate = TryGetProperty(docAnime, "anime", "enddate");

			anime.AirDate = Utils.GetAniDBDateAsDate(convertedAirDate);
			anime.EndDate = Utils.GetAniDBDateAsDate(convertedEndDate);

			anime.BeginYear = anime.AirDate.HasValue ? anime.AirDate.Value.Year : 0;
			anime.EndYear = anime.EndDate.HasValue ? anime.EndDate.Value.Year : 0;

			//string enddate = TryGetProperty(docAnime, "anime", "enddate");

			string restricted = docAnime["anime"].Attributes["restricted"].Value;
			bool res = false;
			bool.TryParse(restricted, out res);
			anime.Restricted = res ? 1 : 0;

			anime.URL = TryGetProperty(docAnime, "anime", "url");
			anime.Picname = TryGetProperty(docAnime, "anime", "picture");

			anime.DateTimeUpdated = DateTime.Now;
			anime.DateTimeDescUpdated = anime.DateTimeUpdated;
			anime.ImageEnabled = 1;
			
			#region Related Anime
			if (docAnime["anime"]["relatedanime"] != null)
			{
				XmlNodeList raItems = docAnime["anime"]["relatedanime"].GetElementsByTagName("anime");
				if (raItems != null)
				{
					anime.RelatedAnimeIdsRAW = "";
					anime.RelatedAnimeTypesRAW = "";

					foreach (XmlNode node in raItems)
					{
						try
						{
							int id = int.Parse(node.Attributes["id"].Value);
							int relType = ConvertReltTypeTextToEnum(TryGetAttribute(node, "type"));
                            
							if (anime.RelatedAnimeIdsRAW.Length > 0) anime.RelatedAnimeIdsRAW += "'";
							if (anime.RelatedAnimeTypesRAW.Length > 0) anime.RelatedAnimeTypesRAW += "'";

							anime.RelatedAnimeIdsRAW += id.ToString();
							anime.RelatedAnimeTypesRAW += relType.ToString();

						}
						catch (Exception ex)
						{
							//BaseConfig.MyAnimeLog.Write("Error in GetEpisodes: {0}", ex);
						}
					}
				}
			}
			#endregion

			#region Titles
			if (docAnime["anime"]["titles"] != null)
			{
				XmlNodeList titleItems = docAnime["anime"]["titles"].GetElementsByTagName("title");
				if (titleItems != null)
				{
					foreach (XmlNode node in titleItems)
					{
						try
						{
							string titleType = node.Attributes["type"].Value.Trim().ToLower();
							string languageType = node.Attributes["xml:lang"].Value.Trim().ToLower();
							string titleValue = node.InnerText.Trim();

							if (titleType.Trim().ToUpper() == "MAIN")
							{
								anime.MainTitle = titleValue;
							}
						}
						catch (Exception ex)
						{
							//BaseConfig.MyAnimeLog.Write("Error in GetEpisodes: {0}", ex);
						}
					}

				}
			}
			#endregion

			#region Ratings

			// init ratings
			anime.VoteCount = 0;
			anime.TempVoteCount = 0;
			anime.Rating = 0;
			anime.TempRating = 0;
			anime.ReviewCount = 0;
			anime.AvgReviewRating = 0;

			NumberStyles style = NumberStyles.Number;
			CultureInfo culture = CultureInfo.CreateSpecificCulture("en-GB");

			if (docAnime["anime"]["ratings"] != null)
			{
				XmlNodeList ratingItems = docAnime["anime"]["ratings"].ChildNodes;
				if (ratingItems != null)
				{
					foreach (XmlNode node in ratingItems)
					{
						try
						{
							if (node.Name.Trim().ToLower() == "permanent")
							{
								int iCount = 0;
								int.TryParse(TryGetAttribute(node, "count"), out iCount);
								anime.VoteCount = iCount;

								decimal iRating = 0;
								decimal.TryParse(node.InnerText.Trim(), style, culture, out iRating);
								anime.Rating = (int)(iRating * 100);
							}
							if (node.Name.Trim().ToLower() == "temporary")
							{
								int iCount = 0;
								int.TryParse(TryGetAttribute(node, "count"), out iCount);
								anime.TempVoteCount = iCount;

								decimal iRating = 0;
								decimal.TryParse(node.InnerText.Trim(), style, culture, out iRating);
								anime.TempRating = (int)(iRating * 100);
							}
							if (node.Name.Trim().ToLower() == "review")
							{
								int iCount = 0;
								int.TryParse(TryGetAttribute(node, "count"), out iCount);
								anime.ReviewCount = iCount;

								decimal iRating = 0;
								decimal.TryParse(node.InnerText.Trim(), style, culture, out iRating);
								anime.AvgReviewRating = (int)(iRating * 100);
							}

						}
						catch (Exception ex)
						{
							//BaseConfig.MyAnimeLog.Write("Error in GetEpisodes: {0}", ex);
						}
					}
				}
			}
			#endregion

		    //anime.VersionNumber = Raw_AniDB_Anime.LastVersion;
			//BaseConfig.MyAnimeLog.Write("Anime: {0}", anime.ToString());
			return anime;
			//anime.Save(true, createSeriesRecord);

			//AniDB_Anime.UpdateDescription(anime.AnimeID, anime.Description);
		}
Esempio n. 3
0
        /// <summary>
        /// we are depending on the HTTP api call to get most of the info
        /// we only use UDP to get mssing information
        /// </summary>
        /// <param name="animeInfo"></param>
        public void PopulateAndSaveFromUDP(Raw_AniDB_Anime animeInfo)
        {
            // raw fields
            this.reviewIDListRAW = animeInfo.ReviewIDListRAW;

            // save now for FK purposes
            AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository();
            repAnime.Save(this);

            CreateAnimeReviews();
        }
Esempio n. 4
0
        public void PopulateAndSaveFromHTTP(ISession session, Raw_AniDB_Anime animeInfo, List<Raw_AniDB_Episode> eps, List<Raw_AniDB_Anime_Title> titles,
            List<Raw_AniDB_Category> cats, List<Raw_AniDB_Tag> tags, List<Raw_AniDB_Character> chars, List<Raw_AniDB_RelatedAnime> rels, List<Raw_AniDB_SimilarAnime> sims,
            List<Raw_AniDB_Recommendation> recs, bool downloadRelations)
        {
            logger.Trace("------------------------------------------------");
            logger.Trace(string.Format("PopulateAndSaveFromHTTP: for {0} - {1}", animeInfo.AnimeID, animeInfo.MainTitle));
            logger.Trace("------------------------------------------------");

            DateTime start0 = DateTime.Now;

            Populate(animeInfo);

            // save now for FK purposes
            AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository();
            repAnime.Save(session, this);

            DateTime start = DateTime.Now;

            CreateEpisodes(session, eps);
            TimeSpan ts = DateTime.Now - start; logger.Trace(string.Format("CreateEpisodes in : {0}", ts.TotalMilliseconds)); start = DateTime.Now;

            CreateTitles(session, titles);
            ts = DateTime.Now - start; logger.Trace(string.Format("CreateTitles in : {0}", ts.TotalMilliseconds)); start = DateTime.Now;

            CreateTags(session, tags);
            ts = DateTime.Now - start; logger.Trace(string.Format("CreateTags in : {0}", ts.TotalMilliseconds)); start = DateTime.Now;

            CreateCharacters(session, chars);
            ts = DateTime.Now - start; logger.Trace(string.Format("CreateCharacters in : {0}", ts.TotalMilliseconds)); start = DateTime.Now;

            CreateRelations(session, rels, downloadRelations);
            ts = DateTime.Now - start; logger.Trace(string.Format("CreateRelations in : {0}", ts.TotalMilliseconds)); start = DateTime.Now;

            CreateSimilarAnime(session, sims);
            ts = DateTime.Now - start; logger.Trace(string.Format("CreateSimilarAnime in : {0}", ts.TotalMilliseconds)); start = DateTime.Now;

            CreateRecommendations(session, recs);
            ts = DateTime.Now - start; logger.Trace(string.Format("CreateRecommendations in : {0}", ts.TotalMilliseconds)); start = DateTime.Now;

            repAnime.Save(this);
            ts = DateTime.Now - start0; logger.Trace(string.Format("TOTAL TIME in : {0}", ts.TotalMilliseconds));
            logger.Trace("------------------------------------------------");
        }
Esempio n. 5
0
        public static Raw_AniDB_Anime ProcessAnimeDetails(XmlDocument docAnime, int animeID)
        {
            // most of the genral anime data will be over written by the UDP command
            Raw_AniDB_Anime anime = new Raw_AniDB_Anime
            {
                AnimeID = animeID
            };

            // check if there is any data
            if (docAnime?["anime"]?.Attributes["id"]?.Value == null)
            {
                logger.Warn("AniDB ProcessAnimeDetails - Received no or invalid info in XML");
                return(null);
            }

            anime.Description  = TryGetProperty(docAnime, "anime", "description")?.Replace('`', '\'');
            anime.AnimeTypeRAW = TryGetProperty(docAnime, "anime", "type");


            string episodecount = TryGetProperty(docAnime, "anime", "episodecount");

            int.TryParse(episodecount, out int epCount);
            anime.EpisodeCount       = epCount;
            anime.EpisodeCountNormal = epCount;

            string dateString = TryGetProperty(docAnime, "anime", "startdate");

            anime.AirDate = null;
            if (!string.IsNullOrEmpty(dateString))
            {
                if (DateTime.TryParseExact(dateString, "yyyy-MM-dd", CultureInfo.InvariantCulture,
                                           DateTimeStyles.AssumeUniversal, out DateTime date))
                {
                    anime.AirDate = date;
                }
                else if (DateTime.TryParseExact(dateString, "yyyy-MM", CultureInfo.InvariantCulture,
                                                DateTimeStyles.AssumeUniversal, out DateTime date2))
                {
                    anime.AirDate = date2;
                }
            }

            dateString    = TryGetProperty(docAnime, "anime", "enddate");
            anime.EndDate = null;
            if (!string.IsNullOrEmpty(dateString))
            {
                if (DateTime.TryParseExact(dateString, "yyyy-MM-dd", CultureInfo.InvariantCulture,
                                           DateTimeStyles.AssumeUniversal, out DateTime date))
                {
                    anime.EndDate = date;
                }
            }

            anime.BeginYear = anime.AirDate?.Year ?? 0;
            anime.EndYear   = anime.EndDate?.Year ?? 0;

            //string enddate = TryGetProperty(docAnime, "anime", "enddate");

            string restricted = docAnime["anime"].Attributes["restricted"]?.Value;

            if (bool.TryParse(restricted, out bool res))
            {
                anime.Restricted = res ? 1 : 0;
            }
            else
            {
                anime.Restricted = 0;
            }

            anime.URL     = TryGetProperty(docAnime, "anime", "url");
            anime.Picname = TryGetProperty(docAnime, "anime", "picture");

            anime.DateTimeUpdated     = DateTime.Now;
            anime.DateTimeDescUpdated = anime.DateTimeUpdated;
            anime.ImageEnabled        = 1;

            #region Related Anime

            XmlNodeList raItems = docAnime["anime"]["relatedanime"]?.GetElementsByTagName("anime");
            if (raItems != null)
            {
                anime.RelatedAnimeIdsRAW   = string.Empty;
                anime.RelatedAnimeTypesRAW = string.Empty;

                foreach (XmlNode node in raItems)
                {
                    if (node?.Attributes?["id"]?.Value == null)
                    {
                        continue;
                    }
                    if (!int.TryParse(node.Attributes["id"].Value, out int id))
                    {
                        continue;
                    }
                    int relType = ConvertReltTypeTextToEnum(TryGetAttribute(node, "type"));

                    if (anime.RelatedAnimeIdsRAW.Length > 0)
                    {
                        anime.RelatedAnimeIdsRAW += "'";
                    }
                    if (anime.RelatedAnimeTypesRAW.Length > 0)
                    {
                        anime.RelatedAnimeTypesRAW += "'";
                    }

                    anime.RelatedAnimeIdsRAW   += id.ToString();
                    anime.RelatedAnimeTypesRAW += relType.ToString();
                }
            }

            #endregion

            #region Titles

            XmlNodeList titleItems = docAnime["anime"]["titles"]?.GetElementsByTagName("title");
            if (titleItems != null)
            {
                foreach (XmlNode node in titleItems)
                {
                    string titleType = node?.Attributes?["type"]?.Value?.Trim().ToLower();
                    if (string.IsNullOrEmpty(titleType))
                    {
                        continue;
                    }
                    string languageType = node.Attributes["xml:lang"]?.Value?.Trim().ToLower();
                    if (string.IsNullOrEmpty(languageType))
                    {
                        continue;
                    }
                    string titleValue = node.InnerText.Trim();
                    if (string.IsNullOrEmpty(titleValue))
                    {
                        continue;
                    }

                    if (titleType.Trim().ToUpper().Equals("MAIN"))
                    {
                        anime.MainTitle = titleValue.Replace('`', '\'');
                    }
                }
            }

            #endregion

            #region Ratings

            // init ratings
            anime.VoteCount       = 0;
            anime.TempVoteCount   = 0;
            anime.Rating          = 0;
            anime.TempRating      = 0;
            anime.ReviewCount     = 0;
            anime.AvgReviewRating = 0;

            NumberStyles style   = NumberStyles.Number;
            CultureInfo  culture = CultureInfo.CreateSpecificCulture("en-GB");

            XmlNodeList ratingItems = docAnime["anime"]["ratings"]?.ChildNodes;
            if (ratingItems == null)
            {
                return(anime);
            }
            foreach (XmlNode node in ratingItems)
            {
                string name = node?.Name?.Trim().ToLower();
                if (string.IsNullOrEmpty(name))
                {
                    continue;
                }
                if (!int.TryParse(TryGetAttribute(node, "count"), out int iCount))
                {
                    continue;
                }
                if (!decimal.TryParse(node.InnerText.Trim(), style, culture, out decimal iRating))
                {
                    continue;
                }
                iRating = (int)Math.Round(iRating * 100);

                if (name.Equals("permanent"))
                {
                    anime.VoteCount = iCount;
                    anime.Rating    = (int)iRating;
                }
                else if (name.Equals("temporary"))
                {
                    anime.TempVoteCount = iCount;
                    anime.TempRating    = (int)iRating;
                }
                else if (name.Equals("review"))
                {
                    anime.ReviewCount     = iCount;
                    anime.AvgReviewRating = (int)iRating;
                }
            }

            #endregion

            return(anime);
        }
Esempio n. 6
0
        public static Raw_AniDB_Anime ProcessAnimeDetails(XmlDocument docAnime, int animeID)
        {
            // most of the genral anime data will be over written by the UDP command
            Raw_AniDB_Anime anime = new Raw_AniDB_Anime
            {
                AnimeID = animeID
            };

            // check if there is any data
            try
            {
                string id = docAnime["anime"].Attributes["id"].Value;
            }
            catch
            {
                //BaseConfig.MyAnimeLog.Write("Invalid xml document: {0}", animeID.ToString());
                return(null);
            }

            anime.Description  = TryGetProperty(docAnime, "anime", "description");
            anime.AnimeTypeRAW = TryGetProperty(docAnime, "anime", "type");


            string episodecount = TryGetProperty(docAnime, "anime", "episodecount");

            int.TryParse(episodecount, out int epCount);
            anime.EpisodeCount       = epCount;
            anime.EpisodeCountNormal = epCount;

            int convertedAirDate = AniDB.GetAniDBDateAsSeconds(TryGetProperty(docAnime, "anime", "startdate"), true);
            int convertedEndDate = AniDB.GetAniDBDateAsSeconds(TryGetProperty(docAnime, "anime", "enddate"), false);

            //anime.AirDate = TryGetProperty(docAnime, "anime", "startdate");
            //anime.EndDate = TryGetProperty(docAnime, "anime", "enddate");

            anime.AirDate = AniDB.GetAniDBDateAsDate(convertedAirDate);
            anime.EndDate = AniDB.GetAniDBDateAsDate(convertedEndDate);

            anime.BeginYear = anime.AirDate.HasValue ? anime.AirDate.Value.Year : 0;
            anime.EndYear   = anime.EndDate.HasValue ? anime.EndDate.Value.Year : 0;

            //string enddate = TryGetProperty(docAnime, "anime", "enddate");

            string restricted = docAnime["anime"].Attributes["restricted"].Value;

            bool.TryParse(restricted, out bool res);
            anime.Restricted = res ? 1 : 0;

            anime.URL     = TryGetProperty(docAnime, "anime", "url");
            anime.Picname = TryGetProperty(docAnime, "anime", "picture");

            anime.DateTimeUpdated     = DateTime.Now;
            anime.DateTimeDescUpdated = anime.DateTimeUpdated;
            anime.ImageEnabled        = 1;

            #region Related Anime

            if (docAnime["anime"]["relatedanime"] != null)
            {
                XmlNodeList raItems = docAnime["anime"]["relatedanime"].GetElementsByTagName("anime");
                if (raItems != null)
                {
                    anime.RelatedAnimeIdsRAW   = "";
                    anime.RelatedAnimeTypesRAW = "";

                    foreach (XmlNode node in raItems)
                    {
                        try
                        {
                            int id      = int.Parse(node.Attributes["id"].Value);
                            int relType = ConvertReltTypeTextToEnum(TryGetAttribute(node, "type"));

                            if (anime.RelatedAnimeIdsRAW.Length > 0)
                            {
                                anime.RelatedAnimeIdsRAW += "'";
                            }
                            if (anime.RelatedAnimeTypesRAW.Length > 0)
                            {
                                anime.RelatedAnimeTypesRAW += "'";
                            }

                            anime.RelatedAnimeIdsRAW   += id.ToString();
                            anime.RelatedAnimeTypesRAW += relType.ToString();
                        }
                        catch
                        {
                            //BaseConfig.MyAnimeLog.Write("Error in GetEpisodes: {0}", ex);
                        }
                    }
                }
            }

            #endregion

            #region Titles

            if (docAnime["anime"]["titles"] != null)
            {
                XmlNodeList titleItems = docAnime["anime"]["titles"].GetElementsByTagName("title");
                if (titleItems != null)
                {
                    foreach (XmlNode node in titleItems)
                    {
                        try
                        {
                            string titleType    = node.Attributes["type"].Value.Trim().ToLower();
                            string languageType = node.Attributes["xml:lang"].Value.Trim().ToLower();
                            string titleValue   = node.InnerText.Trim();

                            if (titleType.Trim().ToUpper() == "MAIN")
                            {
                                anime.MainTitle = titleValue;
                            }
                        }
                        catch
                        {
                            //BaseConfig.MyAnimeLog.Write("Error in GetEpisodes: {0}", ex);
                        }
                    }
                }
            }

            #endregion

            #region Ratings

            // init ratings
            anime.VoteCount       = 0;
            anime.TempVoteCount   = 0;
            anime.Rating          = 0;
            anime.TempRating      = 0;
            anime.ReviewCount     = 0;
            anime.AvgReviewRating = 0;

            NumberStyles style   = NumberStyles.Number;
            CultureInfo  culture = CultureInfo.CreateSpecificCulture("en-GB");

            if (docAnime["anime"]["ratings"] != null)
            {
                XmlNodeList ratingItems = docAnime["anime"]["ratings"].ChildNodes;
                if (ratingItems != null)
                {
                    foreach (XmlNode node in ratingItems)
                    {
                        try
                        {
                            if (node.Name.Trim().ToLower() == "permanent")
                            {
                                int.TryParse(TryGetAttribute(node, "count"), out int iCount);
                                anime.VoteCount = iCount;

                                decimal.TryParse(node.InnerText.Trim(), style, culture, out decimal iRating);
                                anime.Rating = (int)(iRating * 100);
                            }
                            if (node.Name.Trim().ToLower() == "temporary")
                            {
                                int.TryParse(TryGetAttribute(node, "count"), out int iCount);
                                anime.TempVoteCount = iCount;

                                decimal.TryParse(node.InnerText.Trim(), style, culture, out decimal iRating);
                                anime.TempRating = (int)(iRating * 100);
                            }
                            if (node.Name.Trim().ToLower() == "review")
                            {
                                int.TryParse(TryGetAttribute(node, "count"), out int iCount);
                                anime.ReviewCount = iCount;

                                decimal.TryParse(node.InnerText.Trim(), style, culture, out decimal iRating);
                                anime.AvgReviewRating = (int)(iRating * 100);
                            }
                        }
                        catch
                        {
                            //BaseConfig.MyAnimeLog.Write("Error in GetEpisodes: {0}", ex);
                        }
                    }
                }
            }

            #endregion

            //anime.VersionNumber = Raw_AniDB_Anime.LastVersion;
            //BaseConfig.MyAnimeLog.Write("Anime: {0}", anime.ToString());
            return(anime);
            //anime.Save(true, createSeriesRecord);

            //AniDB_Anime.UpdateDescription(anime.AnimeID, anime.Description);
        }
Esempio n. 7
0
        public void PopulateAndSaveFromHTTP(ISession session, Raw_AniDB_Anime animeInfo, List<Raw_AniDB_Episode> eps,
            List<Raw_AniDB_Anime_Title> titles,
            List<Raw_AniDB_Category> cats, List<Raw_AniDB_Tag> tags, List<Raw_AniDB_Character> chars,
            List<Raw_AniDB_RelatedAnime> rels, List<Raw_AniDB_SimilarAnime> sims,
            List<Raw_AniDB_Recommendation> recs, bool downloadRelations)
        {
            logger.Trace("------------------------------------------------");
            logger.Trace(String.Format("PopulateAndSaveFromHTTP: for {0} - {1}", animeInfo.AnimeID, animeInfo.MainTitle));
            logger.Trace("------------------------------------------------");

            Stopwatch taskTimer = new Stopwatch();
            Stopwatch totalTimer = Stopwatch.StartNew();

            Populate(animeInfo);

            // save now for FK purposes
            RepoFactory.AniDB_Anime.Save(this);

            taskTimer.Start();

            CreateEpisodes(eps);
            taskTimer.Stop();
            logger.Trace("CreateEpisodes in : " + taskTimer.ElapsedMilliseconds);
            taskTimer.Restart();

            CreateTitles(titles);
            taskTimer.Stop();
            logger.Trace("CreateTitles in : " + taskTimer.ElapsedMilliseconds);
            taskTimer.Restart();

            CreateTags(tags);
            taskTimer.Stop();
            logger.Trace("CreateTags in : " + taskTimer.ElapsedMilliseconds);
            taskTimer.Restart();

            CreateCharacters(session, chars);
            taskTimer.Stop();
            logger.Trace("CreateCharacters in : " + taskTimer.ElapsedMilliseconds);
            taskTimer.Restart();

            CreateRelations(session, rels, downloadRelations);
            taskTimer.Stop();
            logger.Trace("CreateRelations in : " + taskTimer.ElapsedMilliseconds);
            taskTimer.Restart();

            CreateSimilarAnime(session, sims);
            taskTimer.Stop();
            logger.Trace("CreateSimilarAnime in : " + taskTimer.ElapsedMilliseconds);
            taskTimer.Restart();

            CreateRecommendations(session, recs);
            taskTimer.Stop();
            logger.Trace("CreateRecommendations in : " + taskTimer.ElapsedMilliseconds);
            taskTimer.Restart();

            RepoFactory.AniDB_Anime.Save(this);
            totalTimer.Stop();
            logger.Trace("TOTAL TIME in : " + totalTimer.ElapsedMilliseconds);
            logger.Trace("------------------------------------------------");
        }