Download index.html from fhkffuy/undefined: direct link, hf CLI and curl.
- Browser
- Download file 24.9 kB
-
https://huggingface.co/spaces/fhkffuy/undefined/resolve/main/index.html
- Command line
-
hf download hf://spaces/fhkffuy/undefined/index.html
-
curl -L -o index.html https://huggingface.co/spaces/fhkffuy/undefined/resolve/main/index.html
24.9 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>VidReel Wizard - Transform Videos for Short Platforms</title> | |
| <link rel="icon" type="image/x-icon" href="/static/favicon.ico"> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script src="https://unpkg.com/feather-icons"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.waves.min.js"></script> | |
| <style> | |
| .platform-card { | |
| transition: all 0.3s ease; | |
| } | |
| .platform-card:hover { | |
| transform: translateY(-5px); | |
| box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); | |
| } | |
| .glow-on-hover:hover { | |
| filter: drop-shadow(0 0 8px rgba(255, 215, 0, 0.6)); | |
| } | |
| #video-input { | |
| height: 300px; | |
| } | |
| .preview-box { | |
| aspect-ratio: 9/16; | |
| max-height: 500px; | |
| } | |
| </style> | |
| </head> | |
| <body class="bg-gray-50"> | |
| <div id="vanta-background" class="fixed inset-0 -z-10"></div> | |
| <header class="pt-12 pb-6 px-4 sm:px-6 lg:px-8 text-center"> | |
| <h1 class="text-4xl md:text-6xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-blue-600 to-purple-600 mb-4"> | |
| VidReel Wizard | |
| </h1> | |
| <p class="text-xl md:text-2xl text-gray-700 font-medium max-w-3xl mx-auto"> | |
| Transform your YouTube videos into perfect Shorts, Reels & TikToks | |
| </p> | |
| </header> | |
| <main class="container mx-auto px-4 py-8"> | |
| <section class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-16"> | |
| <div class="bg-white rounded-xl shadow-xl p-6"> | |
| <h2 class="text-2xl font-semibold text-gray-800 mb-4">Your Video</h2> | |
| <div id="video-input" class="w-full bg-gray-100 rounded-lg flex items-center justify-center border-2 border-dashed border-gray-300"> | |
| <div class="text-center p-6"> | |
| <i data-feather="upload" class="w-16 h-16 mx-auto text-gray-400 mb-4"></i> | |
| <p class="text-gray-500 mb-4">Drag & drop your YouTube video URL or file</p> | |
| <input type="file" id="file-upload" class="hidden" accept="video/*"> | |
| <label for="file-upload" class="px-6 py-2 bg-blue-600 text-white rounded-full cursor-pointer hover:bg-blue-700 transition"> | |
| Select Video | |
| </label> | |
| <div class="mt-4 relative"> | |
| <input type="text" id="youtube-url" placeholder="Or paste YouTube URL here" | |
| class="w-full px-4 py-2 border border-gray-300 rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500"> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="mt-4 flex justify-center"> | |
| <button id="analyze-btn" class="px-8 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white font-bold rounded-full hover:shadow-lg transition-all transform hover:scale-105"> | |
| Analyze Video | |
| </button> | |
| </div> | |
| </div> | |
| <div class="bg-white rounded-xl shadow-xl p-6"> | |
| <h2 class="text-2xl font-semibold text-gray-800 mb-4">Transformation Options</h2> | |
| <div class="space-y-4"> | |
| <div> | |
| <h3 class="font-medium text-gray-800 mb-2">Select Platform</h3> | |
| <div class="grid grid-cols-3 gap-2"> | |
| <button class="platform-btn px-3 py-2 bg-blue-100 text-blue-800 rounded-lg font-medium" data-platform="shorts"> | |
| YouTube Shorts | |
| </button> | |
| <button class="platform-btn px-3 py-2 bg-pink-100 text-pink-800 rounded-lg font-medium" data-platform="reels"> | |
| Instagram Reels | |
| </button> | |
| <button class="platform-btn px-3 py-2 bg-black text-white rounded-lg font-medium" data-platform="tiktok"> | |
| TikTok | |
| </button> | |
| </div> | |
| </div> | |
| <div> | |
| <h3 class="font-medium text-gray-800 mb-2">Crop Options</h3> | |
| <div class="grid grid-cols-2 md:grid-cols-4 gap-2"> | |
| <button class="crop-option px-3 py-2 bg-gray-100 text-gray-800 rounded-lg" data-crop="9:16"> | |
| 9:16 Vertical | |
| </button> | |
| <button class="crop-option px-3 py-2 bg-gray-100 text-gray-800 rounded-lg" data-crop="1:1"> | |
| 1:1 Square | |
| </button> | |
| <button class="crop-option px-3 py-2 bg-gray-100 text-gray-800 rounded-lg" data-crop="16:9"> | |
| 16:9 Widescreen | |
| </button> | |
| <button class="crop-option px-3 py-2 bg-gray-100 text-gray-800 rounded-lg" data-crop="custom"> | |
| Custom | |
| </button> | |
| </div> | |
| </div> | |
| <div> | |
| <h3 class="font-medium text-gray-800 mb-2">Enhancements</h3> | |
| <div class="space-y-2"> | |
| <label class="flex items-center space-x-3"> | |
| <input type="checkbox" class="form-checkbox h-5 w-5 text-blue-600 rounded" id="auto-captions"> | |
| <span class="text-gray-700">Auto-generate captions</span> | |
| </label> | |
| <label class="flex items-center space-x-3"> | |
| <input type="checkbox" class="form-checkbox h-5 w-5 text-blue-600 rounded" id="auto-trim"> | |
| <span class="text-gray-700">Auto-trim to 60 seconds</span> | |
| </label> | |
| <label class="flex items-center space-x-3"> | |
| <input type="checkbox" class="form-checkbox h-5 w-5 text-blue-600 rounded" id="add-music"> | |
| <span class="text-gray-700">Add trending music</span> | |
| </label> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <section id="preview-section" class="hidden"> | |
| <h2 class="text-3xl font-bold text-center text-gray-800 mb-8">Preview & Download</h2> | |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-6"> | |
| <div class="bg-white rounded-xl shadow-lg p-4"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-4 text-center">YouTube Shorts</h3> | |
| <div class="preview-box bg-gray-100 rounded-lg overflow-hidden flex items-center justify-center"> | |
| <video id="shorts-preview" controls class="w-full h-full object-cover hidden"></video> | |
| <div id="shorts-placeholder" class="text-center p-6"> | |
| <i data-feather="youtube" class="w-12 h-12 mx-auto text-red-500 mb-4"></i> | |
| <p class="text-gray-500">Shorts preview will appear here</p> | |
| </div> | |
| </div> | |
| <button class="w-full mt-4 px-4 py-2 bg-red-600 text-white rounded-lg font-medium hover:bg-red-700 transition" id="download-shorts"> | |
| Download Short | |
| </button> | |
| </div> | |
| <div class="bg-white rounded-xl shadow-lg p-4"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-4 text-center">Instagram Reels</h3> | |
| <div class="preview-box bg-gray-100 rounded-lg overflow-hidden flex items-center justify-center"> | |
| <video id="reels-preview" controls class="w-full h-full object-cover hidden"></video> | |
| <div id="reels-placeholder" class="text-center p-6"> | |
| <i data-feather="instagram" class="w-12 h-12 mx-auto text-pink-500 mb-4"></i> | |
| <p class="text-gray-500">Reels preview will appear here</p> | |
| </div> | |
| </div> | |
| <button class="w-full mt-4 px-4 py-2 bg-gradient-to-r from-purple-600 to-pink-600 text-white rounded-lg font-medium hover:opacity-90 transition" id="download-reels"> | |
| Download Reel | |
| </button> | |
| </div> | |
| <div class="bg-white rounded-xl shadow-lg p-4"> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-4 text-center">TikTok</h3> | |
| <div class="preview-box bg-gray-100 rounded-lg overflow-hidden flex items-center justify-center"> | |
| <video id="tiktok-preview" controls class="w-full h-full object-cover hidden"></video> | |
| <div id="tiktok-placeholder" class="text-center p-6"> | |
| <i data-feather="music" class="w-12 h-12 mx-auto text-black mb-4"></i> | |
| <p class="text-gray-500">TikTok preview will appear here</p> | |
| </div> | |
| </div> | |
| <button class="w-full mt-4 px-4 py-2 bg-black text-white rounded-lg font-medium hover:bg-gray-800 transition" id="download-tiktok"> | |
| Download TikTok | |
| </button> | |
| </div> | |
| </div> | |
| </section> | |
| <section class="mt-16 bg-white rounded-xl shadow-lg p-8"> | |
| <h2 class="text-3xl font-bold text-center text-gray-800 mb-6">How It Works</h2> | |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-8"> | |
| <div class="text-center p-4"> | |
| <div class="w-20 h-20 mx-auto bg-blue-100 rounded-full flex items-center justify-center mb-4 glow-on-hover"> | |
| <i data-feather="upload" class="w-10 h-10 text-blue-600"></i> | |
| </div> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-2">1. Upload Your Video</h3> | |
| <p class="text-gray-600">Add your YouTube URL or upload a video file directly</p> | |
| </div> | |
| <div class="text-center p-4"> | |
| <div class="w-20 h-20 mx-auto bg-purple-100 rounded-full flex items-center justify-center mb-4 glow-on-hover"> | |
| <i data-feather="sliders" class="w-10 h-10 text-purple-600"></i> | |
| </div> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-2">2. Customize Format</h3> | |
| <p class="text-gray-600">Select platform and adjust cropping, captions, and music</p> | |
| </div> | |
| <div class="text-center p-4"> | |
| <div class="w-20 h-20 mx-auto bg-pink-100 rounded-full flex items-center justify-center mb-4 glow-on-hover"> | |
| <i data-feather="download" class="w-10 h-10 text-pink-600"></i> | |
| </div> | |
| <h3 class="text-xl font-semibold text-gray-800 mb-2">3. Download & Share</h3> | |
| <p class="text-gray-600">Get platform-optimized videos ready for posting</p> | |
| </div> | |
| </div> | |
| </section> | |
| <section class="mt-16"> | |
| <h2 class="text-3xl font-bold text-center text-gray-800 mb-8">Platform Specifications</h2> | |
| <div class="overflow-x-auto"> | |
| <table class="min-w-full bg-white rounded-lg overflow-hidden"> | |
| <thead class="bg-gray-100"> | |
| <tr> | |
| <th class="py-3 px-4 text-left font-semibold text-gray-700">Platform</th> | |
| <th class="py-3 px-4 text-left font-semibold text-gray-700">Optimal Ratio</th> | |
| <th class="py-3 px-4 text-left font-semibold text-gray-700">Max Length</th> | |
| <th class="py-3 px-4 text-left font-semibold text-gray-700">Recommended</th> | |
| </tr> | |
| </thead> | |
| <tbody class="divide-y divide-gray-200"> | |
| <tr> | |
| <td class="py-3 px-4 text-gray-700">YouTube Shorts</td> | |
| <td class="py-3 px-4 text-gray-600">9:16</td> | |
| <td class="py-3 px-4 text-gray-600">60 seconds</td> | |
| <td class="py-3 px-4 text-gray-600">First 15 seconds hook</td> | |
| </tr> | |
| <tr> | |
| <td class="py-3 px-4 text-gray-700">Instagram Reels</td> | |
| <td class="py-3 px-4 text-gray-600">9:16 or 1:1</td> | |
| <td class="py-3 px-4 text-gray-600">90 seconds</td> | |
| <td class="py-3 px-4 text-gray-600">Trending audio</td> | |
| </tr> | |
| <tr> | |
| <td class="py-3 px-4 text-gray-700">TikTok</td> | |
| <td class="py-3 px-4 text-gray-600">9:16</td> | |
| <td class="py-3 px-4 text-gray-600">3 minutes</td> | |
| <td class="py-3 px-4 text-gray-600">Captions & effects</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </section> | |
| </main> | |
| <footer class="bg-black bg-opacity-80 text-white py-12 mt-16"> | |
| <div class="container mx-auto px-4"> | |
| <div class="flex flex-col md:flex-row justify-between items-center"> | |
| <div class="mb-6 md:mb-0"> | |
| <h2 class="text-2xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-blue-400 to-purple-400">VidReel Wizard</h2> | |
| <p class="text-gray-400 mt-2">Your video transformation specialist</p> | |
| </div> | |
| <div class="flex space-x-4"> | |
| <a href="#" class="text-gray-400 hover:text-white transition"> | |
| <i data-feather="twitter"></i> | |
| </a> | |
| <a href="#" class="text-gray-400 hover:text-white transition"> | |
| <i data-feather="instagram"></i> | |
| </a> | |
| <a href="#" class="text-gray-400 hover:text-white transition"> | |
| <i data-feather="youtube"></i> | |
| </a> | |
| </div> | |
| </div> | |
| <div class="border-t border-gray-800 mt-8 pt-8 flex flex-col md:flex-row justify-between items-center"> | |
| <p class="text-gray-500 text-sm">© 2023 VidReel Wizard. All rights reserved.</p> | |
| <div class="flex space-x-6 mt-4 md:mt-0"> | |
| <a href="#" class="text-gray-400 hover:text-white text-sm transition">Privacy Policy</a> | |
| <a href="#" class="text-gray-400 hover:text-white text-sm transition">Terms of Service</a> | |
| <a href="#" class="text-gray-400 hover:text-white text-sm transition">Contact Us</a> | |
| </div> | |
| </div> | |
| </div> | |
| </footer> | |
| <script> | |
| // Initialize Vanta.js background | |
| VANTA.WAVES({ | |
| el: "#vanta-background", | |
| mouseControls: true, | |
| touchControls: true, | |
| gyroControls: false, | |
| minHeight: 200.00, | |
| minWidth: 200.00, | |
| scale: 1.00, | |
| scaleMobile: 1.00, | |
| color: 0x0066ff, | |
| shininess: 35.00, | |
| waveHeight: 15.00, | |
| waveSpeed: 0.80, | |
| zoom: 0.85 | |
| }); | |
| // Initialize Feather Icons | |
| feather.replace(); | |
| document.addEventListener('DOMContentLoaded', function() { | |
| // File upload handling | |
| const fileUpload = document.getElementById('file-upload'); | |
| const videoInput = document.getElementById('video-input'); | |
| const youtubeUrl = document.getElementById('youtube-url'); | |
| const analyzeBtn = document.getElementById('analyze-btn'); | |
| const previewSection = document.getElementById('preview-section'); | |
| let currentVideoFile = null; | |
| let currentPlatform = 'shorts'; | |
| let currentCrop = '9:16'; | |
| // Handle file selection | |
| fileUpload.addEventListener('change', function(e) { | |
| if (e.target.files.length) { | |
| currentVideoFile = e.target.files[0]; | |
| youtubeUrl.value = ''; | |
| updateVideoPreview(); | |
| } | |
| }); | |
| // Handle YouTube URL input | |
| youtubeUrl.addEventListener('input', function() { | |
| if (youtubeUrl.value) { | |
| currentVideoFile = null; | |
| fileUpload.value = ''; | |
| } | |
| }); | |
| // Handle drag and drop | |
| videoInput.addEventListener('dragover', function(e) { | |
| e.preventDefault(); | |
| videoInput.classList.add('border-blue-500', 'bg-blue-50'); | |
| }); | |
| videoInput.addEventListener('dragleave', function() { | |
| videoInput.classList.remove('border-blue-500', 'bg-blue-50'); | |
| }); | |
| videoInput.addEventListener('drop', function(e) { | |
| e.preventDefault(); | |
| videoInput.classList.remove('border-blue-500', 'bg-blue-50'); | |
| if (e.dataTransfer.files.length && e.dataTransfer.files[0].type.includes('video')) { | |
| currentVideoFile = e.dataTransfer.files[0]; | |
| youtubeUrl.value = ''; | |
| fileUpload.files = e.dataTransfer.files; | |
| updateVideoPreview(); | |
| } | |
| }); | |
| // Platform selection | |
| document.querySelectorAll('.platform-btn').forEach(btn => { | |
| btn.addEventListener('click', function() { | |
| document.querySelectorAll('.platform-btn').forEach(b => { | |
| b.classList.remove('ring-2', 'ring-offset-2', 'ring-blue-500'); | |
| }); | |
| this.classList.add('ring-2', 'ring-offset-2', 'ring-blue-500'); | |
| currentPlatform = this.dataset.platform; | |
| }); | |
| }); | |
| // Crop selection | |
| document.querySelectorAll('.crop-option').forEach(btn => { | |
| btn.addEventListener('click', function() { | |
| document.querySelectorAll('.crop-option').forEach(b => { | |
| b.classList.remove('ring-2', 'ring-offset-2', 'ring-blue-500'); | |
| }); | |
| this.classList.add('ring-2', 'ring-offset-2', 'ring-blue-500'); | |
| currentCrop = this.dataset.crop; | |
| }); | |
| }); | |
| // Analyze button | |
| analyzeBtn.addEventListener('click', function() { | |
| if (!currentVideoFile && !youtubeUrl.value) { | |
| alert('Please upload a video or enter a YouTube URL'); | |
| return; | |
| } | |
| // Show loading state | |
| this.innerHTML = '<span class="animate-pulse">Processing...</span>'; | |
| // Simulate processing delay | |
| setTimeout(() => { | |
| this.innerHTML = 'Analyze Video'; | |
| previewSection.classList.remove('hidden'); | |
| // Update previews | |
| updatePlatformPreviews(); | |
| }, 2000); | |
| }); | |
| // Download buttons | |
| document.getElementById('download-shorts').addEventListener('click', function() { | |
| alert('YouTube Short downloaded (simulated)'); | |
| }); | |
| document.getElementById('download-reels').addEventListener('click', function() { | |
| alert('Instagram Reel downloaded (simulated)'); | |
| }); | |
| document.getElementById('download-tiktok').addEventListener('click', function() { | |
| alert('TikTok video downloaded (simulated)'); | |
| }); | |
| // Helper functions | |
| function updateVideoPreview() { | |
| if (currentVideoFile) { | |
| const videoUrl = URL.createObjectURL(currentVideoFile); | |
| videoInput.innerHTML = ` | |
| <video src="${videoUrl}" controls class="w-full h-full object-contain"></video> | |
| <div class="absolute bottom-2 left-2 bg-black bg-opacity-50 text-white px-2 py-1 rounded text-sm"> | |
| ${currentVideoFile.name} | |
| </div> | |
| `; | |
| } | |
| } | |
| function updatePlatformPreviews() { | |
| if (currentVideoFile) { | |
| const videoUrl = URL.createObjectURL(currentVideoFile); | |
| // Update all platform previews | |
| document.getElementById('shorts-preview').src = videoUrl; | |
| document.getElementById('shorts-preview').classList.remove('hidden'); | |
| document.getElementById('shorts-placeholder').classList.add('hidden'); | |
| document.getElementById('reels-preview').src = videoUrl; | |
| document.getElementById('reels-preview').classList.remove('hidden'); | |
| document.getElementById('reels-placeholder').classList.add('hidden'); | |
| document.getElementById('tiktok-preview').src = videoUrl; | |
| document.getElementById('tiktok-preview').classList.remove('hidden'); | |
| document.getElementById('tiktok-placeholder').classList.add('hidden'); | |
| } else if (youtubeUrl.value) { | |
| // For YouTube URLs, we would normally use the YouTube API to get the video | |
| // Here we just show a placeholder with the URL | |
| document.getElementById('shorts-preview').src = ''; | |
| document.getElementById('shorts-preview').classList.add('hidden'); | |
| document.getElementById('shorts-placeholder').classList.remove('hidden'); | |
| document.getElementById('shorts-placeholder').innerHTML = ` | |
| <i data-feather="youtube" class="w-12 h-12 mx-auto text-red-500 mb-4"></i> | |
| <p class="text-gray-500">YouTube URL ready for conversion</p> | |
| <p class="text-xs mt-2 text-gray-400">${youtubeUrl.value}</p> | |
| `; | |
| // Same for other platforms | |
| document.getElementById('reels-preview').src = ''; | |
| document.getElementById('reels-preview').classList.add('hidden'); | |
| document.getElementById('reels-placeholder').classList.remove('hidden'); | |
| document.getElementById('reels-placeholder').innerHTML = ` | |
| <i data-feather="instagram" class="w-12 h-12 mx-auto text-pink-500 mb-4"></i> | |
| <p class="text-gray-500">YouTube URL ready for conversion</p> | |
| <p class="text-xs mt-2 text-gray-400">${youtubeUrl.value}</p> | |
| `; | |
| document.getElementById('tiktok-preview').src = ''; | |
| document.getElementById('tiktok-preview').classList.add('hidden'); | |
| document.getElementById('tiktok-placeholder').classList.remove('hidden'); | |
| document.getElementById('tiktok-placeholder').innerHTML = ` | |
| <i data-feather="music" class="w-12 h-12 mx-auto text-black mb-4"></i> | |
| <p class="text-gray-500">YouTube URL ready for conversion</p> | |
| <p class="text-xs mt-2 text-gray-400">${youtubeUrl.value}</p> | |
| `; | |
| feather.replace(); | |
| } | |
| } | |
| // Initialize with default selections | |
| document.querySelector('[data-platform="shorts"]').click(); | |
| document.querySelector('[data-crop="9:16"]').click(); | |
| }); | |
| </script> | |
| </body> | |
| </html> |