Spaces:
Running
Running
Update index.html
Browse files- index.html +79 -7
index.html
CHANGED
|
@@ -28,12 +28,14 @@
|
|
| 28 |
position: fixed;
|
| 29 |
top: 10px;
|
| 30 |
right: 10px;
|
| 31 |
-
background:
|
| 32 |
border: none;
|
| 33 |
color: #00ff00;
|
| 34 |
-
font-size:
|
| 35 |
cursor: pointer;
|
| 36 |
z-index: 20;
|
|
|
|
|
|
|
| 37 |
}
|
| 38 |
|
| 39 |
#settings-panel {
|
|
@@ -54,7 +56,9 @@
|
|
| 54 |
#token-input,
|
| 55 |
#prompt-input,
|
| 56 |
#clock-color-input,
|
| 57 |
-
#clock-size-input
|
|
|
|
|
|
|
| 58 |
width: 100%;
|
| 59 |
margin-bottom: 10px;
|
| 60 |
}
|
|
@@ -120,17 +124,41 @@
|
|
| 120 |
margin-top: 10px;
|
| 121 |
margin-bottom: 5px;
|
| 122 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
</style>
|
| 124 |
</head>
|
| 125 |
|
| 126 |
<body>
|
| 127 |
<img id="background-image" alt="Please specify your HF token in the settings to generate images" src="">
|
| 128 |
<div id="clock"></div>
|
| 129 |
-
<button id="settings-btn">
|
| 130 |
<div id="settings-panel">
|
| 131 |
<label for="token-input">Hugging Face Token:</label>
|
| 132 |
<input type="password" id="token-input" placeholder="Enter Hugging Face token">
|
| 133 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
<label for="prompt-input">Custom Prompt:</label>
|
| 135 |
<textarea id="prompt-input" rows="4" placeholder="Enter custom prompt (use {time} for current time)"></textarea>
|
| 136 |
|
|
@@ -141,19 +169,27 @@
|
|
| 141 |
<input type="range" id="clock-size-input" min="1" max="20" step="0.1">
|
| 142 |
<span id="clock-size-value"></span>
|
| 143 |
|
|
|
|
|
|
|
|
|
|
| 144 |
<button id="fullscreen-btn" class="btn">Toggle Fullscreen</button>
|
| 145 |
<button id="save-settings" class="btn">Save</button>
|
| 146 |
<button id="test-image" class="btn">Test Image Generation</button>
|
| 147 |
<button id="reset-prompt" class="btn">Reset Prompt</button>
|
| 148 |
</div>
|
|
|
|
|
|
|
|
|
|
| 149 |
|
| 150 |
<script>
|
| 151 |
let hfToken = localStorage.getItem('hfToken') || '';
|
| 152 |
let customPrompt = localStorage.getItem('customPrompt') || 'beautiful abstract landscape that suits the time {time}';
|
| 153 |
-
|
| 154 |
let clockColor = localStorage.getItem('clockColor') || '#00ff00';
|
| 155 |
let clockSize = parseFloat(localStorage.getItem('clockSize')) || 8;
|
|
|
|
| 156 |
let imageGenerationInterval;
|
|
|
|
| 157 |
|
| 158 |
const DEFAULT_PROMPT = 'beautiful abstract landscape that suits the time {time}';
|
| 159 |
|
|
@@ -186,7 +222,7 @@
|
|
| 186 |
if (!hfToken) return;
|
| 187 |
|
| 188 |
try {
|
| 189 |
-
const response = await fetch(
|
| 190 |
method: 'POST',
|
| 191 |
headers: {
|
| 192 |
'Content-Type': 'application/json',
|
|
@@ -198,7 +234,8 @@
|
|
| 198 |
});
|
| 199 |
|
| 200 |
if (!response.ok) {
|
| 201 |
-
|
|
|
|
| 202 |
}
|
| 203 |
|
| 204 |
const blob = await response.blob();
|
|
@@ -213,6 +250,14 @@
|
|
| 213 |
newImage.src = imageUrl;
|
| 214 |
} catch (error) {
|
| 215 |
console.error('Error generating image:', error);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 216 |
}
|
| 217 |
}
|
| 218 |
|
|
@@ -221,6 +266,23 @@
|
|
| 221 |
.slice(0, -3);
|
| 222 |
const prompt = customPrompt.replace('{time}', currentTime);
|
| 223 |
generateImage(prompt);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 224 |
}
|
| 225 |
|
| 226 |
function initializeSettings() {
|
|
@@ -234,6 +296,10 @@
|
|
| 234 |
.value = clockSize;
|
| 235 |
document.getElementById('clock-size-value')
|
| 236 |
.textContent = clockSize + ' vw';
|
|
|
|
|
|
|
|
|
|
|
|
|
| 237 |
}
|
| 238 |
|
| 239 |
function toggleFullscreen() {
|
|
@@ -278,11 +344,17 @@
|
|
| 278 |
.value;
|
| 279 |
clockSize = parseFloat(document.getElementById('clock-size-input')
|
| 280 |
.value);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 281 |
|
| 282 |
localStorage.setItem('hfToken', hfToken);
|
| 283 |
localStorage.setItem('customPrompt', customPrompt);
|
| 284 |
localStorage.setItem('clockColor', clockColor);
|
| 285 |
localStorage.setItem('clockSize', clockSize);
|
|
|
|
|
|
|
| 286 |
|
| 287 |
document.getElementById('settings-panel')
|
| 288 |
.style.display = 'none';
|
|
|
|
| 28 |
position: fixed;
|
| 29 |
top: 10px;
|
| 30 |
right: 10px;
|
| 31 |
+
background: rgba(0, 255, 0, 0.2);
|
| 32 |
border: none;
|
| 33 |
color: #00ff00;
|
| 34 |
+
font-size: 16px;
|
| 35 |
cursor: pointer;
|
| 36 |
z-index: 20;
|
| 37 |
+
padding: 5px 10px;
|
| 38 |
+
border-radius: 5px;
|
| 39 |
}
|
| 40 |
|
| 41 |
#settings-panel {
|
|
|
|
| 56 |
#token-input,
|
| 57 |
#prompt-input,
|
| 58 |
#clock-color-input,
|
| 59 |
+
#clock-size-input,
|
| 60 |
+
#model-select,
|
| 61 |
+
#generation-interval-input {
|
| 62 |
width: 100%;
|
| 63 |
margin-bottom: 10px;
|
| 64 |
}
|
|
|
|
| 124 |
margin-top: 10px;
|
| 125 |
margin-bottom: 5px;
|
| 126 |
}
|
| 127 |
+
|
| 128 |
+
#countdown-bar {
|
| 129 |
+
position: fixed;
|
| 130 |
+
bottom: 0;
|
| 131 |
+
left: 0;
|
| 132 |
+
height: 5px;
|
| 133 |
+
width: 100%;
|
| 134 |
+
background-color: rgba(0, 255, 0, 0.3);
|
| 135 |
+
z-index: 15;
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
#countdown-progress {
|
| 139 |
+
height: 100%;
|
| 140 |
+
width: 0%;
|
| 141 |
+
background-color: rgba(0, 255, 0, 0.7);
|
| 142 |
+
transition: width 1s linear;
|
| 143 |
+
}
|
| 144 |
</style>
|
| 145 |
</head>
|
| 146 |
|
| 147 |
<body>
|
| 148 |
<img id="background-image" alt="Please specify your HF token in the settings to generate images" src="">
|
| 149 |
<div id="clock"></div>
|
| 150 |
+
<button id="settings-btn">Settings</button>
|
| 151 |
<div id="settings-panel">
|
| 152 |
<label for="token-input">Hugging Face Token:</label>
|
| 153 |
<input type="password" id="token-input" placeholder="Enter Hugging Face token">
|
| 154 |
|
| 155 |
+
<label for="model-select">Select Model:</label>
|
| 156 |
+
<select id="model-select">
|
| 157 |
+
<option value="black-forest-labs/FLUX.1-schnell">FLUX.1-schnell</option>
|
| 158 |
+
<option value="black-forest-labs/FLUX.1-dev">FLUX.1-dev</option>
|
| 159 |
+
<option value="XLabs-AI/flux-RealismLora">flux-RealismLora</option>
|
| 160 |
+
</select>
|
| 161 |
+
|
| 162 |
<label for="prompt-input">Custom Prompt:</label>
|
| 163 |
<textarea id="prompt-input" rows="4" placeholder="Enter custom prompt (use {time} for current time)"></textarea>
|
| 164 |
|
|
|
|
| 169 |
<input type="range" id="clock-size-input" min="1" max="20" step="0.1">
|
| 170 |
<span id="clock-size-value"></span>
|
| 171 |
|
| 172 |
+
<label for="generation-interval-input">Image Generation Interval (seconds):</label>
|
| 173 |
+
<input type="number" id="generation-interval-input" min="10" step="1">
|
| 174 |
+
|
| 175 |
<button id="fullscreen-btn" class="btn">Toggle Fullscreen</button>
|
| 176 |
<button id="save-settings" class="btn">Save</button>
|
| 177 |
<button id="test-image" class="btn">Test Image Generation</button>
|
| 178 |
<button id="reset-prompt" class="btn">Reset Prompt</button>
|
| 179 |
</div>
|
| 180 |
+
<div id="countdown-bar">
|
| 181 |
+
<div id="countdown-progress"></div>
|
| 182 |
+
</div>
|
| 183 |
|
| 184 |
<script>
|
| 185 |
let hfToken = localStorage.getItem('hfToken') || '';
|
| 186 |
let customPrompt = localStorage.getItem('customPrompt') || 'beautiful abstract landscape that suits the time {time}';
|
| 187 |
+
let generationFrequency = parseInt(localStorage.getItem('generationFrequency')) || 150;
|
| 188 |
let clockColor = localStorage.getItem('clockColor') || '#00ff00';
|
| 189 |
let clockSize = parseFloat(localStorage.getItem('clockSize')) || 8;
|
| 190 |
+
let selectedModel = localStorage.getItem('selectedModel') || 'black-forest-labs/FLUX.1-schnell';
|
| 191 |
let imageGenerationInterval;
|
| 192 |
+
let countdownInterval;
|
| 193 |
|
| 194 |
const DEFAULT_PROMPT = 'beautiful abstract landscape that suits the time {time}';
|
| 195 |
|
|
|
|
| 222 |
if (!hfToken) return;
|
| 223 |
|
| 224 |
try {
|
| 225 |
+
const response = await fetch(`https://api-inference.huggingface.co/models/${selectedModel}`, {
|
| 226 |
method: 'POST',
|
| 227 |
headers: {
|
| 228 |
'Content-Type': 'application/json',
|
|
|
|
| 234 |
});
|
| 235 |
|
| 236 |
if (!response.ok) {
|
| 237 |
+
const errorData = await response.json();
|
| 238 |
+
throw new Error(`${response.status}: ${errorData.error || 'Unknown error'}`);
|
| 239 |
}
|
| 240 |
|
| 241 |
const blob = await response.blob();
|
|
|
|
| 250 |
newImage.src = imageUrl;
|
| 251 |
} catch (error) {
|
| 252 |
console.error('Error generating image:', error);
|
| 253 |
+
speakError(`Error generating image. ${error.message}`);
|
| 254 |
+
}
|
| 255 |
+
}
|
| 256 |
+
|
| 257 |
+
function speakError(message) {
|
| 258 |
+
if ('speechSynthesis' in window) {
|
| 259 |
+
const utterance = new SpeechSynthesisUtterance(message);
|
| 260 |
+
speechSynthesis.speak(utterance);
|
| 261 |
}
|
| 262 |
}
|
| 263 |
|
|
|
|
| 266 |
.slice(0, -3);
|
| 267 |
const prompt = customPrompt.replace('{time}', currentTime);
|
| 268 |
generateImage(prompt);
|
| 269 |
+
startCountdown();
|
| 270 |
+
}
|
| 271 |
+
|
| 272 |
+
function startCountdown() {
|
| 273 |
+
const progressBar = document.getElementById('countdown-progress');
|
| 274 |
+
let timeLeft = generationFrequency;
|
| 275 |
+
|
| 276 |
+
clearInterval(countdownInterval);
|
| 277 |
+
countdownInterval = setInterval(() => {
|
| 278 |
+
timeLeft--;
|
| 279 |
+
const progress = ((generationFrequency - timeLeft) / generationFrequency) * 100;
|
| 280 |
+
progressBar.style.width = `${progress}%`;
|
| 281 |
+
|
| 282 |
+
if (timeLeft <= 0) {
|
| 283 |
+
clearInterval(countdownInterval);
|
| 284 |
+
}
|
| 285 |
+
}, 1000);
|
| 286 |
}
|
| 287 |
|
| 288 |
function initializeSettings() {
|
|
|
|
| 296 |
.value = clockSize;
|
| 297 |
document.getElementById('clock-size-value')
|
| 298 |
.textContent = clockSize + ' vw';
|
| 299 |
+
document.getElementById('model-select')
|
| 300 |
+
.value = selectedModel;
|
| 301 |
+
document.getElementById('generation-interval-input')
|
| 302 |
+
.value = generationFrequency;
|
| 303 |
}
|
| 304 |
|
| 305 |
function toggleFullscreen() {
|
|
|
|
| 344 |
.value;
|
| 345 |
clockSize = parseFloat(document.getElementById('clock-size-input')
|
| 346 |
.value);
|
| 347 |
+
selectedModel = document.getElementById('model-select')
|
| 348 |
+
.value;
|
| 349 |
+
generationFrequency = parseInt(document.getElementById('generation-interval-input')
|
| 350 |
+
.value);
|
| 351 |
|
| 352 |
localStorage.setItem('hfToken', hfToken);
|
| 353 |
localStorage.setItem('customPrompt', customPrompt);
|
| 354 |
localStorage.setItem('clockColor', clockColor);
|
| 355 |
localStorage.setItem('clockSize', clockSize);
|
| 356 |
+
localStorage.setItem('selectedModel', selectedModel);
|
| 357 |
+
localStorage.setItem('generationFrequency', generationFrequency);
|
| 358 |
|
| 359 |
document.getElementById('settings-panel')
|
| 360 |
.style.display = 'none';
|