212 lines
4.2 KiB
Svelte
212 lines
4.2 KiB
Svelte
<script>
|
|
import { useNavigate } from "svelte-navigator";
|
|
const navigate = useNavigate();
|
|
|
|
let url = "";
|
|
let video = true;
|
|
let audio = true;
|
|
|
|
$: disabled =
|
|
(!audio && !video) ||
|
|
(!url.startsWith("https://youtu.be") &&
|
|
!url.startsWith("https://www.youtube.com"));
|
|
|
|
async function add() {
|
|
const result = await fetch("grid.php", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({ url, audio, video }),
|
|
});
|
|
if (!result.ok) {
|
|
alert(result.status);
|
|
return;
|
|
}
|
|
|
|
const lastId = await result.text();
|
|
|
|
const currentResult = await fetch("/grid.php");
|
|
const current = await currentResult.json();
|
|
|
|
let choosing;
|
|
if (audio && video) {
|
|
choosing = Math.random() > 0.5 ? "audio" : "video";
|
|
} else if (audio) {
|
|
choosing = "video";
|
|
} else if (video) {
|
|
choosing = "audio";
|
|
}
|
|
|
|
const viable = current.filter((link) => {
|
|
if (link.id == lastId) {
|
|
return false;
|
|
}
|
|
if (choosing == "audio") {
|
|
return link.audio;
|
|
} else if (choosing == "video") {
|
|
return link.video;
|
|
}
|
|
});
|
|
|
|
if (!viable.length) {
|
|
alert(`Looks like there's no ${choosing} yet. Come back later!`);
|
|
return;
|
|
}
|
|
|
|
const rndId = viable[Math.floor(Math.random() * viable.length)].id;
|
|
|
|
if (choosing == "audio") {
|
|
navigate(`/x/${lastId}/${rndId}`);
|
|
} else if (choosing == "video") {
|
|
navigate(`/x/${rndId}/${lastId}`);
|
|
}
|
|
}
|
|
|
|
async function random() {
|
|
const currentResult = await fetch("/grid.php");
|
|
const current = await currentResult.json();
|
|
|
|
const audios = current.filter((link) => link.audio);
|
|
if (!audios.length) {
|
|
alert(`Looks like there's no audios yet. Come back later!`);
|
|
}
|
|
const videos = current.filter((link) => link.video);
|
|
if (!videos.length) {
|
|
alert(`Looks like there's no videos yet. Come back later!`);
|
|
}
|
|
|
|
const videoId = videos[Math.floor(Math.random() * videos.length)].id;
|
|
const audioId = audios[Math.floor(Math.random() * audios.length)].id;
|
|
|
|
navigate(`/x/${videoId}/${audioId}`);
|
|
}
|
|
</script>
|
|
|
|
<main>
|
|
<h1>XAOS TUBE</h1>
|
|
|
|
<hr />
|
|
|
|
<div class="input">
|
|
<input type="text" placeholder="YouTube URL..." bind:value={url} />
|
|
<div class="attrs">
|
|
USE:
|
|
<label><input type="checkbox" bind:checked={audio} />Audio</label>
|
|
<label>
|
|
<input type="checkbox" bind:checked={video} />
|
|
Video</label
|
|
>
|
|
</div>
|
|
|
|
<button {disabled} on:click={add}>ADD</button>
|
|
</div>
|
|
<hr />
|
|
<button on:click={random}>JUST GIMME</button>
|
|
<hr />
|
|
<a href="https://kunsaxan.sdbs.cz">ksx</a>
|
|
</main>
|
|
|
|
<div class="fullscreen-bg">
|
|
<video loop muted autoplay id="bg-video">
|
|
<source src="assets/bg.mp4" />
|
|
</video>
|
|
</div>
|
|
|
|
<style>
|
|
main {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding: 4rem;
|
|
gap: 5rem;
|
|
}
|
|
|
|
h1 {
|
|
color: white;
|
|
text-transform: uppercase;
|
|
font-size: 4rem;
|
|
font-weight: 100;
|
|
line-height: 1.1;
|
|
margin: 0;
|
|
}
|
|
|
|
:global(*:focus) {
|
|
outline: none;
|
|
}
|
|
|
|
input {
|
|
font-size: 20px;
|
|
padding: 0.5em;
|
|
border-radius: 5px;
|
|
}
|
|
|
|
button {
|
|
font-family: inherit;
|
|
font-size: inherit;
|
|
padding: 1em 2em;
|
|
color: white;
|
|
background-color: rgba(255, 255, 255, 0.25);
|
|
border-radius: 2em;
|
|
border: 2px solid rgba(255, 255, 255, 0);
|
|
outline: none;
|
|
width: 200px;
|
|
font-variant-numeric: tabular-nums;
|
|
cursor: pointer;
|
|
}
|
|
|
|
button:focus {
|
|
border: 2px solid white;
|
|
}
|
|
|
|
button:active {
|
|
background-color: rgba(255, 255, 255, 0.2);
|
|
}
|
|
|
|
button:disabled {
|
|
color: gray;
|
|
pointer-events: none;
|
|
}
|
|
|
|
hr {
|
|
height: 2px;
|
|
background-color: white;
|
|
border: none;
|
|
width: 420px;
|
|
}
|
|
|
|
.input {
|
|
text-align: center;
|
|
}
|
|
|
|
.input > * {
|
|
margin: 0.5em;
|
|
}
|
|
|
|
.attrs {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
#bg-video {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100vw;
|
|
height: 100vh;
|
|
object-fit: cover;
|
|
z-index: -999;
|
|
/* filter: brightness(.2) contrast(1.1); */
|
|
}
|
|
|
|
a,
|
|
a:visited {
|
|
color: white;
|
|
text-decoration: none;
|
|
}
|
|
|
|
a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
</style>
|