Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
            });
        }