/// <summary> /// Метод скачивания файлов с сайта и последующей выгрузкой на сторону Rdev-a /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void AbooksBtn_Click(object sender, EventArgs e) { try { // Количество скаченных со страницы аудиокниг int countDownloaded = 0; // Формируем объект категории "Новинки" var novelty = new Category { Name = "Новинки", Url = baseUrl }; logger.Debug("Получаем общее количество страниц в категории Новинки."); // Получаем общее количество страниц на сайте в категории "Новинки" int countPage = await service.GetPagesCount(novelty); // Запускаем цикл обхода страниц с книгам начиная с конца (самые новые книги находятся на 1 странице) for (int page = countPage; page >= 1; page--) { logger.Debug($"Получаем количество аудиокниг со страницы {page}."); // Получаем список аудиокниг со страницы var audiobooks = await service.GetAudiobooks(novelty, page); logger.Debug($"Количество аудиокниг на странице {page}: {audiobooks.Count}."); // Запускаем цикл на последовательное скачивание аудиокниг со страницы foreach (var audiobook in audiobooks) { logger.Log($"Загружаем аудиокнигу: {audiobook.Title}."); await grabber.Grab(audiobook); ++countDownloaded; logger.Success($"Аудиокнига {audiobook.Title} загружена, " + $"оставшееся количество аудиокниг на странице {audiobooks.Count - countDownloaded}." ); } countDownloaded = 0; } } catch (Exception ex) { logger.Error($"Скачивание остановлено по причине ошибки: {ex.Message}."); } }
/// <summary> /// Метод загружает аудиокнигу с сайта, в случае успешного скачивания книги, /// сохраняет запись в таблицу DownloadAudiobook /// </summary> /// <param name="audiobook">Аудиокнига, которую необходимо загрузить</param> /// <returns></returns> private async Task Download(Audiobook audiobook, string filename = fileName) { try { logger.Log($"Проверяем, нет ли в БД в таблице скаченных аудиокниг информации об аудиокниге: {audiobook.Title}."); // Проверяем не была ли загружена аудиокнига bool isDownload = db.IsDownloadAudiobook(audiobook); // Если нет, скачиваем if (!isDownload) { logger.Log($"Аудиокнига {audiobook.Title} не скачивалась ранее, запускаем загрузку."); logger.Log($"Абсолютный путь к файлу на диске: {$"{dirPath}/{filename}"}."); using (var fs = new FileStream($"{dirPath}/{filename}", FileMode.Create, FileAccess.ReadWrite)) { logger.Debug($"Запускаем скачивание аудиокниги {audiobook.Title}."); await service.GetAudiobook(audiobook, fs); logger.Success($"Аудиокнига {audiobook.Title} успешно скачена. " + $"Сохраняем информацию в БД, в таблицу загруженных аудиокниг." ); // В случае успешного скачивания сохраним информацию об аудиокниге в таблицке загрузок await db.SaveDownloadAudiobook(audiobook); logger.Success("Сохранение выполнено успешно."); } } else { logger.Log($"Аудиокнига {audiobook.Title} существует в таблице скаченных аудиокниг, поэтому пропускаем скачивание."); } } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <summary> /// Метод авторизации на сервере Rdev /// </summary> /// <returns></returns> public async Task Authorize() { try { logger.Log("Проверяем нужно ли получать токен авторизации."); // Если уже авторизованы, выходим if (isAuthCompleted) { logger.Log("Авторизация была выполнена ранее, выходим из метода."); return; } logger.Log("Получаем значение логина и пароля для авторизации."); // Получаем значение логина из настроек var login = ConfigurationManager.AppSettings["UserLogin"]; // В App.config должно быть указано значение логина if (string.IsNullOrEmpty(login)) { throw new Exception("В настройках отсутствует значение UserLogin."); } // Получаем значение пароля, может быть пустым var password = ConfigurationManager.AppSettings["UserPassword"]; logger.Log($"Login:{login}, Password:{password}."); // Формируем объект с данными для авторизации var content = JsonConvert.SerializeObject(new { Login = login, Password = password }); var authContent = new StringContent(content, Encoding.UTF8, "application/json"); logger.Log($"Отправляем запрос на авторизацию, по адресу {authLogin}, указав полученные учетные данные."); // Отправляем данные для авторизации, ожидаем получить токен using (var response = await client.PostAsync(authLogin, authContent).ConfigureAwait(false)) { if (response.StatusCode != HttpStatusCode.OK) { throw new Exception($"Сервер вернул статус код с ошибкой: {response.StatusCode}."); } var user = await response.Content.ReadAsStringAsync(); if (string.IsNullOrEmpty(user)) { throw new Exception("Не удалось получить информацию о пользователе."); } var userObj = JsonConvert.DeserializeObject <User>(user); if (string.IsNullOrEmpty(userObj.Token)) { throw new Exception("Не удалось получить token авторизованного пользователя."); } client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", userObj.Token); logger.Success("Авторизация успешно выполнена."); isAuthCompleted = true; } } catch (Exception ex) { throw new Exception($"Необработанная ошибка при попытке авторизоваться на сервере Rdev: {ex.Message}."); } }