public static RawBrowserMessageEnvelop Deserialize(BinaryReader r)
        {
            var e = new RawBrowserMessageEnvelop {
            };

            e.MessageType = StreamHelper.ReadString(r);
            if (r.ReadBoolean())
            {
                e.Message             = new();
                e.Message.Url         = StreamHelper.ReadString(r);
                e.Message.File        = StreamHelper.ReadString(r);
                e.Message.Method      = StreamHelper.ReadString(r);
                e.Message.RequestBody = StreamHelper.ReadString(r);
                StreamHelper.ReadStateHeaders(r, out Dictionary <string, List <string> > dict1);
                StreamHelper.ReadStateHeaders(r, out Dictionary <string, List <string> > dict2);
                StreamHelper.ReadStateCookies(r, out Dictionary <string, string> dict3);
                e.Message.RequestHeaders  = dict1;
                e.Message.ResponseHeaders = dict2;
                e.Message.Cookies         = dict3;
            }
            var count = r.ReadInt32();

            e.VideoIds = new string[count];
            for (int i = 0; i < count; i++)
            {
                e.VideoIds[i] = r.ReadString();
            }
            if (r.ReadBoolean())
            {
                count = r.ReadInt32();
                var list = new RawBrowserMessage[count];
                for (int i = 0; i < count; i++)
                {
                    var message = new RawBrowserMessage();
                    message.Url         = StreamHelper.ReadString(r);
                    message.File        = StreamHelper.ReadString(r);
                    message.Method      = StreamHelper.ReadString(r);
                    message.RequestBody = StreamHelper.ReadString(r);
                    StreamHelper.ReadStateHeaders(r, out Dictionary <string, List <string> > dict1);
                    StreamHelper.ReadStateHeaders(r, out Dictionary <string, List <string> > dict2);
                    StreamHelper.ReadStateCookies(r, out Dictionary <string, string> dict3);
                    message.RequestHeaders  = dict1;
                    message.ResponseHeaders = dict2;
                    message.Cookies         = dict3;
                    list[i] = message;
                }
                e.Messages = list;
            }
            return(e);
        }
        public static void Serialize(RawBrowserMessageEnvelop e, BinaryWriter w)
        {
            w.Write(1);
            w.Write(e.MessageType ?? string.Empty);
            w.Write(e.Message != null);
            if (e.Message != null)
            {
                w.Write(e.Message.Url ?? string.Empty);
                w.Write(e.Message.File ?? string.Empty);
                w.Write(e.Message.Method ?? string.Empty);
                w.Write(e.Message.RequestBody ?? string.Empty);
                StreamHelper.WriteStateHeaders(e.Message.RequestHeaders, w);
                StreamHelper.WriteStateHeaders(e.Message.ResponseHeaders, w);
                StreamHelper.WriteStateCookies(e.Message.Cookies, w);
            }
            var count = e.VideoIds?.Length ?? 0;

            w.Write(count);
            if (e.VideoIds != null && e.VideoIds.Length > 0)
            {
                foreach (var item in e.VideoIds)
                {
                    w.Write(item);
                }
            }
            w.Write(e.Messages != null);
            if (e.Messages != null)
            {
                count = e.Messages.Length;
                w.Write(count);
                foreach (var message in e.Messages)
                {
                    w.Write(message.Url ?? string.Empty);
                    w.Write(message.File ?? string.Empty);
                    w.Write(message.Method ?? string.Empty);
                    w.Write(message.RequestBody ?? string.Empty);
                    StreamHelper.WriteStateHeaders(message.RequestHeaders, w);
                    StreamHelper.WriteStateHeaders(message.ResponseHeaders, w);
                    StreamHelper.WriteStateCookies(message.Cookies, w);
                }
            }
        }
