protected virtual void Grab(GrabResult result, JObject vars, GrabOptions options)
        {
            if (options.Flags.HasFlag(GrabOptionFlag.GrabImages))
            {
                var image_url = new Uri(result.OriginalUri, vars.SelectToken("$.image_url").Value <string>());
                result.Resources.Add(new GrabbedImage(GrabbedImageType.Primary, null, image_url));
            }

            result.Title             = vars.SelectToken("$.video_title").Value <string>();
            result.Statistics        = new GrabStatisticInfo();
            result.Statistics.Length = TimeSpan.FromSeconds(vars.SelectToken("$.video_duration").Value <int>());
            var qualities = vars.SelectTokens("$.defaultQuality[*]").Select(t => t.Value <int>()).ToArray();

            foreach (var quality in qualities)
            {
                var key = $"quality_{quality}p";
                var url = vars.SelectToken($"$.{key}")?.Value <string>();
                if (string.IsNullOrEmpty(url))
                {
                    continue;
                }
                var vid = new GrabbedMedia(new Uri(result.OriginalUri, url), null, new MediaFormat("video/mp4", "mp4"), MediaChannels.Both);
                vid.Resolution  = $"{quality}p";
                vid.FormatTitle = $"MP4 {vid.Resolution}";
                result.Resources.Add(vid);
            }
        }
        public static void Convert(GrabbedMedia videoStream, GrabbedMedia audioStream, string videoPath, string audioPath, string outputPath)
        {
            var builder = new MediaMerger(outputPath);

            builder.AddStreamSource(videoPath, MediaStreamType.Video);
            builder.AddStreamSource(audioPath, MediaStreamType.Audio);
            builder.OutputMimeType  = videoStream.Format.Mime;
            builder.OutputShortName = videoStream.Format.Extension;
            builder.Build();
        }
Beispiel #3
0
        public GrabbedMediaViewModel(GrabbedMedia media, GrabbedMedia attachTo = null)
        {
            Media    = media;
            AttachTo = attachTo;
            Name     = $"{media.Container?.ToUpperInvariant()} {media.Resolution}".Trim();

            if (IsComposition)
            {
                Consideration = "Full media after conversion";
            }
            else if (media.Channels == MediaChannels.Both)
            {
                Consideration = "Full Media";
            }
            else
            {
                Consideration = (media.Channels.HasAudio() ? "Audio" : "Video") + " Only";
            }
        }
        /// <summary>
        /// Given the specified <paramref name="metaData"/>, generates proper <see cref="GrabResult"/>.
        /// </summary>
        protected virtual GrabResult GrabUsingConfiguration(Configuration configuration, Uri originalUri)
        {
            var grabList = new List <IGrabbed>();

            // Ensure we have at least one video format available
            if (string.IsNullOrWhiteSpace(configuration?.Request?.Files?.Progressive?.FirstOrDefault().Url))
            {
                return(null);
            }

            if (configuration.Video?.Thumbs != null)
            {
                foreach (var keyValuePair in configuration.Video.Thumbs)
                {
                    var imageType = GrabbedImageType.Thumbnail;
                    if (keyValuePair.Key == "base")
                    {
                        imageType = GrabbedImageType.Primary;
                    }

                    grabList.Add(new GrabbedImage(imageType, null, new Uri(keyValuePair.Value)));
                }
            }

            foreach (var progressive in configuration.Request.Files.Progressive)
            {
                var format = new MediaFormat(progressive.Mime, MimeHelper.ExtractMimeExtension(progressive.Mime));
                var vid    = new GrabbedMedia(new Uri(progressive.Url), null, format, MediaChannels.Both)
                {
                    Resolution = progressive.Quality
                };
                grabList.Add(vid);
            }

            var result = new GrabResult(originalUri, grabList)
            {
                Title = configuration.Video?.Title
            };

            return(result);
        }
