Example #1
0
        /// <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}.");
            }
        }