使用VALKEY

This commit is contained in:
CN-JS-HuiBai
2026-04-03 22:30:35 +08:00
parent e30736c3e7
commit 3c3bd6dcb1
4 changed files with 213 additions and 75 deletions

View File

@@ -72,7 +72,7 @@ document.addEventListener('DOMContentLoaded', () => {
let s3Username = '';
let s3Password = '';
let s3AuthHeaders = {};
const SAVED_AUTH_STORAGE_KEY = 'media-coding-web:s3-auth';
const LEGACY_AUTH_STORAGE_KEY = 'media-coding-web:s3-auth';
const SAVED_BUCKET_STORAGE_KEY = 'media-coding-web:selected-bucket';
// Seek state
@@ -770,41 +770,6 @@ document.addEventListener('DOMContentLoaded', () => {
if (s3Password) s3AuthHeaders['X-S3-Password'] = s3Password;
};
const saveAuthState = (username, password) => {
try {
window.localStorage.setItem(SAVED_AUTH_STORAGE_KEY, JSON.stringify({
username,
password
}));
} catch (error) {
console.warn('Failed to persist auth state:', error);
}
};
const loadAuthState = () => {
try {
const rawValue = window.localStorage.getItem(SAVED_AUTH_STORAGE_KEY);
if (!rawValue) return null;
const parsed = JSON.parse(rawValue);
if (!parsed || typeof parsed.username !== 'string' || typeof parsed.password !== 'string') {
return null;
}
return parsed;
} catch (error) {
console.warn('Failed to read auth state:', error);
return null;
}
};
const clearAuthState = () => {
try {
window.localStorage.removeItem(SAVED_AUTH_STORAGE_KEY);
window.localStorage.removeItem(SAVED_BUCKET_STORAGE_KEY);
} catch (error) {
console.warn('Failed to clear auth state:', error);
}
};
const saveSelectedBucket = (bucketName) => {
try {
if (bucketName) {
@@ -826,6 +791,12 @@ document.addEventListener('DOMContentLoaded', () => {
}
};
try {
window.localStorage.removeItem(LEGACY_AUTH_STORAGE_KEY);
} catch (error) {
console.warn('Failed to clear legacy auth state:', error);
}
const showLogin = () => {
if (loginScreen) loginScreen.classList.remove('hidden');
if (appContainer) appContainer.classList.add('hidden');
@@ -859,6 +830,27 @@ document.addEventListener('DOMContentLoaded', () => {
loginError.classList.add('hidden');
};
const applyAuthenticatedState = async (buckets) => {
if (!Array.isArray(buckets) || buckets.length === 0) {
throw new Error('No buckets available for this account');
}
renderBuckets(buckets);
showApp();
const savedBucket = loadSelectedBucket();
selectedBucket = buckets.some((bucket) => bucket.Name === savedBucket)
? savedBucket
: buckets[0].Name;
if (bucketSelect) bucketSelect.value = selectedBucket;
saveSelectedBucket(selectedBucket);
loadConfig();
if (!ws) {
connectWebSocket();
}
setAuthHeaders('', '');
await fetchVideos(selectedBucket);
};
const login = async (options = {}) => {
if (!loginUsernameInput || !loginPasswordInput) return false;
const username = typeof options.username === 'string' ? options.username.trim() : loginUsernameInput.value.trim();
@@ -882,29 +874,12 @@ document.addEventListener('DOMContentLoaded', () => {
throw new Error(data.error || 'Login failed');
}
const data = await res.json();
if (!Array.isArray(data.buckets) || data.buckets.length === 0) {
throw new Error('No buckets available for this account');
}
saveAuthState(username, password);
if (loginUsernameInput) loginUsernameInput.value = username;
if (loginPasswordInput) loginPasswordInput.value = password;
renderBuckets(data.buckets);
showApp();
const savedBucket = loadSelectedBucket();
selectedBucket = data.buckets.some((bucket) => bucket.Name === savedBucket)
? savedBucket
: data.buckets[0].Name;
if (bucketSelect) bucketSelect.value = selectedBucket;
saveSelectedBucket(selectedBucket);
loadConfig();
if (!ws) {
connectWebSocket();
}
await fetchVideos(selectedBucket);
if (loginPasswordInput) loginPasswordInput.value = '';
await applyAuthenticatedState(data.buckets);
return true;
} catch (err) {
console.error('Login error:', err);
clearAuthState();
if (!skipErrorUi) {
showLoginError(err.message);
}
@@ -919,19 +894,18 @@ document.addEventListener('DOMContentLoaded', () => {
};
const restoreSavedSession = async () => {
const savedAuth = loadAuthState();
if (!savedAuth) {
try {
const res = await fetch('/api/buckets');
if (!res.ok) {
return false;
}
const data = await res.json();
await applyAuthenticatedState(data.buckets || []);
return true;
} catch (error) {
console.error('Session restore failed:', error);
return false;
}
if (loginUsernameInput) loginUsernameInput.value = savedAuth.username;
if (loginPasswordInput) loginPasswordInput.value = savedAuth.password;
return login({
username: savedAuth.username,
password: savedAuth.password,
isRestoring: true,
skipErrorUi: true
});
};
const clearDownloadCache = async () => {