public async ValueTask <ThumbnailGeneratorGetThumbnailResult> GetThumbnailAsync(NestedPath filePath, ThumbnailGeneratorGetThumbnailOptions options, bool cacheOnly = false, CancellationToken cancellationToken = default) { await Task.Delay(1, cancellationToken).ConfigureAwait(false); if (!await _fileSystem.ExistsFileAsync(filePath, cancellationToken)) { return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); } ThumbnailGeneratorGetThumbnailResult result = default; // Cache result = await this.GetThumbnailFromCacheAsync(filePath, options, cancellationToken).ConfigureAwait(false); if (result.Status == ThumbnailGeneratorGetThumbnailResultStatus.Succeeded) { return(result); } if (cacheOnly) { return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); } // Picture result = await this.GetPictureThumbnailAsync(filePath, options, cancellationToken).ConfigureAwait(false); if (result.Status == ThumbnailGeneratorGetThumbnailResultStatus.Succeeded) { return(result); } // Movie result = await this.GetMovieThumbnailAsync(filePath, options, cancellationToken).ConfigureAwait(false); if (result.Status == ThumbnailGeneratorGetThumbnailResultStatus.Succeeded) { return(result); } return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); }
private async ValueTask <ThumbnailGeneratorGetThumbnailResult> GetPictureThumbnailAsync(NestedPath filePath, ThumbnailGeneratorGetThumbnailOptions options, CancellationToken cancellationToken = default) { var ext = filePath.GetExtension().ToLower(); if (!_pictureTypeExtensionList.Contains(ext)) { return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); } try { var fileLength = await _fileSystem.GetFileSizeAsync(filePath, cancellationToken); var fileLastWriteTime = await _fileSystem.GetFileLastWriteTimeAsync(filePath, cancellationToken); using (var inStream = await _fileSystem.GetFileStreamAsync(filePath, cancellationToken)) using (var outStream = new RecyclableMemoryStream(_bytesPool)) { this.ConvertImage(inStream, outStream, options.Width, options.Height, options.ResizeType, options.FormatType); outStream.Seek(0, SeekOrigin.Begin); var image = outStream.ToMemoryOwner(); var fileMeta = new FileMeta(filePath, (ulong)fileLength, Timestamp.FromDateTime(fileLastWriteTime)); var thumbnailMeta = new ThumbnailMeta(options.ResizeType, options.FormatType, (uint)options.Width, (uint)options.Height); var content = new ThumbnailContent(image); var cache = new ThumbnailCache(fileMeta, thumbnailMeta, new[] { content }); await _thumbnailGeneratorRepository.ThumbnailCaches.InsertAsync(cache); return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Succeeded, cache.Contents)); } } catch (NotSupportedException e) { _logger.Warn(e); } catch (OperationCanceledException e) { _logger.Debug(e); } catch (Exception e) { _logger.Error(e); throw; } return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); }
private async ValueTask <ThumbnailGeneratorGetThumbnailResult> GetMovieThumbnailAsync(NestedPath filePath, ThumbnailGeneratorGetThumbnailOptions options, CancellationToken cancellationToken = default) { if (!_movieTypeExtensionList.Contains(filePath.GetExtension().ToLower())) { return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); } try { var fileLength = await _fileSystem.GetFileSizeAsync(filePath, cancellationToken); var fileLastWriteTime = await _fileSystem.GetFileLastWriteTimeAsync(filePath, cancellationToken); var images = await this.GetMovieImagesAsync(filePath, options.MinInterval, options.MaxImageCount, options.Width, options.Height, options.ResizeType, options.FormatType, cancellationToken).ConfigureAwait(false); var fileMeta = new FileMeta(filePath, (ulong)fileLength, Timestamp.FromDateTime(fileLastWriteTime)); var thumbnailMeta = new ThumbnailMeta(options.ResizeType, options.FormatType, (uint)options.Width, (uint)options.Height); var contents = images.Select(n => new ThumbnailContent(n)).ToArray(); var cache = new ThumbnailCache(fileMeta, thumbnailMeta, contents); await _thumbnailGeneratorRepository.ThumbnailCaches.InsertAsync(cache); return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Succeeded, cache.Contents)); } catch (NotSupportedException e) { _logger.Warn(e); } catch (OperationCanceledException e) { _logger.Debug(e); } catch (Exception e) { _logger.Error(e); throw; } return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); }
private async ValueTask <ThumbnailGeneratorGetThumbnailResult> GetThumbnailFromCacheAsync(NestedPath filePath, ThumbnailGeneratorGetThumbnailOptions options, CancellationToken cancellationToken = default) { var cache = await _thumbnailGeneratorRepository.ThumbnailCaches.FindOneAsync(filePath, options.Width, options.Height, options.ResizeType, options.FormatType); if (cache is null) { return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); } var fileLength = await _fileSystem.GetFileSizeAsync(filePath, cancellationToken); var fileLastWriteTime = await _fileSystem.GetFileLastWriteTimeAsync(filePath, cancellationToken); if ((ulong)fileLength != cache.FileMeta.Length && Timestamp.FromDateTime(fileLastWriteTime) != cache.FileMeta.LastWriteTime) { return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Failed)); } return(new ThumbnailGeneratorGetThumbnailResult(ThumbnailGeneratorGetThumbnailResultStatus.Succeeded, cache.Contents)); }