Beispiel #3
0
        public RawBrowserMessageEnvelop Parse(Stream stream)
        {
            var envelop = new RawBrowserMessageEnvelop();
            var reader  = new JsonTextReader(new StreamReader(stream));

            if (reader.Read() && reader.TokenType == JsonToken.StartObject)
            {
                while (reader.Read())
                {
                    if (reader.TokenType == JsonToken.EndObject)
                    {
                        break;
                    }
                    var messageType = ReadProperty <string>(reader, "messageType");
                    if (messageType != null)
                    {
                        envelop.MessageType = messageType;
                    }
                    var customData = ReadProperty <string>(reader, "customData");
                    if (customData != null)
                    {
                        envelop.CustomData = customData;
                    }
                    if (IsObjectStart(reader, "message"))
                    {
                        var msg = ReadMessageObject(reader);
                        envelop.Message = msg;
                    }
                    if (IsListStart(reader, "messages"))
                    {
                        var list = new List <RawBrowserMessage>();
                        while (reader.Read())
                        {
                            if (reader.TokenType == JsonToken.EndArray)
                            {
                                break;
                            }
                            if (reader.TokenType == JsonToken.StartObject)
                            {
                                var msg = ReadMessageObject(reader);
                                list.Add(msg);
                                envelop.Messages = list.ToArray();
                            }
                        }
                    }
                    if (IsListStart(reader, "videoIds"))
                    {
                        var list = new List <RawBrowserMessage>();
                        while (reader.Read())
                        {
                            if (reader.TokenType == JsonToken.EndArray)
                            {
                                break;
                            }
                            if (reader.TokenType == JsonToken.StartObject)
                            {
                                var msg = ReadMessageObject(reader);
                                list.Add(msg);
                                envelop.Messages = list.ToArray();
                            }
                        }
                    }
                    SkipUnknownParts(reader);
                }
            }
            return(envelop);
        }
Beispiel #4
0
        internal static void Handle(RawBrowserMessageEnvelop envelop)
        {
            //Log.Debug("Type: " + envelop.MessageType);
            if (envelop.MessageType == "videoIds")
            {
                foreach (var item in envelop.VideoIds)
                {
                    ApplicationContext.VideoTracker.AddVideoDownload(item);
                }
                return;
            }

            if (envelop.MessageType == "clear")
            {
                ApplicationContext.VideoTracker.ClearVideoList();
                return;
            }

            if (envelop.MessageType == "sync")
            {
                return;
            }

            if (envelop.MessageType == "custom")
            {
                var args = ArgsProcessor.ParseArgs(envelop.CustomData.Split('\r'));
                ArgsProcessor.Process(args);
                return;
            }

            var rawMessage = envelop.Message;

            if (rawMessage == null && envelop.Messages == null)
            {
                Log.Debug("Raw message/messages is null");
                return;
            }
            ;

            switch (envelop.MessageType)
            {
            case "download":
            {
                var message = Parse(rawMessage);
                if (!(Helpers.IsBlockedHost(message.Url) || Helpers.IsCompressedJSorCSS(message.Url)))
                {
                    ApplicationContext.CoreService.AddDownload(message);
                }
                break;
            }

            case "links":
            {
                var messages = new List <Message>(envelop.Messages.Length);
                foreach (var msg in envelop.Messages)
                {
                    var message = Parse(msg);
                    messages.Add(message);
                }
                ApplicationContext.CoreService.AddBatchLinks(messages);
                break;
            }

            case "video":
            {
                var message     = Parse(rawMessage);
                var contentType = message.GetResponseHeaderFirstValue("Content-Type");

                if (VideoUrlHelper.IsYtFormat(contentType))
                {
                    VideoUrlHelper.ProcessPostYtFormats(message);
                }

                //if (VideoUrlHelper.IsFBFormat(contentType, message.Url))
                //{
                //    VideoUrlHelper.ProcessPostFBFormats(message, ApplicationContext.Core);
                //}

                if (VideoUrlHelper.IsHLS(contentType))
                {
                    VideoUrlHelper.ProcessHLSVideo(message);
                }

                if (VideoUrlHelper.IsDASH(contentType))
                {
                    VideoUrlHelper.ProcessDashVideo(message);
                }

                if (!VideoUrlHelper.ProcessYtDashSegment(message))
                {
                    if (VideoUrlHelper.IsNormalVideo(contentType, message.Url, message.GetContentLength()))
                    {
                        VideoUrlHelper.ProcessNormalVideo(message);
                    }
                }
                break;
            }
            }
        }