CommanderLazarus commited on
Commit
8348fb2
·
verified ·
1 Parent(s): 0d7a4e5

Make me an application that converts several photos and an mp3 version of a song into a small music video. Allow text based imagery options with a text field. - Initial Deployment

Browse files
Files changed (3) hide show
  1. README.md +7 -5
  2. index.html +330 -18
  3. prompts.txt +1 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Music Video Generator
3
- emoji: 🌍
4
- colorFrom: indigo
5
- colorTo: red
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: music-video-generator
3
+ emoji: 🐳
4
+ colorFrom: pink
5
+ colorTo: purple
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,331 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Music Video Creator</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
9
+ <script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
11
+ <script src="https://unpkg.com/feather-icons"></script>
12
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet">
13
+ <style>
14
+ body {
15
+ font-family: 'Poppins', sans-serif;
16
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
17
+ }
18
+ .video-preview {
19
+ background: rgba(0, 0, 0, 0.7);
20
+ border-radius: 12px;
21
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
22
+ }
23
+ .upload-area {
24
+ border: 2px dashed #cbd5e0;
25
+ border-radius: 12px;
26
+ transition: all 0.3s ease;
27
+ }
28
+ .upload-area:hover {
29
+ border-color: #667eea;
30
+ background-color: rgba(102, 126, 234, 0.05);
31
+ }
32
+ .file-input {
33
+ display: none;
34
+ }
35
+ .thumbnail-container {
36
+ position: relative;
37
+ overflow: hidden;
38
+ border-radius: 8px;
39
+ }
40
+ .thumbnail-container img {
41
+ transition: transform 0.3s ease;
42
+ }
43
+ .thumbnail-container:hover img {
44
+ transform: scale(1.05);
45
+ }
46
+ .remove-btn {
47
+ position: absolute;
48
+ top: 8px;
49
+ right: 8px;
50
+ background: rgba(255, 255, 255, 0.8);
51
+ border-radius: 50%;
52
+ padding: 4px;
53
+ cursor: pointer;
54
+ opacity: 0;
55
+ transition: opacity 0.3s ease;
56
+ }
57
+ .thumbnail-container:hover .remove-btn {
58
+ opacity: 1;
59
+ }
60
+ .progress-bar {
61
+ height: 6px;
62
+ background-color: #e2e8f0;
63
+ border-radius: 3px;
64
+ overflow: hidden;
65
+ }
66
+ .progress-fill {
67
+ height: 100%;
68
+ background: linear-gradient(90deg, #667eea, #764ba2);
69
+ width: 0%;
70
+ transition: width 0.4s ease;
71
+ }
72
+ .pulse {
73
+ animation: pulse 2s infinite;
74
+ }
75
+ @keyframes pulse {
76
+ 0% { box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.4); }
77
+ 70% { box-shadow: 0 0 0 10px rgba(102, 126, 234, 0); }
78
+ 100% { box-shadow: 0 0 0 0 rgba(102, 126, 234, 0); }
79
+ }
80
+ </style>
81
+ </head>
82
+ <body class="min-h-screen text-gray-800">
83
+ <!-- Header -->
84
+ <header class="py-6 px-4 sm:px-8">
85
+ <div class="container mx-auto flex justify-between items-center">
86
+ <div class="flex items-center space-x-2">
87
+ <div class="w-10 h-10 bg-white rounded-full flex items-center justify-center">
88
+ <i data-feather="music" class="text-indigo-600"></i>
89
+ </div>
90
+ <h1 class="text-2xl font-bold text-white">Vidify</h1>
91
+ </div>
92
+ <nav class="hidden md:flex space-x-8">
93
+ <a href="#" class="text-white hover:text-indigo-200 font-medium">Home</a>
94
+ <a href="#" class="text-white hover:text-indigo-200 font-medium">Features</a>
95
+ <a href="#" class="text-white hover:text-indigo-200 font-medium">Pricing</a>
96
+ <a href="#" class="text-white hover:text-indigo-200 font-medium">Contact</a>
97
+ </nav>
98
+ <button class="bg-white text-indigo-600 px-4 py-2 rounded-full font-medium hover:bg-indigo-50 transition duration-300">
99
+ Sign In
100
+ </button>
101
+ </div>
102
+ </header>
103
+
104
+ <!-- Main Content -->
105
+ <main class="container mx-auto px-4 py-8">
106
+ <div class="text-center mb-12" data-aos="fade-up">
107
+ <h1 class="text-4xl md:text-5xl font-bold text-white mb-4">Create Stunning Music Videos</h1>
108
+ <p class="text-xl text-indigo-100 max-w-2xl mx-auto">Transform your photos and music into captivating visual stories with our easy-to-use editor</p>
109
+ </div>
110
+
111
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
112
+ <!-- Upload Section -->
113
+ <div class="bg-white rounded-2xl shadow-xl p-6" data-aos="fade-right">
114
+ <h2 class="text-2xl font-bold mb-6 text-gray-800">Upload Your Content</h2>
115
+
116
+ <!-- Photo Upload -->
117
+ <div class="mb-8">
118
+ <h3 class="text-lg font-semibold mb-3 text-gray-700">Photos</h3>
119
+ <div class="upload-area p-8 text-center cursor-pointer mb-4" id="photoUploadArea">
120
+ <i data-feather="image" class="w-12 h-12 text-gray-400 mx-auto mb-3"></i>
121
+ <p class="text-gray-600 mb-2">Drag & drop your photos here</p>
122
+ <p class="text-sm text-gray-500 mb-4">or</p>
123
+ <button class="bg-indigo-600 text-white px-6 py-2 rounded-full font-medium hover:bg-indigo-700 transition duration-300">
124
+ Browse Files
125
+ </button>
126
+ <input type="file" class="file-input" id="photoInput" accept="image/*" multiple>
127
+ </div>
128
+ <div class="text-sm text-gray-500 mb-4">Supports JPG, PNG, GIF (Max 10 files)</div>
129
+
130
+ <!-- Photo Thumbnails -->
131
+ <div class="grid grid-cols-3 sm:grid-cols-4 md:grid-cols-5 gap-3 mt-4" id="photoThumbnails">
132
+ <!-- Thumbnails will be added here dynamically -->
133
+ </div>
134
+ </div>
135
+
136
+ <!-- Audio Upload -->
137
+ <div class="mb-8">
138
+ <h3 class="text-lg font-semibold mb-3 text-gray-700">Audio Track</h3>
139
+ <div class="upload-area p-8 text-center cursor-pointer" id="audioUploadArea">
140
+ <i data-feather="music" class="w-12 h-12 text-gray-400 mx-auto mb-3"></i>
141
+ <p class="text-gray-600 mb-2">Upload your MP3 file</p>
142
+ <p class="text-sm text-gray-500 mb-4">or</p>
143
+ <button class="bg-indigo-600 text-white px-6 py-2 rounded-full font-medium hover:bg-indigo-700 transition duration-300">
144
+ Select MP3
145
+ </button>
146
+ <input type="file" class="file-input" id="audioInput" accept="audio/mp3">
147
+ </div>
148
+ <div class="text-sm text-gray-500 mt-2">Supports MP3 files only</div>
149
+ </div>
150
+
151
+ <!-- Text-based Imagery Options -->
152
+ <div class="mb-8">
153
+ <h3 class="text-lg font-semibold mb-3 text-gray-700">Text-based Imagery</h3>
154
+ <div class="bg-gray-50 rounded-lg p-4">
155
+ <label for="imageryText" class="block text-sm font-medium text-gray-700 mb-2">Describe your desired imagery:</label>
156
+ <textarea id="imageryText" rows="3" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500" placeholder="e.g., Sunset beach, city lights, mountain landscape..."></textarea>
157
+ <p class="text-xs text-gray-500 mt-2">Our AI will generate relevant images based on your description</p>
158
+ </div>
159
+ </div>
160
+
161
+ <!-- Generate Button -->
162
+ <button id="generateBtn" class="w-full bg-gradient-to-r from-indigo-600 to-purple-600 text-white py-3 rounded-full font-bold text-lg hover:from-indigo-700 hover:to-purple-700 transition duration-300 pulse">
163
+ Generate Music Video
164
+ </button>
165
+ </div>
166
+
167
+ <!-- Preview Section -->
168
+ <div class="bg-white rounded-2xl shadow-xl p-6" data-aos="fade-left">
169
+ <h2 class="text-2xl font-bold mb-6 text-gray-800">Preview</h2>
170
+
171
+ <!-- Video Preview -->
172
+ <div class="video-preview aspect-video flex items-center justify-center mb-6">
173
+ <div class="text-center">
174
+ <i data-feather="play-circle" class="w-16 h-16 text-white mx-auto mb-3"></i>
175
+ <p class="text-white">Your video preview will appear here</p>
176
+ </div>
177
+ </div>
178
+
179
+ <!-- Progress Bar -->
180
+ <div class="progress-bar mb-6">
181
+ <div class="progress-fill" id="progressFill"></div>
182
+ </div>
183
+
184
+ <!-- Video Info -->
185
+ <div class="space-y-4">
186
+ <div class="flex justify-between items-center">
187
+ <span class="text-gray-600">Status:</span>
188
+ <span class="font-medium text-indigo-600" id="statusText">Ready to generate</span>
189
+ </div>
190
+ <div class="flex justify-between items-center">
191
+ <span class="text-gray-600">Duration:</span>
192
+ <span class="font-medium" id="durationText">0:00</span>
193
+ </div>
194
+ <div class="flex justify-between items-center">
195
+ <span class="text-gray-600">Resolution:</span>
196
+ <span class="font-medium">1080p</span>
197
+ </div>
198
+ </div>
199
+
200
+ <!-- Action Buttons -->
201
+ <div class="flex space-x-4 mt-8">
202
+ <button class="flex-1 border border-indigo-600 text-indigo-600 py-2 rounded-lg font-medium hover:bg-indigo-50 transition duration-300">
203
+ <i data-feather="download" class="inline mr-2"></i>Download
204
+ </button>
205
+ <button class="flex-1 bg-indigo-600 text-white py-2 rounded-lg font-medium hover:bg-indigo-700 transition duration-300">
206
+ <i data-feather="share-2" class="inline mr-2"></i>Share
207
+ </button>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </main>
212
+
213
+ <!-- Footer -->
214
+ <footer class="py-8 px-4 mt-12">
215
+ <div class="container mx-auto text-center text-white">
216
+ <p>© 2023 Vidify. All rights reserved.</p>
217
+ <div class="flex justify-center space-x-6 mt-4">
218
+ <a href="#" class="hover:text-indigo-200">Terms</a>
219
+ <a href="#" class="hover:text-indigo-200">Privacy</a>
220
+ <a href="#" class="hover:text-indigo-200">Help Center</a>
221
+ <a href="#" class="hover:text-indigo-200">Contact</a>
222
+ </div>
223
+ </div>
224
+ </footer>
225
+
226
+ <script>
227
+ AOS.init({
228
+ duration: 800,
229
+ easing: 'ease-out-cubic'
230
+ });
231
+
232
+ feather.replace();
233
+
234
+ // File upload handling
235
+ const photoUploadArea = document.getElementById('photoUploadArea');
236
+ const audioUploadArea = document.getElementById('audioUploadArea');
237
+ const photoInput = document.getElementById('photoInput');
238
+ const audioInput = document.getElementById('audioInput');
239
+ const photoThumbnails = document.getElementById('photoThumbnails');
240
+ const generateBtn = document.getElementById('generateBtn');
241
+ const progressFill = document.getElementById('progressFill');
242
+ const statusText = document.getElementById('statusText');
243
+ const durationText = document.getElementById('durationText');
244
+
245
+ // Photo upload area click handler
246
+ photoUploadArea.addEventListener('click', () => {
247
+ photoInput.click();
248
+ });
249
+
250
+ // Audio upload area click handler
251
+ audioUploadArea.addEventListener('click', () => {
252
+ audioInput.click();
253
+ });
254
+
255
+ // Handle photo selection
256
+ photoInput.addEventListener('change', function(e) {
257
+ const files = e.target.files;
258
+ photoThumbnails.innerHTML = '';
259
+
260
+ for (let i = 0; i < files.length; i++) {
261
+ const file = files[i];
262
+ if (!file.type.match('image.*')) continue;
263
+
264
+ const reader = new FileReader();
265
+ reader.onload = function(e) {
266
+ const thumbnail = document.createElement('div');
267
+ thumbnail.className = 'thumbnail-container';
268
+ thumbnail.innerHTML = `
269
+ <img src="${e.target.result}" alt="Thumbnail" class="w-full h-20 object-cover">
270
+ <div class="remove-btn">
271
+ <i data-feather="x" class="w-4 h-4 text-gray-700"></i>
272
+ </div>
273
+ `;
274
+ photoThumbnails.appendChild(thumbnail);
275
+ feather.replace();
276
+
277
+ // Add remove functionality
278
+ const removeBtn = thumbnail.querySelector('.remove-btn');
279
+ removeBtn.addEventListener('click', function(e) {
280
+ e.stopPropagation();
281
+ thumbnail.remove();
282
+ });
283
+ };
284
+ reader.readAsDataURL(file);
285
+ }
286
+ });
287
+
288
+ // Handle audio selection
289
+ audioInput.addEventListener('change', function(e) {
290
+ const file = e.target.files[0];
291
+ if (file && file.type === 'audio/mp3') {
292
+ statusText.textContent = 'MP3 file selected';
293
+ statusText.classList.add('text-green-600');
294
+ statusText.classList.remove('text-indigo-600');
295
+ }
296
+ });
297
+
298
+ // Generate button click handler
299
+ generateBtn.addEventListener('click', function() {
300
+ if (photoInput.files.length === 0) {
301
+ alert('Please upload at least one photo');
302
+ return;
303
+ }
304
+
305
+ if (audioInput.files.length === 0) {
306
+ alert('Please upload an MP3 file');
307
+ return;
308
+ }
309
+
310
+ // Simulate video generation process
311
+ statusText.textContent = 'Generating video...';
312
+ statusText.classList.add('text-yellow-600');
313
+ statusText.classList.remove('text-green-600', 'text-indigo-600');
314
+
315
+ let progress = 0;
316
+ const interval = setInterval(() => {
317
+ progress += Math.random() * 10;
318
+ if (progress >= 100) {
319
+ progress = 100;
320
+ clearInterval(interval);
321
+ statusText.textContent = 'Video ready!';
322
+ statusText.classList.add('text-green-600');
323
+ statusText.classList.remove('text-yellow-600');
324
+ durationText.textContent = '1:45';
325
+ }
326
+ progressFill.style.width = progress + '%';
327
+ }, 200);
328
+ });
329
+ </script>
330
+ </body>
331
  </html>
prompts.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ Make me an application that converts several photos and an mp3 version of a song into a small music video. Allow text based imagery options with a text field.