public CoverArt GetCoverArt(Track track, int?size) { var fullTrackCoverPath = Path.Combine(_fullCoverArtPath, track.Id.ToString("n")); var coverArtPath = size.HasValue ? Path.Combine(_coverArtPath, size.Value.ToString()) : _fullCoverArtPath; var trackCoverArtPath = Path.Combine(coverArtPath, track.Id.ToString("n")); var coverArt = GetScaledCoverArt(track, trackCoverArtPath); if (coverArt != null) { return(coverArt); } coverArt = GetScaledCoverArt(track, fullTrackCoverPath); if (coverArt == null) { if (File.Exists(track.Path)) { var tagReader = _tagReaderFactory.CreateTagReader(track.Path, false); coverArt = tagReader.CoverArt.FirstOrDefault(ca => ca.CoverArtType == CoverArtType.Front || ca.CoverArtType == CoverArtType.Other); } if (coverArt != null) { WriteCoverArtToDisk(fullTrackCoverPath, coverArt.CoverArtData); } else { return(null); } } // Resize the image if requested if (size.HasValue) { using var imageMemoryStream = new MemoryStream(); using var image = SixLabors.ImageSharp.Image.Load(coverArt.CoverArtData.Span); var resizeOptions = new ResizeOptions { Size = new Size { Height = size.Value, Width = size.Value }, Mode = ResizeMode.Max }; var resizedImageData = image.Clone(ctx => ctx.Resize(resizeOptions)); // Save to PNG to retain quality at the expense of file size resizedImageData.SaveAsPng(imageMemoryStream); coverArt.CoverArtData = imageMemoryStream.ToArray(); WriteCoverArtToDisk(trackCoverArtPath, coverArt.CoverArtData); } coverArt.MimeType = MimeType.GetMimeType(coverArt.CoverArtData, trackCoverArtPath); return(coverArt); }
public Func <CancellationToken, Task <MediaBundle <Track> > > CreateMethod(IMetadataRepository metadataRepository, IMetadataRepositoryCache metadataRepositoryCache, ITagReaderFactory tagReaderFactory) { return(async cancellationToken => { var mediaBundle = await metadataRepository.GetTrackAsync(UserId, Path, CollectionId, Populate, cancellationToken).ConfigureAwait(false); Track track = null; if (mediaBundle != null) { track = mediaBundle.Media; } else if (!UpdateCollection) { return null; } if (track != null && track.DateFileModified.ToUniversalTime() >= File.GetLastWriteTimeUtc(Path)) { return mediaBundle; } var now = DateTime.UtcNow; var dateAdded = now; Guid?trackId = null; if (track != null) { trackId = track.Id; dateAdded = track.DateAdded; } var tagReader = tagReaderFactory.CreateTagReader(Path); track = await metadataRepositoryCache.TagReaderToTrackModelAsync(UserId, tagReader, CollectionId, cancellationToken).ConfigureAwait(false); if (trackId.HasValue) { track.Id = trackId.Value; } track.CollectionId = CollectionId; track.DateAdded = dateAdded; track.DateModified = now; track.Visible = true; await metadataRepository.InsertOrUpdateTrackAsync(track, cancellationToken).ConfigureAwait(false); mediaBundle = new MediaBundle <Track> { Media = track, Dispositions = new List <Disposition>(), Playback = new List <Playback>() }; return mediaBundle; }); }