Spaces:
Running
Running
Házme una página para descargar música de Tik tok con un link
Browse files- README.md +8 -5
- components/footer.js +84 -0
- components/navbar.js +97 -0
- index.html +178 -19
- script.js +132 -0
- style.css +65 -19
README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: TuneTok Takedown 🎵
|
| 3 |
+
colorFrom: pink
|
| 4 |
+
colorTo: yellow
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
components/footer.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomFooter extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
:host {
|
| 7 |
+
display: block;
|
| 8 |
+
width: 100%;
|
| 9 |
+
}
|
| 10 |
+
footer {
|
| 11 |
+
background: linear-gradient(135deg, #0c4a6e 0%, #701a75 100%);
|
| 12 |
+
}
|
| 13 |
+
.footer-link {
|
| 14 |
+
transition: color 0.3s ease;
|
| 15 |
+
}
|
| 16 |
+
.footer-link:hover {
|
| 17 |
+
color: #7dd3fc;
|
| 18 |
+
}
|
| 19 |
+
</style>
|
| 20 |
+
<footer class="text-white">
|
| 21 |
+
<div class="container mx-auto px-4 py-8">
|
| 22 |
+
<div class="grid md:grid-cols-4 gap-8">
|
| 23 |
+
<!-- Brand -->
|
| 24 |
+
<div class="col-span-2 md:col-span-1">
|
| 25 |
+
<div class="flex items-center space-x-2 mb-4">
|
| 26 |
+
<i data-feather="music" class="text-primary-300"></i>
|
| 27 |
+
<span class="text-xl font-bold">TuneTok Takedown</span>
|
| 28 |
+
</div>
|
| 29 |
+
<p class="text-primary-200 text-sm">
|
| 30 |
+
Tu herramienta confiable para descargar música de TikTok
|
| 31 |
+
</p>
|
| 32 |
+
</div>
|
| 33 |
+
|
| 34 |
+
<!-- Quick Links -->
|
| 35 |
+
<div>
|
| 36 |
+
<h4 class="font-semibold mb-4">Enlaces Rápidos</h4>
|
| 37 |
+
<div class="space-y-2">
|
| 38 |
+
<a href="#" class="block footer-link text-primary-200 text-sm">Inicio</a>
|
| 39 |
+
<a href="#how-it-works" class="block footer-link text-primary-200 text-sm">Cómo funciona</a>
|
| 40 |
+
<a href="#" class="block footer-link text-primary-200 text-sm">FAQ</a>
|
| 41 |
+
<a href="#" class="block footer-link text-primary-200 text-sm">Contacto</a>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
|
| 45 |
+
<!-- Legal -->
|
| 46 |
+
<div>
|
| 47 |
+
<h4 class="font-semibold mb-4">Legal</h4>
|
| 48 |
+
<div class="space-y-2">
|
| 49 |
+
<a href="#" class="block footer-link text-primary-200 text-sm">Términos de Servicio</a>
|
| 50 |
+
<a href="#" class="block footer-link text-primary-200 text-sm">Política de Privacidad</a>
|
| 51 |
+
<a href="#" class="block footer-link text-primary-200 text-sm">Cookies</a>
|
| 52 |
+
</div>
|
| 53 |
+
</div>
|
| 54 |
+
|
| 55 |
+
<!-- Social -->
|
| 56 |
+
<div>
|
| 57 |
+
<h4 class="font-semibold mb-4">Síguenos</h4>
|
| 58 |
+
<div class="flex space-x-4">
|
| 59 |
+
<a href="#" class="footer-link">
|
| 60 |
+
<i data-feather="twitter"></i>
|
| 61 |
+
</a>
|
| 62 |
+
<a href="#" class="footer-link">
|
| 63 |
+
<i data-feather="instagram"></i>
|
| 64 |
+
</a>
|
| 65 |
+
<a href="#" class="footer-link">
|
| 66 |
+
<i data-feather="github"></i>
|
| 67 |
+
</a>
|
| 68 |
+
</div>
|
| 69 |
+
</div>
|
| 70 |
+
</div>
|
| 71 |
+
|
| 72 |
+
<!-- Bottom -->
|
| 73 |
+
<div class="border-t border-primary-700 mt-8 pt-8 text-center">
|
| 74 |
+
<p class="text-primary-200 text-sm">
|
| 75 |
+
© 2024 TuneTok Takedown. Todos los derechos reservados.
|
| 76 |
+
</p>
|
| 77 |
+
</div>
|
| 78 |
+
</div>
|
| 79 |
+
</footer>
|
| 80 |
+
`;
|
| 81 |
+
}
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
customElements.define('custom-footer', CustomFooter);
|
components/navbar.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomNavbar extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
:host {
|
| 7 |
+
display: block;
|
| 8 |
+
width: 100%;
|
| 9 |
+
}
|
| 10 |
+
nav {
|
| 11 |
+
background: rgba(255, 255, 255, 0.8);
|
| 12 |
+
backdrop-filter: blur(10px);
|
| 13 |
+
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
| 14 |
+
}
|
| 15 |
+
.nav-link {
|
| 16 |
+
transition: all 0.3s ease;
|
| 17 |
+
position: relative;
|
| 18 |
+
}
|
| 19 |
+
.nav-link:hover {
|
| 20 |
+
color: #0ea5e9;
|
| 21 |
+
}
|
| 22 |
+
.nav-link::after {
|
| 23 |
+
content: '';
|
| 24 |
+
position: absolute;
|
| 25 |
+
width: 0;
|
| 26 |
+
height: 2px;
|
| 27 |
+
bottom: -2px;
|
| 28 |
+
left: 0;
|
| 29 |
+
background: linear-gradient(135deg, #0ea5e9 0%, #d946ef 100%);
|
| 30 |
+
transition: width 0.3s ease;
|
| 31 |
+
}
|
| 32 |
+
.nav-link:hover::after {
|
| 33 |
+
width: 100%;
|
| 34 |
+
}
|
| 35 |
+
</style>
|
| 36 |
+
<nav class="sticky top-0 z-50">
|
| 37 |
+
<div class="container mx-auto px-4 py-4">
|
| 38 |
+
<div class="flex items-center justify-between">
|
| 39 |
+
<!-- Logo -->
|
| 40 |
+
<div class="flex items-center space-x-2">
|
| 41 |
+
<i data-feather="music" class="text-primary-600"></i>
|
| 42 |
+
<span class="text-xl font-bold bg-gradient-to-r from-primary-600 to-secondary-600 bg-clip-text text-transparent">
|
| 43 |
+
TuneTok Takedown
|
| 44 |
+
</span>
|
| 45 |
+
</div>
|
| 46 |
+
|
| 47 |
+
<!-- Navigation Links -->
|
| 48 |
+
<div class="hidden md:flex items-center space-x-8">
|
| 49 |
+
<a href="#" class="nav-link text-gray-700 font-medium">Inicio</a>
|
| 50 |
+
<a href="#how-it-works" class="nav-link text-gray-700 font-medium">Cómo funciona</a>
|
| 51 |
+
<a href="#" class="nav-link text-gray-700 font-medium">FAQ</a>
|
| 52 |
+
</div>
|
| 53 |
+
|
| 54 |
+
<!-- Mobile menu button -->
|
| 55 |
+
<button id="mobileMenuButton" class="md:hidden text-gray-700">
|
| 56 |
+
<i data-feather="menu"></i>
|
| 57 |
+
</button>
|
| 58 |
+
</div>
|
| 59 |
+
|
| 60 |
+
<!-- Mobile Menu -->
|
| 61 |
+
<div id="mobileMenu" class="hidden md:hidden mt-4 space-y-4">
|
| 62 |
+
<a href="#" class="block nav-link text-gray-700 font-medium">Inicio</a>
|
| 63 |
+
<a href="#how-it-works" class="block nav-link text-gray-700 font-medium">Cómo funciona</a>
|
| 64 |
+
<a href="#" class="block nav-link text-gray-700 font-medium">FAQ</a>
|
| 65 |
+
</div>
|
| 66 |
+
</div>
|
| 67 |
+
</nav>
|
| 68 |
+
`;
|
| 69 |
+
|
| 70 |
+
// Add mobile menu functionality
|
| 71 |
+
const mobileMenuButton = this.shadowRoot.getElementById('mobileMenuButton');
|
| 72 |
+
const mobileMenu = this.shadowRoot.getElementById('mobileMenu');
|
| 73 |
+
|
| 74 |
+
mobileMenuButton.addEventListener('click', () => {
|
| 75 |
+
const isHidden = mobileMenu.classList.contains('hidden');
|
| 76 |
+
if (isHidden) {
|
| 77 |
+
mobileMenu.classList.remove('hidden');
|
| 78 |
+
mobileMenuButton.innerHTML = '<i data-feather="x"></i>';
|
| 79 |
+
} else {
|
| 80 |
+
mobileMenu.classList.add('hidden');
|
| 81 |
+
mobileMenuButton.innerHTML = '<i data-feather="menu"></i>';
|
| 82 |
+
}
|
| 83 |
+
feather.replace();
|
| 84 |
+
});
|
| 85 |
+
|
| 86 |
+
// Close mobile menu when clicking outside
|
| 87 |
+
document.addEventListener('click', (event) => {
|
| 88 |
+
if (!this.contains(event.target) && !mobileMenu.classList.contains('hidden')) {
|
| 89 |
+
mobileMenu.classList.add('hidden');
|
| 90 |
+
mobileMenuButton.innerHTML = '<i data-feather="menu"></i>';
|
| 91 |
+
feather.replace();
|
| 92 |
+
}
|
| 93 |
+
});
|
| 94 |
+
}
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
customElements.define('custom-navbar', CustomNavbar);
|
index.html
CHANGED
|
@@ -1,19 +1,178 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="es" class="h-full">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>TuneTok Takedown - Descarga Música de TikTok</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></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 |
+
<script>
|
| 13 |
+
tailwind.config = {
|
| 14 |
+
theme: {
|
| 15 |
+
extend: {
|
| 16 |
+
colors: {
|
| 17 |
+
primary: {
|
| 18 |
+
50: '#f0f9ff',
|
| 19 |
+
100: '#e0f2fe',
|
| 20 |
+
200: '#bae6fd',
|
| 21 |
+
300: '#7dd3fc',
|
| 22 |
+
400: '#38bdf8',
|
| 23 |
+
500: '#0ea5e9',
|
| 24 |
+
600: '#0284c7',
|
| 25 |
+
700: '#0369a1',
|
| 26 |
+
800: '#075985',
|
| 27 |
+
900: '#0c4a6e',
|
| 28 |
+
},
|
| 29 |
+
secondary: {
|
| 30 |
+
50: '#fdf4ff',
|
| 31 |
+
100: '#fae8ff',
|
| 32 |
+
200: '#f5d0fe',
|
| 33 |
+
300: '#f0abfc',
|
| 34 |
+
400: '#e879f9',
|
| 35 |
+
500: '#d946ef',
|
| 36 |
+
600: '#c026d3',
|
| 37 |
+
700: '#a21caf',
|
| 38 |
+
800: '#86198f',
|
| 39 |
+
900: '#701a75',
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</script>
|
| 46 |
+
</head>
|
| 47 |
+
<body class="min-h-screen bg-gradient-to-br from-primary-50 to-secondary-50">
|
| 48 |
+
<custom-navbar></custom-navbar>
|
| 49 |
+
|
| 50 |
+
<main class="container mx-auto px-4 py-8">
|
| 51 |
+
<!-- Hero Section -->
|
| 52 |
+
<section class="text-center mb-16">
|
| 53 |
+
<div class="max-w-4xl mx-auto">
|
| 54 |
+
<h1 class="text-5xl md:text-6xl font-bold text-gray-900 mb-6">
|
| 55 |
+
Descarga Música de
|
| 56 |
+
<span class="bg-gradient-to-r from-primary-600 to-secondary-600 bg-clip-text text-transparent">
|
| 57 |
+
TikTok
|
| 58 |
+
</span>
|
| 59 |
+
</h1>
|
| 60 |
+
<p class="text-xl text-gray-600 mb-8">
|
| 61 |
+
Extrae el audio de cualquier video de TikTok en segundos.
|
| 62 |
+
Fácil, rápido y completamente gratis.
|
| 63 |
+
</p>
|
| 64 |
+
|
| 65 |
+
<!-- Download Form -->
|
| 66 |
+
<div class="bg-white rounded-2xl shadow-xl p-8 max-w-2xl mx-auto">
|
| 67 |
+
<div class="flex flex-col sm:flex-row gap-4">
|
| 68 |
+
<input
|
| 69 |
+
type="text"
|
| 70 |
+
id="tiktokUrl"
|
| 71 |
+
placeholder="Pega el enlace de TikTok aquí..."
|
| 72 |
+
class="flex-1 px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent"
|
| 73 |
+
>
|
| 74 |
+
<button
|
| 75 |
+
id="downloadBtn"
|
| 76 |
+
class="px-8 py-3 bg-gradient-to-r from-primary-600 to-secondary-600 text-white rounded-lg font-semibold hover:from-primary-700 hover:to-secondary-700 transition-all duration-300 flex items-center justify-center gap-2"
|
| 77 |
+
>
|
| 78 |
+
<i data-feather="download"></i>
|
| 79 |
+
Descargar
|
| 80 |
+
</button>
|
| 81 |
+
</div>
|
| 82 |
+
<div id="errorMessage" class="mt-4 text-red-500 text-sm hidden"></div>
|
| 83 |
+
</div>
|
| 84 |
+
</div>
|
| 85 |
+
</section>
|
| 86 |
+
|
| 87 |
+
<!-- Features Section -->
|
| 88 |
+
<section class="mb-16">
|
| 89 |
+
<h2 class="text-3xl font-bold text-center text-gray-900 mb-12">
|
| 90 |
+
¿Por qué elegirnos?
|
| 91 |
+
</h2>
|
| 92 |
+
<div class="grid md:grid-cols-3 gap-8">
|
| 93 |
+
<div class="text-center p-6">
|
| 94 |
+
<div class="w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 95 |
+
<i data-feather="zap" class="text-primary-600"></i>
|
| 96 |
+
</div>
|
| 97 |
+
<h3 class="text-xl font-semibold mb-2">Super Rápido</h3>
|
| 98 |
+
<p class="text-gray-600">Descargas instantáneas sin esperas ni límites</p>
|
| 99 |
+
</div>
|
| 100 |
+
<div class="text-center p-6">
|
| 101 |
+
<div class="w-16 h-16 bg-secondary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 102 |
+
<i data-feather="shield" class="text-secondary-600"></i>
|
| 103 |
+
</div>
|
| 104 |
+
<h3 class="text-xl font-semibold mb-2">100% Seguro</h3>
|
| 105 |
+
<p class="text-gray-600">Sin registro, sin virus, totalmente confiable</p>
|
| 106 |
+
</div>
|
| 107 |
+
<div class="text-center p-6">
|
| 108 |
+
<div class="w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 109 |
+
<i data-feather="music" class="text-primary-600"></i>
|
| 110 |
+
</div>
|
| 111 |
+
<h3 class="text-xl font-semibold mb-2">Alta Calidad</h3>
|
| 112 |
+
<p class="text-gray-600">Audio en la mejor calidad disponible</p>
|
| 113 |
+
</div>
|
| 114 |
+
</div>
|
| 115 |
+
</section>
|
| 116 |
+
|
| 117 |
+
<!-- How it Works -->
|
| 118 |
+
<section class="bg-white rounded-2xl shadow-xl p-8 mb-16">
|
| 119 |
+
<h2 class="text-3xl font-bold text-center text-gray-900 mb-12">
|
| 120 |
+
Cómo funciona
|
| 121 |
+
</h2>
|
| 122 |
+
<div class="grid md:grid-cols-3 gap-8">
|
| 123 |
+
<div class="text-center">
|
| 124 |
+
<div class="w-12 h-12 bg-primary-500 text-white rounded-full flex items-center justify-center mx-auto mb-4 font-bold text-lg">
|
| 125 |
+
1
|
| 126 |
+
</div>
|
| 127 |
+
<h3 class="text-lg font-semibold mb-2">Copia el enlace</h3>
|
| 128 |
+
<p class="text-gray-600">Abre TikTok y copia el enlace del video</p>
|
| 129 |
+
</div>
|
| 130 |
+
<div class="text-center">
|
| 131 |
+
<div class="w-12 h-12 bg-primary-500 text-white rounded-full flex items-center justify-center mx-auto mb-4 font-bold text-lg">
|
| 132 |
+
2
|
| 133 |
+
</div>
|
| 134 |
+
<h3 class="text-lg font-semibold mb-2">Pega aquí</h3>
|
| 135 |
+
<p class="text-gray-600">Pega el enlace en nuestro campo de texto</p>
|
| 136 |
+
</div>
|
| 137 |
+
<div class="text-center">
|
| 138 |
+
<div class="w-12 h-12 bg-primary-500 text-white rounded-full flex items-center justify-center mx-auto mb-4 font-bold text-lg">
|
| 139 |
+
3
|
| 140 |
+
</div>
|
| 141 |
+
<h3 class="text-lg font-semibold mb-2">¡Descarga!</h3>
|
| 142 |
+
<p class="text-gray-600">Haz clic y obtén tu música al instante</p>
|
| 143 |
+
</div>
|
| 144 |
+
</div>
|
| 145 |
+
</section>
|
| 146 |
+
|
| 147 |
+
<!-- Results Section -->
|
| 148 |
+
<section id="resultsSection" class="hidden">
|
| 149 |
+
<div class="bg-white rounded-2xl shadow-xl p-8 max-w-2xl mx-auto">
|
| 150 |
+
<h3 class="text-2xl font-bold text-center text-gray-900 mb-6">
|
| 151 |
+
¡Listo para descargar!
|
| 152 |
+
</h3>
|
| 153 |
+
<div id="audioPreview" class="mb-6"></div>
|
| 154 |
+
<div class="flex gap-4 justify-center">
|
| 155 |
+
<button id="downloadAudio" class="px-6 py-3 bg-primary-600 text-white rounded-lg font-semibold hover:bg-primary-700 transition-colors flex items-center gap-2">
|
| 156 |
+
<i data-feather="download"></i>
|
| 157 |
+
Descargar MP3
|
| 158 |
+
</button>
|
| 159 |
+
<button id="newDownload" class="px-6 py-3 bg-gray-200 text-gray-700 rounded-lg font-semibold hover:bg-gray-300 transition-colors flex items-center gap-2">
|
| 160 |
+
<i data-feather="refresh-cw"></i>
|
| 161 |
+
Nuevo Enlace
|
| 162 |
+
</button>
|
| 163 |
+
</div>
|
| 164 |
+
</div>
|
| 165 |
+
</section>
|
| 166 |
+
</main>
|
| 167 |
+
|
| 168 |
+
<custom-footer></custom-footer>
|
| 169 |
+
|
| 170 |
+
<script src="components/navbar.js"></script>
|
| 171 |
+
<script src="components/footer.js"></script>
|
| 172 |
+
<script src="script.js"></script>
|
| 173 |
+
<script>
|
| 174 |
+
feather.replace();
|
| 175 |
+
</script>
|
| 176 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 177 |
+
</body>
|
| 178 |
+
</html>
|
script.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Main JavaScript for TuneTok Takedown
|
| 2 |
+
|
| 3 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 4 |
+
const downloadBtn = document.getElementById('downloadBtn');
|
| 5 |
+
const tiktokUrlInput = document.getElementById('tiktokUrl');
|
| 6 |
+
const errorMessage = document.getElementById('errorMessage');
|
| 7 |
+
const resultsSection = document.getElementById('resultsSection');
|
| 8 |
+
const audioPreview = document.getElementById('audioPreview');
|
| 9 |
+
const downloadAudioBtn = document.getElementById('downloadAudio');
|
| 10 |
+
const newDownloadBtn = document.getElementById('newDownload');
|
| 11 |
+
|
| 12 |
+
// Validate TikTok URL
|
| 13 |
+
function isValidTikTokUrl(url) {
|
| 14 |
+
const tiktokPattern = /^https?:\/\/(www\.)?tiktok\.com\/.+/;
|
| 15 |
+
return tiktokPattern.test(url);
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
// Show error message
|
| 19 |
+
function showError(message) {
|
| 20 |
+
errorMessage.textContent = message;
|
| 21 |
+
errorMessage.classList.remove('hidden');
|
| 22 |
+
setTimeout(() => {
|
| 23 |
+
errorMessage.classList.add('hidden');
|
| 24 |
+
}, 5000);
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
// Simulate download process (in a real app, this would call an API)
|
| 28 |
+
function processDownload(url) {
|
| 29 |
+
return new Promise((resolve, reject) => {
|
| 30 |
+
setTimeout(() => {
|
| 31 |
+
if (isValidTikTokUrl(url)) {
|
| 32 |
+
resolve({
|
| 33 |
+
title: 'TikTok Audio',
|
| 34 |
+
url: url,
|
| 35 |
+
downloadUrl: `https://api.example.com/download?url=${encodeURIComponent(url)}`,
|
| 36 |
+
audioUrl: 'https://example.com/audio.mp3'
|
| 37 |
+
});
|
| 38 |
+
} else {
|
| 39 |
+
reject('Enlace de TikTok no válido');
|
| 40 |
+
}
|
| 41 |
+
}, 2000);
|
| 42 |
+
});
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
// Create audio preview
|
| 46 |
+
function createAudioPreview(audioUrl) {
|
| 47 |
+
return `
|
| 48 |
+
<div class="bg-gray-50 rounded-lg p-4">
|
| 49 |
+
<audio controls class="w-full">
|
| 50 |
+
<source src="${audioUrl}" type="audio/mpeg">
|
| 51 |
+
Tu navegador no soporta el elemento de audio.
|
| 52 |
+
</audio>
|
| 53 |
+
<p class="text-sm text-gray-600 mt-2 text-center">
|
| 54 |
+
Previsualiza el audio antes de descargar
|
| 55 |
+
</p>
|
| 56 |
+
</div>
|
| 57 |
+
`;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
// Handle download button click
|
| 61 |
+
downloadBtn.addEventListener('click', async function() {
|
| 62 |
+
const url = tiktokUrlInput.value.trim();
|
| 63 |
+
|
| 64 |
+
if (!url) {
|
| 65 |
+
showError('Por favor, pega un enlace de TikTok');
|
| 66 |
+
return;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
if (!isValidTikTokUrl(url)) {
|
| 70 |
+
showError('Por favor, ingresa un enlace válido de TikTok');
|
| 71 |
+
return;
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
// Show loading state
|
| 75 |
+
const originalText = downloadBtn.innerHTML;
|
| 76 |
+
downloadBtn.innerHTML = '<div class="spinner"></div> Procesando...';
|
| 77 |
+
downloadBtn.disabled = true;
|
| 78 |
+
|
| 79 |
+
try {
|
| 80 |
+
const result = await processDownload(url);
|
| 81 |
+
|
| 82 |
+
// Show results section
|
| 83 |
+
audioPreview.innerHTML = createAudioPreview(result.audioUrl);
|
| 84 |
+
resultsSection.classList.remove('hidden');
|
| 85 |
+
|
| 86 |
+
// Set download link
|
| 87 |
+
downloadAudioBtn.onclick = function() {
|
| 88 |
+
window.open(result.downloadUrl, '_blank');
|
| 89 |
+
};
|
| 90 |
+
|
| 91 |
+
// Scroll to results
|
| 92 |
+
resultsSection.scrollIntoView({ behavior: 'smooth' });
|
| 93 |
+
|
| 94 |
+
} catch (error) {
|
| 95 |
+
showError(error);
|
| 96 |
+
} finally {
|
| 97 |
+
// Reset button
|
| 98 |
+
downloadBtn.innerHTML = originalText;
|
| 99 |
+
downloadBtn.disabled = false;
|
| 100 |
+
feather.replace();
|
| 101 |
+
}
|
| 102 |
+
});
|
| 103 |
+
|
| 104 |
+
// Handle new download button
|
| 105 |
+
newDownloadBtn.addEventListener('click', function() {
|
| 106 |
+
resultsSection.classList.add('hidden');
|
| 107 |
+
tiktokUrlInput.value = '';
|
| 108 |
+
tiktokUrlInput.focus();
|
| 109 |
+
});
|
| 110 |
+
|
| 111 |
+
// Allow Enter key to trigger download
|
| 112 |
+
tiktokUrlInput.addEventListener('keypress', function(e) {
|
| 113 |
+
if (e.key === 'Enter') {
|
| 114 |
+
downloadBtn.click();
|
| 115 |
+
}
|
| 116 |
+
});
|
| 117 |
+
|
| 118 |
+
// Add some interactive effects
|
| 119 |
+
const featureCards = document.querySelectorAll('.text-center.p-6');
|
| 120 |
+
featureCards.forEach(card => {
|
| 121 |
+
card.addEventListener('mouseenter', function() {
|
| 122 |
+
this.style.transform = 'translateY(-5px)';
|
| 123 |
+
this.style.transition = 'transform 0.3s ease';
|
| 124 |
+
this.style.boxShadow = '0 10px 25px rgba(0, 0, 0, 0.1)';
|
| 125 |
+
});
|
| 126 |
+
|
| 127 |
+
card.addEventListener('mouseleave', function() {
|
| 128 |
+
this.style.transform = 'translateY(0)';
|
| 129 |
+
this.style.boxShadow = 'none';
|
| 130 |
+
});
|
| 131 |
+
});
|
| 132 |
+
});
|
style.css
CHANGED
|
@@ -1,28 +1,74 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
margin-top: 5px;
|
| 16 |
}
|
| 17 |
|
| 18 |
-
.
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
padding: 16px;
|
| 22 |
-
border: 1px solid lightgray;
|
| 23 |
-
border-radius: 16px;
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
| 28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* Custom styles for TuneTok Takedown */
|
| 2 |
+
|
| 3 |
+
/* Smooth scrolling */
|
| 4 |
+
html {
|
| 5 |
+
scroll-behavior: smooth;
|
| 6 |
+
}
|
| 7 |
+
|
| 8 |
+
/* Custom animations */
|
| 9 |
+
@keyframes fadeInUp {
|
| 10 |
+
from {
|
| 11 |
+
opacity: 0;
|
| 12 |
+
transform: translateY(30px);
|
| 13 |
+
}
|
| 14 |
+
to {
|
| 15 |
+
opacity: 1;
|
| 16 |
+
transform: translateY(0);
|
| 17 |
+
}
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
.fade-in-up {
|
| 21 |
+
animation: fadeInUp 0.6s ease-out;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
/* Loading spinner */
|
| 25 |
+
.spinner {
|
| 26 |
+
border: 2px solid #f3f3f3;
|
| 27 |
+
border-top: 2px solid #0ea5e9;
|
| 28 |
+
border-radius: 50%;
|
| 29 |
+
width: 20px;
|
| 30 |
+
height: 20px;
|
| 31 |
+
animation: spin 1s linear infinite;
|
| 32 |
}
|
| 33 |
|
| 34 |
+
@keyframes spin {
|
| 35 |
+
0% { transform: rotate(0deg); }
|
| 36 |
+
100% { transform: rotate(360deg); }
|
| 37 |
}
|
| 38 |
|
| 39 |
+
/* Custom button hover effects */
|
| 40 |
+
.btn-gradient {
|
| 41 |
+
background: linear-gradient(135deg, #0ea5e9 0%, #d946ef 100%);
|
| 42 |
+
transition: all 0.3s ease;
|
|
|
|
| 43 |
}
|
| 44 |
|
| 45 |
+
.btn-gradient:hover {
|
| 46 |
+
transform: translateY(-2px);
|
| 47 |
+
box-shadow: 0 10px 25px rgba(14, 165, 233, 0.3);
|
|
|
|
|
|
|
|
|
|
| 48 |
}
|
| 49 |
|
| 50 |
+
/* Glass morphism effect */
|
| 51 |
+
.glass {
|
| 52 |
+
background: rgba(255, 255, 255, 0.25);
|
| 53 |
+
backdrop-filter: blur(10px);
|
| 54 |
+
border: 1px solid rgba(255, 255, 255, 0.18);
|
| 55 |
}
|
| 56 |
+
|
| 57 |
+
/* Custom scrollbar */
|
| 58 |
+
::-webkit-scrollbar {
|
| 59 |
+
width: 8px;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
::-webkit-scrollbar-track {
|
| 63 |
+
background: #f1f1f1;
|
| 64 |
+
border-radius: 10px;
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
::-webkit-scrollbar-thumb {
|
| 68 |
+
background: linear-gradient(135deg, #0ea5e9 0%, #d946ef 100%);
|
| 69 |
+
border-radius: 10px;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
::-webkit-scrollbar-thumb:hover {
|
| 73 |
+
background: linear-gradient(135deg, #0284c7 0%, #c026d3 100%);
|
| 74 |
+
}
|