示例#1
0
        private async Task <(int added, int deleted, int total)> Rescan()
        {
            var now   = DateTimeOffset.UtcNow;
            int added = 0;
            int total = 0;
            var paths = await _storage.ScanBucket("sources");

            foreach (var path in paths)
            {
                var existent = await _context.Files.Where(f => f.FileName == path).FirstOrDefaultAsync();

                if (existent == null)
                {
                    var file = new FileDbModel(path)
                    {
                        LastSyncDate = now
                    };
                    await _context.Files.AddAsync(file);

                    added++;
                }
                else
                {
                    existent.LastSyncDate = now;
                }
                total++;
            }

            await _context.SaveChangesAsync();

            var old     = _context.Files.Where(f => f.LastSyncDate < now);
            var deleted = old.Delete();

            return(added, deleted, total);
        }
示例#2
0
        private async Task <FileDbModel> GenerateFileGif(FileDbModel file)
        {
            var path = await _storage.GetFullFilePath(file.FileName);

            var previewPath = await _storage.GeneratePath($"{file.FileId}_{DateTimeOffset.Now.ToUnixTimeSeconds()}.gif");

            await Conversion.ToGif(path, previewPath, 0).Start();

            return(new FileDbModel(previewPath));
        }
示例#3
0
        private async Task <FileDbModel> ConvertVideoInternal(FileDbModel file, VideoFormat format)
        {
            var path = await _storage.GetFullFilePath(file.FileName);

            var newFilePath =
                await _storage.GeneratePath(
                    $"{file.FileId}_{DateTimeOffset.Now.ToUnixTimeSeconds()}_{format}.mp4");

            IMediaInfo mediaInfo = await MediaInfo.Get(path);

            IStream videoStream = mediaInfo.VideoStreams.FirstOrDefault().SetFormat(format);

            await Conversion.New().AddStream(videoStream)
            .SetOutput(newFilePath)
            .Start();

            return(new FileDbModel(newFilePath));
        }
示例#4
0
        private async Task <FileDbModel> GenerateFilePreview(FileDbModel file)
        {
            var path = await _storage.GetFullFilePath(file.FileName);

            var previewPath = await _storage.GeneratePath($"{file.FileId}_{DateTimeOffset.Now.ToUnixTimeSeconds()}.jpg");

            IMediaInfo mediaInfo = await MediaInfo.Get(path);

            var    videoStream = mediaInfo.VideoStreams.FirstOrDefault() ?? throw new Exception($"Empty video stream {path}");
            Random rnd         = new Random();

            for (int i = 0; i < 20; i++)
            {
                _storage.RemoveFile(previewPath);
                var targetSec = rnd.Next(1, videoStream.Duration.Seconds);
                try
                {
                    await Conversion.New().AddStream(videoStream
                                                     .SetCodec(VideoCodec.Png)
                                                     .SetOutputFramesCount(1)
                                                     .SetSize(new VideoSize(_settings.Value.DefaultPreviewSize.Width,
                                                                            _settings.Value.DefaultPreviewSize.Height))
                                                     .SetSeek(TimeSpan.FromSeconds(targetSec)))
                    .SetOutput(previewPath)
                    .Start();

                    if (GetAverageColor(previewPath) > 30)
                    {
                        break;
                    }

                    _storage.RemoveFile(previewPath);
                }
                catch (ConversionException e)
                {
                    Console.WriteLine(e);
                }
            }

            return(new FileDbModel(previewPath));
        }
示例#5
0
 public static FileDto ToDto(this FileDbModel db)
 {
     return(Mapper.Map <FileDto>(db));
 }