Beispiel #1
0
        public EPGProvider(ref SQLDatabase db, BackendHub backend)
        {
            fs      = new Filesystem(Directory.GetCurrentDirectory());
            this.db = db;

            backend.EPGRequest += (sender, e) =>
            {
                switch (e.Action)
                {
                case BackendAction.Download:
                    Task.Run(() => Download(e.Provider, e.Response, e.Parameters, e.Context));
                    break;

                case BackendAction.Create:
                    Task.Run(() => Create(e.Provider, e.Response, e.Parameters, e.Context));
                    break;

                case BackendAction.Import:
                    Task.Run(() => Import(e.Provider, e.Response, e.Parameters, e.Context));
                    break;

                case BackendAction.Remove:
                    Task.Run(() => Remove(e.Provider, e.Response, e.Parameters, e.Context));
                    break;

                case BackendAction.Update:
                    Task.Run(() => Update(e.Provider, e.Response, e.Parameters, e.Context));
                    break;

                default:
                    break;
                }
            };
        }
Beispiel #2
0
        public SQLDatabase(string database)
        {
            var dataBase = Filesystem.Combine(Environment.CurrentDirectory, database);

            sqlConn = new SQLiteConnection(string.Format("Data Source={0};Version=3;", dataBase));

            Open();
        }
Beispiel #3
0
        async void _downloadPlayList(string url, string file, string ua, int provider)
        {
            var importDir = Path.Combine(Directory.GetCurrentDirectory(),
                                         string.Format("Download/playlist/{0}", provider));

            var u  = Functions.ReplaceAndFixNames(db, url, false);
            var dl = new HTTPClient(u.Result);

            dl.UserAgent = ua;

            dl.GetResponse(url);
            dl.HTTPClientResponse += (sender, e) =>
            {
                if (e.Data.Length != 0)
                {
                    using (var fs = new Filesystem(importDir))
                        fs.Write(Filesystem.Combine(fs.Root, file), e.Data);

                    Task.Run(() => Console.WriteLine("Downloaded Playlist: {0}...", u.Result));
                }
            };
        }
Beispiel #4
0
        public async void Download(int provider, string response, Dictionary <string, string> parameters, HttpListenerContext context)
        {
            var prov = GetProviderNameByID(db, provider);
            var res  = string.Empty;

            using (var fs = new Filesystem())
            {
                if (parameters.ContainsKey("chanlist"))
                {
                    var dir = string.Format("Download/channels/{0}", parameters["chanlist"]);
                    Directory.CreateDirectory(dir);

                    Task.Run(() => Console.WriteLine("Downloading Channel List for Provider: {0}", prov.Result));
                    var lists = db.SQLQuery <uint>(string.Format("SELECT * FROM channel_lists WHERE id='{0}' AND id != '0'", parameters["chanlist"])).Result;
                    if (lists.Count != 0)
                    {
                        for (var i = uint.MinValue; i < lists.Count; i++)
                        {
                            var hc = new HTTPClient(Functions.ReplaceAndFixNames(db, lists[i]["url"], false).Result);
                            hc.HTTPClientError    += (sender, e) => Console.WriteLine(e.Message);
                            hc.HTTPClientResponse += (sender, e) =>
                            {
                                hc.GetResponse(prov.Result);
                                if (e.Data.Length != 0)
                                {
                                    res = e.Data;
                                    fs.Write(fs.ResolvePath(Filesystem.Combine(dir,
                                                                               Functions.ReplaceAndFixNames(db, lists[i]["file"]).Result)), res);
                                }
                            };
                        }
                    }
                }
            }

            Task.Run(() => MakeResponse(provider, res, BackendAction.Download, parameters, context));
        }
