| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- using System.Text;
- using System.Text.Json;
- using System.Text.RegularExpressions;
- var builder = WebApplication.CreateBuilder(args);
- var app = builder.Build();
- string? m3u = null;
- string? xml = null;
- DateTime lastParsed = DateTime.MinValue;
- bool stillParsing = false;
- Dictionary<int, string> channels = [];
- if (Environment.GetCommandLineArgs().Length < 2) return;
- var HOST = Environment.GetCommandLineArgs()[1];
- async Task Parse(bool force = false) {
- if (stillParsing) return;
- if (!force && (DateTime.Now - lastParsed).TotalMinutes < 15 && m3u != null && xml != null) return;
- stillParsing = true;
- var client = new HttpClient();
- var jsonString = await client.GetStringAsync(@"https://ppv.to/api/streams");
- using var doc = JsonDocument.Parse(jsonString);
- var categories = doc.RootElement.GetProperty("streams").EnumerateArray();
- m3u = "#EXTM3U\n";
- xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><tv>\n";
- foreach (var category in categories) {
- var streams = category.GetProperty("streams").EnumerateArray();
- foreach (var stream in streams) {
- if (stream.GetProperty("always_live").GetInt32() == 1) continue;
- var iframe = stream.GetProperty("iframe").GetString();
- var name = stream.GetProperty("name").GetString();
- var id = stream.GetProperty("id").GetInt32();
- var tag = stream.GetProperty("tag").GetString();
- var poster = stream.GetProperty("poster").GetString();
- var cat = stream.GetProperty("category_name").GetString();
- var startUnix = stream.GetProperty("starts_at").GetInt64();
- var endUnix = stream.GetProperty("ends_at").GetInt64();
- // if (DateTimeOffset.FromUnixTimeSeconds(startUnix).AddHours(-4) > DateTimeOffset.UtcNow) continue;
- var thisM3u = "\n";
- thisM3u += $"#EXTINF:-1 tvg-name=\"{name}\" tvg-id=\"{id}\" tvg-chno=\"{id}\" tvg-logo=\"{poster}\" tvg-group=\"{cat}\",{tag}\n";
- thisM3u += $"#EXTVLCOPT:http-origin=\"https://ppv.to\"\n";
- thisM3u += $"#EXTVLCOPT:http-referrer=\"https://ppv.to\"\n";
- thisM3u += $"#EXTVLCOPT:http-user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:138.0) Gecko/20100101 Firefox/138.0\"\n";
- thisM3u += $"{HOST}/stream/{id}.m3u8\n";
- m3u += thisM3u;
- var start = DateTimeOffset.FromUnixTimeSeconds(startUnix).ToString("yyyyMMddHHmmss +0000");
- var end = DateTimeOffset.FromUnixTimeSeconds(endUnix).ToString("yyyyMMddHHmmss +0000");
- xml += $"<channel id=\"{id}\"><display-name>{tag}</display-name><icon src=\"\"/></channel>\n";
- xml += $"<programme start=\"{start}\" stop=\"{end}\" channel=\"{id}\"><title>{name}</title><desc>{cat}</desc></programme>\n";
- channels[id] = iframe!;
- }
- }
- xml += "</tv>";
- stillParsing = false;
- }
- app.MapGet("stream/{idFile}", async (string idFile) => {
- var id = int.Parse(idFile.Split('.')[0]);
- var client = new HttpClient();
- var embed = await client.GetStringAsync(channels[id]);
- var matches = Regex.Matches(embed, "atob\\(\"([^\"]+)\"\\);");
- foreach (Match match in matches) {
- var url = Encoding.ASCII.GetString(Convert.FromBase64String(match.Groups[1].Value));
- // url = url.Replace("index.m3u8", "tracks-v1a1/mono.ts.m3u8");
- if (url.Contains(".m3u8")) {
- return Results.Redirect(url, false, true);
- }
- }
- return Results.NotFound();
- });
- app.MapGet("/m3u", async (bool force = false) => {
- await Parse();
- return Results.Text(m3u, "application/vnd.apple.mpegurl");
- });
- app.MapGet("/xml", async (bool force = false) => {
- await Parse();
- return Results.Text(xml, "application/xml");
- });
- app.Run();
|