lampac-talks f843f04fd4 chore: initial commit 154.3
Signed-off-by: lampac-talks <lampac-talks@users.noreply.github.com>
2026-01-30 16:23:09 +03:00

245 lines
9.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Newtonsoft.Json.Linq;
using Shared.Models.Base;
using Shared.Models.Online.Settings;
using Shared.Models.Online.VoKino;
using Shared.Models.Templates;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Web;
namespace Shared.Engine.Online
{
public struct VoKinoInvoke
{
#region VoKinoInvoke
string host;
string apihost;
string token;
Func<string, Task<string>> onget;
Func<string, string> onstreamfile;
Action requesterror;
public VoKinoInvoke(string host, string apihost, string token, Func<string, Task<string>> onget, Func<string, string> onstreamfile, Action requesterror = null)
{
this.host = host != null ? $"{host}/" : null;
this.apihost = apihost;
this.token = token;
this.onget = onget;
this.onstreamfile = onstreamfile;
this.requesterror = requesterror;
}
#endregion
public static void SendOnline(VokinoSettings init, List<(dynamic init, string name, string url, string plugin, int index)> online, JObject view)
{
var on = init.online;
void send(string name, int x)
{
string url = "{localhost}/lite/vokino?balancer=" + name.ToLower();
string displayname = $"{init.displayname ?? "VoKino"}";
if (name != "VoKino")
displayname = $"{name} ({init.displayname ?? "VoKino"})";
if (init.onlyBalancerName)
displayname = name;
online.Add((init, displayname, url, (name == "VoKino" ? "vokino" : $"vokino-{name.ToLower()}"), init.displayindex > 0 ? (init.displayindex + x) : online.Count));
}
if (on.vokino && (view == null || view.ContainsKey("Vokino")))
send("VoKino", 1);
if (on.filmix && (view == null || view.ContainsKey("Filmix")))
send("Filmix", 2);
if (on.alloha && (view == null || view.ContainsKey("Alloha")))
send("Alloha", 3);
if (on.vibix && (view == null || view.ContainsKey("Vibix")))
send("Vibix", 4);
if (on.monframe && (view == null || view.ContainsKey("MonFrame")))
send("MonFrame", 5);
if (on.remux && (view == null || view.ContainsKey("Remux")))
send("Remux", 6);
if (on.ashdi && (view == null || view.ContainsKey("Ashdi")))
send("Ashdi", 7);
if (on.hdvb && (view == null || view.ContainsKey("Hdvb")))
send("HDVB", 8);
}
#region Embed
public async Task<EmbedModel> Embed(string origid, long kinopoisk_id, string balancer, string t)
{
try
{
if (string.IsNullOrEmpty(balancer))
{
string json = await onget($"{apihost}/v2/view/{origid ?? kinopoisk_id.ToString()}?token={token}");
if (json == null)
{
requesterror?.Invoke();
return null;
}
if (json.Contains("not found"))
return new EmbedModel() { IsEmpty = true };
var similars = new List<Similar>(10);
foreach (var item in JsonSerializer.Deserialize<JsonElement>(json).GetProperty("online").EnumerateObject())
{
string playlistUrl = item.Value.GetProperty("playlist_url").GetString();
if (string.IsNullOrEmpty(playlistUrl))
continue;
var model = new Similar()
{
title = item.Name,
balancer = Regex.Match(playlistUrl, "/v2/online/([^/]+)/").Groups[1].Value
};
if (item.Name == "Vokino")
similars.Insert(0, model);
else
similars.Add(model);
}
return new EmbedModel() { similars = similars };
}
else
{
string uri = $"{apihost}/v2/online/{balancer}/{origid ?? kinopoisk_id.ToString()}?token={token}";
if (!string.IsNullOrEmpty(t))
uri += $"&{t}";
string json = await onget(uri);
if (json == null)
{
requesterror?.Invoke();
return null;
}
if (json.Contains("not found"))
return new EmbedModel() { IsEmpty = true };
var root = JsonSerializer.Deserialize<RootObject>(json);
if (root?.channels == null || root.channels.Length == 0)
return null;
return new EmbedModel() { menu = root.menu, channels = root.channels };
}
}
catch { }
return null;
}
#endregion
#region Tpl
public ITplResult Tpl(EmbedModel result, string origid, long kinopoisk_id, string title, string original_title, string balancer, string t, int s, VastConf vast = null, bool rjson = false)
{
if (result == null || result.IsEmpty)
return default;
string enc_title = HttpUtility.UrlEncode(title);
string enc_original_title = HttpUtility.UrlEncode(original_title);
#region similar
if (result.similars != null)
{
var stpl = new SimilarTpl(result.similars.Count);
foreach (var similar in result.similars)
{
string link = host + $"lite/vokino?rjson={rjson}&origid={origid}&kinopoisk_id={kinopoisk_id}&title={enc_title}&original_title={enc_original_title}&balancer={similar.balancer}";
stpl.Append(similar.title, string.Empty, string.Empty, link);
}
return stpl;
}
#endregion
if (result?.channels == null || result.channels.Length == 0)
return default;
#region Переводы
var voices = result?.menu?.FirstOrDefault(i => i.title == "Перевод")?.submenu;
var vtpl = new VoiceTpl(voices != null ? voices.Length : 0);
if (voices != null && voices.Length > 0)
{
foreach (var translation in voices)
{
if (translation.playlist_url != null && translation.playlist_url.Contains("?"))
{
string _t = HttpUtility.UrlEncode(translation.playlist_url.Split("?")[1]);
vtpl.Append(translation.title, translation.selected, host + $"lite/vokino?rjson={rjson}&origid={origid}&kinopoisk_id={kinopoisk_id}&balancer={balancer}&title={enc_title}&original_title={enc_original_title}&t={_t}&s={s}");
}
}
}
#endregion
if (result!.channels.First().playlist_url == "submenu")
{
if (s == -1)
{
var tpl = new SeasonTpl(quality: result.channels[0].quality_full?.Replace("2160p.", "4K "), result.channels.Length);
foreach (var ch in result.channels)
{
string sname = Regex.Match(ch.title, "^([0-9]+)").Groups[1].Value;
if (string.IsNullOrEmpty(sname))
sname = Regex.Match(ch.title, "([0-9]+)$").Groups[1].Value;
tpl.Append(ch.title, host + $"lite/vokino?rjson={rjson}&origid={origid}&kinopoisk_id={kinopoisk_id}&balancer={balancer}&title={enc_title}&original_title={enc_original_title}&t={t}&s={sname}", sname);
}
return tpl;
}
else
{
var series = result.channels.First(i => i.title.StartsWith($"{s} ") || i.title.EndsWith($" {s}")).submenu;
var etpl = new EpisodeTpl(vtpl, series.Length);
foreach (var e in series)
{
string ename = Regex.Match(e.ident, "([0-9]+)$").Groups[1].Value;
etpl.Append(e.title, title ?? original_title, s.ToString(), ename, onstreamfile(e.stream_url), vast: vast);
}
return etpl;
}
}
else
{
var mtpl = new MovieTpl(title, original_title, vtpl, result.channels.Length);
foreach (var ch in result!.channels)
{
string name = ch.quality_full;
if (!string.IsNullOrWhiteSpace(name.Replace("2160p.", "")))
{
name = name.Replace("2160p.", "4K ");
if (ch.extra != null && ch.extra.TryGetValue("size", out string size) && !string.IsNullOrEmpty(size))
name += $" - {size}";
}
mtpl.Append(name, onstreamfile(ch.stream_url), vast: vast);
}
return mtpl;
}
}
#endregion
}
}