示例#1
0
        public bool UpdateAuthorInfo(string page, Author author, SynchronizationContext context,
                                     bool skipBookDescriptionChecking = false)
        {
            try
            {
                lock (_lockObj)
                {
                    bool retValue = false;
                    if (string.IsNullOrWhiteSpace(author.AlternateURL) && author.URL.Contains("http://www.fanfiction.net/atom/u/"))
                    {
                        author.AlternateURL = author.URL.Replace("http://www.fanfiction.net/atom/u/",
                                                                 "http://www.fanfiction.net/u/");
                    }
                    if (string.IsNullOrWhiteSpace(author.AlternateURL) && author.URL.Contains("https://www.fanfiction.net/atom/u/"))
                    {
                        author.AlternateURL = author.URL.Replace("https://www.fanfiction.net/atom/u/",
                                                                 "https://www.fanfiction.net/u/");
                    }


                    var authorTemp = new Author {
                        UpdateDate = author.UpdateDate
                    };

                    using (XmlReader reader = XmlReader.Create(new StringReader(page)))
                    {
                        SyndicationFeed feed = SyndicationFeed.Load(reader);
                        int             cnt  = 0;
                        foreach (var item in feed.Items)
                        {
                            var text = new AuthorText
                            {
                                Description = CleanSummary(TextCleaner.Html2Text(item.Summary.Text)),
                                Genres      = item.Authors.Count > 0 ? item.Authors[0].Name : "",
                                Link        = item.Links.Count > 0 ?
                                              //item.Links[0].GetAbsoluteUri()==null ? "" : item.Links[0].GetAbsoluteUri().AbsolutePath
                                              item.Links[0].Uri.ToString()
                                    : "",
                                Name        = item.Title.Text,
                                Order       = cnt,
                                SectionName = item.Authors.Count > 0 ? item.Authors[0].Name : "",
                                Size        = -1,
                                UpdateDate  = item.LastUpdatedTime.LocalDateTime
                            };
                            authorTemp.Texts.Add(text);
                            cnt++;
                        }

                        if (author.Texts.Count > 0) // если раньше загружали автора, то проводим сравнение
                        {
                            foreach (AuthorText txt in authorTemp.Texts)
                            {
                                bool bFound  = false;
                                int  OldSize = 0; // стрый размер текста
                                foreach (AuthorText t in author.Texts)
                                {
                                    if (txt.Link == t.Link)
                                    {
                                        txt.Cached = t.Cached;
                                        if (t.IsNew)
                                        {
                                            // если книгу не читали до этой проверки, не меняем старое значение, чтобы видеть кумулятивное изменение размера
                                            OldSize = t.SizeOld;// запоминаем позапрошлый размер, чтобы запомнить изменения в новом тексте кумулятивно
                                        }
                                        else
                                        {
                                            OldSize = t.Size; // запоминаем старый размер, чтобы запомнить его в новом тексте
                                        }
                                        bFound = txt.Name == t.Name && txt.Description == t.Description;
                                        // && txt.UpdateDate == t.UpdateDate
                                        if (bFound)
                                        {
                                            // переносим значение isNew в новый массив, чтобы не потерять непрочитанные новые тексты
                                            txt.IsNew      = t.IsNew;
                                            txt.UpdateDate = t.UpdateDate;
                                            txt.SizeOld    = t.SizeOld; // переносим, чтобы при отсутствии изменений не скидывалась информация об изменениях
                                            break;
                                        }
                                    }
                                }
                                if (!bFound)
                                {
                                    retValue         = true;
                                    authorTemp.IsNew = true;
                                    txt.IsNew        = true;
                                    txt.UpdateDate   = DateTime.Now;
                                    txt.SizeOld      = OldSize;
                                    // да, автор обновился
                                    authorTemp.UpdateDate = DateTime.Now;

                                    //#region Отсылка информации об обновлении в шину брокера сообщений
                                    //MessageBroker.HiLevelManager.Manager.GetInstance().PublishMessageUpdatedBook(txt, author.URL, author.Name);
                                    //#endregion
                                    // отсылка инормации об обновлении на сервер статистики
                                    SIinformer.ApiStuff.ApiManager.GetInstance().PublishMessageUpdatedBook(MainWindow.MainForm.GetLogger(), MainWindow.GetSettings(), txt, author.URL, author.Name);
                                }
                            }
                            // доп проверка по количеству произведений
                            if (authorTemp.Texts.Count != author.Texts.Count)
                            {
                                retValue = true;
                                authorTemp.UpdateDate = feed.LastUpdatedTime.LocalDateTime;
                            }
                        }

                        // отсылка информации о книгах (не обновленные. обновленные идут отдельным вызовом) на сервер статистики
                        SIinformer.ApiStuff.ApiManager.GetInstance().SetBooksInfo(MainWindow.MainForm.GetLogger(), MainWindow.GetSettings(), authorTemp.Texts.Where(b => !b.IsNew).ToList(), author.URL, author.Name);

                        context.Post(Author.SyncRun, new Author.RunContent {
                            Renewed = author, New = authorTemp
                        });


                        reader.Close();
                    }

                    return(retValue);
                }//lock
            }
            catch (Exception ex)
            {
                MainWindow.MainForm.GetLogger().Add("Ошибка парсинка странички  " + author.URL + "     " + ex.Message);
            }
            return(false);
        }