mirror of
https://github.com/myronblair/kino-app
synced 2026-07-28 05:23:45 -05:00
auto-commit for cf4f0369-14b7-4d06-b915-b8f7098fd48d
This commit is contained in:
@@ -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)}`;
|
||||
|
||||
@@ -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"} />
|
||||
|
||||
Reference in New Issue
Block a user