using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Shared.Models.Base;
using Shared.Models.Events;
using Shared.Models.Module;
using Shared.Models.Module.Entrys;
using Shared.PlaywrightCore;
using System.Text;
using System.Web;
using IO = System.IO;
namespace SISI
{
public class SisiApiController : BaseController
{
#region sisi.js
[HttpGet]
[AllowAnonymous]
[Route("sisi.js")]
[Route("sisi/js/{token}")]
public ContentResult Sisi(string token, bool lite)
{
if (lite)
return Content(FileCache.ReadAllText("plugins/sisi.lite.js").Replace("{localhost}", host), "application/javascript; charset=utf-8");
var init = AppInit.conf.sisi;
var apr = init.appReplace ?? InvkEvent.conf?.Controller?.AppReplace?.sisi?.regex;
string memKey = $"sisi.js:{apr?.Count ?? 0}:{init.component}:{init.iconame}:{host}:{init.push_all}:{init.forced_checkRchtype}";
if (!memoryCache.TryGetValue(memKey, out (string file, string filecleaer) cache))
{
cache.file = FileCache.ReadAllText("plugins/sisi.js", saveCache: false)
.Replace("{rch_websoket}", FileCache.ReadAllText($"plugins/rch_{AppInit.conf.WebSocket.type}.js", saveCache: false));
#region appReplace
if (apr != null)
{
foreach (var r in apr)
{
string val = r.Value;
if (val.StartsWith("file:"))
val = IO.File.ReadAllText(val.Substring(5));
cache.file = Regex.Replace(cache.file, r.Key, val, RegexOptions.IgnoreCase);
}
}
if (InvkEvent.conf?.Controller?.AppReplace?.sisi?.list != null)
{
foreach (var r in InvkEvent.conf.Controller.AppReplace.sisi.list)
{
string val = r.Value;
if (val.StartsWith("file:"))
val = IO.File.ReadAllText(val.Substring(5));
cache.file = cache.file.Replace(r.Key, val);
}
}
#endregion
var bulder = new StringBuilder(cache.file);
if (!init.spider)
bulder = bulder.Replace("Lampa.Search.addSource(Search);", "");
if (init.component != "sisi")
{
bulder = bulder.Replace("use_api: 'lampac'", $"use_api: '{init.component}'");
bulder = bulder.Replace("'plugin_sisi_'", $"'plugin_{init.component}_'");
}
if (!string.IsNullOrEmpty(init.vipcontent))
bulder = bulder.Replace("var content = [^\n\r]+", init.vipcontent);
if (!string.IsNullOrEmpty(init.iconame))
{
bulder = bulder.Replace("Defined.use_api == 'pwa'", "true")
.Replace("'
p
'", $"'{init.iconame}
'");
}
bulder = bulder
.Replace("{invc-rch}", FileCache.ReadAllText("plugins/invc-rch.js", saveCache: false))
.Replace("{invc-rch_nws}", FileCache.ReadAllText("plugins/invc-rch_nws.js", saveCache: false))
.Replace("{push_all}", init.push_all.ToString().ToLower())
.Replace("{localhost}", host)
.Replace("{historySave}", AppInit.conf.sisi.history.enable.ToString().ToLower());
if (init.forced_checkRchtype)
bulder = bulder.Replace("window.rchtype", "Defined.rchtype");
cache.file = bulder.ToString();
cache.filecleaer = cache.file.Replace("{token}", string.Empty);
if (AppInit.conf.mikrotik == false)
memoryCache.Set(memKey, cache, DateTime.Now.AddMinutes(1));
}
if (InvkEvent.conf?.Controller?.AppReplace?.sisi?.eval != null)
{
string source = InvkEvent.AppReplace("sisi", new EventAppReplace(cache.file, token, null, host, requestInfo, HttpContext.Request, hybridCache));
return Content(source.Replace("{token}", HttpUtility.UrlEncode(token)), "application/javascript; charset=utf-8");
}
return Content(token != null ? cache.file.Replace("{token}", HttpUtility.UrlEncode(token)) : cache.filecleaer, "application/javascript; charset=utf-8");
}
#endregion
#region modification.js
[HttpGet]
[AllowAnonymous]
[Route("sisi/plugins/modification.js")]
public ActionResult SisiModification()
{
string file = FileCache.ReadAllText("wwwroot/sisi/plugins/modification.js");
if (!AppInit.conf.sisi.xdb)
file = file.Replace("addId();", "");
file = Regex.Replace(file, "\\{localhost\\}/?", $"{host}/sisi");
return Content(file, contentType: "application/javascript; charset=utf-8");
}
#endregion
[HttpGet]
[Route("sisi")]
async public ValueTask Index(string rchtype, string account_email, string uid, string token, bool spder)
{
var conf = AppInit.conf;
JObject kitconf = await loadKitConf();
bool lgbt = conf.sisi.lgbt;
if (kitconf != null && kitconf.Value("lgbt") == false)
lgbt = false;
var channels = new List(conf.sisi.NextHUB ? 50 : 20)
{
new ChannelItem("Закладки", $"{host}/sisi/bookmarks", 0)
};
if (conf.sisi.history.enable)
channels.Add(new ChannelItem("История", $"{host}/sisi/historys", 1));
#region modules
SisiModuleEntry.EnsureCache();
if (SisiModuleEntry.sisiModulesCache != null && SisiModuleEntry.sisiModulesCache.Count > 0)
{
var args = new SisiEventsModel(rchtype, account_email, uid, token);
foreach (var entry in SisiModuleEntry.sisiModulesCache)
{
try
{
if (entry.Invoke != null)
{
try
{
var result = entry.Invoke(HttpContext, memoryCache, requestInfo, host, args);
if (result != null && result.Count > 0)
channels.AddRange(result);
}
catch { }
}
if (entry.InvokeAsync != null)
{
try
{
var result = await entry.InvokeAsync(HttpContext, memoryCache, requestInfo, host, args);
if (result != null && result.Count > 0)
channels.AddRange(result);
}
catch { }
}
if (entry.Events != null)
{
try
{
var result = entry.Events(host);
if (result != null && result.Count > 0)
channels.AddRange(result);
}
catch { }
}
}
catch (Exception ex) { Console.WriteLine($"Modules {entry.mod?.NamespacePath(entry.mod.sisi)}: {ex.Message}\n\n"); }
}
}
#endregion
#region send
void send(string name, BaseSettings _init, string plugin = null, int displayindex = -1, BaseSettings myinit = null)
{
var init = myinit != null ? _init : loadKit(_init, kitconf);
bool enable = init.enable && !init.rip;
if (!enable)
return;
if (spder == true && init.spider != true)
return;
if (rchtype != null)
{
if (init.client_type != null && !init.client_type.Contains(rchtype))
return;
string rch_deny = init.RchAccessNotSupport();
if (rch_deny != null && rch_deny.Contains(rchtype))
return;
string stream_deny = init.StreamAccessNotSupport();
if (stream_deny != null && stream_deny.Contains(rchtype))
return;
if (init.rhub && !init.rhub_fallback && !init.corseu && string.IsNullOrWhiteSpace(init.webcorshost))
{
if (init.rhub_geo_disable != null &&
requestInfo.Country != null &&
init.rhub_geo_disable.Contains(requestInfo.Country))
{
return;
}
}
}
if (init.geo_hide != null &&
requestInfo.Country != null &&
init.geo_hide.Contains(requestInfo.Country))
{
return;
}
if (init.group > 0 && init.group_hide)
{
var user = requestInfo.user;
if (user == null || init.group > user.group)
return;
}
string url = string.Empty;
if (string.IsNullOrEmpty(init.overridepasswd))
{
url = init.overridehost;
if (string.IsNullOrEmpty(url) && init.overridehosts != null && init.overridehosts.Length > 0)
url = init.overridehosts[Random.Shared.Next(0, init.overridehosts.Length)];
}
string displayname = init.displayname ?? name;
if (string.IsNullOrEmpty(url))
url = $"{host}/{plugin ?? name.ToLower()}";
if (displayindex == -1)
{
displayindex = init.displayindex;
if (displayindex == 0)
displayindex = 20 + channels.Count;
}
channels.Add(new ChannelItem(init.displayname ?? name, url, displayindex));
}
#endregion
#region NextHUB
if (conf.sisi.NextHUB)
{
foreach (string inFile in Directory.GetFiles("NextHUB/sites", "*.yaml"))
{
try
{
if (inFile.Contains(".my."))
continue;
string plugin = Path.GetFileNameWithoutExtension(inFile);
if (!lgbt && plugin == "gayporntube")
continue;
var init = Controllers.NextHUB.Root.goInit(plugin);
if (init == null)
continue;
if (init.debug)
Console.WriteLine("\n" + JsonConvert.SerializeObject(init, Formatting.Indented));
init = await loadKit(init);
if (PlaywrightBrowser.Status == PlaywrightStatus.disabled || init.rhub)
{
if (init.priorityBrowser != "http" || (init.view != null && init.view.viewsource == false))
{
if (AppInit.conf.multiaccess == false)
Console.WriteLine($"NextHUB: {plugin} - Playwright is disabled, skipping.");
continue;
}
}
send(Regex.Replace(init.host, "^https?://", ""), init, $"nexthub?plugin={plugin}", myinit: init);
}
catch (YamlDotNet.Core.YamlException ex)
{
Console.WriteLine($"\nОшибка: {ex.Message}\nфайл: {Path.GetFileName(inFile)}\nстрока: {ex.Start.Line}");
}
catch (Exception ex) { Console.WriteLine($"NextHUB: error DeserializeObject {inFile}\n {ex.Message}"); }
}
}
#endregion
send("pornhubpremium.com", conf.PornHubPremium, "phubprem"); // !rhub
send("pornhub.com", conf.PornHub, "phub");
send("xvideos.com", conf.Xvideos, "xds");
send("xhamster.com", conf.Xhamster, "xmr");
send("ebalovo.porn", conf.Ebalovo, "elo");
send("hqporner.com", conf.HQporner, "hqr");
if (conf.Spankbang.priorityBrowser == "http" || conf.Spankbang.rhub || PlaywrightBrowser.Status != PlaywrightStatus.disabled || !string.IsNullOrEmpty(conf.Spankbang.overridehost) || conf.Spankbang.overridehosts?.Length > 0)
send("spankbang.com", conf.Spankbang, "sbg");
send("eporner.com", conf.Eporner, "epr");
send("porntrex.com", conf.Porntrex, "ptx");
send("xdsred", conf.XvideosRED, "xdsred"); // !rhub
send("xnxx.com", conf.Xnxx, "xnx");
send("tizam.pw", conf.Tizam, "tizam");
if (conf.BongaCams.priorityBrowser == "http" || conf.BongaCams.rhub || PlaywrightBrowser.Status != PlaywrightStatus.disabled || !string.IsNullOrEmpty(conf.BongaCams.overridehost) || conf.BongaCams.overridehosts?.Length > 0)
send("bongacams.com", conf.BongaCams, "bgs");
if (conf.Runetki.priorityBrowser == "http" || conf.Runetki.rhub || PlaywrightBrowser.Status != PlaywrightStatus.disabled || !string.IsNullOrEmpty(conf.Runetki.overridehost) || conf.Runetki.overridehosts?.Length > 0)
send("runetki.com", conf.Runetki, "runetki");
send("chaturbate.com", conf.Chaturbate, "chu");
if (lgbt)
{
send("phubgay", conf.PornHub, "phubgay", 10_100);
send("phubtrans", conf.PornHub, "phubsml", 10_101);
send("xdsgay", conf.Xvideos, "xdsgay", 10_102);
send("xdstrans", conf.Xvideos, "xdssml", 10_103);
send("xmrgay", conf.Xhamster, "xmrgay", 10_104);
send("xmrtrans", conf.Xhamster, "xmrsml", 10_105);
}
if (conf.sisi.xdb)
{
try
{
var ch = await Http.Get("https://vi.sisi.am", timeoutSeconds: 4);
foreach (var pl in ch.GetValue("channels"))
{
string title = pl.Value("title").Replace("pornhubpremium.com", "phubprem.com");
string playlist_url = pl.Value("playlist_url");
if (playlist_url.Contains("/bookmarks"))
continue;
if (channels.FirstOrDefault(i => i.title == title).title != null)
continue;
channels.Add(new ChannelItem(title, playlist_url, 20 + channels.Count));
}
}
catch { }
}
return Json(new
{
title = "sisi",
channels = channels.OrderBy(i => i.displayindex)
});
}
}
}