internal async Task <WatermarkOptions> GetWatermarkOptions(
        string ffprobePath,
        Channel channel,
        Option <ChannelWatermark> playoutItemWatermark,
        Option <ChannelWatermark> globalWatermark,
        MediaVersion videoVersion,
        Option <ChannelWatermark> watermarkOverride,
        Option <string> watermarkPath)
    {
        if (channel.StreamingMode != StreamingMode.HttpLiveStreamingDirect)
        {
            if (videoVersion is CoverArtMediaVersion)
            {
                return(new WatermarkOptions(
                           watermarkOverride,
                           await watermarkPath.IfNoneAsync(videoVersion.MediaFiles.Head().Path),
                           0,
                           false));
            }

            // check for playout item watermark
            foreach (ChannelWatermark watermark in playoutItemWatermark)
            {
                switch (watermark.ImageSource)
                {
                case ChannelWatermarkImageSource.Custom:
                    string customPath = _imageCache.GetPathForImage(
                        watermark.Image,
                        ArtworkKind.Watermark,
                        Option <int> .None);
                    return(new WatermarkOptions(
                               await watermarkOverride.IfNoneAsync(watermark),
                               customPath,
                               None,
                               await IsAnimated(ffprobePath, customPath)));

                case ChannelWatermarkImageSource.ChannelLogo:
                    Option <string> maybeChannelPath = channel.Artwork
                                                       .Filter(a => a.ArtworkKind == ArtworkKind.Logo)
                                                       .HeadOrNone()
                                                       .Map(a => _imageCache.GetPathForImage(a.Path, ArtworkKind.Logo, Option <int> .None));
                    return(new WatermarkOptions(
                               await watermarkOverride.IfNoneAsync(watermark),
                               maybeChannelPath,
                               None,
                               await maybeChannelPath.Match(
                                   p => IsAnimated(ffprobePath, p),
                                   () => Task.FromResult(false))));

                default:
                    throw new NotSupportedException("Unsupported watermark image source");
                }
            }

            // check for channel watermark
            if (channel.Watermark != null)
            {
                switch (channel.Watermark.ImageSource)
                {
                case ChannelWatermarkImageSource.Custom:
                    string customPath = _imageCache.GetPathForImage(
                        channel.Watermark.Image,
                        ArtworkKind.Watermark,
                        Option <int> .None);
                    return(new WatermarkOptions(
                               await watermarkOverride.IfNoneAsync(channel.Watermark),
                               customPath,
                               None,
                               await IsAnimated(ffprobePath, customPath)));

                case ChannelWatermarkImageSource.ChannelLogo:
                    Option <string> maybeChannelPath = channel.Artwork
                                                       .Filter(a => a.ArtworkKind == ArtworkKind.Logo)
                                                       .HeadOrNone()
                                                       .Map(a => _imageCache.GetPathForImage(a.Path, ArtworkKind.Logo, Option <int> .None));
                    return(new WatermarkOptions(
                               await watermarkOverride.IfNoneAsync(channel.Watermark),
                               maybeChannelPath,
                               None,
                               await maybeChannelPath.Match(
                                   p => IsAnimated(ffprobePath, p),
                                   () => Task.FromResult(false))));

                default:
                    throw new NotSupportedException("Unsupported watermark image source");
                }
            }

            // check for global watermark
            foreach (ChannelWatermark watermark in globalWatermark)
            {
                switch (watermark.ImageSource)
                {
                case ChannelWatermarkImageSource.Custom:
                    string customPath = _imageCache.GetPathForImage(
                        watermark.Image,
                        ArtworkKind.Watermark,
                        Option <int> .None);
                    return(new WatermarkOptions(
                               await watermarkOverride.IfNoneAsync(watermark),
                               customPath,
                               None,
                               await IsAnimated(ffprobePath, customPath)));

                case ChannelWatermarkImageSource.ChannelLogo:
                    Option <string> maybeChannelPath = channel.Artwork
                                                       .Filter(a => a.ArtworkKind == ArtworkKind.Logo)
                                                       .HeadOrNone()
                                                       .Map(a => _imageCache.GetPathForImage(a.Path, ArtworkKind.Logo, Option <int> .None));
                    return(new WatermarkOptions(
                               await watermarkOverride.IfNoneAsync(watermark),
                               maybeChannelPath,
                               None,
                               await maybeChannelPath.Match(
                                   p => IsAnimated(ffprobePath, p),
                                   () => Task.FromResult(false))));

                default:
                    throw new NotSupportedException("Unsupported watermark image source");
                }
            }
        }

        return(new WatermarkOptions(None, None, None, false));
    }