FIXA-懒得写了

This commit is contained in:
CN-JS-HuiBai
2026-04-02 22:54:46 +08:00
parent 92e7a80a1e
commit 52c8466ddd
3 changed files with 89 additions and 28 deletions

View File

@@ -579,6 +579,10 @@ header p {
transition: opacity 0.3s ease;
}
.player-section {
position: relative;
}
.player-overlay h3 {
margin-bottom: 0.5rem;
font-weight: 600;
@@ -590,7 +594,7 @@ header p {
}
.now-playing {
margin-top: 1.5rem;
margin-top: 2.5rem;
padding-top: 1.5rem;
border-top: 1px solid var(--panel-border);
}
@@ -609,11 +613,14 @@ header p {
}
.custom-controls {
margin-top: 0.9rem;
position: relative;
z-index: 12;
margin: -5.75rem 1rem 0;
padding: 0.9rem 1rem;
border-radius: 14px;
border: 1px solid var(--panel-border);
background: rgba(15, 23, 42, 0.72);
background: linear-gradient(180deg, rgba(15, 23, 42, 0.18), rgba(15, 23, 42, 0.86));
backdrop-filter: blur(10px);
display: flex;
align-items: center;
justify-content: space-between;
@@ -627,7 +634,7 @@ header p {
.custom-controls.controls-faded,
.custom-seek-container.controls-faded {
opacity: 0;
transform: translateY(8px);
transform: translateY(12px);
pointer-events: none;
}
@@ -989,6 +996,7 @@ header p {
.custom-controls {
align-items: center;
margin: -6.25rem 0.75rem 0;
}
.controls-left,

View File

@@ -110,6 +110,21 @@ document.addEventListener('DOMContentLoaded', () => {
}
};
const createStreamSessionId = () => `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
const buildStreamUrl = (targetSeconds = null) => {
const codec = codecSelect?.value || 'h264';
const encoder = encoderSelect?.value || 'software';
const streamSessionId = createStreamSessionId();
let streamUrl = `/api/stream?bucket=${encodeURIComponent(selectedBucket)}&key=${encodeURIComponent(selectedKey)}&codec=${encodeURIComponent(codec)}&encoder=${encodeURIComponent(encoder)}&streamSessionId=${encodeURIComponent(streamSessionId)}`;
if (typeof targetSeconds === 'number' && Number.isFinite(targetSeconds) && targetSeconds > 0) {
streamUrl += `&ss=${targetSeconds}`;
}
if (s3Username) streamUrl += `&username=${encodeURIComponent(s3Username)}`;
if (s3Password) streamUrl += `&password=${encodeURIComponent(s3Password)}`;
return streamUrl;
};
const updatePlayControls = () => {
if (controlPlayToggle) {
controlPlayToggle.textContent = videoPlayer.paused ? 'Play' : 'Pause';
@@ -510,11 +525,7 @@ document.addEventListener('DOMContentLoaded', () => {
}
// Build new stream URL with ss parameter
const codec = codecSelect?.value || 'h264';
const encoder = encoderSelect?.value || 'software';
let streamUrl = `/api/stream?bucket=${encodeURIComponent(selectedBucket)}&key=${encodeURIComponent(selectedKey)}&codec=${encodeURIComponent(codec)}&encoder=${encodeURIComponent(encoder)}&ss=${targetSeconds}`;
if (s3Username) streamUrl += `&username=${encodeURIComponent(s3Username)}`;
if (s3Password) streamUrl += `&password=${encodeURIComponent(s3Password)}`;
const streamUrl = buildStreamUrl(targetSeconds);
// Changing src automatically aborts the previous HTTP request,
// which triggers res.on('close') on the server, killing the old ffmpeg process
@@ -876,9 +887,7 @@ document.addEventListener('DOMContentLoaded', () => {
const codec = codecSelect?.value || 'h264';
const encoder = encoderSelect?.value || 'software';
if (!selectedBucket) throw new Error('No bucket selected');
let streamUrl = `/api/stream?bucket=${encodeURIComponent(selectedBucket)}&key=${encodeURIComponent(selectedKey)}&codec=${encodeURIComponent(codec)}&encoder=${encodeURIComponent(encoder)}`;
if (s3Username) streamUrl += `&username=${encodeURIComponent(s3Username)}`;
if (s3Password) streamUrl += `&password=${encodeURIComponent(s3Password)}`;
const streamUrl = buildStreamUrl();
videoPlayer.src = streamUrl;
videoPlayer.load();
videoPlayer.addEventListener('loadedmetadata', () => {