Example #1
0
        public async Task <ActionResult> Upload(MediaUploadRequestVM vm, IFormFile file)
        {
            try
            {
                var result = await _media.UploadAsync(vm, file, User);

                result.ThumbnailPath = Url.Content(result.ThumbnailPath);

                await _db.SaveChangesAsync();

                if (!result.IsProcessed)
                {
                    _workerAlarm.FireNewEncoderJob();
                }

                return(Json(result));
            }
            catch (Exception ex)
            {
                return(Json(new
                {
                    Error = true,
                    Description = ex.Message
                }));
            }
        }
Example #2
0
        /// <summary>
        /// Uploads a new media file.
        /// </summary>
        public async Task <MediaUploadResultVM> UploadAsync(MediaUploadRequestVM vm, IFormFile file, ClaimsPrincipal principal)
        {
            var id  = Guid.NewGuid();
            var key = PageHelper.GetMediaKey(id);

            var handler = _mediaHandlers.FirstOrDefault(x => x.SupportedMimeTypes.Contains(file.ContentType));

            if (handler == null)
            {
                throw new UploadException("Неизвестный тип файла!");
            }

            var userId = _userMgr.GetUserId(principal);
            var user   = await _db.Users.GetAsync(x => x.Id == userId, "Пользователь не найден");

            var paths = await SaveUploadAsync(file, key, handler);

            var tags = await GetTagsForUploadedMedia(vm);

            var meta = await handler.ExtractMetadataAsync(paths.LocalPath, file.ContentType);

            var media = new Media
            {
                Id          = id,
                Key         = key,
                Type        = handler.MediaType,
                MimeType    = file.ContentType,
                Title       = vm.Title,
                FilePath    = paths.UrlPath,
                UploadDate  = DateTimeOffset.Now,
                Uploader    = user,
                IsProcessed = handler.IsImmediate,
                Date        = FuzzyDate.TryParse(vm.Date) != null
                    ? vm.Date
                    : meta?.Date?.Date.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture),
                Tags = tags
            };

            _db.Media.Add(media);

            if (!handler.IsImmediate)
            {
                _db.MediaJobs.Add(new MediaEncodingJob
                {
                    Id      = Guid.NewGuid(),
                    MediaId = media.Id
                });
            }

            var changeset = await GetChangesetAsync(null, _mapper.Map <MediaEditorVM>(media), id, principal, null);

            _db.Changes.Add(changeset);

            return(_mapper.Map <MediaUploadResultVM>(media));
        }
Example #3
0
        /// <summary>
        /// Creates event \ location tags for the uploaded media.
        /// </summary>
        private async Task <List <MediaTag> > GetTagsForUploadedMedia(MediaUploadRequestVM vm)
        {
            var result = new List <MediaTag>();

            var locId = vm.Location.TryParse <Guid>();
            var evtId = vm.Event.TryParse <Guid>();

            var tagIds = new[] { locId, evtId }
            .Where(x => x != Guid.Empty)
            .ToList();

            var existing = tagIds.Any()
                ? await _db.Pages
                           .Where(x => tagIds.Contains(x.Id) && !x.IsDeleted)
                           .ToHashSetAsync(x => x.Id)
                : null;

            TryAddTag(vm.Location, locId, MediaTagType.Location);
            TryAddTag(vm.Event, evtId, MediaTagType.Event);

            return(result);

            void TryAddTag(string title, Guid id, MediaTagType type)
            {
                if (string.IsNullOrEmpty(title))
                {
                    return;
                }

                var tag = new MediaTag {
                    Type = type
                };

                if (existing?.Contains(id) == true)
                {
                    tag.ObjectId = id;
                }
                else
                {
                    tag.ObjectTitle = title;
                }

                result.Add(tag);
            }
        }