lampac/Online/Controllers/Kinobase.cs
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

155 lines
5.9 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.Playwright;
using Shared.Models.Online.Kinobase;
using Shared.Models.Online.Settings;
using Shared.PlaywrightCore;
namespace Online.Controllers
{
public class Kinobase : BaseOnlineController<KinobaseSettings>
{
public Kinobase() : base(AppInit.conf.Kinobase) { }
[HttpGet]
[Route("lite/kinobase")]
async public Task<ActionResult> Index(string title, int year, int s = -1, int serial = -1, string href = null, string t = null, bool rjson = false, bool similar = false, string source = null, string id = null)
{
if (PlaywrightBrowser.Status == PlaywrightStatus.disabled)
return OnError();
if (await IsRequestBlocked(rch: false))
return badInitMsg;
if (string.IsNullOrEmpty(href) && !string.IsNullOrEmpty(source) && !string.IsNullOrEmpty(id))
{
if (source.ToLower() == "kinobase")
href = id;
}
var oninvk = new KinobaseInvoke
(
host,
init,
ongettourl =>
{
if (ongettourl.Contains("/search?query="))
return httpHydra.Get(ongettourl, addheaders: HeadersModel.Init("referer", init.host));
return black_magic(ongettourl);
},
streamfile => HostStreamProxy(streamfile),
requesterror: () => proxyManager?.Refresh()
);
#region search
if (string.IsNullOrEmpty(href))
{
var search = await InvokeCacheResult<SearchModel>($"kinobase:search:{title}:{year}", 40, async e =>
{
var content = await oninvk.Search(title, year);
if (content == null)
return e.Fail("search");
return e.Success(content);
});
if (similar || string.IsNullOrEmpty(search.Value?.link))
return await ContentTpl(search, () => search.Value.similar);
if (string.IsNullOrEmpty(search.Value?.link))
return OnError();
href = search.Value?.link;
}
#endregion
var cache = await InvokeCacheResult<EmbedModel>($"kinobase:view:{href}:{proxyManager?.CurrentProxyIp}", 20, async e =>
{
var content = await oninvk.Embed(href, init.playerjs);
if (content == null)
return e.Fail("embed");
return e.Success(content);
});
if (cache.IsSuccess && cache.Value.IsEmpty)
return ShowError(cache.Value.errormsg);
return await ContentTpl(cache, () => oninvk.Tpl(cache.Value, title, href, s, t, rjson));
}
#region black_magic
async Task<string> black_magic(string uri)
{
try
{
using (var browser = new PlaywrightBrowser())
{
var page = await browser.NewPageAsync(init.plugin, proxy: proxy_data, headers: init.headers).ConfigureAwait(false);
if (page == null)
return null;
await page.Context.AddCookiesAsync(new List<Cookie>()
{
new Cookie()
{
Name = "player_settings",
Value = $"{(init.playerjs ? "new" : "old")}|{(init.hls ? "hls" : "mp4")}|{(init.hdr ? 1 : 0)}",
Domain = Regex.Match(init.host, "^https?://([^/]+)").Groups[1].Value,
Path = "/",
Expires = 2220002226
}
}).ConfigureAwait(false);
await page.RouteAsync("**/*", async route =>
{
try
{
if (route.Request.Url.Contains("/playerjs.js"))
{
await route.FulfillAsync(new RouteFulfillOptions
{
Body = System.IO.File.ReadAllText("data/kinobase_playerjs.js")
});
return;
}
else if (route.Request.Url.Contains("/uppod.js"))
{
await route.FulfillAsync(new RouteFulfillOptions
{
Body = System.IO.File.ReadAllText("data/kinobase_uppod.js")
});
return;
}
if (!route.Request.Url.Contains(init.host) || route.Request.Url.Contains("/comments"))
{
await route.AbortAsync();
return;
}
if (await PlaywrightBase.AbortOrCache(page, route, abortMedia: true, patterCache: "/js/(jquery|boot)\\.js"))
return;
await route.ContinueAsync();
}
catch { }
});
PlaywrightBase.GotoAsync(page, uri);
await browser.WaitForAnySelectorAsync(page, "#playerjsfile", ".uppod-media", ".alert").ConfigureAwait(false);
string content = await page.ContentAsync().ConfigureAwait(false);
PlaywrightBase.WebLog("GET", uri, content, proxy_data);
return content;
}
}
catch { return null; }
}
#endregion
}
}