Spaces:
Sleeping
Sleeping
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <meta httpEquiv="Content-Type" content="text/html; charset=utf-8" /> | |
| <title>Python YouTube Ringtones</title> | |
| <meta name="title" content="Python YouTube Ringtones" /> | |
| <meta name="description" content="Generate custom ringtones from YouTube videos with one click! Python YouTube Ringtones lets you convert YouTube audio into high-quality MP3 and iPhone ringtones in seconds. No software required β fast, free, and online!" /> | |
| <meta property="og:type" content="website" /> | |
| <meta property="og:url" content="https://ringtones.jessejesse.xyz" /> | |
| <meta property="og:title" content="Python YouTube Ringtones" /> | |
| <meta property="og:description" content="Generate custom ringtones from YouTube videos with one click! Python YouTube Ringtones lets you convert YouTube audio into high-quality MP3 and iPhone ringtones in seconds. No software required β fast, free, and online!" /> | |
| <meta property="og:image" content="https://ringtones.jessejesse.xyz/og.png" /> | |
| <meta property="twitter:card" content="summary_large_image" /> | |
| <meta property="twitter:url" content="https://ringtones.jessejesse.xyz" /> | |
| <meta property="twitter:title" content="Python YouTube Ringtones" /> | |
| <meta property="twitter:description" content="Generate custom ringtones from YouTube videos with one click! Python YouTube Ringtones lets you convert YouTube audio into high-quality MP3 and iPhone ringtones in seconds. No software required β fast, free, and online!" /> | |
| <meta property="twitter:image" content="https://ringtones.jessejesse.xyz/og.png" /> | |
| <meta name="author" content="JesseJesse.xyz" /> | |
| <style> | |
| body { | |
| background: linear-gradient(135deg, #1a1a2e, #111827, #0f0f14); | |
| color: white; | |
| visibility: hidden; | |
| } | |
| </style> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script> | |
| document.addEventListener("DOMContentLoaded", () => { | |
| document.body.style.visibility = "visible"; | |
| updateRingtoneCount(); // Fetch count on page load | |
| }); | |
| </script> | |
| </head> | |
| <body class="bg-gradient-to-br from-gray-900 via-gray-800 to-black text-white flex flex-col justify-center items-center h-screen"> | |
| <div class="w-full max-w-md bg-transparent p-6 rounded-lg shadow-lg text-center"> | |
| <img src="icon.png" alt="App Icon" class="w-20 h-20 mx-auto mb-4" /> | |
| <h1 class="text-xl font-bold mb-4">Python YouTube Ringtones</h1> | |
| <p class="mt-4 text-center text-yellow-400"> | |
| βͺβ¬βͺβ¬ tones made: <span id="ringtone-count">0</span> | |
| </p> | |
| <br /> | |
| <div class="flex gap-2"> | |
| <input | |
| id="youtube-url" | |
| type="text" | |
| placeholder="Enter YouTube URL" | |
| class="flex-1 p-2 border border-gray-700 rounded bg-gray-700 text-white" | |
| /> | |
| <button onclick="pasteClipboard()" class="bg-gray-600 hover:bg-gray-500 px-3 py-2 rounded"> | |
| ✎ | |
| </button> | |
| </div> | |
| <input | |
| id="mp3-upload" | |
| type="file" | |
| accept="audio/*" | |
| class="w-full p-2 mt-4 border border-gray-700 rounded bg-gray-700 text-white" | |
| /> | |
| <button | |
| onclick="processRingtone()" | |
| class="w-full bg-indigo-700 hover:bg-green-800 text-white py-2 px-4 rounded mt-4" | |
| > | |
| Generate Ringtones | |
| </button> | |
| <p id="status" class="text-center mt-4 text-yellow-400"></p> | |
| <a | |
| id="android-ringtone" | |
| href="#" | |
| download | |
| class="hidden block mt-4 text-center text-green-800" | |
| >β¬ Android Ringtone</a | |
| > | |
| <a | |
| id="iphone-ringtone" | |
| href="#" | |
| download | |
| class="hidden block mt-4 text-center text-green-400" | |
| >β¬ iPhone Ringtone</a | |
| > | |
| </div> | |
| <footer class="mt-6 text-green-600 text-sm text-center cursor-pointer" onclick="sharePage()"> | |
| JesseJesse.xyz | |
| </footer> | |
| <br /> | |
| <span class="inline-block ml-2 text-sm text-center cursor-pointer">☝ share</span> | |
| <script> | |
| const REDIS_URL = "https://amused-walleye-31373.upstash.io"; | |
| const REDIS_TOKEN = "AXqNASQgMWZmMTdjYTEtNTJjYi00MDczLWJmZDctNjFjZGUyOTA0ZjEyNjcyMTI0NDM2MDBjNDVmZmE5NjJlMTllYTkyMDI2MDU="; | |
| async function updateRingtoneCount() { | |
| try { | |
| const response = await fetch(`${REDIS_URL}/get/ringtone_count`, { | |
| headers: { Authorization: `Bearer ${REDIS_TOKEN}` }, | |
| }); | |
| const data = await response.json(); | |
| document.getElementById("ringtone-count").innerText = data.result || 0; | |
| } catch (error) { | |
| console.error("Error fetching ringtone count:", error); | |
| } | |
| } | |
| async function incrementRingtoneCount() { | |
| try { | |
| await fetch(`${REDIS_URL}/incr/ringtone_count`, { | |
| headers: { Authorization: `Bearer ${REDIS_TOKEN}` }, | |
| }); | |
| updateRingtoneCount(); //count | |
| } catch (error) { | |
| console.error("Error updating ringtone count:", error); | |
| } | |
| } | |
| async function processRingtone() { | |
| const urlInput = document.getElementById("youtube-url").value; | |
| const fileInput = document.getElementById("mp3-upload").files[0]; | |
| const androidLink = document.getElementById("android-ringtone"); | |
| const iphoneLink = document.getElementById("iphone-ringtone"); | |
| const status = document.getElementById("status"); | |
| if (!urlInput && !fileInput) { | |
| status.innerText = "β Please enter a YouTube URL or upload an MP3 file!"; | |
| return; | |
| } | |
| try { | |
| status.innerText = "β³ one moment please..."; | |
| const client = await import("https://cdn.jsdelivr.net/npm/@gradio/client/+esm").then((m) => m.Client); | |
| const connectedClient = await client.connect("sudo-soldier/PYTR"); | |
| const inputData = { | |
| url: urlInput || "Hello!!", | |
| uploaded_file: fileInput || null, | |
| }; | |
| const result = await connectedClient.predict("/process_youtube_url", inputData); | |
| const androidFile = result.data[0]?.url || result.data[0]?.path; | |
| const iphoneFile = result.data[1]?.url || result.data[1]?.path; | |
| if (androidFile) { | |
| androidLink.href = androidFile; | |
| androidLink.download = "android_ringtone.mp3"; | |
| androidLink.style.display = "block"; | |
| } | |
| if (iphoneFile) { | |
| iphoneLink.href = iphoneFile; | |
| iphoneLink.download = "iphone_ringtone.m4r"; | |
| iphoneLink.style.display = "block"; | |
| } | |
| status.innerText = "Ringtones Ready!"; | |
| incrementRingtoneCount(); //count | |
| } catch (error) { | |
| console.error(error); | |
| status.innerText = "Error processing request!"; | |
| } | |
| } | |
| async function pasteClipboard() { | |
| try { | |
| const text = await navigator.clipboard.readText(); | |
| document.getElementById("youtube-url").value = text; | |
| } catch (error) { | |
| alert("Clipboard access denied! Please paste manually."); | |
| } | |
| } | |
| function sharePage() { | |
| if (navigator.share) { | |
| navigator | |
| .share({ | |
| title: "ringtones.JesseJesse.xyz", | |
| url: window.location.href, | |
| }) | |
| .catch((error) => console.log("Sharing failed:", error)); | |
| } else { | |
| alert("Share API not supported in this browser."); | |
| } | |
| } | |
| </script> | |
| </body> | |
| </html> | |