/// <summary> /// Метод скачивает архив с аудиокнигой и передает по файлам на сервер Rdev /// </summary> /// <param name="audiobook">Аудиокнига которую необходимо загрузить</param> /// <returns></returns> public async Task Grab(Audiobook audiobook) { logger.Debug("Запускаем авторизацию на сервере Rdev."); // Авторизуемся на сервере Rdev await client.Authorize(); logger.Debug("Запускаем скачивание с удаленного сервера."); // Скачиваем аудиокнигу в локальную директорию await Download(audiobook); logger.Debug("Запускаем выгрузку файлов аудиокниги на сервер Rdev."); // Выгружаем аудиокнигу на Rdev из локальной директроии await Upload(audiobook); }
/// <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); } }
public async Task GrabLocal(Audiobook audiobook) { await Download(audiobook, $"{audiobook.Title}.zip"); }
/// <summary> /// Метод распаковывает архив с аудиокнигой и запускает пофайловую передачу на Rdev, /// после успешной передачи файла на сервер Rdev, сохраняет запись о файле в таблицу UploadAudiofile, /// после успешной передачи всей аудиокниге сохраняет в таблицу UploadAudiobook запись о книге /// </summary> /// <param name="audiobook"></param> /// <returns></returns> private async Task Upload(Audiobook audiobook) { try { logger.Log($"Проверяем была ли аудиокнига {audiobook.Title} полностью на Rdev."); // Если книга полностью отдана на Rdev, выходим из метода if (db.IsUploadAudiobook(audiobook)) { logger.Log($"Аудиокнига {audiobook.Title} была полностью отдана на Rdev, выходим из метода."); return; } logger.Log($"Получаем значение ownerrecid для аудиокниги {audiobook.Title}."); // Получаем идентификатор аудиокниги Guid ownerRecId = db.GetOwnerRecid(audiobook); logger.Log($"Запускаем чтение архива с аудиокнигой по адресу {fileName}."); // Запускаем пофайловую передачу файлов из архива на Rdev using (var zip = ZipFile.OpenRead(fileName)) { int chapter = 0; foreach (var entry in zip.Entries) { // Берем только mp3 файлы if (entry.FullName.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)) { logger.Log($"Запускаем выгрузку аудиофайла {entry.Name}."); // Получаем файл на отправку using (var fs = entry.Open()) { Guid recId = Guid.NewGuid(); // Формируем объект прдеставляющий файл для отправки на Rdev var file = new Audiofile() { Name = entry.Name, Chapter = ++chapter, OwnerRecid = ownerRecId.ToString(), AudiobookName = audiobook.Title, AudiobookUrl = audiobook.Url }; logger.Log($"Проверяем отправлялся ли аудиофайл {entry.Name} ранее на Rdev."); // Проверям был ли отдан файл с таким названием и главой на Rdev, если да, переходим к следующей итерации цикла, // иначе отдаем файл if (db.IsUploadAudiofile(file)) { logger.Log($"Аудиофайл {entry.Name} ранее был отправлен на Rdev, переходим к следующему."); continue; } logger.Log( $"Отправляем аудиофайл {entry.Name} на Rdev. Данный аудиофайл является {file.Chapter} главой аудиокниги." ); // Отправляем файл на Rdev await client.Upload(file, fs, recId); logger.Success($"Аудиофайл {entry.Name} был успешно отправлен на Rdev."); logger.Log("Сохраняем информацию по аудиофайлу в таблицу отданных аудиофайлов."); // Добавляем файл в таблицу отданных файлов await db.SaveUploadAudiofile(file); logger.Success("Сохранение прошло успешно."); } } } logger.Success($"Аудиокнига {audiobook.Title} была полностью передана на Rdev."); logger.Log($"Сохраняем информацию об аудиокниге {audiobook.Title} в таблицу отданных на Rdev аудиокниг."); // Добавляем запись о полностью отданной на Rdev книге await db.SaveUploadAudiobook(audiobook); logger.Success("Сохранение прошло успешно."); } } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <summary> /// Метод отправки файлов из локальной директории на Rdev по http /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void DirUpload_Click(object sender, EventArgs e) { try { // Получаем путь к директории с аудиокнигами var path = ConfigurationManager.AppSettings["Audiobooks"]; int counter = 0; // Заканчиваем работу метода если не удалось найти директорию с аудиокнигами if (!Directory.Exists(path)) { logger.Warning("Директория с аудиокнигами не существует!"); return; } // Получаем список файлов из директории (аудиокниги в директории представлены в виде .zip архива) var files = Directory.GetFiles(path); logger.Debug("Запущена загрузка аудиокниг из локальной директории"); logger.Log($"Количество файлов: {files.Count()}."); // Запускаем цикл на последовательный обход архива с аудиокнигами foreach (var file in files) { if (Path.GetExtension(file) != ".zip") { continue; } using (var zip = ZipFile.Open(file, ZipArchiveMode.Read, Encoding.GetEncoding(866))) { //Получаем список файлов var zipContent = zip.Entries; // Ищем txt файл со ссылкой на аудиокнигу var txtName = zipContent.FirstOrDefault(x => Path.GetExtension(x.Name.Replace('<', ' ').Replace('>', ' ')) == ".txt"); // Копируем содержимое файла в memory stream var memStream = new MemoryStream(); await txtName.Open().CopyToAsync(memStream); // Получаем содержимое файла string txtContnent = Encoding.ASCII.GetString(memStream.ToArray()); // Формируем объект аудиокниги var audiobook = new Audiobook { Title = Path.GetFileNameWithoutExtension(txtName.Name.Replace('<', ' ').Replace('>', ' ')), Url = txtContnent }; // Сохраняем аудиокнигу в таблицу скаченных аудиокниг await db.SaveDownloadAudiobook(audiobook); logger.Debug($"Попытка загрузки аудиокниги {audiobook.Title}, URL:{audiobook.Url}"); // Получаем все mp3 файлы var mp3Content = zipContent.Where(x => Path.GetExtension(x.Name.Replace('<', ' ').Replace('>', ' ')) == ".mp3").ToList(); int chapter = 0; logger.Log($"Аудиокнига {audiobook.Title} из {mp3Content.Count} аудиофайлов."); logger.Debug($"Проверяем была ли аудиокнига: {audiobook.Title} загружена ранее."); // Если книга полностью отдана на Rdev, идем к следующей if (db.IsUploadAudiobook(audiobook)) { logger.Warning($"Аудиокнига {audiobook.Title} была ранее передана на Rdev."); logger.Log($"Количество загруженных книг {++counter}."); continue; } logger.Debug($"Получаем ownerrecid для файла аудиокниги: {audiobook.Title}."); // Получаем идентификатор книги, если книга уже выгружалась на рдев но не все файлы были переданы // получаем значение идентификатора из бд иначе если это первая выгрузка формируем новый идентификатор Guid ownerRecId = db.GetOwnerRecid(audiobook); logger.Debug($"Запускаем upload аудиофайлов книги: {audiobook.Title}."); foreach (var entry in mp3Content) { using (var fs = entry.Open()) { Guid recId = Guid.NewGuid(); // Формируем объект отправляемого файла var sendedFile = new Audiofile() { Name = entry.Name, Chapter = ++chapter, OwnerRecid = ownerRecId.ToString(), AudiobookName = audiobook.Title, AudiobookUrl = audiobook.Url }; logger.Debug($"Проверяем отправлялся ли файл {sendedFile.Name} ранее."); // Проверям был ли отдан файл с таким названием и главой на Rdev, если да, переходим к следующей итерации цикла, // иначе отдаем файл if (db.IsUploadAudiofile(sendedFile)) { logger.Warning($"Файл {sendedFile.Name} уже отправлялся, переходим к следующему."); continue; } logger.Debug($"Отправляем аудиофайл: {sendedFile.Name}"); // Отправляем файл на Rdev await client.Upload(sendedFile, fs, recId); logger.Debug($"Сохраняем информацию о переданном файле {sendedFile.Name}"); // В случае если файл был успешно передан на Rdev (вернулся статус код 200) await db.SaveUploadAudiofile(sendedFile); logger.Success($"Информация о файле {sendedFile.Name} была успешно сохранена."); } } logger.Debug($"Все файлы аудиокниги {audiobook.Title} были переданны, сохраняем аудиокнигу в историю загрузок."); // Добавляем запись о полностью отданной на Rdev книге, если не было ошибки при передаче файлов await db.SaveUploadAudiobook(audiobook); logger.Success($"Информация об аудиокниге {audiobook.Title} была успешно сохранена."); logger.Debug($"Количество загруженных книг{++counter}"); } } } catch (Exception ex) { logger.Error(ex.Message); } }