Beispiel #5
0
        public Backend(int port = 81)
        {
            db          = new SQLDatabase("channels.db");
            HTTPSockets = new Dictionary <string, HTTPSocket>();

            HTTPSockets.Add("backend", new HTTPSocket("*", port, string.Empty));
            HTTPSockets.Add("website", new HTTPSocket("*", port + 1, string.Empty));
            HTTPSockets.Add("tsproxy", new HTTPSocket("*", port + 2, string.Empty));

            backend = new Network.Backend(ref db, this);
            backend.BackendResponse += (sender, e) =>
            {
                if (e.Context == null)
                {
                    return;
                }

                switch (e.Target)
                {
                case BackendTarget.Playlist:
                    e.Context.Response.StatusCode        = 200;
                    e.Context.Response.StatusDescription = "OK";
                    e.Context.Response.ContentType       = "application/x-mpegURL";
                    e.Context.Response.Headers.Add("Content-Disposition",
                                                   "attachment; filename=playlist.m3u8");
                    break;

                case BackendTarget.Epg:
                    e.Context.Response.StatusCode        = 200;
                    e.Context.Response.StatusDescription = "OK";
                    e.Context.Response.ContentType       = "application/gzip";
                    break;

                case BackendTarget.Channel:
                    break;

                case BackendTarget.TSProxy:
                    e.Context.Response.StatusCode        = 200;
                    e.Context.Response.StatusDescription = "OK";
                    e.Context.Response.ContentType       = "video/mp2t";
                    break;

                case BackendTarget.WebSite:
                case BackendTarget.Unknown:
                default:
                    break;
                }

                Task.Run(() => HTTPSockets["backend"].Send(
                             Encoding.UTF8.GetBytes(e.Response), e.Context)
                         );
            };

            HTTPSockets["tsproxy"].DataReceived += (sender, e) =>
            {
                using (var tsp = new Formats.TSDownloader())
                    tsp.Request(new Uri(e.Parameters["url"]), ref e.Context);
            };

            HTTPSockets["backend"].DataReceived += (sender, e) =>
            {
                switch (e.Target)
                {
                case BackendTarget.Playlist:
                    var evArgs = new BackendRequestEventArgs();
                    evArgs.Context    = e.Context;
                    evArgs.Target     = e.Target;
                    evArgs.Parameters = e.Parameters;

                    BackendRequest?.Invoke(this, evArgs);
                    break;

                case BackendTarget.Epg:
                    using (var fs = new Filesystem(""))
                    {
                        if (fs.Exists("epgdata.xml.gz"))
                        {
                            var data = fs.Read("epgdata.xml.gz").Result;

                            e.Context.Response.ContentType = "application/gzip";
                            e.Context.Response.Headers.Add("Content-Disposition",
                                                           "attachment; filename=epgdata.xml.gz");

                            e.Context.Response.StatusCode        = 200;
                            e.Context.Response.StatusDescription = "OK";

                            Task.Run(() => HTTPSockets["backend"].Send(data, e.Context));
                        }
                        else
                        {
                            e.Context.Response.StatusCode        = 503;
                            e.Context.Response.StatusDescription = "Service Unavailable";

                            Task.Run(() => HTTPSockets["backend"].Send(new byte[0], e.Context));
                        }
                    }

                    break;

                case BackendTarget.WebSite:
                case BackendTarget.Unknown:
                default:
                    e.Context.Response.StatusCode        = 404;
                    e.Context.Response.StatusDescription = "Not Found";
                    Task.Run(() => HTTPSockets["backend"].Send(e.Context.Response.StatusDescription, e.Context));
                    break;
                }
            };

            website = new WebSite(this);
            website.WebSiteResponse += (sender, e) =>
            {
                Task.Run(() => HTTPSockets["website"].Send(Encoding.UTF8.
                                                           GetBytes(e.Response), e.Context));
            };

            HTTPSockets["website"].DataReceived += (sender, e) =>
            {
                if (e.UserAgent.Contains("Kodi"))
                {
                    e.Context.Response.StatusCode        = 403;
                    e.Context.Response.StatusDescription = "Forbidden";

                    Task.Run(() => HTTPSockets["website"].Send(new byte[0], e.Context));

                    return;
                }

                var evArgs = new BackendRequestEventArgs();
                evArgs.Context    = e.Context;
                evArgs.Parameters = e.Parameters;
                evArgs.Target     = e.Target;

                WebSiteRequest?.Invoke(this, evArgs);
            };

            running = true;
            var t = new Thread(HeartBeat);

            t.IsBackground = true;

            t.Start();
        }
Beispiel #6
0
 public TemplateProvider()
 {
     fs = new Filesystem("");
 }
Beispiel #7
0
        async Task <Dictionary <string, List <epg_entry> > > ImportFormJson(string input, int list)
        {
            var epginfo = new Dictionary <string, List <epg_entry> >();

            using (var db = new SQLDatabase("channels.db"))
            {
                var url = db.SQLQuery(string.Format("SELECT infourl FROM epg_lists WHERE id='{0}' AND id != '0'", list), "infourl").Result;
                if (string.IsNullOrEmpty(url))
                {
                    return(epginfo);
                }

                var json_input = fix_json_input(input);
                var metadata   = JsonConvert.DeserializeObject <Dictionary <string, List <epg_entry> > >(json_input);
                if (metadata.Count != 0)
                {
                    foreach (var item in metadata.OrderBy(c => c.Key))
                    {
                        Task.Run(() =>
                        {
                            var dir           = string.Format("Download/epg/proginfo/{0}/{1}", list, item.Key);
                            var infolist      = new List <epg_entry>();
                            infolist.Capacity = ushort.MaxValue;

                            Directory.CreateDirectory(dir);

                            for (var i = 0; i < item.Value.Count; i++)
                            {
                                using (var fs = new Filesystem())
                                {
                                    var res    = string.Empty;
                                    var progid = item.Value[i].ProgID;

                                    var f = fs.ResolvePath(Filesystem.Combine(dir, string.Format("{0}.json", progid)));

                                    if (!fs.Exists(f) || fs.Length(f) == 0)
                                    {
                                        var hc = new HTTPClient(url.Replace("[#PROGID#]", progid));
                                        hc.GetResponse(item.Value[i].title);
                                        hc.HTTPClientResponse += (sender, e) =>
                                        {
                                            if (e.Data.Length != 0)
                                            {
                                                res = fix_json_input(e.Data);
                                                fs.Write(f, res);
                                            }
                                        };
                                    }
                                    else
                                    {
                                        res = fs.ReadText(f, Encoding.UTF8).Result;
                                    }

                                    if (!string.IsNullOrEmpty(res))
                                    {
                                        infolist.Add(JsonConvert.DeserializeObject <epg_entry>(res));
                                    }
                                }
                            }

                            epginfo.Add(item.Key, infolist);
                            infolist.Clear();
                        });
                    }

                    metadata.Clear();
                }
            }

            return(epginfo);
        }