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; } }; }
public SQLDatabase(string database) { var dataBase = Filesystem.Combine(Environment.CurrentDirectory, database); sqlConn = new SQLiteConnection(string.Format("Data Source={0};Version=3;", dataBase)); Open(); }
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)); } }; }
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)); }
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(); }
public TemplateProvider() { fs = new Filesystem(""); }
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); }