public WebSiteHub(Network.WebSite website) { template = new TemplateProvider(); website.WebSiteHubRequest += (sender, e) => { var evArgs = new WebSiteHubResponseEventArgs(); evArgs.Response = template.ReadTemplate("site_content"); evArgs.Context = e.Context; WebSiteHubResponse?.Invoke(this, evArgs); }; }
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(); }