Beispiel #5
0
        /// <summary>
        /// Given the specified <paramref name="metaData"/>, generates proper <see cref="GrabResult"/>.
        /// </summary>
        protected virtual GrabResult GrabUsingMetadata(IDictionary <string, string> metaData)
        {
            var grabList = new List <IGrabbed>();

            // extract metadata
            var title            = metaData.GetOrDefault("og:title");
            var image            = metaData.GetOrDefault("og:image");
            var description      = metaData.GetOrDefault("og:description");
            var originalUri      = new Uri(metaData.GetOrDefault("og:url"));
            var type             = metaData.GetOrDefault("og:type");
            var video            = metaData.GetOrDefault("og:video");
            var video_secure_url = metaData.GetOrDefault("og:video:secure_url");
            var video_type       = metaData.GetOrDefault("og:video:type");
            var video_width      = int.Parse(metaData.GetOrDefault("og:video:width", "0"));
            var video_height     = int.Parse(metaData.GetOrDefault("og:video:height", "0"));

            // grab image
            if (!string.IsNullOrEmpty(image))
            {
                grabList.Add(new GrabbedImage(GrabbedImageType.Primary, null, new Uri(image)));
            }

            // grab video
            if (!string.IsNullOrEmpty(video))
            {
                var format = new MediaFormat(video_type, MimeHelper.ExtractMimeExtension(video_type));
                var vid    = new GrabbedMedia(new Uri(video), null, format, MediaChannels.Both);
                grabList.Add(vid);
            }

            // make result
            var result = new GrabResult(originalUri, grabList)
            {
                Title       = title,
                Description = description,
            };

            return(result);
        }
        /// <summary>
        /// Updates information about the grabbed media according to the given YouTube iTag info.
        /// </summary>
        protected virtual void UpdateStreamITagInfo(GrabbedMedia grabbed, YouTubeTagInfo itag)
        {
            grabbed.BitRateString = itag.BitRateString;
            grabbed.Container     = itag.Container;
            grabbed.Resolution    = itag.VideoResolution;
            grabbed.FormatId      = itag.iTag;
            if (!string.IsNullOrEmpty(grabbed.Container))
            {
                grabbed.Format.Extension = grabbed.Container.ToLowerInvariant();
            }
            var attributes = new List <string>
            {
                grabbed.Container?.ToUpperInvariant(),
                grabbed.Resolution
            };

            if (grabbed.Channels != MediaChannels.Both)
            {
                attributes.Add($"({grabbed.Channels} only)");
            }
            grabbed.FormatTitle = string.Join(" ", attributes.Where(attr => !string.IsNullOrWhiteSpace(attr)));
        }
        /// <summary>
        /// Appends the specified <paramref name="stream"/> to the specified <paramref name="result"/>.
        /// </summary>
        protected virtual void AppendStreamToResult(GrabResult result, YouTubeStreamInfo stream)
        {
            MediaChannels channels;

            // get iTag info
            var itagInfo = stream.iTag == null ? null : YouTubeTags.For(stream.iTag.Value);

            // extract extension from mime
            var extension = stream.Extension ?? stream.Mime?.Split('/')?.Last();

            // decide according to stream type - adaptive, or muxed
            if (stream is YouTubeMuxedStream muxedStream)
            {
                // Muxed stream
                channels = MediaChannels.Both;
            }
            else if (stream is YouTubeAdaptiveStream adaptiveStream)
            {
                // Adaptive stream
                var hasVideo = itagInfo?.HasVideo ?? stream.Mime.StartsWith("video");
                channels = hasVideo ? MediaChannels.Video : MediaChannels.Audio;
            }
            else
            {
                throw new NotSupportedException($"YouTube stream of type {stream.GetType()} is not implemented in {nameof(YouTubeGrabber)}.{nameof(AppendStreamToResult)}.");
            }

            var format  = new MediaFormat(stream.Mime, extension);
            var grabbed = new GrabbedMedia(new Uri(stream.Url), null, format, channels);

            result.Resources.Add(grabbed);

            // update grabbed media iTag info
            if (itagInfo != null)
            {
                UpdateStreamITagInfo(grabbed, itagInfo.Value);
            }
        }
Beispiel #8
0
        protected virtual void Grab(GrabResult result, JObject flashVars, JArray qualityItemVars, GrabOptions options)
        {
            var grabbed = new Dictionary <int, GrabbedMedia>();

            if (options.Flags.HasFlag(GrabOptionFlag.GrabImages))
            {
                var image_url = new Uri(result.OriginalUri, flashVars.SelectToken("$.image_url").Value <string>());
                result.Resources.Add(new GrabbedImage(GrabbedImageType.Primary, null, image_url));
            }

            result.Title      = flashVars.SelectToken("$.video_title").Value <string>();
            result.Statistics = new GrabStatisticInfo
            {
                Length = TimeSpan.FromSeconds(flashVars.SelectToken("$.video_duration").Value <int>())
            };

            if (qualityItemVars != null && qualityItemVars.Count > 0)
            {
                foreach (var quality in qualityItemVars)
                {
                    var url = quality.Value <string>("url");
                    if (string.IsNullOrEmpty(url))
                    {
                        continue;
                    }
                    var vid = new GrabbedMedia(new Uri(result.OriginalUri, url), result.OriginalUri, DefaultMediaFormat, MediaChannels.Both);
                    vid.Resolution = quality.Value <string>("text");
                    var qint = StringHelper.ForceParseInt(vid.Resolution);
                    grabbed.Add(qint, vid);
                }
            }

            var mediaDefinitions = flashVars.SelectToken("$.mediaDefinitions");

            foreach (var def in mediaDefinitions)
            {
                var format       = def.Value <string>("format");
                var url          = def.Value <string>("videoUrl");
                var isQualityArr = def["quality"] is JArray;
                var qualityArr   = isQualityArr ? def["quality"].Values <int>().ToArray() : null;
                var quality      = isQualityArr ? 0 : StringHelper.ForceParseInt(def.Value <string>("quality"));
                if (grabbed.ContainsKey(quality) || string.IsNullOrEmpty(url))
                {
                    continue;
                }
                if (isQualityArr && qualityArr.Length == 0)
                {
                    continue;
                }
                var uri          = new Uri(result.OriginalUri, url);
                var resol        = isQualityArr ? null : $"{quality}p";
                var playlistType = isQualityArr ? HlsPlaylistType.Master : HlsPlaylistType.Stream;

                switch (format.ToLowerInvariant())
                {
                case "mp4":
                    var m = new GrabbedMedia(uri, result.OriginalUri, DefaultMediaFormat, MediaChannels.Both)
                    {
                        Resolution  = resol,
                        FormatTitle = $"MP4 {resol}",
                    };
                    grabbed.Add(quality, m);
                    break;

                case "hls":
                    var sr = new GrabbedStreamReference(uri, result.OriginalUri)
                    {
                        Resolution   = resol,
                        PlaylistType = playlistType,
                    };
                    result.Resources.Add(sr);
                    break;

                default:
                    continue;
                }
            }

            foreach (var g in grabbed.OrderByDescending(m => m.Key))
            {
                result.Resources.Add(g.Value);
            }
        }