Files
stream-cinema/CinemaWeb/Pages/StreamsPage.cs
Roman Vaníček 0bcb6d571f
All checks were successful
continuous-integration/drone/push Build is passing
Rename to Cinema
2024-11-30 00:50:10 +01:00

107 lines
3.4 KiB
C#

using System;
using System.Text;
using System.Web;
using CinemaLib.API;
using CinemaWeb.Layouts;
namespace CinemaWeb.Pages;
public class StreamsPage : BasicLayout
{
private readonly string _id;
private readonly string _title;
public StreamsPage(string id, string title)
{
this._id = id;
this._title = title;
}
protected override string Title => _title;
protected override async Task RenderContentAsync(HttpRequest req, TextWriter w)
{
w.WriteLine("<h1>" + HttpUtility.HtmlEncode(_title) + "</h1>");
w.WriteLine("<div><b>Zvolte kvalitu</b></div>");
CinemaLib.API.Stream[]? res = await Metadata.StreamsAsync(_id, cancel: req.HttpContext.RequestAborted);
if (res == null || res.Length == 0)
{
w.WriteLine("<em>Nic nenalezeno</em>");
}
else
{
RenderStreams(w, res, _title);
}
}
internal static void RenderStreams(TextWriter w, IEnumerable<CinemaLib.API.Stream> streams, string title)
{
w.WriteLine("<div class=\"media-streams\">");
foreach (CinemaLib.API.Stream i in streams)
{
// Gather external subtitles
StringBuilder extSubtitles = new StringBuilder();
if (i.subtitles != null && i.subtitles.Count != 0)
foreach (StreamSubtitle j in i.subtitles)
if (j.src != null)
extSubtitles.Append("&sub=" + HttpUtility.UrlEncode(GetCompactExternalSubtitle(j.language, new Uri(j.src))));
if (extSubtitles.Length > 0)
extSubtitles[0] = '?';
w.WriteLine("<div class=\"media-stream\"><a href=\"/link/" + i.provider + "/" + HttpUtility.UrlEncode(i.ident) + "/" + HttpUtility.UrlEncode(i.name) + "/" + HttpUtility.UrlEncode(title) + extSubtitles.ToString() + "\">");
w.WriteLine($"<div class=\"stream-basic\">{Math.Round((double)(i.size ?? 0) / (1024 * 1024 * 1024), 2)} GB ({i.date_added})</div>");
if (i.video != null && i.video.Count != 0)
{
StreamVideo a = i.video.First();
string is3D = a.is3d ? " (3D)" : "";
string hdr = a.hasHdr ? (" HDR" + (a.hdrQuality != null ? "[" + a.hdrQuality + "]" : "")) : "";
w.WriteLine($"<div class=\"video-channel\">{a.width}x{a.height} {a.codec}{is3D} {Math.Round((a.duration ?? 0) / 60)} min{HttpUtility.HtmlEncode(hdr)}</div>");
}
if (i.audio != null && i.audio.Count != 0)
{
w.WriteLine("<div class=\"audio-channels\">");
foreach (StreamAudio j in i.audio)
{
w.WriteLine($"<div class=\"audio-channel\">{j.language} {j.codec} {j.channels}</div>");
}
w.WriteLine("</div>");
}
if (i.subtitles != null && i.subtitles.Count != 0)
{
w.WriteLine("<div class=\"subtitle-channels\">");
foreach (StreamSubtitle j in i.subtitles)
{
w.WriteLine($"<div class=\"subtitle-channel\">{j.language}</div>");
}
w.WriteLine("</div>");
}
w.WriteLine("</a></div>");
}
w.WriteLine("</div>");
}
private static string GetCompactExternalSubtitle(string lang, Uri uri) {
string provider = "http";
string id = uri.ToString();
switch (uri.Host) {
case "webshare.cz":
const string WebsharePrefix = "#/file/";
if (uri.AbsolutePath == "/" && uri.Fragment.StartsWith(WebsharePrefix)) {
provider = "webshare";
id = uri.Fragment.Substring(WebsharePrefix.Length);
}
break;
}
// Format: <lang>:<provider>:<id>
return lang + ":" + provider + ":" + id;
}
}