예제 #1
0
        public async Task <Caff> Create(Caff caff)
        {
            var result = _context.Caffs.Add(caff);
            await _context.SaveChangesAsync();

            return(result.Entity);
        }
예제 #2
0
        public async Task <Caff> Upload(long userId, UploadCAFFRequest request)
        {
            // TODO What to do with userId?
            var ext = Path.GetExtension(request.Image.FileName).ToLowerInvariant();

            if (string.IsNullOrEmpty(ext) || !permittedExtensions.Contains(ext))
            {
                throw new BadRequestException("Not supported file extension");
            }
            if (request.Image.Length > _fileSettings.MaxSizeInMegaBytes * 1024 * 1024)
            {
                throw new BadRequestException("Size limit reached");
            }

            var extension = ".caff";

            Directory.CreateDirectory(_fileSettings.FilePath);
            var filePath = Path.Combine(_fileSettings.FilePath,
                                        Path.GetRandomFileName() + extension);

            using (var stream = File.Create(filePath))
            {
                await request.Image.CopyToAsync(stream);
            }

            var directory = filePath.Substring(0, filePath.Length - extension.Length);

            Directory.CreateDirectory(directory);

            string   creator;
            DateTime creationDate;
            int      duration  = 0;
            string   thumbnail = Path.Combine(directory, "1_img.bmp");

            try
            {
                var process = System.Diagnostics.Process.Start(_parserSettings.ParserExe, $"{filePath} {directory}");
                process.WaitForExit();

                var metadataJsonFile = Path.Combine(directory, "output.json");
                if (!File.Exists(metadataJsonFile))
                {
                    throw new Exception("CAFF parsing did not produce metadata");
                }

                if (!File.Exists(thumbnail))
                {
                    throw new Exception("CAFF parsing did not produce thumbnail image");
                }

                var     jsonContent = File.ReadAllText(metadataJsonFile);
                dynamic jToken      = JToken.Parse(jsonContent);

                var year   = jToken.Credits.year.ToObject <int>();
                var month  = jToken.Credits.month.ToObject <int>();
                var day    = jToken.Credits.day.ToObject <int>();
                var hour   = jToken.Credits.hour.ToObject <int>();
                var minute = jToken.Credits.minute.ToObject <int>();

                creator      = jToken.Credits.creator;
                creationDate = new DateTime(
                    year,
                    month,
                    day,
                    hour,
                    minute,
                    0
                    );

                foreach (var anim in jToken.Animations)
                {
                    duration += anim.duration.ToObject <int>();
                }
            }
            catch
            {
                Directory.Delete(directory);
                throw;
            }

            var thumbnails = new List <Thumbnail>();

            foreach (var file in Directory.GetFiles(directory, "*.bmp"))
            {
                thumbnails.Add(new Thumbnail
                {
                    FilePath = file
                });
            }

            var caff = new Caff
            {
                Name         = request.Name,
                Cost         = request.Price,
                ImagePath    = filePath,
                Creator      = creator,
                CreationDate = creationDate,
                Duration     = duration,
                Thumbnails   = thumbnails
            };

            return(await Create(caff));
        }