auto-commit for cf4f0369-14b7-4d06-b915-b8f7098fd48d

This commit is contained in:
emergent-agent-e1
2026-04-29 16:21:32 +00:00
parent 00b0d5426c
commit 20aba50fa1
5 changed files with 180 additions and 46 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ export const getStreamUrl = (movie) => {
if (!movie) return "";
const token = localStorage.getItem("kino_token") || "";
if (movie.hls_status === "done" && movie.hls_path) {
return `${API}/movies/${movie.id}/hls/playlist.m3u8?auth=${encodeURIComponent(token)}`;
return `${API}/movies/${movie.id}/hls/${movie.hls_path}?auth=${encodeURIComponent(token)}`;
}
if (movie.storage_type === "local" || movie.storage_type === "radarr") {
return `${API}/stream/${movie.id}?auth=${encodeURIComponent(token)}`;
+23 -8
View File
@@ -35,11 +35,11 @@ export default function Admin() {
load();
};
const startTranscode = async (m) => {
const startTranscode = async (m, quality = "quick") => {
setTranscoding({ ...transcoding, [m.id]: true });
try {
await api.post(`/movies/${m.id}/transcode`);
toast.success("Transcoding started — refresh in a few minutes");
await api.post(`/movies/${m.id}/transcode`, { quality });
toast.success(`${quality === "abr" ? "ABR" : "Quick"} transcode started`);
load();
} catch (err) {
toast.error(err.response?.data?.detail || "Could not start transcode");
@@ -48,6 +48,13 @@ export default function Admin() {
}
};
const hlsLabel = (m) => {
if (m.hls_status === "done") {
return m.hls_path === "master.m3u8" ? "ABR" : "Quick";
}
return null;
};
const hlsStatusBadge = (m) => {
if (!m.hls_status) return null;
const colors = {
@@ -56,7 +63,8 @@ export default function Admin() {
done: "text-[#86efac]",
failed: "text-[#fca5a5]",
};
return <span className={`text-[9px] uppercase tracking-[0.2em] ${colors[m.hls_status] || "text-[#8A8A8A]"}`}>HLS {m.hls_status}</span>;
const variant = m.hls_status === "done" ? hlsLabel(m) : "";
return <span className={`text-[9px] uppercase tracking-[0.2em] ${colors[m.hls_status] || "text-[#8A8A8A]"}`}>HLS {m.hls_status}{variant ? ` · ${variant}` : ""}</span>;
};
return (
@@ -101,10 +109,17 @@ export default function Admin() {
<span className="col-span-2 text-[10px] uppercase tracking-[0.3em] text-[#8A8A8A]">{m.storage_type}</span>
<span className="col-span-2">{hlsStatusBadge(m)}</span>
<div className="col-span-2 flex justify-end gap-2">
{(m.storage_type === "local" || m.storage_type === "radarr") && m.hls_status !== "done" && m.hls_status !== "running" && (
<button onClick={() => startTranscode(m)} disabled={transcoding[m.id]}
className="text-[10px] uppercase tracking-[0.2em] border border-[#222] hover:border-[#D9381E] hover:text-[#D9381E] text-[#8A8A8A] px-3 py-1 disabled:opacity-50"
data-testid={`transcode-${m.id}`}>HLS</button>
{(m.storage_type === "local" || m.storage_type === "radarr") && m.hls_status !== "running" && m.hls_status !== "pending" && (
<div className="flex gap-1">
<button onClick={() => startTranscode(m, "quick")} disabled={transcoding[m.id]}
title="Quick transcode (stream-copy, single bitrate)"
className="text-[10px] uppercase tracking-[0.2em] border border-[#222] hover:border-[#D9381E] hover:text-[#D9381E] text-[#8A8A8A] px-2 py-1 disabled:opacity-50"
data-testid={`transcode-quick-${m.id}`}>Quick</button>
<button onClick={() => startTranscode(m, "abr")} disabled={transcoding[m.id]}
title="Adaptive bitrate (re-encodes to 360/480/720/1080p — slow)"
className="text-[10px] uppercase tracking-[0.2em] border border-[#222] hover:border-[#D9381E] hover:text-[#D9381E] text-[#8A8A8A] px-2 py-1 disabled:opacity-50"
data-testid={`transcode-abr-${m.id}`}>ABR</button>
</div>
)}
<button onClick={() => toggleFeatured(m)} className={`${m.featured ? "text-[#D9381E]" : "text-[#8A8A8A]"} hover:text-[#ED4B32] transition-colors`} aria-label="Feature" data-testid={`feature-${m.id}`}>
<Star size={16} strokeWidth={1.5} fill={m.featured ? "#D9381E" : "none"} />