private void RenderAlbum(ParsedAlbum album) { if (this.InvokeRequired == false) { this.gb_SongHeader.Visible = false; this.gb_Album_Header.Visible = true; this.tb_RO_Title.Text = album.Header.Title; this.tb_RO_Genre.Text = album.Genre; this.tb_RO_Artist.Text = album.Artist; this.tb_RO_Format.Text = album.Header.Format; this.tb_RO_Uploader.Text = album.Uploader; this.tb_RO_Date_Album.Text = album.Header.ReleaseDate; this.tb_RO_Type_Album.Text = album.Header.Type; this.tb_RO_Count_Album.Text = album.Header.SongsCount.ToString(); this.tb_RO_Description_Album.Text = album.Header.Description; this.tb_RO_Updater_Album.Text = album.Header.Updater; this.RenderImage(album); this.dgv_List.Rows.Clear(); Int32 failed_count = 0; for (Int32 i = 0; i < album.Songs.Count; i++) { OneSongHeader song = album.Songs[i]; this.dgv_List.Rows.Add (song.Number, song.Artist, song.Title, song.Duration, song.Size, song.Bitrate); if (song.IsAvailableForDownload == false) { DataGridViewRow drvr = this.dgv_List.Rows[i]; drvr.DefaultCellStyle = new DataGridViewCellStyle() { BackColor = Color.LightPink }; drvr.Cells["col_Download"].ReadOnly = true; drvr.Cells["col_Download"].Value = false; failed_count++; } } if (failed_count > 0) { if (failed_count == album.Songs.Count) { this.gb_FooterButtons.Enabled = false; this.SetOrAppendMessage(true, String.Format( "Все {0} песни в данном альбоме помечены на сайте как таковые, файлы которых утеряны", album.Songs.Count)); } else { this.SetOrAppendMessage(true, String.Format("Из {0} песен {1} помечены на сайте как таковые, файл которых утерян", album.Songs.Count, failed_count)); } this.UpdateStatus(5); } } else { Action<ParsedAlbum> a = RenderAlbum; this.Invoke(a, album); } }
/// <summary> /// Пытается скачать и распарсить страницу альбома или песни по указаннному URI, после чего возвратить результат /// </summary> /// <param name="PageURI">URI страницы, по которой должен выполняться запрос</param> /// <param name="UserAgent">User-Agent, с которым будет исполнен запрос</param> /// <param name="DownloadCover">Определяет, необходимо ли загружать обложку альбома или песни</param> /// <param name="InvokeEvents">Определяет, необходимо ли вызывать события в процессе выполнения</param> /// <param name="CancToken"></param> /// <returns>Модель, соответсующая альбому или песни, или же NULL в случае провала парсинга</returns> public static ACommonData TryGrabAndParsePage (Uri PageURI, String UserAgent, Boolean DownloadCover, Boolean InvokeEvents, CancellationToken CancToken) { Task<HtmlAgilityPack.HtmlDocument> temp_task = Task.Run<HtmlAgilityPack.HtmlDocument> (() => CoreInternal.TryGrabPageWithCancellation(PageURI, UserAgent, CancToken), CancToken); try { temp_task.Wait(CancToken); } catch (InvalidOperationException ioex) { if (InvokeEvents == true) { Core.OnException.Invoke(ioex.InnerException); } return null; } catch (AggregateException aex) { if (InvokeEvents == true) { Core.OnException.Invoke(aex.InnerException); } return null; } catch (OperationCanceledException ocex) { var temp = ocex.TotalMessage(); CancToken.ThrowIfCancellationRequested(); } HtmlAgilityPack.HtmlDocument HTML_doc = temp_task.Result; if (InvokeEvents == true) { Core.PageWasDownloaded.Invoke(HTML_doc); } ParsedItemType album_or_song = CoreInternal.DetectItemType(HTML_doc); if (album_or_song == ParsedItemType.Unknown) { if (InvokeEvents == true) { Core.OnException.Invoke(new InvalidOperationException(String.Format( "Страница, полученная по URI '{0}' с кодировкой '{1}', не может быть распознана как страница альбома или песни", PageURI.ToString(), HTML_doc.Encoding.ToString()))); } return null; } if (InvokeEvents == true) { Core.ItemWasDetected.Invoke(album_or_song); } CancToken.ThrowIfCancellationRequested(); ICommonHeader header; if (album_or_song == ParsedItemType.Album) { try { header = CoreInternal.ParseAlbumHeader(HTML_doc); } catch (Exception ex) { if (InvokeEvents == true) { Core.OnException.Invoke(new InvalidOperationException( String.Format("Произошла ошибка при парсинге страницы альбома, полученной по URI '{0}'", PageURI), ex)); } return null; } } else { try { header = CoreInternal.ParseOneSongHeader(HTML_doc); } catch (Exception ex) { if (InvokeEvents == true) { Core.OnException.Invoke(new InvalidOperationException( String.Format("Произошла ошибка при парсинге страницы песни, полученной по URI '{0}'", PageURI), ex)); } return null; } } if (InvokeEvents == true) { Core.HeaderWasParsed.Invoke(header); } CancToken.ThrowIfCancellationRequested(); DownloadedFile cover_file = null; Bitmap cover_image = null; if (DownloadCover == true && header.CoverImageURI != null) { String err_mess; cover_file = CoreInternal.TryDownloadFile(header.CoverImageURI, header.PageURI, UserAgent, out err_mess); if (cover_file != null) { cover_image = CoreInternal.TryConvertFileToImage(cover_file); if (InvokeEvents == true) { Core.CoverWasAcquired.Invoke(cover_file, cover_image); } } } CancToken.ThrowIfCancellationRequested(); ACommonData output; if (album_or_song == ParsedItemType.Album) { AlbumHeader ah = (AlbumHeader) header; List<OneSongHeader> songs; try { songs = CoreInternal.ParseAllSongsInAlbum(HTML_doc, ah); } catch (Exception ex) { if (InvokeEvents == true) { Core.OnException.Invoke(new InvalidOperationException( String.Format("Произошла ошибка при парсинге списка песен для альбома, полученного по URI '{0}'", PageURI), ex)); } return null; } output = new ParsedAlbum(ah, songs, cover_file, cover_image); } else { OneSongHeader sh = (OneSongHeader) header; Uri song_URI; try { song_URI = CoreInternal.ExtractDownloadSongURI(HTML_doc); } catch (Exception ex) { if (InvokeEvents == true) { Core.OnException.Invoke(new InvalidOperationException(String.Format( "Произошла ошибка при парсинге ссылки на скачку файла песни, страница которой получена по URI '{0}'", PageURI), ex)); } return null; } Uri album_URI; try { album_URI = CoreInternal.ExtractAlbumURIFromSongPage(HTML_doc); } catch (Exception ex) { if (InvokeEvents == true) { Core.OnException.Invoke(new InvalidOperationException(String.Format( "Произошла ошибка при парсинге ссылки на страницу альбома песни, страница которой получена по URI '{0}'", PageURI), ex)); } return null; } output = new ParsedSong(sh, song_URI, album_URI, cover_file, cover_image); } if (InvokeEvents == true) { Core.WorkIsDone.Invoke(output); } return output; }