lampac/Shared/Engine/SISI/EbalovoTo.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

841 lines
32 KiB
C#
Raw 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 Shared.Engine.RxEnumerate;
using Shared.Models;
using Shared.Models.SISI.Base;
using Shared.Models.SISI.OnResult;
using System.Text;
using System.Threading;
using System.Web;
namespace Shared.Engine.SISI
{
public static class EbalovoTo
{
static readonly ThreadLocal<StringBuilder> sbUri = new(() => new StringBuilder(PoolInvk.rentChunk));
#region Uri
public static string Uri(string host, string search, string sort, string c, int pg)
{
var url = sbUri.Value;
url.Clear();
url.Append(host);
url.Append("/");
if (!string.IsNullOrWhiteSpace(search))
{
url.Append($"search/{HttpUtility.UrlEncode(search)}/");
}
else
{
if (!string.IsNullOrEmpty(c))
{
url.Append($"porno/{c}");
if (sort is "porno-online" or "xxx-top")
url.Append($"-rating");
url.Append("/");
}
else
{
if (!string.IsNullOrEmpty(sort))
url.Append($"{sort}/");
}
}
if (pg > 1)
url.Append($"{pg}/");
return url.ToString();
}
#endregion
#region Playlist
public static List<PlaylistItem> Playlist(string uri, ReadOnlySpan<char> html, Func<PlaylistItem, PlaylistItem> onplaylist = null)
{
if (html.IsEmpty)
return null;
var rx = Rx.Split("<div class=\"item\">", html);
if (rx.Count == 0)
return null;
var playlists = new List<PlaylistItem>(rx.Count);
foreach (var row in rx.Rows())
{
if (!row.Contains("<div class=\"item-info\">"))
continue;
string link = row.Match("<a href=\"https?://[^/]+/(video/[^\"]+)\"");
string title = row.Match("<div class=\"item-title\">([^<]+)</div>");
if (!string.IsNullOrWhiteSpace(title) && !string.IsNullOrWhiteSpace(link))
{
var img = row.Groups("( )src=\"(([^\"]+)/[0-9]+.jpg)\"");
if (string.IsNullOrWhiteSpace(img[3].Value) || img[2].Value.Contains("load.png"))
img = row.Groups("(data-srcset|data-src|srcset)=\"([^\"]+/[0-9]+.jpg)\"");
var pl = new PlaylistItem()
{
name = title.Trim(),
video = $"{uri}?uri={link}",
picture = img[2].Value,
time = row.Match(" data-eb=\"([^;\"]+);", trim: true),
json = true,
related = true,
bookmark = new Bookmark()
{
site = "elo",
href = link,
image = img[2].Value
}
};
if (onplaylist != null)
pl = onplaylist.Invoke(pl);
playlists.Add(pl);
}
}
return playlists;
}
#endregion
#region Menu
public static List<MenuItem> Menu(string host, string sort, string c)
{
host = string.IsNullOrWhiteSpace(host) ? string.Empty : $"{host}/";
string url = host + "elo";
var menu = new List<MenuItem>()
{
new MenuItem()
{
title = "Поиск",
search_on = "search_on",
playlist_url = url,
},
new MenuItem()
{
title = $"Сортировка: {(string.IsNullOrEmpty(sort) ? "новинки" : sort)}",
playlist_url = "submenu",
submenu = new List<MenuItem>()
{
new MenuItem()
{
title = "Новинки",
playlist_url = url + $"?c={c}"
},
new MenuItem()
{
title = "Лучшее",
playlist_url = url + $"?c={c}&sort=porno-online"
},
new MenuItem()
{
title = "Популярное",
playlist_url = url + $"?c={c}&sort=xxx-top"
}
}
}
};
{
var submenu = new List<MenuItem>()
{
new MenuItem()
{
title = "Все",
playlist_url = url + $"?sort={sort}"
},
new MenuItem()
{
title = "CFNM",
playlist_url = url + $"?sort={sort}&c=cfnm"
},
new MenuItem()
{
title = "pov",
playlist_url = url + $"?sort={sort}&c=pov"
},
new MenuItem()
{
title = "Анал",
playlist_url = url + $"?sort={sort}&c=anal-videos"
},
new MenuItem()
{
title = "Анальная дыра",
playlist_url = url + $"?sort={sort}&c=gape"
},
new MenuItem()
{
title = "Анальная пробка",
playlist_url = url + $"?sort={sort}&c=butt-plug-porn"
},
new MenuItem()
{
title = "БДСМ",
playlist_url = url + $"?sort={sort}&c=bdsm-porn"
},
new MenuItem()
{
title = "Блондинки",
playlist_url = url + $"?sort={sort}&c=blonde"
},
new MenuItem()
{
title = "Большие жопы",
playlist_url = url + $"?sort={sort}&c=big-ass"
},
new MenuItem()
{
title = "Большие сиськи",
playlist_url = url + $"?sort={sort}&c=big-tits"
},
new MenuItem()
{
title = "Большие члены",
playlist_url = url + $"?sort={sort}&c=big-cock"
},
new MenuItem()
{
title = "Большой чёрный член",
playlist_url = url + $"?sort={sort}&c=bbc"
},
new MenuItem()
{
title = "Бондаж",
playlist_url = url + $"?sort={sort}&c=bondage"
},
new MenuItem()
{
title = "Босс",
playlist_url = url + $"?sort={sort}&c=boss"
},
new MenuItem()
{
title = "Бритые письки",
playlist_url = url + $"?sort={sort}&c=shaved-pussy"
},
new MenuItem()
{
title = "Брюнетки",
playlist_url = url + $"?sort={sort}&c=a1-brunette"
},
new MenuItem()
{
title = "Буккаке",
playlist_url = url + $"?sort={sort}&c=bukkake"
},
new MenuItem()
{
title = "В гольфах",
playlist_url = url + $"?sort={sort}&c=knee-socks"
},
new MenuItem()
{
title = "В клубе",
playlist_url = url + $"?sort={sort}&c=club"
},
new MenuItem()
{
title = "В красивом белье",
playlist_url = url + $"?sort={sort}&c=lingerie"
},
new MenuItem()
{
title = "В майке",
playlist_url = url + $"?sort={sort}&c=shirt"
},
new MenuItem()
{
title = "В масле",
playlist_url = url + $"?sort={sort}&c=oiled"
},
new MenuItem()
{
title = "В машине",
playlist_url = url + $"?sort={sort}&c=car-porn"
},
new MenuItem()
{
title = "В очках",
playlist_url = url + $"?sort={sort}&c=glasses"
},
new MenuItem()
{
title = "В презервативе",
playlist_url = url + $"?sort={sort}&c=condom"
},
new MenuItem()
{
title = "В спальне",
playlist_url = url + $"?sort={sort}&c=bedroom"
},
new MenuItem()
{
title = "В спортзале",
playlist_url = url + $"?sort={sort}&c=gym-porn"
},
new MenuItem()
{
title = "В чулках",
playlist_url = url + $"?sort={sort}&c=stockings"
},
new MenuItem()
{
title = "Вебкамера",
playlist_url = url + $"?sort={sort}&c=webcam"
},
new MenuItem()
{
title = "Волосатая пизда",
playlist_url = url + $"?sort={sort}&c=hairy"
},
new MenuItem()
{
title = "Гибкие",
playlist_url = url + $"?sort={sort}&c=flexible"
},
new MenuItem()
{
title = "Глотает сперму",
playlist_url = url + $"?sort={sort}&c=cum-swallow"
},
new MenuItem()
{
title = "Горничная",
playlist_url = url + $"?sort={sort}&c=maid"
},
new MenuItem()
{
title = "Госпожа",
playlist_url = url + $"?sort={sort}&c=mistress"
},
new MenuItem()
{
title = "Групповуха",
playlist_url = url + $"?sort={sort}&c=group-porno"
},
new MenuItem()
{
title = "Дилдо",
playlist_url = url + $"?sort={sort}&c=dildo"
},
new MenuItem()
{
title = "Длинные волосы",
playlist_url = url + $"?sort={sort}&c=long-hair"
},
new MenuItem()
{
title = "Доктор",
playlist_url = url + $"?sort={sort}&c=doctor"
},
new MenuItem()
{
title = "Домашнее порно",
playlist_url = url + $"?sort={sort}&c=amateur"
},
new MenuItem()
{
title = "Дрочит парню",
playlist_url = url + $"?sort={sort}&c=handjob"
},
new MenuItem()
{
title = "Евро",
playlist_url = url + $"?sort={sort}&c=a1-europe"
},
new MenuItem()
{
title = "Жесть",
playlist_url = url + $"?sort={sort}&c=fun"
},
new MenuItem()
{
title = "ЖМЖ",
playlist_url = url + $"?sort={sort}&c=a1-threesome"
},
new MenuItem()
{
title = "Измена",
playlist_url = url + $"?sort={sort}&c=cheating"
},
new MenuItem()
{
title = "Интимные стрижки",
playlist_url = url + $"?sort={sort}&c=intimate-haircut"
},
new MenuItem()
{
title = "Кляп в рот",
playlist_url = url + $"?sort={sort}&c=gag"
},
new MenuItem()
{
title = "Короткие волосы",
playlist_url = url + $"?sort={sort}&c=short-hair"
},
new MenuItem()
{
title = "Косички",
playlist_url = url + $"?sort={sort}&c=braids"
},
new MenuItem()
{
title = "Красивая грудь",
playlist_url = url + $"?sort={sort}&c=nice-tits-porn"
},
new MenuItem()
{
title = "Красивые",
playlist_url = url + $"?sort={sort}&c=a1-babe"
},
new MenuItem()
{
title = "Красивые попки",
playlist_url = url + $"?sort={sort}&c=ass"
},
new MenuItem()
{
title = "Красивый секс",
playlist_url = url + $"?sort={sort}&c=beautiful"
},
new MenuItem()
{
title = "Крупным планом",
playlist_url = url + $"?sort={sort}&c=closeup"
},
new MenuItem()
{
title = "Куколд",
playlist_url = url + $"?sort={sort}&c=cuckold"
},
new MenuItem()
{
title = "Куни",
playlist_url = url + $"?sort={sort}&c=cunni"
},
new MenuItem()
{
title = "Лесби",
playlist_url = url + $"?sort={sort}&c=lesbi-porno"
},
new MenuItem()
{
title = "Лижет попу",
playlist_url = url + $"?sort={sort}&c=ass-licking-porn"
},
new MenuItem()
{
title = "Массаж",
playlist_url = url + $"?sort={sort}&c=massage"
},
new MenuItem()
{
title = "Мастурбация",
playlist_url = url + $"?sort={sort}&c=a1-masturbation"
},
new MenuItem()
{
title = "Мачеха",
playlist_url = url + $"?sort={sort}&c=a1-stepmom"
},
new MenuItem()
{
title = "Медсестра",
playlist_url = url + $"?sort={sort}&c=nurse"
},
new MenuItem()
{
title = "Между сисек",
playlist_url = url + $"?sort={sort}&c=tits-fuck"
},
new MenuItem()
{
title = "Межрассовое",
playlist_url = url + $"?sort={sort}&c=interracial"
},
new MenuItem()
{
title = "МЖМ",
playlist_url = url + $"?sort={sort}&c=2man-woman"
},
new MenuItem()
{
title = "Минет",
playlist_url = url + $"?sort={sort}&c=blowjob"
},
new MenuItem()
{
title = "Молодые",
playlist_url = url + $"?sort={sort}&c=teen"
},
new MenuItem()
{
title = "На каблуках",
playlist_url = url + $"?sort={sort}&c=heels"
},
new MenuItem()
{
title = "На пляже",
playlist_url = url + $"?sort={sort}&c=beach"
},
new MenuItem()
{
title = "На природе",
playlist_url = url + $"?sort={sort}&c=outdoor-sex"
},
new MenuItem()
{
title = "На публике",
playlist_url = url + $"?sort={sort}&c=a1-public"
},
new MenuItem()
{
title = "На столе",
playlist_url = url + $"?sort={sort}&c=table"
},
new MenuItem()
{
title = "Наездница",
playlist_url = url + $"?sort={sort}&c=cowgirl"
},
new MenuItem()
{
title = "Наручники",
playlist_url = url + $"?sort={sort}&c=handcuffs"
},
new MenuItem()
{
title = "Натуральные сиськи",
playlist_url = url + $"?sort={sort}&c=a1-natural-tits"
},
new MenuItem()
{
title = "Негритянки",
playlist_url = url + $"?sort={sort}&c=black-girl"
},
new MenuItem()
{
title = "Негры",
playlist_url = url + $"?sort={sort}&c=black"
},
new MenuItem()
{
title = "Негры с блондинками",
playlist_url = url + $"?sort={sort}&c=blacks-on-blondes"
},
new MenuItem()
{
title = "Некрасивая грудь",
playlist_url = url + $"?sort={sort}&c=ugly-tits"
},
new MenuItem()
{
title = "Няня",
playlist_url = url + $"?sort={sort}&c=babysitter"
},
new MenuItem()
{
title = "Писает",
playlist_url = url + $"?sort={sort}&c=pissing"
},
new MenuItem()
{
title = "Плётка",
playlist_url = url + $"?sort={sort}&c=whip"
},
new MenuItem()
{
title = "Под водой",
playlist_url = url + $"?sort={sort}&c=underwater"
},
new MenuItem()
{
title = "Подчинение",
playlist_url = url + $"?sort={sort}&c=submission"
},
new MenuItem()
{
title = "Поза 69",
playlist_url = url + $"?sort={sort}&c=69"
},
new MenuItem()
{
title = "Порно зрелых",
playlist_url = url + $"?sort={sort}&c=milfs"
},
new MenuItem()
{
title = "Реслинг",
playlist_url = url + $"?sort={sort}&c=wrestling"
},
new MenuItem()
{
title = "Русское домашнее порно",
playlist_url = url + $"?sort={sort}&c=russian-amateur"
},
new MenuItem()
{
title = "Русское порно",
playlist_url = url + $"?sort={sort}&c=ruporn"
},
new MenuItem()
{
title = "Рыжие",
playlist_url = url + $"?sort={sort}&c=redhead"
},
new MenuItem()
{
title = "С латинками",
playlist_url = url + $"?sort={sort}&c=latina-sex"
},
new MenuItem()
{
title = "С невестой",
playlist_url = url + $"?sort={sort}&c=bride"
},
new MenuItem()
{
title = "С тренером",
playlist_url = url + $"?sort={sort}&c=couch-porn"
},
new MenuItem()
{
title = "Свингеры",
playlist_url = url + $"?sort={sort}&c=swingers"
},
new MenuItem()
{
title = "Секретарша",
playlist_url = url + $"?sort={sort}&c=secretary-porn"
},
new MenuItem()
{
title = "Секс в общаге",
playlist_url = url + $"?sort={sort}&c=dorm-porn"
},
new MenuItem()
{
title = "Секс в офисе",
playlist_url = url + $"?sort={sort}&c=office-sex"
},
new MenuItem()
{
title = "Секс на кухне",
playlist_url = url + $"?sort={sort}&c=kitchen"
},
new MenuItem()
{
title = "Секс с бывшей",
playlist_url = url + $"?sort={sort}&c=exgfs"
},
new MenuItem()
{
title = "Секс-игрушки",
playlist_url = url + $"?sort={sort}&c=sex-toys"
},
new MenuItem()
{
title = "Секс-машина",
playlist_url = url + $"?sort={sort}&c=sex-machines"
},
new MenuItem()
{
title = "Секс-рабыня",
playlist_url = url + $"?sort={sort}&c=slave"
},
new MenuItem()
{
title = "Силиконовые сиськи",
playlist_url = url + $"?sort={sort}&c=silicone-tits"
},
new MenuItem()
{
title = "Сквирт",
playlist_url = url + $"?sort={sort}&c=squirting"
},
new MenuItem()
{
title = "Соло",
playlist_url = url + $"?sort={sort}&c=a1-solo"
},
new MenuItem()
{
title = "Сперма вытекает",
playlist_url = url + $"?sort={sort}&c=creampie"
},
new MenuItem()
{
title = "Сперма на груди",
playlist_url = url + $"?sort={sort}&c=cum-on-tits"
},
new MenuItem()
{
title = "Сперма на лице",
playlist_url = url + $"?sort={sort}&c=facial"
},
new MenuItem()
{
title = "Сперма на ногах",
playlist_url = url + $"?sort={sort}&c=sperma-na-nogah"
},
new MenuItem()
{
title = "Сперма на пизде",
playlist_url = url + $"?sort={sort}&c=cum-on-pussy"
},
new MenuItem()
{
title = "Сперма на попе",
playlist_url = url + $"?sort={sort}&c=cum-on-ass"
},
new MenuItem()
{
title = "Старые с молодыми",
playlist_url = url + $"?sort={sort}&c=old-and-young"
},
new MenuItem()
{
title = "Страпон",
playlist_url = url + $"?sort={sort}&c=strapon"
},
new MenuItem()
{
title = "Стриптиз",
playlist_url = url + $"?sort={sort}&c=strip"
},
new MenuItem()
{
title = "Студентка",
playlist_url = url + $"?sort={sort}&c=schoolgirls"
},
new MenuItem()
{
title = "Студенты",
playlist_url = url + $"?sort={sort}&c=students"
},
new MenuItem()
{
title = "Стюардесса",
playlist_url = url + $"?sort={sort}&c=styuardessa"
},
new MenuItem()
{
title = "Трах",
playlist_url = url + $"?sort={sort}&c=trah"
},
new MenuItem()
{
title = "Учит трахаться",
playlist_url = url + $"?sort={sort}&c=teaching"
},
new MenuItem()
{
title = "Учитель",
playlist_url = url + $"?sort={sort}&c=teacher"
},
new MenuItem()
{
title = "Учительница",
playlist_url = url + $"?sort={sort}&c=teacher-milf"
},
new MenuItem()
{
title = "Футфетиш",
playlist_url = url + $"?sort={sort}&c=foot-fetish"
},
new MenuItem()
{
title = "Худые",
playlist_url = url + $"?sort={sort}&c=skinny-porn"
},
new MenuItem()
{
title = "Чешское порно",
playlist_url = url + $"?sort={sort}&c=czech-porn"
},
new MenuItem()
{
title = "Член из дырки",
playlist_url = url + $"?sort={sort}&c=gloryhole-porn"
},
new MenuItem()
{
title = "Эротика",
playlist_url = url + $"?sort={sort}&c=erotic"
}
};
menu.Add(new MenuItem()
{
title = $"Категория: {submenu.FirstOrDefault(i => i.playlist_url!.EndsWith($"&c={c}")).title ?? "все"}",
playlist_url = "submenu",
submenu = submenu
});
}
return menu;
}
#endregion
#region StreamLinks
async public static Task<StreamItem> StreamLinks(HttpHydra http, string uri, string host, string url, Func<string, Task<string>> onlocation = null)
{
if (string.IsNullOrEmpty(url))
return null;
string stream_link = null;
List<PlaylistItem> recomends = null;
await http.GetSpan($"{host}/{url}", html =>
{
foreach (string q in new string[] { "video_alt_url", "video_url" })
{
stream_link = Rx.Groups(html, $"{q}:([\t ]+)?('|\")(?<link>[^\"']+)")["link"].Value;
if (!string.IsNullOrEmpty(stream_link))
break;
}
if (!string.IsNullOrEmpty(stream_link))
recomends = Playlist(uri, html);
},
addheaders: HeadersModel.Init(
("sec-fetch-dest", "document"),
("sec-fetch-mode", "navigate"),
("sec-fetch-site", "same-origin"),
("sec-fetch-user", "?1"),
("upgrade-insecure-requests", "1")
));
if (string.IsNullOrEmpty(stream_link))
return null;
if (onlocation != null)
{
string location = await onlocation.Invoke(stream_link);
if (location == null || stream_link == location || location.Contains("_file/"))
return null;
stream_link = location;
}
return new StreamItem()
{
qualitys = new Dictionary<string, string>()
{
["auto"] = stream_link
},
recomends = recomends
};
}
#endregion
}
}