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); }
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)); }
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)); }
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)); }
public static FileDto ToDto(this FileDbModel db) { return(Mapper.Map <FileDto>(db)); }