/// <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);
        }
Beispiel #3
0
        /// <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);
        }