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

675 lines
25 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 Shared.Engine.RxEnumerate;
using Shared.Models.SISI.Base;
using System.Text;
using System.Threading;
using System.Web;
namespace Shared.Engine.SISI
{
public static class PorntrexTo
{
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)}/");
if (!string.IsNullOrEmpty(sort))
url.Append($"{sort}/");
url.Append($"?from_videos={pg}");
}
else
{
if (!string.IsNullOrEmpty(c))
{
url.Append($"categories/{c}/");
if (sort == "most-popular")
url.Append($"top-rated/");
url.Append($"?from4={pg}");
}
else
{
if (string.IsNullOrEmpty(sort))
{
url.Append($"latest-updates/{pg}/");
}
else
{
url.Append($"{sort}/weekly/?from4={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=\"video-preview-screen", html, 1);
if (rx.Count == 0)
return null;
var playlists = new List<PlaylistItem>(rx.Count);
foreach (var row in rx.Rows())
{
if (row.Contains("<span class=\"line-private\">"))
continue;
var g = row.Groups("<a href=\"https?://[^/]+/(video/[^\"]+)\" title=\"([^\"]+)\"");
if (!string.IsNullOrWhiteSpace(g[1].Value) && !string.IsNullOrWhiteSpace(g[2].Value))
{
var img = row.Groups("data-src=\"(https?:)?//(((ptx|statics)\\.cdntrex\\.com/contents/videos_screenshots/[0-9]+/[0-9]+)[^\"]+)");
var pl = new PlaylistItem()
{
video = $"{uri}?uri={g[1].Value}",
name = g[2].Value,
picture = $"https://{img[2].Value}",
quality = row.Match("<span class=\"quality\">([^<]+)</span>"),
time = row.Match("<i class=\"fa fa-clock-o\"></i>([^<]+)</div>", trim: true),
json = true,
bookmark = new Bookmark()
{
site = "ptx",
href = g[1].Value,
image = $"https://{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 search, string sort, string c)
{
host = string.IsNullOrWhiteSpace(host) ? string.Empty : $"{host}/";
string url = host + "ptx";
if (!string.IsNullOrEmpty(search))
{
string encodesearch = HttpUtility.UrlEncode(search);
return new List<MenuItem>()
{
new MenuItem()
{
title = "Поиск",
search_on = "search_on",
playlist_url = url,
},
new MenuItem()
{
title = $"Сортировка: {(string.IsNullOrEmpty(sort) ? "Most Relevant" : sort)}",
playlist_url = "submenu",
submenu = new List<MenuItem>()
{
new MenuItem()
{
title = "Most Relevant",
playlist_url = url + $"?c={c}&search={encodesearch}"
},
new MenuItem()
{
title = "Новинки",
playlist_url = url + $"?c={c}&sort=latest-updates&search={encodesearch}"
},
new MenuItem()
{
title = "Топ просмотров",
playlist_url = url + $"?c={c}&sort=most-popular&search={encodesearch}"
}
}
}
};
}
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=most-popular"
}
}
}
};
{
var submenu = new List<MenuItem>()
{
new MenuItem()
{
title = "Все",
playlist_url = url + $"?sort={sort}"
},
new MenuItem()
{
title = "4K UHD",
playlist_url = url + $"?sort={sort}&c=4k-porn"
},
new MenuItem()
{
title = "Anal",
playlist_url = url + $"?sort={sort}&c=anal"
},
new MenuItem()
{
title = "Arab",
playlist_url = url + $"?sort={sort}&c=arab"
},
new MenuItem()
{
title = "Asian",
playlist_url = url + $"?sort={sort}&c=asian"
},
new MenuItem()
{
title = "Ass licking",
playlist_url = url + $"?sort={sort}&c=ass-licking"
},
new MenuItem()
{
title = "Ass to mouth (ATM)",
playlist_url = url + $"?sort={sort}&c=ass-to-mouth"
},
new MenuItem()
{
title = "Babe",
playlist_url = url + $"?sort={sort}&c=babe"
},
new MenuItem()
{
title = "Babysitter",
playlist_url = url + $"?sort={sort}&c=babysitter"
},
new MenuItem()
{
title = "BBW",
playlist_url = url + $"?sort={sort}&c=bbw"
},
new MenuItem()
{
title = "Big Ass",
playlist_url = url + $"?sort={sort}&c=big-ass"
},
new MenuItem()
{
title = "Big Tits",
playlist_url = url + $"?sort={sort}&c=big-tits"
},
new MenuItem()
{
title = "Black",
playlist_url = url + $"?sort={sort}&c=black"
},
new MenuItem()
{
title = "Blonde",
playlist_url = url + $"?sort={sort}&c=blonde"
},
new MenuItem()
{
title = "Blowjob",
playlist_url = url + $"?sort={sort}&c=blowjob"
},
new MenuItem()
{
title = "Bondage",
playlist_url = url + $"?sort={sort}&c=bondage"
},
new MenuItem()
{
title = "Brunette",
playlist_url = url + $"?sort={sort}&c=brunette"
},
new MenuItem()
{
title = "Bukkake",
playlist_url = url + $"?sort={sort}&c=bukkake"
},
new MenuItem()
{
title = "Busty",
playlist_url = url + $"?sort={sort}&c=busty"
},
new MenuItem()
{
title = "Casting",
playlist_url = url + $"?sort={sort}&c=casting"
},
new MenuItem()
{
title = "Celebrities",
playlist_url = url + $"?sort={sort}&c=celebrities"
},
new MenuItem()
{
title = "College",
playlist_url = url + $"?sort={sort}&c=college"
},
new MenuItem()
{
title = "Compilation",
playlist_url = url + $"?sort={sort}&c=compilation"
},
new MenuItem()
{
title = "Creampie",
playlist_url = url + $"?sort={sort}&c=creampie"
},
new MenuItem()
{
title = "Cuckold",
playlist_url = url + $"?sort={sort}&c=cuckold"
},
new MenuItem()
{
title = "Cum-swap",
playlist_url = url + $"?sort={sort}&c=cum-swapping"
},
new MenuItem()
{
title = "Cumshots",
playlist_url = url + $"?sort={sort}&c=cumshots"
},
new MenuItem()
{
title = "Czech",
playlist_url = url + $"?sort={sort}&c=czech"
},
new MenuItem()
{
title = "Czech Massage",
playlist_url = url + $"?sort={sort}&c=czech-massage"
},
new MenuItem()
{
title = "Deepthroat",
playlist_url = url + $"?sort={sort}&c=deepthroat"
},
new MenuItem()
{
title = "Doggystyle",
playlist_url = url + $"?sort={sort}&c=doggystyle"
},
new MenuItem()
{
title = "Double Penetration (DP)",
playlist_url = url + $"?sort={sort}&c=double-penetration"
},
new MenuItem()
{
title = "Ebony",
playlist_url = url + $"?sort={sort}&c=ebony"
},
new MenuItem()
{
title = "Fantasy",
playlist_url = url + $"?sort={sort}&c=fantasy"
},
new MenuItem()
{
title = "Fetish",
playlist_url = url + $"?sort={sort}&c=fetish"
},
new MenuItem()
{
title = "Fingering",
playlist_url = url + $"?sort={sort}&c=fingering"
},
new MenuItem()
{
title = "Fisting",
playlist_url = url + $"?sort={sort}&c=fisting"
},
new MenuItem()
{
title = "Footjob",
playlist_url = url + $"?sort={sort}&c=footjob"
},
new MenuItem()
{
title = "Foursome",
playlist_url = url + $"?sort={sort}&c=foursome"
},
new MenuItem()
{
title = "Gangbang",
playlist_url = url + $"?sort={sort}&c=gangbang"
},
new MenuItem()
{
title = "Gangbang Creampie",
playlist_url = url + $"?sort={sort}&c=gangbang-creampie"
},
new MenuItem()
{
title = "Gaping",
playlist_url = url + $"?sort={sort}&c=gaping"
},
new MenuItem()
{
title = "Gay",
playlist_url = url + $"?sort={sort}&c=gay"
},
new MenuItem()
{
title = "German",
playlist_url = url + $"?sort={sort}&c=german"
},
new MenuItem()
{
title = "Gloryhole",
playlist_url = url + $"?sort={sort}&c=gloryhole"
},
new MenuItem()
{
title = "Hairy",
playlist_url = url + $"?sort={sort}&c=hairy"
},
new MenuItem()
{
title = "Handjob",
playlist_url = url + $"?sort={sort}&c=handjob"
},
new MenuItem()
{
title = "Hardcore",
playlist_url = url + $"?sort={sort}&c=hardcore"
},
new MenuItem()
{
title = "Hentai",
playlist_url = url + $"?sort={sort}&c=hentai"
},
new MenuItem()
{
title = "Homemade",
playlist_url = url + $"?sort={sort}&c=homemade"
},
new MenuItem()
{
title = "Hungarian",
playlist_url = url + $"?sort={sort}&c=hungarian"
},
new MenuItem()
{
title = "Indian",
playlist_url = url + $"?sort={sort}&c=indian"
},
new MenuItem()
{
title = "Interracial",
playlist_url = url + $"?sort={sort}&c=interracial"
},
new MenuItem()
{
title = "Japanese",
playlist_url = url + $"?sort={sort}&c=japanese"
},
new MenuItem()
{
title = "Latina",
playlist_url = url + $"?sort={sort}&c=latina"
},
new MenuItem()
{
title = "Lesbian",
playlist_url = url + $"?sort={sort}&c=lesbian"
},
new MenuItem()
{
title = "Lingerie",
playlist_url = url + $"?sort={sort}&c=lingerie"
},
new MenuItem()
{
title = "Massage",
playlist_url = url + $"?sort={sort}&c=massage"
},
new MenuItem()
{
title = "Masturbation",
playlist_url = url + $"?sort={sort}&c=masturbation"
},
new MenuItem()
{
title = "Mature",
playlist_url = url + $"?sort={sort}&c=mature"
},
new MenuItem()
{
title = "Milf",
playlist_url = url + $"?sort={sort}&c=milf"
},
new MenuItem()
{
title = "Office",
playlist_url = url + $"?sort={sort}&c=office"
},
new MenuItem()
{
title = "Old and Young",
playlist_url = url + $"?sort={sort}&c=old-and-young"
},
new MenuItem()
{
title = "Orgy",
playlist_url = url + $"?sort={sort}&c=orgy"
},
new MenuItem()
{
title = "Outdoor",
playlist_url = url + $"?sort={sort}&c=outdoor"
},
new MenuItem()
{
title = "Petite",
playlist_url = url + $"?sort={sort}&c=petite"
},
new MenuItem()
{
title = "POV",
playlist_url = url + $"?sort={sort}&c=pov"
},
new MenuItem()
{
title = "Public",
playlist_url = url + $"?sort={sort}&c=public"
},
new MenuItem()
{
title = "Pussy licking",
playlist_url = url + $"?sort={sort}&c=pussy-licking"
},
new MenuItem()
{
title = "Red Head",
playlist_url = url + $"?sort={sort}&c=red-head"
},
new MenuItem()
{
title = "Riding",
playlist_url = url + $"?sort={sort}&c=riding"
},
new MenuItem()
{
title = "Russian",
playlist_url = url + $"?sort={sort}&c=russian"
},
new MenuItem()
{
title = "School Girl",
playlist_url = url + $"?sort={sort}&c=school-girl"
},
new MenuItem()
{
title = "Shemale",
playlist_url = url + $"?sort={sort}&c=shemale"
},
new MenuItem()
{
title = "Skinny",
playlist_url = url + $"?sort={sort}&c=skinny"
},
new MenuItem()
{
title = "Small tits",
playlist_url = url + $"?sort={sort}&c=small-tits"
},
new MenuItem()
{
title = "Solo",
playlist_url = url + $"?sort={sort}&c=solo"
},
new MenuItem()
{
title = "Squirt",
playlist_url = url + $"?sort={sort}&c=squirt"
},
new MenuItem()
{
title = "Strap-on",
playlist_url = url + $"?sort={sort}&c=strap-on"
},
new MenuItem()
{
title = "Swallow",
playlist_url = url + $"?sort={sort}&c=swallow"
},
new MenuItem()
{
title = "Teen",
playlist_url = url + $"?sort={sort}&c=teen"
},
new MenuItem()
{
title = "Threesome",
playlist_url = url + $"?sort={sort}&c=threesome"
},
new MenuItem()
{
title = "Titfuck",
playlist_url = url + $"?sort={sort}&c=titfuck"
},
new MenuItem()
{
title = "Toys",
playlist_url = url + $"?sort={sort}&c=toys"
},
new MenuItem()
{
title = "Uniform",
playlist_url = url + $"?sort={sort}&c=uniform"
},
new MenuItem()
{
title = "Vintage",
playlist_url = url + $"?sort={sort}&c=vintage"
},
new MenuItem()
{
title = "Webcam",
playlist_url = url + $"?sort={sort}&c=webcam"
},
new MenuItem()
{
title = "Wife",
playlist_url = url + $"?sort={sort}&c=wife"
}
};
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
public static string StreamLinksUri(string host, string uri)
{
if (string.IsNullOrWhiteSpace(uri))
return null;
return $"{host}/{uri}";
}
public static Dictionary<string, string> StreamLinks(ReadOnlySpan<char> html)
{
if (html.IsEmpty)
return null;
var rx = Rx.Matches("(https?://[^/]+/get_file/[^\\.]+_([0-9]+p)\\.mp4)", html);
var stream_links = new Dictionary<string, string>(rx.Count);
foreach (var row in rx.Rows())
{
var g = row.Groups();
if (!string.IsNullOrEmpty(g[1].Value))
stream_links.TryAdd(g[2].Value, g[1].Value);
}
if (stream_links.Count == 0)
{
string link = Rx.Match(html, "(https?://[^/]+/get_file/[^\\.]+\\.mp4)");
if (link != null)
stream_links.TryAdd("auto", link);
}
return stream_links.Reverse().ToDictionary(k => k.Key, v => v.Value);
}
#endregion
}
}