1333 lines
55 KiB
C#
1333 lines
55 KiB
C#
using Microsoft.AspNetCore.Http;
|
||
using Microsoft.AspNetCore.ResponseCompression;
|
||
using Newtonsoft.Json;
|
||
using Shared.Engine;
|
||
using Shared.Engine.Utilities;
|
||
using Shared.Models;
|
||
using Shared.Models.AppConf;
|
||
using Shared.Models.Base;
|
||
using Shared.Models.Browser;
|
||
using Shared.Models.DLNA;
|
||
using Shared.Models.Merchant;
|
||
using Shared.Models.Module;
|
||
using Shared.Models.Online.Settings;
|
||
using Shared.Models.ServerProxy;
|
||
using Shared.Models.SISI.Base;
|
||
using System.Reflection;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading;
|
||
using YamlDotNet.Serialization;
|
||
|
||
namespace Shared
|
||
{
|
||
public class AppInit
|
||
{
|
||
#region static
|
||
public static string rootPasswd;
|
||
|
||
public static readonly HashSet<string> CompressionMimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(["image/svg+xml"]).ToHashSet();
|
||
|
||
public static bool Win32NT => Environment.OSVersion.Platform == PlatformID.Win32NT;
|
||
|
||
public static bool IsDefaultApnOrCors(string apn) => apn != null && Regex.IsMatch(apn, "(apn.monster|apn.watch|cfhttp.top|lampac.workers.dev)");
|
||
|
||
static FileSystemWatcher fileWatcher;
|
||
|
||
static AppInit()
|
||
{
|
||
updateConf();
|
||
if (File.Exists("init.conf"))
|
||
lastUpdateConf = File.GetLastWriteTime("init.conf");
|
||
|
||
updateYamlConf();
|
||
if (File.Exists("init.yaml") && File.GetLastWriteTime("init.yaml") > lastUpdateConf)
|
||
lastUpdateConf = File.GetLastWriteTime("init.yaml");
|
||
|
||
LoadModules();
|
||
|
||
#region watcherInit
|
||
if (conf.watcherInit == "system")
|
||
{
|
||
fileWatcher = new FileSystemWatcher
|
||
{
|
||
Path = Directory.GetCurrentDirectory(),
|
||
Filter = "init.conf",
|
||
NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite,
|
||
EnableRaisingEvents = true
|
||
};
|
||
|
||
fileWatcher.Changed += async (s, e) =>
|
||
{
|
||
fileWatcher.EnableRaisingEvents = false;
|
||
|
||
try
|
||
{
|
||
await Task.Delay(200);
|
||
updateConf();
|
||
updateYamlConf();
|
||
}
|
||
catch { }
|
||
finally
|
||
{
|
||
fileWatcher.EnableRaisingEvents = true;
|
||
}
|
||
};
|
||
}
|
||
else
|
||
{
|
||
ThreadPool.QueueUserWorkItem(async _ =>
|
||
{
|
||
while (true)
|
||
{
|
||
await Task.Delay(TimeSpan.FromSeconds(1));
|
||
|
||
try
|
||
{
|
||
if (File.Exists("init.conf"))
|
||
{
|
||
var lwtConf = File.GetLastWriteTime("init.conf");
|
||
var lwtYaml = File.GetLastWriteTime("init.yaml");
|
||
|
||
if (lwtConf > lastUpdateConf || lwtYaml > lastUpdateConf)
|
||
{
|
||
updateConf();
|
||
updateYamlConf();
|
||
|
||
lastUpdateConf = lwtConf > lwtYaml ? lwtConf : lwtYaml;
|
||
|
||
try
|
||
{
|
||
|
||
string init = JsonConvert.SerializeObject(conf, Formatting.Indented, new JsonSerializerSettings()
|
||
{
|
||
NullValueHandling = NullValueHandling.Ignore,
|
||
DefaultValueHandling = DefaultValueHandling.Ignore
|
||
});
|
||
|
||
Directory.CreateDirectory("database/backup/init");
|
||
File.WriteAllText($"database/backup/init/{DateTime.Now.ToString("dd-MM-yyyy.HH")}.conf", init);
|
||
}
|
||
catch { }
|
||
}
|
||
}
|
||
}
|
||
catch { }
|
||
}
|
||
});
|
||
}
|
||
#endregion
|
||
}
|
||
#endregion
|
||
|
||
public readonly string guid = Guid.NewGuid().ToString();
|
||
|
||
#region conf
|
||
static DateTime lastUpdateConf = default;
|
||
|
||
public static AppInit conf = null;
|
||
|
||
static void updateConf()
|
||
{
|
||
if (!File.Exists("init.conf"))
|
||
{
|
||
conf = new AppInit();
|
||
return;
|
||
}
|
||
|
||
string initfile = File.ReadAllText("init.conf").Trim();
|
||
initfile = Regex.Replace(initfile, "\"weblog\":([ \t]+)?(true|false)([ \t]+)?,", "", RegexOptions.IgnoreCase);
|
||
|
||
if (!initfile.StartsWith("{"))
|
||
initfile = "{" + initfile + "}";
|
||
|
||
try
|
||
{
|
||
conf = JsonConvert.DeserializeObject<AppInit>(initfile, new JsonSerializerSettings
|
||
{
|
||
Error = (se, ev) =>
|
||
{
|
||
ev.ErrorContext.Handled = true;
|
||
Console.WriteLine($"DeserializeObject Exception init.conf:\n{ev.ErrorContext.Error}\n\n");
|
||
}
|
||
});
|
||
}
|
||
catch { }
|
||
|
||
if (conf == null)
|
||
conf = new AppInit();
|
||
|
||
PosterApi.Initialization(conf.omdbapi_key, conf.posterApi, new ProxyLink());
|
||
|
||
#region accounts
|
||
if (conf.accsdb.accounts != null)
|
||
{
|
||
foreach (var u in conf.accsdb.accounts)
|
||
{
|
||
if (conf.accsdb.findUser(u.Key) is AccsUser user)
|
||
{
|
||
if (u.Value > user.expires)
|
||
user.expires = u.Value;
|
||
}
|
||
else
|
||
{
|
||
conf.accsdb.users.Add(new AccsUser()
|
||
{
|
||
id = u.Key.ToLowerAndTrim(),
|
||
expires = u.Value
|
||
});
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region users.txt
|
||
if (File.Exists("merchant/users.txt"))
|
||
{
|
||
long utc = DateTime.UtcNow.ToFileTimeUtc();
|
||
foreach (string line in File.ReadAllLines("merchant/users.txt"))
|
||
{
|
||
if (string.IsNullOrWhiteSpace(line) && !line.Contains("@"))
|
||
continue;
|
||
|
||
var data = line.Split(',');
|
||
if (data.Length > 1)
|
||
{
|
||
if (long.TryParse(data[1], out long ex) && ex > utc)
|
||
{
|
||
try
|
||
{
|
||
DateTime e = DateTime.FromFileTimeUtc(ex);
|
||
string email = data[0].ToLowerAndTrim();
|
||
|
||
if (conf.accsdb.findUser(email) is AccsUser user)
|
||
{
|
||
if (e > user.expires)
|
||
user.expires = e;
|
||
|
||
user.group = conf.Merchant.defaultGroup;
|
||
}
|
||
else
|
||
{
|
||
conf.accsdb.users.Add(new AccsUser()
|
||
{
|
||
id = email,
|
||
expires = e,
|
||
group = conf.Merchant.defaultGroup
|
||
});
|
||
}
|
||
}
|
||
catch { }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
try
|
||
{
|
||
File.WriteAllText("current.conf", JsonConvert.SerializeObject(conf, Formatting.Indented));
|
||
}
|
||
catch { }
|
||
}
|
||
|
||
static void updateYamlConf()
|
||
{
|
||
if (conf == null)
|
||
return;
|
||
|
||
try
|
||
{
|
||
if (File.Exists("init.yaml"))
|
||
{
|
||
string yaml = File.ReadAllText("init.yaml");
|
||
if (!string.IsNullOrWhiteSpace(yaml))
|
||
{
|
||
var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();
|
||
var yamlObject = deserializer.Deserialize(new StringReader(yaml));
|
||
if (yamlObject != null)
|
||
{
|
||
string json = JsonConvertPool.SerializeObject(yamlObject);
|
||
JsonConvert.PopulateObject(json, conf, new JsonSerializerSettings
|
||
{
|
||
Error = (se, ev) =>
|
||
{
|
||
ev.ErrorContext.Handled = true;
|
||
Console.WriteLine($"DeserializeObject Exception init.yaml:\n{ev.ErrorContext.Error}\n\n");
|
||
}
|
||
});
|
||
|
||
try
|
||
{
|
||
File.WriteAllText("current.conf", JsonConvert.SerializeObject(conf, Formatting.Indented));
|
||
}
|
||
catch { }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine($"DeserializeObject Exception init.yaml:\n{ex}\n\n");
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region Host
|
||
public static string Host(HttpContext httpContext)
|
||
{
|
||
string scheme = string.IsNullOrEmpty(conf.listen.scheme) ? httpContext.Request.Scheme : conf.listen.scheme;
|
||
if (httpContext.Request.Headers.TryGetValue("xscheme", out var xscheme) && !string.IsNullOrEmpty(xscheme))
|
||
scheme = xscheme;
|
||
|
||
if (!string.IsNullOrEmpty(conf.listen.host))
|
||
return $"{scheme}://{conf.listen.host}";
|
||
|
||
if (httpContext.Request.Headers.TryGetValue("xhost", out var xhost))
|
||
return $"{scheme}://{Regex.Replace(xhost, "^https?://", "")}";
|
||
|
||
return $"{scheme}://{httpContext.Request.Host.Value}";
|
||
}
|
||
#endregion
|
||
|
||
#region modules
|
||
public static List<RootModule> modules;
|
||
|
||
public static void LoadModules()
|
||
{
|
||
if (modules != null)
|
||
return;
|
||
|
||
if (File.Exists("module/manifest.json"))
|
||
{
|
||
var jss = new JsonSerializerSettings { Error = (se, ev) =>
|
||
{
|
||
ev.ErrorContext.Handled = true;
|
||
Console.WriteLine("module/manifest.json - " + ev.ErrorContext.Error + "\n\n");
|
||
}};
|
||
|
||
var mods = JsonConvert.DeserializeObject<List<RootModule>>(File.ReadAllText("module/manifest.json"), jss);
|
||
if (mods == null)
|
||
return;
|
||
|
||
modules = new List<RootModule>();
|
||
foreach (var mod in mods)
|
||
{
|
||
if (!mod.enable || mod.dll == "Jackett.dll")
|
||
continue;
|
||
|
||
string path = File.Exists(mod.dll) ? mod.dll : $"{Environment.CurrentDirectory}/module/{mod.dll}";
|
||
if (File.Exists(path))
|
||
{
|
||
try
|
||
{
|
||
mod.assembly = Assembly.LoadFile(path);
|
||
mod.index = mod.index != 0 ? mod.index : (100 + modules.Count);
|
||
modules.Add(mod);
|
||
}
|
||
catch { }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region server
|
||
public ListenConf listen = new ListenConf()
|
||
{
|
||
localhost = "127.0.0.1",
|
||
ip = "any", port = 9118,
|
||
compression = true,
|
||
frontend = null // cloudflare|nginx
|
||
};
|
||
|
||
public bool multiaccess = false;
|
||
|
||
public bool useDeveloperExceptionPage = false;
|
||
|
||
public bool mikrotik = false;
|
||
|
||
public string watcherInit = "cron";// system
|
||
|
||
public string imagelibrary = "NetVips"; // NetVips|ImageMagick|none
|
||
|
||
public bool pirate_store = true;
|
||
|
||
public string apikey = null;
|
||
|
||
public bool litejac = true;
|
||
|
||
public bool filelog = false;
|
||
|
||
public bool disableEng = false;
|
||
|
||
public bool always_rjson = false;
|
||
|
||
public string anticaptchakey;
|
||
|
||
public string omdbapi_key;
|
||
|
||
public string playerInner;
|
||
|
||
public string defaultOn = "enable";
|
||
|
||
public string corsehost { get; set; } = "https://cors.apn.monster";
|
||
|
||
public BaseModule BaseModule { get; set; } = new BaseModule()
|
||
{
|
||
nws = true,
|
||
ws = true,
|
||
kurwaCron = true,
|
||
allowExternalIpAccessToLocalRequest = false,
|
||
EnableControllers = ["Admin", "Bookmark", "Chromium", "Cmd", "PlayerInner", "Corseu", "Media", "ErrorDoc", "Cub", "LampaWeb", "RchApi", "Storage", "SyncApi", "Timecode", "Tmdb", "WebLog"],
|
||
Middlewares = new BaseModuleMiddlewares()
|
||
{
|
||
proxy = true,
|
||
proxyimg = true,
|
||
proxytmdb = true,
|
||
proxycub = true,
|
||
staticFiles = true,
|
||
unknownStaticFiles = true,
|
||
statistics = true,
|
||
staticache = true,
|
||
module = true
|
||
},
|
||
Sql = new BaseModuleSql()
|
||
{
|
||
externalids = true,
|
||
sisi = true,
|
||
syncUser = true
|
||
}
|
||
};
|
||
|
||
public CorseuConf corseu { get; set; } = new CorseuConf();
|
||
|
||
public MediaApiConf media { get; set; } = new MediaApiConf();
|
||
|
||
public ApnConf apn { get; set; } = new ApnConf() { secure = "none" };
|
||
|
||
public Dictionary<string, CmdConf> cmd = new Dictionary<string, CmdConf>();
|
||
|
||
public PosterApiConf posterApi = new PosterApiConf()
|
||
{
|
||
rsize = true, width = 210,
|
||
bypass = "statichdrezka\\."
|
||
};
|
||
|
||
public WsConf WebSocket = new WsConf()
|
||
{
|
||
type = "nws", // signalr|nws
|
||
inactiveAfterMinutes = 120
|
||
};
|
||
|
||
public KitConf kit = new KitConf()
|
||
{
|
||
cacheToSeconds = 60 * 60 * 3, // 3h
|
||
configCheckIntervalSeconds = 20
|
||
};
|
||
|
||
public SyncConf sync = new SyncConf();
|
||
|
||
public HybridCacheConf cache = new HybridCacheConf()
|
||
{
|
||
type = "fdb", // mem|fdb|sql|hybrid
|
||
extend = -1, // seconds
|
||
reqIPs = 5
|
||
};
|
||
|
||
public StaticacheConf Staticache { get; set; } = new StaticacheConf();
|
||
|
||
public WafConf WAF = new WafConf()
|
||
{
|
||
enable = true,
|
||
bypassLocalIP = true,
|
||
bruteForceProtection = true,
|
||
limit_map = new Dictionary<string, WafLimitMap>()
|
||
{
|
||
["^/(proxy|tmdb|cub|transcoding|dlna|ts)"] = new WafLimitMap() { limit = 50, second = 1 },
|
||
["^/nexthub"] = new WafLimitMap() { limit = 5, second = 1, queryIds = ["plugin"] },
|
||
["^/(sisi|bgs|chu|runetki|elo|epr|hqr|phub|ptx|sbg|tizam|xmr|xnx|xds)"] = new WafLimitMap() { limit = 5, second = 1, pathId = true },
|
||
["^/lite/"] = new WafLimitMap() { limit = 10, second = 1 },
|
||
["^/(rch|timecode|storage|bookmark)/"] = new WafLimitMap() { limit = 10, second = 1, pathId = true },
|
||
[".*"] = new WafLimitMap() { limit = 10, second = 1 }
|
||
}
|
||
};
|
||
|
||
public WebLogConf weblog = new WebLogConf();
|
||
|
||
public OpenStatConf openstat = new OpenStatConf();
|
||
|
||
public RchConf rch = new RchConf()
|
||
{
|
||
enable = true
|
||
};
|
||
|
||
public SyncUserConf sync_user = new SyncUserConf() { enable = true, version = 2 };
|
||
|
||
public StorageConf storage = new StorageConf() { enable = true, max_size = 7_000000, brotli = false, md5name = true };
|
||
|
||
public GCConf GC { get; set; } = new GCConf()
|
||
{
|
||
enable = true,
|
||
|
||
// false - GC старается возвращать высвобождённую виртуальную память ОС
|
||
// true - GC сохраняет адресное пространство/сегменты, чтобы быстрее переиспользовать
|
||
RetainVM = false,
|
||
|
||
// false — только Stop-the-World сборки
|
||
// true — фоновые (concurrent) сборки
|
||
Concurrent = null,
|
||
|
||
// 1 — минимальная экономия памяти, крупные поколения
|
||
// 9 — максимальная экономия, маленькие поколения, частые GC
|
||
ConserveMemory = null,
|
||
|
||
// Процент доступной памяти, после которого GC считает систему под давлением
|
||
// Ниже значение — раньше и агрессивнее запускаются сборки
|
||
HighMemoryPercent = 90
|
||
};
|
||
|
||
public PuppeteerConf chromium = new PuppeteerConf()
|
||
{
|
||
enable = true, Headless = true,
|
||
Args = ["--disable-blink-features=AutomationControlled"], // , "--window-position=-2000,100"
|
||
context = new KeepopenContext() { keepopen = true, keepalive = 20, min = 0, max = 4 }
|
||
};
|
||
|
||
public PuppeteerConf firefox = new PuppeteerConf()
|
||
{
|
||
enable = false, Headless = true,
|
||
context = new KeepopenContext() { keepopen = true, keepalive = 20, min = 1, max = 2 }
|
||
};
|
||
|
||
public FfprobeSettings ffprobe = new FfprobeSettings() { enable = true };
|
||
|
||
public TranscodingConf transcoding { get; set; } = new TranscodingConf()
|
||
{
|
||
tempRoot = Path.Combine("cache", "transcoding"),
|
||
idleTimeoutSec = 60 * 5, idleTimeoutSec_live = 120,
|
||
maxConcurrentJobs = 5
|
||
};
|
||
|
||
public CubConf cub { get; set; } = new CubConf()
|
||
{
|
||
enable = false, viewru = true,
|
||
responseContentLength = true,
|
||
domain = CrypTo.DecodeBase64("Y3ViLnJlZA=="), scheme = "http",
|
||
mirror = "mirror-kurwa.men",
|
||
cache_api = 180, cache_img = 120,
|
||
};
|
||
|
||
public TmdbConf tmdb { get; set; } = new TmdbConf()
|
||
{
|
||
enable = true,
|
||
responseContentLength = true,
|
||
httpversion = 2, DNS_TTL = 20,
|
||
cache_api = 240, cache_img = 60,
|
||
api_key = "4ef0d7355d9ffb5151e987764708ce96"
|
||
};
|
||
|
||
public ServerproxyConf serverproxy = new ServerproxyConf()
|
||
{
|
||
enable = true, verifyip = true,
|
||
encrypt = true, encrypt_aes = true,
|
||
responseContentLength = true,
|
||
buffering = new ServerproxyBufferingConf()
|
||
{
|
||
enable = true,
|
||
rent = 64 * 1024, // 64кб
|
||
length = 256 // rent * 256 = ~16 MB
|
||
},
|
||
image = new ServerproxyImageConf()
|
||
{
|
||
cache = true,
|
||
cache_rsize = true,
|
||
cache_time = 60, // minute
|
||
noSqlDb = true // не хранить ProxyLink в sql
|
||
},
|
||
maxlength_m3u = 5000000, // 5mb
|
||
maxlength_ts = 40000000 // 40mb
|
||
};
|
||
|
||
public FileCacheConf fileCacheInactive = new FileCacheConf()
|
||
{
|
||
hls = 90, html = 5, torrent = 2880 // minute
|
||
};
|
||
|
||
public DLNASettings dlna = new DLNASettings()
|
||
{
|
||
enable = true, path = "dlna",
|
||
uploadSpeed = 125000 * 10,
|
||
autoupdatetrackers = true, intervalUpdateTrackers = 90, addTrackersToMagnet = true,
|
||
mediaPattern = "^\\.(aac|flac|mpga|mpega|mp2|mp3|m4a|oga|ogg|opus|spx|opus|weba|wav|dif|dv|fli|mp4|mpeg|mpg|mpe|mpv|mkv|ts|m4s|m2ts|mts|ogv|webm|avi|qt|mov)$",
|
||
cover = new CoverSettings()
|
||
{
|
||
enable = true, preview = true,
|
||
timeout = 20, skipModificationTime = 60,
|
||
priorityClass = System.Diagnostics.ProcessPriorityClass.Idle,
|
||
extension = "(mp4|mkv|avi|mpg|mpe|mpv)",
|
||
coverComand = "-n -ss 3:00 -i \"{file}\" -vf \"thumbnail=150,scale=400:-2\" -frames:v 1 \"{thumb}\"",
|
||
// фрэмрэйт -r : больше - больше файл , плавнее движения
|
||
// качество -crf : больше - меньше файл , появляются артефакты
|
||
previewComand = "-n -ss 00:03:00 -to 00:03:07 -i \"{file}\" -ss 00:04:37 -to 00:04:44 -i \"{file}\" -ss 00:06:41 -to 00:06:48 -i \"{file}\" -ss 00:09:20 -to 00:09:27 -i \"{file}\" -ss 00:12:45 -to 00:12:52 -i \"{file}\" -ss 00:17:09 -to 00:17:16 -i \"{file}\" -ss 00:22:50 -to 00:22:57 -i \"{file}\" -ss 00:29:51 -to 00:29:58 -i \"{file}\" -ss 00:39:23 -to 00:39:30 -i \"{file}\" -ss 00:51:44 -to 00:51:51 -i \"{file}\" -ss 01:07:45 -to 01:07:52 -i \"{file}\" -ss 01:20:33 -to 01:20:40 -i \"{file}\" -filter_complex \"[0:v]setpts=0.5*PTS,scale=-2:240[v0];[1:v]setpts=0.5*PTS,scale=-2:240[v1];[2:v]setpts=0.5*PTS,scale=-2:240[v2];[3:v]setpts=0.5*PTS,scale=-2:240[v3];[4:v]setpts=0.5*PTS,scale=-2:240[v4];[5:v]setpts=0.5*PTS,scale=-2:240[v5];[6:v]setpts=0.5*PTS,scale=-2:240[v6];[7:v]setpts=0.5*PTS,scale=-2:240[v7];[8:v]setpts=0.5*PTS,scale=-2:240[v8];[9:v]setpts=0.5*PTS,scale=-2:240[v9];[10:v]setpts=0.5*PTS,scale=-2:240[v10];[11:v]setpts=0.5*PTS,scale=-2:240[v11];[v0][v1][v2][v3][v4][v5][v6][v7][v8][v9][v10][v11]concat=n=12:v=1:a=0\" -an -r 20 -c:v libx264 -crf 28 -preset veryslow \"{preview}\""
|
||
}
|
||
};
|
||
|
||
public WebConf LampaWeb = new WebConf()
|
||
{
|
||
autoupdate = true,
|
||
intervalupdate = 90, // minute
|
||
basetag = true, index = "lampa-main/index.html",
|
||
git = "yumata/lampa",
|
||
tree = "978b95a8f808cca7f24add2337d55ebf1effc411"
|
||
};
|
||
|
||
public OnlineConf online = new OnlineConf()
|
||
{
|
||
findkp = "all", checkOnlineSearch = true,
|
||
spider = true, spiderName = "Spider",
|
||
component = "lampac", name = "Lampac", description = "Плагин для просмотра онлайн сериалов и фильмов",
|
||
version = true, btn_priority_forced = true, showquality = true,
|
||
with_search = new List<string>() { "kinotochka", "kinobase", "kinopub", "lumex", "filmix", "filmixtv", "fxapi", "redheadsound", "animevost", "animego", "animedia", "animebesst", "anilibria", "aniliberty", "rezka", "rhsprem", "kodik", "remux", "animelib", "kinoukr", "rc/filmix", "rc/fxapi", "rc/rhs", "vcdn", "videocdn", "lumex", "collaps", "collaps-dash", "vdbmovies", "hdvb", "alloha", "veoveo", "rutubemovie", "vkmovie" }
|
||
};
|
||
|
||
public SisiConf sisi { get; set; } = new SisiConf()
|
||
{
|
||
NextHUB = true, spider = true, lgbt = true,
|
||
component = "sisi", iconame = "", push_all = true,
|
||
heightPicture = 240, rsize = true, rsize_disable = ["Chaturbate", "PornHub", "PornHubPremium", "HQporner", "Spankbang", "Eporner", "Porntrex", "Xnxx", "Porndig", "Youjizz", "Veporn", "Pornk"],
|
||
bookmarks = new BookmarksConf() { saveimage = true, savepreview = true },
|
||
history = new HistoryConf() { enable = true, days = 30 }
|
||
};
|
||
|
||
public AccsConf accsdb = new AccsConf()
|
||
{
|
||
authMesage = "Войдите в аккаунт - настройки, синхронизация",
|
||
denyMesage = "Добавьте {account_email} в init.conf или через {host}/admin",
|
||
denyGroupMesage = "У вас нет прав для просмотра этой страницы",
|
||
expiresMesage = "Время доступа для {account_email} истекло в {expires}",
|
||
maxip_hour = 10, maxrequest_hour = 400, maxlock_day = 3, blocked_hour = 36,
|
||
shared_daytime = 366*10, // 10 years
|
||
};
|
||
|
||
public MerchantsModel Merchant = new MerchantsModel();
|
||
|
||
public VastConf vast = new VastConf();
|
||
|
||
/// <summary>
|
||
/// https://infocisco.ru/prefix_network_mask.html
|
||
/// </summary>
|
||
public HashSet<Known> KnownProxies { get; set; } = new HashSet<Known>()
|
||
{
|
||
new Known() { ip = "10.2.0.0", prefixLength = 16 },
|
||
new Known() { ip = "192.168.0.0", prefixLength = 16 }
|
||
};
|
||
|
||
public bool real_ip_cf { get; set; }
|
||
|
||
public ProxySettings proxy = new ProxySettings();
|
||
|
||
public ProxySettings[] globalproxy = new ProxySettings[]
|
||
{
|
||
//new ProxySettings()
|
||
//{
|
||
// pattern = "\\.onion",
|
||
// list = ["socks5://127.0.0.1:9050"]
|
||
//}
|
||
};
|
||
|
||
public IReadOnlyCollection<OverrideResponse> overrideResponse { get; set; }
|
||
//{
|
||
// new OverrideResponse()
|
||
// {
|
||
// pattern = "/over/text",
|
||
// action = "html",
|
||
// type = "text/plain; charset=utf-8",
|
||
// val = "text"
|
||
// },
|
||
// new OverrideResponse()
|
||
// {
|
||
// pattern = "/over/online.js",
|
||
// action = "file",
|
||
// type = "application/javascript; charset=utf-8",
|
||
// val = "plugins/online.js"
|
||
// },
|
||
// new OverrideResponse()
|
||
// {
|
||
// pattern = "/over/gogoole",
|
||
// action = "redirect",
|
||
// val = "https://www.google.com/"
|
||
// }
|
||
//};
|
||
#endregion
|
||
|
||
#region SISI
|
||
public SisiSettings BongaCams { get; set; } = new SisiSettings("BongaCams", "kwwsv=22hh1erqjdfdpv1frp", rch_access: "apk", stream_access: "apk,cors,web")
|
||
{
|
||
spider = false,
|
||
httpversion = 2,
|
||
headers = HeadersModel.Init(
|
||
("referer", "{host}/"),
|
||
("x-requested-with", "XMLHttpRequest")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public SisiSettings Runetki { get; set; } = new SisiSettings("Runetki", "kwwsv=22uxv1uxqhwnl81frp", rch_access: "apk", stream_access: "apk,cors,web")
|
||
{
|
||
spider = false,
|
||
httpversion = 2,
|
||
headers = HeadersModel.Init(
|
||
("referer", "{host}/"),
|
||
("x-requested-with", "XMLHttpRequest")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public SisiSettings Chaturbate { get; set; } = new SisiSettings("Chaturbate", "kwwsv=22fkdwxuedwh1frp", rch_access: "apk,cors", stream_access: "apk,cors,web")
|
||
{
|
||
spider = false,
|
||
};
|
||
|
||
public SisiSettings Ebalovo { get; set; } = new SisiSettings("Ebalovo", "kwwsv=22zzz1hedoryr1sur", rch_access: "apk", stream_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web",
|
||
headers = Http.defaultFullHeaders,
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-dest", "video"),
|
||
("sec-fetch-mode", "no-cors"),
|
||
("sec-fetch-site", "same-origin")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public SisiSettings Eporner { get; set; } = new SisiSettings("Eporner", "kwwsv=22zzz1hsruqhu1frp", rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web",
|
||
headers_image = HeadersModel.Init(
|
||
("Accept", "image/jpeg,image/png,image/*;q=0.8,*/*;q=0.5"),
|
||
("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"),
|
||
("Cache-Control", "max-age=0")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public SisiSettings HQporner { get; set; } = new SisiSettings("HQporner", "kwwsv=22p1ktsruqhu1frp", rch_access: "apk,cors", stream_access: "apk,cors,web")
|
||
{
|
||
geostreamproxy = ["ALL"],
|
||
headers = HeadersModel.Init("referer", "{host}").ToDictionary()
|
||
};
|
||
|
||
public SisiSettings Porntrex { get; set; } = new SisiSettings("Porntrex", "kwwsv=22zzz1sruqwuh{1frp", streamproxy: true, rch_access: "apk", stream_access: "apk")
|
||
{
|
||
headers_stream = HeadersModel.Init(
|
||
("referer", "{host}/")
|
||
).ToDictionary(),
|
||
headers_image = HeadersModel.Init(
|
||
("referer", "{host}/")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public SisiSettings Spankbang { get; set; } = new SisiSettings("Spankbang", "kwwsv=22ux1vsdqnedqj1frp", rch_access: "apk,cors,web", stream_access: "apk,cors,web")
|
||
{
|
||
httpversion = 2
|
||
};
|
||
|
||
public SisiSettings Xhamster { get; set; } = new SisiSettings("Xhamster", "kwwsv=22ux1{kdpvwhu1frp", rch_access: "apk,cors", stream_access: "apk,cors,web")
|
||
{
|
||
httpversion = 2,
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site")
|
||
).ToDictionary(),
|
||
headers_image = HeadersModel.Init(
|
||
("Accept", "image/jpeg,image/png,image/*;q=0.8,*/*;q=0.5"),
|
||
("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"),
|
||
("Cache-Control", "max-age=0")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public SisiSettings Xnxx { get; set; } = new SisiSettings("Xnxx", "kwwsv=22zzz1{q{{1frp", rch_access: "apk,cors", stream_access: "apk,cors,web");
|
||
|
||
public SisiSettings Tizam { get; set; } = new SisiSettings("Tizam", "kwwsv=22lq1wl}dp1lqir", rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web"
|
||
};
|
||
|
||
public SisiSettings Xvideos { get; set; } = new SisiSettings("Xvideos", "kwwsv=22zzz1{ylghrv1frp", rch_access: "apk,cors", stream_access: "apk,cors,web");
|
||
|
||
public SisiSettings XvideosRED { get; set; } = new SisiSettings("XvideosRED", "kwwsv=22zzz1{ylghrv1uhg", enable: false);
|
||
|
||
public SisiSettings PornHub { get; set; } = new SisiSettings("PornHub", "kwwsv=22uw1sruqkxe1frp", rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
httpversion = 2,
|
||
rchstreamproxy = "web",
|
||
headers = HeadersModel.Init(
|
||
Http.defaultFullHeaders,
|
||
("cookie", "platform=pc; accessAgeDisclaimerPH=1"),
|
||
("sec-fetch-dest", "document"),
|
||
("sec-fetch-site", "same-origin"),
|
||
("sec-fetch-mode", "navigate")
|
||
).ToDictionary(),
|
||
headers_image = HeadersModel.Init(
|
||
("Accept", "image/jpeg,image/png,image/*;q=0.8,*/*;q=0.5"),
|
||
("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"),
|
||
("Cache-Control", "max-age=0")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public SisiSettings PornHubPremium { get; set; } = new SisiSettings("PornHubPremium", "kwwsv=22uw1sruqkxesuhplxp1frp", enable: false, stream_access: "apk,cors")
|
||
{
|
||
httpversion = 2,
|
||
rchstreamproxy = "web",
|
||
headers = HeadersModel.Init(
|
||
("sec-fetch-dest", "document"),
|
||
("sec-fetch-site", "none"),
|
||
("sec-fetch-user", "?1"),
|
||
("upgrade-insecure-requests", "1")
|
||
).ToDictionary(),
|
||
headers_image = HeadersModel.Init(
|
||
("Accept", "image/jpeg,image/png,image/*;q=0.8,*/*;q=0.5"),
|
||
("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"),
|
||
("Cache-Control", "max-age=0")
|
||
).ToDictionary()
|
||
};
|
||
#endregion
|
||
|
||
#region Online
|
||
/// <summary>
|
||
/// https://iptv.online/ru/dealers/api
|
||
/// </summary>
|
||
public OnlinesSettings IptvOnline { get; set; } = new OnlinesSettings("IptvOnline", "https://iptv.online", enable: false)
|
||
{
|
||
rhub_safety = false
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly92ZW92ZW8uaW8=
|
||
/// </summary>
|
||
public OnlinesSettings VeoVeo { get; set; } = new OnlinesSettings("VeoVeo", "kwwsv=22dsl1uvwsujdslsw1frp", stream_access: "apk,cors,web");
|
||
|
||
public RezkaSettings Rezka { get; set; } = new RezkaSettings("Rezka", "kwwsv=22kguh}nd1ph", true)
|
||
{
|
||
stream_access = "apk,cors,web",
|
||
ajax = true, reserve = true,
|
||
hls = true, scheme = "http",
|
||
headers = Http.defaultUaHeaders
|
||
};
|
||
|
||
public RezkaSettings RezkaPrem { get; set; } = new RezkaSettings("RezkaPrem", null)
|
||
{
|
||
enable = false,
|
||
rhub_safety = false,
|
||
stream_access = "apk,cors,web",
|
||
reserve = true, hls = true, scheme = "http"
|
||
};
|
||
|
||
public CollapsSettings Collaps { get; set; } = new CollapsSettings("Collaps", "kwwsv=22dsl1ox{hpeg1zv", streamproxy: true, two: false)
|
||
{
|
||
rch_access = "apk",
|
||
stream_access = "apk,cors,web",
|
||
two = true,
|
||
apihost = "https://api.bhcesh.me",
|
||
token = "eedefb541aeba871dcfc756e6b31c02e",
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("Origin", "https://kinokrad.my")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("Origin", "https://kinokrad.my"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site"),
|
||
("accept", "*/*")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings Ashdi { get; set; } = new OnlinesSettings("Ashdi", "kwwsv=22edvh1dvkgl1yls", rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
enable = false,
|
||
rchstreamproxy = "web",
|
||
geo_hide = ["RU", "BY"]
|
||
};
|
||
|
||
public OnlinesSettings Kinoukr { get; set; } = new OnlinesSettings("Kinoukr", "kwwsv=22nlqrxnu1frp", rch_access: "apk,cors", stream_access: "apk,cors,web")
|
||
{
|
||
geo_hide = ["RU", "BY"],
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("cookie", "legit_user=1;"),
|
||
("origin", "{host}"),
|
||
("referer", "{host}/"),
|
||
("sec-fetch-dest", "document"),
|
||
("sec-fetch-mode", "navigate"),
|
||
("sec-fetch-site", "same-origin"),
|
||
("sec-fetch-user", "?1"),
|
||
("upgrade-insecure-requests", "1")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings Eneyida { get; set; } = new OnlinesSettings("Eneyida", "kwwsv=22hqh|lgd1wy", rch_access: "apk,cors", stream_access: "apk,cors,web");
|
||
|
||
public OnlinesSettings Kinotochka { get; set; } = new OnlinesSettings("Kinotochka", "kwwsv=22nlqryleh1yls", rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web"
|
||
};
|
||
|
||
public OnlinesSettings RutubeMovie { get; set; } = new OnlinesSettings("RutubeMovie", "kwwsv=22uxwxeh1ux", streamproxy: true, rch_access: "apk,cors");
|
||
|
||
public OnlinesSettings VkMovie { get; set; } = new OnlinesSettings("VkMovie", "kwwsv=22dsl1ynylghr1ux", streamproxy: true, rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("origin", "encrypt:kwwsv=22ynylghr1ux"),
|
||
("referer", "encrypt:kwwsv=22ynylghr1ux2")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings Plvideo { get; set; } = new OnlinesSettings("Plvideo", "kwwsv=22dsl1j41soylghr1ux", streamproxy: true, enable: false, rch_access: "apk,cors");
|
||
|
||
public OnlinesSettings CDNvideohub { get; set; } = new OnlinesSettings("CDNvideohub", "kwwsv=22sodsl1fgqylghrkxe1frp", streamproxy: true, rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
httpversion = 2,
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("referer", "encrypt:kwwsv=22kgnlqr1sxe2"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings Redheadsound { get; set; } = new OnlinesSettings("Redheadsound", "kwwsv=22uhgkhdgvrxqg1vwxglr", enable: false, rch_access: "apk")
|
||
{
|
||
headers = HeadersModel.Init("referer", "{host}/").ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings iRemux { get; set; } = new OnlinesSettings("iRemux", "kwwsv=22phjdreodnr1frp")
|
||
{
|
||
rchstreamproxy = "web",
|
||
geostreamproxy = ["UA"],
|
||
corseu = true
|
||
};
|
||
|
||
public PidTorSettings PidTor { get; set; } = new PidTorSettings()
|
||
{
|
||
enable = true, redapi = "http://redapi.cfhttp.top",
|
||
min_sid = 15, emptyVoice = true
|
||
};
|
||
|
||
/// <summary>
|
||
/// http://filmixapp.cyou
|
||
/// http://filmixapp.vip
|
||
/// http://fxapp.biz
|
||
/// </summary>
|
||
public FilmixSettings Filmix { get; set; } = new FilmixSettings("Filmix", "http://filmixapp.cyou")
|
||
{
|
||
rhub_safety = false,
|
||
rch_access = "apk",
|
||
stream_access = "apk,cors,web",
|
||
reserve = false,
|
||
headers = HeadersModel.Init(
|
||
("Accept-Encoding", "gzip")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public FilmixSettings FilmixTV { get; set; } = new FilmixSettings("FilmixTV", "kwwsv=22dsl1ilopl{1wy", enable: false)
|
||
{
|
||
rhub_safety = false,
|
||
pro = true,
|
||
stream_access = "apk,cors,web",
|
||
headers = HeadersModel.Init(
|
||
("user-agent", "Mozilla/5.0 (SMART-TV; LINUX; Tizen 6.0) AppleWebKit/537.36 (KHTML, like Gecko) 76.0.3809.146/6.0 TV Safari/537.36")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public FilmixSettings FilmixPartner { get; set; } = new FilmixSettings("FilmixPartner", "kwws=22819418914;2sduwqhubdsl", enable: false)
|
||
{
|
||
stream_access = "apk,cors,web"
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly9nby56ZXQtZmxpeC5vbmxpbmU=
|
||
/// aHR0cHM6Ly9nby56ZXRmbGl4LW9ubGluZS5sb2w=
|
||
/// </summary>
|
||
public ZetflixSettings Zetflix { get; set; } = new ZetflixSettings("Zetflix", "kwwsv=22jr1}hw0iol{1rqolqh", enable: false)
|
||
{
|
||
browser_keepopen = true,
|
||
geostreamproxy = ["ALL"],
|
||
hls = true
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly9raW5vcGxheTIuc2l0ZS8=
|
||
/// a2lub2dvLm1lZGlh
|
||
/// aHR0cHM6Ly9maWxtLTIwMjQub3JnLw==
|
||
/// </summary>
|
||
public OnlinesSettings VideoDB { get; set; } = new OnlinesSettings("VideoDB", "kwwsv=22nlqrjr1phgld", "kwwsv=2263ei6:<31reuxw1vkrz", streamproxy: true, rch_access: "apk", stream_access: "apk,cors,web")
|
||
{
|
||
httpversion = 2,
|
||
priorityBrowser = "http",
|
||
imitationHuman = true,
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-storage-access", "active"),
|
||
("upgrade-insecure-requests", "1")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("accept", "*/*"),
|
||
("origin", "{host}"),
|
||
("referer", "{host}/"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "same-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly9jb2xkZmlsbS5pbmsv
|
||
/// </summary>
|
||
public OnlinesSettings CDNmovies { get; set; } = new OnlinesSettings("CDNmovies", "kwwsv=22frogfgq1{|}", enable: false, rch_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web",
|
||
headers = HeadersModel.Init(
|
||
("DNT", "1"),
|
||
("Upgrade-Insecure-Requests", "1")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings VDBmovies { get; set; } = new OnlinesSettings("VDBmovies", "kwwsv=22fgqprylhv0vwuhdp1rqolqh", streamproxy: true, rch_access: "apk", stream_access: "apk")
|
||
{
|
||
enable = false,
|
||
httpversion = 2,
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-storage-access", "active"),
|
||
("upgrade-insecure-requests", "1")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("accept", "*/*"),
|
||
("referer", "{host}"),
|
||
("origin", "{host}/"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings FanCDN { get; set; } = new OnlinesSettings("FanCDN", "kwwsv=224idqvhuldov1qhw", streamproxy: true, rch_access: "apk")
|
||
{
|
||
enable = true,
|
||
rhub_safety = false,
|
||
httpversion = 2,
|
||
imitationHuman = true,
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-storage-access", "active"),
|
||
("upgrade-insecure-requests", "1")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("origin", "{host}"),
|
||
("referer", "{host}/"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "same-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public KinobaseSettings Kinobase { get; set; } = new KinobaseSettings("Kinobase", "kwwsv=22nlqredvh1ruj", true, hdr: true)
|
||
{
|
||
httpversion = 2,
|
||
stream_access = "apk,cors,web",
|
||
geostreamproxy = ["ALL"]
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly91YWtpbm9nby5lYw==
|
||
/// aHR0cHM6Ly91YWtpbm9nby5vbmxpbmU=
|
||
/// </summary>
|
||
public OnlinesSettings Kinogo { get; set; } = new OnlinesSettings("Kinogo", "kwwsv=22nlqrjr1ox{xu|", rch_access: "apk", stream_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web"
|
||
};
|
||
|
||
/// <summary>
|
||
/// Получение учетной записи
|
||
///
|
||
/// tg: @monk_in_a_hat
|
||
/// email: helpdesk@lumex.ink
|
||
/// </summary>
|
||
public LumexSettings VideoCDN { get; set; } = new LumexSettings("VideoCDN", "https://api.lumex.space", "API-токен", "https://portal.lumex.host", "ID клиент")
|
||
{
|
||
enable = false,
|
||
stream_access = "apk,cors,web",
|
||
log = false,
|
||
verifyip = true, // ссылки привязаны к ip пользователя
|
||
scheme = "http",
|
||
//geostreamproxy = ["UA"],
|
||
hls = false, // false - mp4 / true - m3u8
|
||
disable_protection = false, // true - отключить проверку на парсер
|
||
disable_ads = false, // отключить рекламу
|
||
vast = new VastConf() { msg = "Реклама от VideoCDN" }
|
||
};
|
||
|
||
public LumexSettings Lumex { get; set; } = new LumexSettings("Lumex", "kwwsv=22sruwdo1oxph{1krvw", null, "lumex.space", "tl6h28Hn1rL5")
|
||
{
|
||
enable = true,
|
||
stream_access = "apk,cors,web",
|
||
hls = true, scheme = "http",
|
||
priorityBrowser = "http",
|
||
geostreamproxy = ["ALL"]
|
||
};
|
||
|
||
/// <summary>
|
||
/// api.vokino.org
|
||
/// api.vokino.pro
|
||
/// </summary>
|
||
public VokinoSettings VoKino { get; set; } = new VokinoSettings("VoKino", "http://api.vokino.org", streamproxy: false)
|
||
{
|
||
rchstreamproxy = "web",
|
||
rhub_safety = false
|
||
};
|
||
|
||
public IframeVideoSettings IframeVideo { get; set; } = new IframeVideoSettings("IframeVideo", "kwwsv=22liudph1ylghr", "kwwsv=22ylghriudph1vsdfh", enable: false);
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly9tb3ZpZWxhYi5vbmU=
|
||
/// aHR0cHM6Ly92aWQxNzMwODAxMzcwLmZvdHBybzEzNWFsdG8uY29tL2FwaS9pZGtwP2twX2lkPTEzOTI1NTAmZD1raW5vZ28uaW5j
|
||
/// </summary>
|
||
public OnlinesSettings HDVB { get; set; } = new OnlinesSettings("HDVB", "kwwsv=22ylg4:667649;41hqwrxdhgrq1frp", "kwwsv=22dslye1frp", token: "8h5ih7f:3edig<d:747f7i4:3hh4e4<5", rch_access: "apk", stream_access: "apk,cors,web")
|
||
{
|
||
streamproxy = true,
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("referer", "encrypt:kwwsv=22prylhode1rqh2")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("origin", "{host}"),
|
||
("referer", "{host}/"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "same-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
/// <summary>
|
||
/// api: aHR0cHM6Ly92aWJpeC5vcmcvYXBpL2V4dGVybmFsL2RvY3VtZW50YXRpb24=
|
||
/// iframe: aHR0cHM6Ly9jb2xkZmlsbS5pbmsv
|
||
/// </summary>
|
||
public OnlinesSettings Vibix { get; set; } = new OnlinesSettings("Vibix", "kwwsv=22ylel{1ruj", enable: false, rch_access: "apk", stream_access: "apk,cors,web")
|
||
{
|
||
httpversion = 2,
|
||
headers = Http.defaultFullHeaders
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly92aWRlb3NlZWQudHYvZmFxLnBocA==
|
||
/// </summary>
|
||
public OnlinesSettings Videoseed { get; set; } = new OnlinesSettings("Videoseed", "kwwsv=22ylghrvhhg1wy", streamproxy: true, enable: false, stream_access: "apk,cors,web")
|
||
{
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-storage-access", "active"),
|
||
("upgrade-insecure-requests", "1")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
/// <summary>
|
||
/// https://api.srvkp.com - стандартный
|
||
/// https://cdn32.lol/api- apk
|
||
/// https://cdn4t.store/api - apk
|
||
/// https://kpapp.link/api - smart tv
|
||
/// https://api.service-kp.com - старый
|
||
/// </summary>
|
||
public KinoPubSettings KinoPub { get; set; } = new KinoPubSettings("KinoPub", "https://api.srvkp.com")
|
||
{
|
||
httpversion = 2,
|
||
rhub_safety = false,
|
||
filetype = "hls", // hls | hls4 | mp4
|
||
stream_access = "apk,cors,web",
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("sec-fetch-dest", "document"),
|
||
("sec-fetch-mode", "navigate"),
|
||
("sec-fetch-site", "none"),
|
||
("sec-fetch-user", "?1"),
|
||
("upgrade-insecure-requests", "1")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public AllohaSettings Alloha { get; set; } = new AllohaSettings("Alloha", "kwwsv=22dsl1dsexjdoo1ruj", "kwwsv=22wruvr0dv1vwordgl1olyh", "", "", true, true)
|
||
{
|
||
rch_access = "apk,cors,web",
|
||
stream_access = "apk,cors,web",
|
||
reserve = true
|
||
};
|
||
|
||
public AllohaSettings Mirage { get; set; } = new AllohaSettings("Mirage", "kwwsv=22dsl1dsexjdoo1ruj", "kwwsv=22txdguloolrq0dv1doodunqrz1rqolqh", "6892d506bbdd5790e0ca047ff39462", "", true, true)
|
||
{
|
||
enable = true,
|
||
streamproxy = true,
|
||
httpversion = 2,
|
||
headers = Http.defaultFullHeaders
|
||
};
|
||
|
||
public OnlinesSettings GetsTV { get; set; } = new OnlinesSettings("GetsTV", "https://getstv.com", enable: false, stream_access: "apk,cors,web")
|
||
{
|
||
rhub_safety = false,
|
||
headers = HeadersModel.Init(
|
||
("user-agent", "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.34 Safari/537.36 WebAppManager")
|
||
).ToDictionary()
|
||
};
|
||
#endregion
|
||
|
||
#region ENG
|
||
/// <summary>
|
||
/// aHR0cHM6Ly93d3cuaHlkcmFmbGl4LnZpcA==
|
||
/// </summary>
|
||
public OnlinesSettings Hydraflix { get; set; } = new OnlinesSettings("Hydraflix", "kwwsv=22ylgidvw1sur", streamproxy: true)
|
||
{
|
||
priorityBrowser = "scraping"
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly92aWRzcmMueHl6
|
||
/// aHR0cHM6Ly92aWRzcmMucHJv
|
||
/// aHR0cHM6Ly92aWRzcmMudG8=
|
||
/// </summary>
|
||
public OnlinesSettings Vidsrc { get; set; } = new OnlinesSettings("Vidsrc", "kwwsv=22ylgvuf1ff", streamproxy: true);
|
||
|
||
public OnlinesSettings MovPI { get; set; } = new OnlinesSettings("MovPI", "kwwsv=22prylhvdsl1foxe", streamproxy: true);
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly9kYXkyc29hcC54eXov
|
||
/// </summary>
|
||
public OnlinesSettings VidLink { get; set; } = new OnlinesSettings("VidLink", "kwwsv=22ylgolqn1sur", streamproxy: true);
|
||
|
||
public OnlinesSettings Videasy { get; set; } = new OnlinesSettings("Videasy", "kwwsv=22sod|hu1ylghdv|1qhw", streamproxy: true);
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly9zbWFzaHlzdHJlYW0ueHl6
|
||
/// </summary>
|
||
public OnlinesSettings Smashystream { get; set; } = new OnlinesSettings("Smashystream", "kwwsv=22sod|hu1vpdvk|vwuhdp1frp", streamproxy: true);
|
||
|
||
public OnlinesSettings Autoembed { get; set; } = new OnlinesSettings("Autoembed", "kwwsv=22sod|hu1dxwrhpehg1ff", streamproxy: true, enable: false);
|
||
|
||
/// <summary>
|
||
/// Omega
|
||
/// </summary>
|
||
public OnlinesSettings Playembed { get; set; } = new OnlinesSettings("Playembed", "https://vidora.su", streamproxy: true, enable: false);
|
||
|
||
|
||
/// <summary>
|
||
/// EmbedSu
|
||
/// </summary>
|
||
public OnlinesSettings Twoembed { get; set; } = new OnlinesSettings("Twoembed", "https://embed.su", streamproxy: true, enable: false)
|
||
{
|
||
headers_stream = HeadersModel.Init(
|
||
("accept", "*/*"),
|
||
("accept-language", "en-US,en;q=0.5"),
|
||
("referer", "{host}/"),
|
||
("origin", "{host}"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings Rgshows { get; set; } = new OnlinesSettings("Rgshows", "kwwsv=22dsl1ujvkrzv1ph", streamproxy: true, enable: false)
|
||
{
|
||
headers = HeadersModel.Init(
|
||
("accept", "*/*"),
|
||
("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1"),
|
||
("accept-language", "en-US,en;q=0.5"),
|
||
("referer", "encrypt:kwwsv=22zzz1ujvkrzv1ph2"),
|
||
("origin", "encrypt:kwwsv=22zzz1ujvkrzv1ph"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "same-site")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(
|
||
("accept", "*/*"),
|
||
("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1"),
|
||
("accept-language", "en-US,en;q=0.5"),
|
||
("referer", "encrypt:kwwsv=22zzz1ujvkrzv1ph2"),
|
||
("origin", "encrypt:kwwsv=22zzz1ujvkrzv1ph"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site")
|
||
).ToDictionary()
|
||
};
|
||
#endregion
|
||
|
||
#region Anime
|
||
public KodikSettings Kodik { get; set; } = new KodikSettings("Kodik", "kwwsv=22nrglndsl1frp", "kwwsv=22nrgln1lqir", "74gg<8i;7f54:4<e3<g9f:44;556:d58", "", true)
|
||
{
|
||
rch_access = "apk",
|
||
stream_access = "apk,cors,web",
|
||
auto_proxy = true, // прокси UA в api
|
||
cdn_is_working = true, // прокси UA в обычном
|
||
//geostreamproxy = ["UA"],
|
||
headers = HeadersModel.Init(
|
||
("referer", "encrypt:kwwsv=22dqlole1ph2")
|
||
).ToDictionary()
|
||
};
|
||
|
||
/// <summary>
|
||
/// move to AniLiberty
|
||
/// </summary>
|
||
public OnlinesSettings AnilibriaOnline { get; set; } = new OnlinesSettings("AnilibriaOnline", "kwwsv=22dsl1dqloleuld1wy", enable: false);
|
||
|
||
public OnlinesSettings AniLiberty { get; set; } = new OnlinesSettings("AniLiberty", "kwwsv=22dsl1dqloleuld1dss", stream_access: "apk,cors,web")
|
||
{
|
||
httpversion = 2
|
||
};
|
||
|
||
/// <summary>
|
||
/// aHR0cHM6Ly9hbmlsaWIubWU=
|
||
/// </summary>
|
||
public OnlinesSettings AnimeLib { get; set; } = new OnlinesSettings("AnimeLib", "kwwsv=22dsl1fgqolev1ruj", streamproxy: true, stream_access: "apk")
|
||
{
|
||
enable = false,
|
||
rhub_safety = false,
|
||
httpversion = 2,
|
||
headers = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("origin", "encrypt:kwwsv=22dqlphole1ruj"),
|
||
("referer", "encrypt:kwwsv=22dqlphole1ruj2"),
|
||
("sec-fetch-dest", "empty"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "cross-site")
|
||
).ToDictionary(),
|
||
headers_stream = HeadersModel.Init(Http.defaultFullHeaders,
|
||
("accept-encoding", "identity;q=1, *;q=0"),
|
||
("origin", "encrypt:kwwsv=22dqlphole1ruj"),
|
||
("referer", "encrypt:kwwsv=22dqlphole1ruj2"),
|
||
("sec-fetch-dest", "video"),
|
||
("sec-fetch-mode", "cors"),
|
||
("sec-fetch-site", "same-site")
|
||
).ToDictionary()
|
||
};
|
||
|
||
public OnlinesSettings AniMedia { get; set; } = new OnlinesSettings("AniMedia", "kwwsv=22dpg1rqolqh");
|
||
|
||
public OnlinesSettings Animevost { get; set; } = new OnlinesSettings("Animevost", "kwwsv=22dqlphyrvw1ruj", rch_access: "apk,cors", stream_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web",
|
||
httptimeout = 10
|
||
};
|
||
|
||
public OnlinesSettings MoonAnime { get; set; } = new OnlinesSettings("MoonAnime", "kwwsv=22dsl1prrqdqlph1duw", token: ";98iHI0H5h4Ef05fd7640h9D4830:;3GIG0:6:F9E", rch_access: "apk", stream_access: "apk,cors")
|
||
{
|
||
rchstreamproxy = "web",
|
||
geo_hide = ["RU", "BY"]
|
||
};
|
||
|
||
public OnlinesSettings Animebesst { get; set; } = new OnlinesSettings("Animebesst", "kwwsv=22dqlph41ehvw", rch_access: "apk", stream_access: "apk,cors,web")
|
||
{
|
||
httpversion = 2
|
||
};
|
||
|
||
public OnlinesSettings AnimeGo { get; set; } = new OnlinesSettings("AnimeGo", "kwwsv=22dqlphjr1ph", streamproxy: true, enable: false)
|
||
{
|
||
httpversion = 2,
|
||
headers_stream = HeadersModel.Init(
|
||
("origin", "https://aniboom.one"),
|
||
("referer", "https://aniboom.one/")
|
||
).ToDictionary()
|
||
};
|
||
#endregion
|
||
}
|
||
}
|