示例#1
0
 public GrabbedStreamRefViewModel(GrabbedStreamReference streamRef)
 {
     Reference = streamRef;
     Name      = streamRef.Resolution ?? "Master Playlist";
 }
示例#2
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);
            }
        }