220 lines
9.0 KiB
HTML
220 lines
9.0 KiB
HTML
<!-- index.html -->
|
||
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<link rel="stylesheet" href="/static/style.css" media="all" />
|
||
<link rel="stylesheet" href="/static/desktop.css" media="(min-width: 960px)">
|
||
<link rel="stylesheet" href="/static/mobile.css" media="(max-width: 959px)">
|
||
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎙️</text></svg>">
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<meta name="description" content="dicta2stream is a minimalist voice streaming platform for looping your spoken audio anonymously." />
|
||
<title>dicta2stream</title>
|
||
<!-- Section visibility and navigation styles -->
|
||
<link rel="stylesheet" href="/static/css/section.css" media="all" />
|
||
|
||
<style>
|
||
/* Hide mobile menu by default on larger screens */
|
||
@media (min-width: 960px) {
|
||
#mobile-menu { display: none !important; }
|
||
#burger-label { display: none !important; }
|
||
}
|
||
</style>
|
||
<link rel="modulepreload" href="/static/sound.js" />
|
||
<script src="/static/file-display.js?v=3"></script>
|
||
<script type="module" src="/static/dashboard.js?v=7"></script>
|
||
<script src="/static/streams-ui.js?v=3" type="module"></script>
|
||
<script src="/static/auth.js?v=5" type="module"></script>
|
||
<script src="/static/app.js?v=6" type="module"></script>
|
||
</head>
|
||
<body>
|
||
<header>
|
||
<h1>dicta2stream 🎙️</h1>
|
||
<p>Your voice. Your loop. One drop away.</p>
|
||
</header>
|
||
|
||
<main>
|
||
|
||
<!-- Guest Dashboard -->
|
||
<nav id="guest-dashboard" class="dashboard-nav guest-only">
|
||
<a href="#welcome-page" id="guest-welcome">Welcome</a>
|
||
<a href="#stream-page" id="guest-streams">Streams</a>
|
||
<a href="#register-page" id="guest-login">Account</a>
|
||
</nav>
|
||
|
||
<!-- User Dashboard -->
|
||
<nav id="user-dashboard" class="dashboard-nav auth-only">
|
||
<a href="#welcome-page" id="user-welcome">Welcome</a>
|
||
<a href="#stream-page" id="user-streams">Streams</a>
|
||
<a href="#me-page" id="show-me">Your Stream</a>
|
||
</nav>
|
||
<section id="me-page" class="auth-only">
|
||
<div>
|
||
<h2 id="your-stream-heading">Your Stream</h2>
|
||
</div>
|
||
<article>
|
||
<p>This is your personal stream. Only you can upload to it.</p>
|
||
<audio id="me-audio"></audio>
|
||
<div class="audio-controls">
|
||
<button class="play-pause-btn" type="button" aria-label="Play" data-uid="">▶️</button>
|
||
</div>
|
||
</article>
|
||
<section id="user-upload-area" class="auth-only">
|
||
<p>Drag & drop your audio file here<br>or click to browse</p>
|
||
<input type="file" id="fileInputUser" accept="audio/*" hidden />
|
||
</section>
|
||
|
||
<article id="log-out" class="auth-only article--bordered logout-section">
|
||
<button id="logout-button" class="button">🚪 Log Out</button>
|
||
</article>
|
||
|
||
<section id="uploaded-files" class="auth-only">
|
||
<h3>Uploaded Files</h3>
|
||
<ul id="file-list" class="file-list">
|
||
<li>Loading files...</li>
|
||
</ul>
|
||
<p class="quota-meter">Quota: <progress id="quota-bar" value="0" max="100"></progress> <span id="quota-text">0 MB</span></p>
|
||
</section>
|
||
|
||
<!-- Account Deletion Section -->
|
||
<section id="account-deletion" class="article--bordered auth-only">
|
||
<h3>Account Deletion</h3>
|
||
<p>This action is irreversible and will permanently remove:</p>
|
||
<ul>
|
||
<li>Your account information</li>
|
||
<li>All uploaded audio files</li>
|
||
</ul>
|
||
|
||
<div class="centered-container">
|
||
<button id="delete-account-from-privacy" class="button">
|
||
🗑️ Delete My Account
|
||
</button>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
|
||
<div id="spinner" class="spinner"></div>
|
||
|
||
<!-- Burger menu and legacy links section removed for clarity -->
|
||
|
||
<section id="terms-page" class="always-visible">
|
||
<h2>Terms of Service</h2>
|
||
<article class="article--bordered">
|
||
<div class="alert alert-warning">
|
||
<strong>Beta Testing Notice:</strong> This service is currently in public beta. As such, you may encounter bugs or unexpected behavior.
|
||
Updates to the service may cause data loss. Please report any issues or suggestions to help us improve.
|
||
</div>
|
||
|
||
<p>By accessing or using dicta2stream.net (the "Service"), you agree to be bound by these Terms of Service ("Terms"). If you do not agree, do not use the Service.</p>
|
||
<ul>
|
||
<li>You must be at least 18 years old to register.</li>
|
||
<li>Each account must be unique and used by only one person.</li>
|
||
<li>One account per device/IP per 24 hours.</li>
|
||
<li>If hate speech, illegal, or harmful content is detected, the account and all associated data will be deleted.</li>
|
||
<li>The associated email address will be banned from recreating an account.</li>
|
||
<li>Uploads are limited to 100 MB and must be voice only.</li>
|
||
<li>Music/singing will be rejected.</li>
|
||
<li>This is a beta service; data may be lost during updates or maintenance.</li>
|
||
<li>Please report any bugs or suggestions to help improve the service.</li>
|
||
</ul>
|
||
</article>
|
||
</section>
|
||
|
||
<section id="privacy-page" class="always-visible">
|
||
<div>
|
||
<h2>Privacy Policy</h2>
|
||
</div>
|
||
<article class="article--bordered">
|
||
<ul>
|
||
<li><strong>Users</strong>: Session uses both cookies and localStorage to store UID and authentication state.</li>
|
||
<li><strong>Guests</strong>: No cookies are set. No persistent identifiers are stored.</li>
|
||
<li>We log IP + UID only for abuse protection and quota enforcement.</li>
|
||
<li>Data is never sold.</li>
|
||
</ul>
|
||
</article>
|
||
|
||
<!-- Guest login message removed as per user request -->
|
||
</section>
|
||
|
||
<section id="imprint-page" class="always-visible">
|
||
<h2>Imprint</h2>
|
||
<article class="article--bordered">
|
||
<p><strong>Andreas Michael Fleckl</strong></p>
|
||
<p>Johnstrassse 7/6<br>1140 Vienna<br>Austria / Europe</p>
|
||
</article>
|
||
</section>
|
||
|
||
<section id="welcome-page" class="always-visible">
|
||
<h2>Welcome</h2>
|
||
<article class="article--bordered">
|
||
<p>dicta2stream is a minimalist voice streaming platform for your spoken audio anonymously under a nickname in a loop. <span class="text-muted">(Opus | Mono | 48 kHz | 60 kbps)</span><br><br>
|
||
<strong>What you can do here:</strong></p>
|
||
<ul>
|
||
<li>🎧 Listen to public voice streams from others, instantly</li>
|
||
<li>🎙️ Upload your own audio and share your voice with the world</li>
|
||
<li>🕵️ No sign-up required for listening</li>
|
||
<li>🔒 Optional registration for uploading and managing your own stream</li>
|
||
</ul>
|
||
<div class="email-section">
|
||
<a href="mailto:Andreas.Fleckl@dicta2stream.net" class="button">
|
||
Andreas.Fleckl@dicta2stream.net
|
||
</a>
|
||
</div>
|
||
</article>
|
||
</section>
|
||
<section id="stream-page" class="always-visible">
|
||
<h2>Public Streams</h2>
|
||
<!-- The list below is dynamically populated by streams-ui.js; shows 'Loading...' while fetching -->
|
||
<ul id="stream-list"><li>Loading...</li></ul>
|
||
</section>
|
||
|
||
<section id="register-page" class="guest-only">
|
||
<h2>Account</h2>
|
||
<article class="article--wide">
|
||
<form id="register-form">
|
||
<p><label>Email<br><input type="email" name="email" required /></label></p>
|
||
<p><label>Username<br><input type="text" name="user" required /></label></p>
|
||
<p class="bot-trap">
|
||
<label>Leave this empty:<br>
|
||
<input type="text" name="bot_trap" autocomplete="off" />
|
||
</label>
|
||
</p>
|
||
<p><button type="submit">Login / Create Account</button></p>
|
||
</form>
|
||
<p class="form-note">You'll receive a magic login link via email. No password required.</p>
|
||
</article>
|
||
</section>
|
||
|
||
|
||
</main>
|
||
|
||
<footer>
|
||
<p class="footer-links">
|
||
<a href="#terms-page" id="footer-terms">Terms</a> |
|
||
<a href="#privacy-page" id="footer-privacy">Privacy</a> |
|
||
<a href="#imprint-page" id="footer-imprint">Imprint</a>
|
||
</p>
|
||
</footer>
|
||
|
||
<!-- Load public streams UI logic -->
|
||
<script type="module" src="/static/streams-ui.js?v=3"></script>
|
||
<!-- Load upload functionality -->
|
||
<script type="module" src="/static/upload.js"></script>
|
||
|
||
<script type="module">
|
||
import { initMagicLogin } from '/static/magic-login.js';
|
||
const params = new URLSearchParams(window.location.search);
|
||
if (params.has('token')) {
|
||
if (document.readyState === "loading") {
|
||
document.addEventListener('DOMContentLoaded', initMagicLogin);
|
||
} else {
|
||
initMagicLogin();
|
||
}
|
||
}
|
||
</script>
|
||
<script type="module" src="/static/init-personal-stream.js"></script>
|
||
<script type="module" src="/static/personal-player.js"></script>
|
||
|
||
</body>
|
||
</html>
|