/// <summary> /// Преобразует пост в SoftPost /// </summary> /// <param name="param"></param> /// <returns>SoftPost</returns> public async Task <SoftPost> Convert(DriverToSoftInput param) { SoftPost post = null; switch (param.Type) { case nameof(RutorItem): post = await RutorToSoft(param); break; case nameof(NnmclubItem): post = await NnmclubToSoft(param); break; default: break; } if (post != null) { _context.SoftPosts.Add(post); _context.SaveChanges(); return(post); } return(null); }
/// <summary> /// Преобразует NnmclubPost в SoftPost /// </summary> /// <returns></returns> async Task <SoftPost> NnmclubToSoft(DriverToSoftInput param) { NnmclubItem clubItem = _context .NnmclubItems .Include(el => el.NnmclubListItem) .Include(el => el.Imgs) .Include(el => el.Spoilers) .SingleOrDefault(el => el.Id == param.ParseItemId); if (clubItem != null) { string posterFullName = await DownloadFile(clubItem.Poster, Path.GetFileName(clubItem.Poster), param.ProxySocks5Addr, param.ProxySocks5Port, param.ProxyActive); if (posterFullName == null) { _logger.LogError($"Не удалось загрузить постер. NnmclubItem.Id: {param.ParseItemId}; Href: {clubItem.NnmclubListItem.Href}"); return(null); } string torrentFullName = await DownloadFile(param.TorrentUri + clubItem.Torrent, Path.GetRandomFileName().Replace('.', '_') + ".torrent", param.ProxySocks5Addr, param.ProxySocks5Port, param.ProxyActive, new Uri(param.AuthPage), param.AuthParam); if (torrentFullName == null) { _logger.LogError($"Не удалось загрузить торрент файл. NnmclubItem.Id: {param.ParseItemId}; Href: {clubItem.NnmclubListItem.Href}"); return(null); } var post = new SoftPost { NnmclubItemId = param.ParseItemId, Created = DateTime.Now, Name = clubItem.Name, Description = clubItem.Description, Spoilers = FormatSpoilersNnmclub(clubItem.Spoilers), PosterImg = posterFullName, TorrentFile = torrentFullName, Imgs = (from img in clubItem.Imgs select new SoftPostImg { Created = DateTime.Now, ImgUri = img.ImgUri }).ToList(), }; return(post); } _logger.LogError($"В базе не найдена презентация с указанным Id. NnmclubItem.Id: {param.ParseItemId}"); return(null); }
/// <summary> /// Подготавливаем и выкладываем пост /// </summary> /// <param name="itemType">Тип поста</param> /// <param name="itemId">Id поста</param> /// <returns>Если метод выполнен успешно - true, инчае false</returns> async Task <PublishResult> Send(string itemType, int itemId) { //Подготавливаем DriverToSoftInput driverInput = _context.DriverToSoftInputs .Single(el => el.Active && el.Type == itemType); driverInput.ParseItemId = itemId; SoftPost post = await _driverService.Convert(driverInput); if (post == null) { _logger.LogError($"Не удалось подготовить пост к публикации. {itemType}.Id = " + itemId); return(PublishResult.Error); } //Выкладываем SoftPostInput softPostInput = _context.SoftPostInputs .Single(el => el.Active); softPostInput.SoftPostId = post.Id; softPostInput.PosterUploadQueryString = _context.DictionaryValues .Where(el => el.DictionaryName == softPostInput.PosterUploadQueryStringId) .ToDictionary(k => k.Key, v => v.Value); softPostInput.TorrentUploadQueryString = _context.DictionaryValues .Where(el => el.DictionaryName == softPostInput.TorrentUploadQueryStringId) .ToDictionary(k => k.Key, v => v.Value); softPostInput.FormData = _context.DictionaryValues .Where(el => el.DictionaryName == softPostInput.FormDataId) .ToDictionary(k => k.Key, v => v.Value); softPostInput.AuthData = _context.DictionaryValues .Where(el => el.DictionaryName == softPostInput.AuthDataId) .ToDictionary(k => k.Key, v => v.Value); PublishResult result = await _softService.AddPost(softPostInput); if (result == PublishResult.Error) { _logger.LogError("Не удалось выложить пост на сайт. SoftPost.Id = " + post.Id); return(PublishResult.Error); } if (result == PublishResult.FileExist) { _logger.LogError("Не удалось выложить пост на сайт. Такой файл уже загружен."); return(PublishResult.FileExist); } return(PublishResult.Success); }
public async Task <ActionResult <SoftPost> > ToSoft(DriverToSoftInput param) { SoftPost result = await _driverService.Convert(param); if (result != null) { foreach (var item in result.Imgs) { item.SoftPost = null; } return(Ok(result)); } return(BadRequest("Сервису не удалось получить готовый пост")); }
/// <summary> /// Преобразует RutorPost в SoftPost /// </summary> /// <param name="param"></param> /// <returns></returns> async Task <SoftPost> RutorToSoft(DriverToSoftInput param) { RutorItem rutorItem = _context .RutorItems .Include(el => el.RutorListItem) .Include(el => el.Imgs) .Include(el => el.Spoilers) .SingleOrDefault(el => el.Id == param.ParseItemId); if (rutorItem != null) { var post = new SoftPost(); post.RutorItemId = param.ParseItemId; post.Name = rutorItem.Name; post.Created = DateTime.Now; string torrentFile = await DownloadFile(param.TorrentUri + rutorItem.RutorListItem.HrefNumber, Path.GetRandomFileName().Replace('.', '_') + ".torrent", param.ProxySocks5Addr, param.ProxySocks5Port, param.ProxyActive); if (torrentFile == null) { _logger.LogError($"Не удалось загрузить торрент файл. RutorItem.Id: {param.ParseItemId}; Href: {rutorItem.RutorListItem.HrefNumber}"); return(null); } post.TorrentFile = torrentFile; string posterFile = await GetPosterImgRutor(rutorItem.Imgs, param); if (posterFile == null) { _logger.LogError($"Не удалось загрузить постер. RutorItem.Id: {param.ParseItemId}; Href: {rutorItem.RutorListItem.HrefNumber}"); return(null); } FileInfo img = new FileInfo(posterFile); if (img.Length > param.MaxPosterSize * 1024) { posterFile = _imgsConverter.ConvertToJpg(posterFile, 100); } post.PosterImg = posterFile; var queryUriImgs = (from el in rutorItem.Imgs where el.ParentUrl != null select el.ParentUrl).ToList(); var queryParams = (from el in _context.ImghostParsingInputs where el.Active == true select el).ToList(); List <string> screenshots = (await _imghostService.GetOriginalsUri(new ImghostGetOriginalsInput { ImgsUri = queryUriImgs, ParsingParams = queryParams, })).ToList(); var queryScr = (from el in screenshots select new SoftPostImg { Created = DateTime.Now, ImgUri = el, }).ToList(); post.Imgs = queryScr; post.Description = FormatDescriptionRutor(rutorItem.Description, post.PosterImg); post.Spoilers = FormatSpoilersRutor(rutorItem.Spoilers); return(post); } _logger.LogError($"В базе не найдена раздача с указанным Id. RutorItem.Id: {param.ParseItemId}"); return(null); }
/// <summary> /// Выбирает постер из списка изображений и сохраняет его /// </summary> /// <param name="listImg"></param> /// <returns>Полное имя файла</returns> async Task <string> GetPosterImgRutor(List <RutorItemImg> listImg, DriverToSoftInput param) { IList <RutorItemImg> withoutLink = (from img in listImg where img.ParentUrl == null && img.ChildUrl != null select img).ToList(); if (withoutLink.Count > 0) { if (withoutLink.Count == 1) { RutorItemImg img = withoutLink.Single(); string fullFileNameOne = await DownloadFile(img.ChildUrl, Path.GetFileName(img.ChildUrl), param.ProxySocks5Addr, param.ProxySocks5Port, param.ProxyActive); if (fullFileNameOne == null) { _logger.LogError("При загрузке постера произошла ошибка. ChildImg uri: " + img.ChildUrl); return(null); } return(fullFileNameOne); } int maxSize = 0; string posterUri = ""; foreach (RutorItemImg item in withoutLink) { var webClient = new WebClient(); Stream stream; try { stream = await webClient.OpenReadTaskAsync(item.ChildUrl); } catch (WebException ex) { _logger.LogError(ex, "При загрузке файла постера по списку произошла ошибка. ChildImg uri: " + item.ChildUrl); return(null); } var img = new Bitmap(stream); if (maxSize < img.Width * img.Height) { maxSize = img.Width * img.Height; posterUri = item.ChildUrl; } } string fullFileName = await DownloadFile(posterUri, Path.GetFileName(posterUri), param.ProxySocks5Addr, param.ProxySocks5Port, param.ProxyActive); if (fullFileName == null) { _logger.LogError("При загрузке постера произошла ошибка. Poster uri: " + posterUri); return(null); } return(fullFileName); } _logger.LogError("Не удалось выбрать подходящий постер или изображения отсутсвуют"); return(null); }