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