mirror of
https://github.com/sussy-code/smov.git
synced 2024-12-20 14:37:43 +01:00
Merge main
This commit is contained in:
commit
aabdd0abac
7 changed files with 200 additions and 237 deletions
|
@ -72,4 +72,4 @@ git push # Push to YOUR repository
|
||||||
|
|
||||||
## Contact Me
|
## Contact Me
|
||||||
**Discord:** *.baddeveloper*
|
**Discord:** *.baddeveloper*
|
||||||
**Email:** *[sudo-flix@proton.me](mailto:sudo-flix@proton.me)*
|
**Email:** *[dev@sudo-flix.lol](mailto:dev@sudo-flix.lol)*
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
</script>
|
</script>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<link rel="icon" href="/favicon.ico" />
|
<link rel="icon" href="/favicon.ico" />
|
||||||
|
<meta itemprop="image" content="/android-chrome-192x192.png">
|
||||||
|
<meta property="og:image" content="/android-chrome-192x192.png">
|
||||||
<meta name="viewport"
|
<meta name="viewport"
|
||||||
content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=1.0, user-scalable=no" />
|
content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=1.0, user-scalable=no" />
|
||||||
<meta name="description" content="Watch your favorite shows and movies for free with no ads ever! (っ'ヮ'c)" />
|
<meta name="description" content="Watch your favorite shows and movies for free with no ads ever! (っ'ヮ'c)" />
|
||||||
|
@ -173,4 +175,4 @@
|
||||||
<script type="module" src="/src/index.tsx"></script>
|
<script type="module" src="/src/index.tsx"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -454,7 +454,7 @@
|
||||||
},
|
},
|
||||||
"screens": {
|
"screens": {
|
||||||
"dmca": {
|
"dmca": {
|
||||||
"text": "Welcome to sudo-flix's DMCA contact page. If you believe your copyrighted work has been improperly used on our platform (😢), please send a detailed DMCA notice to: <bold>sudo-flix@proton.me</bold> below. Please include a description of the copyrighted material, your contact details, and a statement of good faith belief. We're committed to resolving these matters promptly and appreciate your cooperation.",
|
"text": "Welcome to sudo-flix's DMCA contact page. If you believe your copyrighted work has been improperly used on our platform (😢), please send a detailed DMCA notice to: <bold>dev@sudo-flix.lol</bold> below. Please include a description of the copyrighted material, your contact details, and a statement of good faith belief. We're committed to resolving these matters promptly and appreciate your cooperation.",
|
||||||
"title": "DMCA :("
|
"title": "DMCA :("
|
||||||
},
|
},
|
||||||
"loadingApp": "Loading application",
|
"loadingApp": "Loading application",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import React, { useCallback, useEffect, useState } from "react";
|
import React, { useCallback } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
import { Icon, Icons } from "@/components/Icon";
|
import { Icon, Icons } from "@/components/Icon";
|
||||||
|
@ -88,22 +88,6 @@ export function NextEpisodeButton(props: {
|
||||||
props.onChange?.(metaCopy);
|
props.onChange?.(metaCopy);
|
||||||
}, [setDirectMeta, meta, props, setShouldStartFromBeginning]);
|
}, [setDirectMeta, meta, props, setShouldStartFromBeginning]);
|
||||||
|
|
||||||
const [countdown, setCountdown] = useState(15);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const timer = setInterval(() => {
|
|
||||||
setCountdown((prev) => (prev > 0 ? prev - 1 : 0));
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
return () => clearInterval(timer);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (countdown === 0) {
|
|
||||||
loadNextEpisode();
|
|
||||||
}
|
|
||||||
}, [countdown, loadNextEpisode]);
|
|
||||||
|
|
||||||
if (!meta?.episode || !nextEp) return null;
|
if (!meta?.episode || !nextEp) return null;
|
||||||
if (metaType !== "show") return null;
|
if (metaType !== "show") return null;
|
||||||
|
|
||||||
|
@ -130,9 +114,7 @@ export function NextEpisodeButton(props: {
|
||||||
className="bg-buttons-primary hover:bg-buttons-primaryHover text-buttons-primaryText flex justify-center items-center"
|
className="bg-buttons-primary hover:bg-buttons-primaryHover text-buttons-primaryText flex justify-center items-center"
|
||||||
>
|
>
|
||||||
<Icon className="text-xl mr-1" icon={Icons.SKIP_EPISODE} />
|
<Icon className="text-xl mr-1" icon={Icons.SKIP_EPISODE} />
|
||||||
{countdown > 0
|
{t("player.nextEpisode.next")}
|
||||||
? `Next episode in ${countdown} seconds`
|
|
||||||
: t("player.nextEpisode.next")}
|
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
|
@ -41,8 +41,13 @@ export function Volume(props: Props) {
|
||||||
|
|
||||||
const handleMouseEnter = useCallback(async () => {
|
const handleMouseEnter = useCallback(async () => {
|
||||||
if (await canChangeVolume()) setHovering(true);
|
if (await canChangeVolume()) setHovering(true);
|
||||||
|
document.body.classList.add("overflow-y-hidden");
|
||||||
}, [setHovering]);
|
}, [setHovering]);
|
||||||
|
|
||||||
|
const handleMouseLeave = () => {
|
||||||
|
document.body.classList.remove("overflow-y-hidden");
|
||||||
|
};
|
||||||
|
|
||||||
let percentage = makePercentage(volume * 100);
|
let percentage = makePercentage(volume * 100);
|
||||||
if (dragging) percentage = makePercentage(dragPercentage);
|
if (dragging) percentage = makePercentage(dragPercentage);
|
||||||
const percentageString = makePercentageString(percentage);
|
const percentageString = makePercentageString(percentage);
|
||||||
|
@ -61,9 +66,10 @@ export function Volume(props: Props) {
|
||||||
<div
|
<div
|
||||||
className={props.className}
|
className={props.className}
|
||||||
onMouseEnter={handleMouseEnter}
|
onMouseEnter={handleMouseEnter}
|
||||||
|
onMouseLeave={handleMouseLeave}
|
||||||
onWheel={handleWheel}
|
onWheel={handleWheel}
|
||||||
>
|
>
|
||||||
<div className="pointer-events-auto flex cursor-pointer items-center py-0">
|
<div className="pointer-events-auto flex cursor-pointer items-center py-0 touch-none">
|
||||||
<div className="px-4 text-2xl text-white" onClick={handleClick}>
|
<div className="px-4 text-2xl text-white" onClick={handleClick}>
|
||||||
<Icon icon={percentage > 0 ? Icons.VOLUME : Icons.VOLUME_X} />
|
<Icon icon={percentage > 0 ? Icons.VOLUME : Icons.VOLUME_X} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -145,234 +145,207 @@ function ParticlesCanvas() {
|
||||||
|
|
||||||
// Basic particle config
|
// Basic particle config
|
||||||
const particleCount = 265;
|
const particleCount = 265;
|
||||||
let imageParticleCount = particleCount;
|
|
||||||
|
|
||||||
// Holiday overrides
|
|
||||||
let imageOverride: { image: string; sizeRange?: [number, number] }[] = [];
|
let imageOverride: { image: string; sizeRange?: [number, number] }[] = [];
|
||||||
const date = new Date();
|
const date = new Date();
|
||||||
const month = date.getMonth();
|
const month = date.getMonth();
|
||||||
const day = date.getDate();
|
const day = date.getDate();
|
||||||
if (
|
let imageParticleCount = particleCount;
|
||||||
(month === 11 && day >= 24 && day <= 26) ||
|
|
||||||
Math.random() < 0.051 // 5.1%
|
|
||||||
) {
|
|
||||||
imageOverride = [
|
|
||||||
{
|
|
||||||
image: "/lightbar-images/snowflake.svg",
|
|
||||||
sizeRange: [12, 20] as [number, number],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
image: "/lightbar-images/santa.png",
|
|
||||||
sizeRange: [25, 35] as [number, number],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
imageParticleCount = particleCount * 0.1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Halloween overrides
|
switch (true) {
|
||||||
const month2 = date.getMonth();
|
case (month === 11 && day >= 24 && day <= 26) || Math.random() < 0.051:
|
||||||
const day2 = date.getDate();
|
imageOverride = [
|
||||||
if (
|
{
|
||||||
(month2 === 9 && day2 >= 29 && day2 <= 31) ||
|
image: "/lightbar-images/snowflake.svg",
|
||||||
Math.random() < 0.05 // 5%
|
sizeRange: [12, 20] as [number, number],
|
||||||
) {
|
},
|
||||||
imageOverride = [
|
{
|
||||||
{
|
image: "/lightbar-images/santa.png",
|
||||||
image: "/lightbar-images/ghost.png",
|
sizeRange: [25, 35] as [number, number],
|
||||||
sizeRange: [20, 33] as [number, number],
|
},
|
||||||
},
|
];
|
||||||
{
|
imageParticleCount = particleCount * 0.1;
|
||||||
image: "/lightbar-images/pumpkin.png",
|
break;
|
||||||
sizeRange: [25, 35] as [number, number],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
imageParticleCount = particleCount * 0.0879;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fish easter egg
|
case (month === 9 && day >= 29 && day <= 31) || Math.random() < 0.05:
|
||||||
const shouldShowFishie = Math.random() < 0.1; // 10%
|
imageOverride = [
|
||||||
if (shouldShowFishie) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/ghost.png",
|
||||||
{
|
sizeRange: [20, 33] as [number, number],
|
||||||
image: "/lightbar-images/fishie.png",
|
},
|
||||||
sizeRange: [10, 13] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/pumpkin.png",
|
||||||
{
|
sizeRange: [25, 35] as [number, number],
|
||||||
image: "/lightbar-images/shark.png",
|
},
|
||||||
sizeRange: [48, 56] as [number, number],
|
];
|
||||||
},
|
imageParticleCount = particleCount * 0.0879;
|
||||||
];
|
break;
|
||||||
imageParticleCount = particleCount * 0.085;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Weed easter egg
|
case Math.random() < 0.1:
|
||||||
const month3 = date.getMonth() + 1;
|
imageOverride = [
|
||||||
const day3 = date.getDate();
|
{
|
||||||
const shouldShowZa = (month3 === 4 && day3 === 20) || Math.random() < 0.25; // 25%
|
image: "/lightbar-images/fishie.png",
|
||||||
if (shouldShowZa) {
|
sizeRange: [10, 13] as [number, number],
|
||||||
imageOverride = [
|
},
|
||||||
{
|
{
|
||||||
image: "/lightbar-images/weed.png",
|
image: "/lightbar-images/shark.png",
|
||||||
sizeRange: [32, 40] as [number, number],
|
sizeRange: [48, 56] as [number, number],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
imageParticleCount = particleCount / 6.25;
|
imageParticleCount = particleCount * 0.075;
|
||||||
}
|
break;
|
||||||
|
|
||||||
// Kitty easter egg
|
case (month === 4 && day === 20) || Math.random() < 0.25:
|
||||||
const shouldShowCat = Math.random() < 0.2; // 20%
|
imageOverride = [
|
||||||
if (shouldShowCat) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/weed.png",
|
||||||
{
|
sizeRange: [32, 40] as [number, number],
|
||||||
image: "/lightbar-images/cat.png",
|
},
|
||||||
sizeRange: [30, 38] as [number, number],
|
];
|
||||||
},
|
imageParticleCount = particleCount / 6.25;
|
||||||
];
|
break;
|
||||||
imageParticleCount = particleCount / 6.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Movie & popcorn easter egg
|
case Math.random() < 0.2:
|
||||||
const shouldShowParaphernalia = Math.random() < 0.3; // 30%
|
imageOverride = [
|
||||||
if (shouldShowParaphernalia) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/cat.png",
|
||||||
{
|
sizeRange: [30, 38] as [number, number],
|
||||||
image: "/lightbar-images/camera.png",
|
},
|
||||||
sizeRange: [24, 32] as [number, number],
|
];
|
||||||
},
|
imageParticleCount = particleCount / 6.6;
|
||||||
{
|
break;
|
||||||
image: "/lightbar-images/popcorn.png",
|
|
||||||
sizeRange: [18, 27] as [number, number],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
imageParticleCount = particleCount / 7.85;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chicken easter egg
|
case Math.random() < 0.3:
|
||||||
const shouldShow4thDecor = Math.random() < 0.08; // 8%
|
imageOverride = [
|
||||||
if (shouldShow4thDecor) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/camera.png",
|
||||||
{
|
sizeRange: [24, 32] as [number, number],
|
||||||
image: "/lightbar-images/cock.png",
|
},
|
||||||
sizeRange: [25, 32] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/popcorn.png",
|
||||||
{
|
sizeRange: [18, 27] as [number, number],
|
||||||
image: "/lightbar-images/egg.png",
|
},
|
||||||
sizeRange: [18, 24] as [number, number],
|
];
|
||||||
},
|
imageParticleCount = particleCount / 7.85;
|
||||||
{
|
break;
|
||||||
image: "/lightbar-images/barn.png",
|
|
||||||
sizeRange: [32, 38] as [number, number],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
imageParticleCount = particleCount / 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Money easter egg
|
case Math.random() < 0.08:
|
||||||
const shouldShowMoney = Math.random() < 0.06; // 6%
|
imageOverride = [
|
||||||
if (shouldShowMoney) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/cock.png",
|
||||||
{
|
sizeRange: [25, 32] as [number, number],
|
||||||
image: "/lightbar-images/money-sack.png",
|
},
|
||||||
sizeRange: [24, 32] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/egg.png",
|
||||||
{
|
sizeRange: [18, 24] as [number, number],
|
||||||
image: "/lightbar-images/money.png",
|
},
|
||||||
sizeRange: [13, 23] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/barn.png",
|
||||||
{
|
sizeRange: [32, 38] as [number, number],
|
||||||
image: "/lightbar-images/coin.png",
|
},
|
||||||
sizeRange: [8, 20] as [number, number],
|
];
|
||||||
},
|
imageParticleCount = particleCount / 9;
|
||||||
];
|
break;
|
||||||
imageParticleCount = particleCount / 8.45;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pirate easter egg
|
case Math.random() < 0.06:
|
||||||
const shouldShowPirate = Math.random() < 0.075; // 7.5%
|
imageOverride = [
|
||||||
if (shouldShowPirate) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/money-sack.png",
|
||||||
{
|
sizeRange: [24, 32] as [number, number],
|
||||||
image: "/lightbar-images/skull.png",
|
},
|
||||||
sizeRange: [20, 28] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/money.png",
|
||||||
{
|
sizeRange: [13, 23] as [number, number],
|
||||||
image: "/lightbar-images/ship.png",
|
},
|
||||||
sizeRange: [23, 27] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/coin.png",
|
||||||
];
|
sizeRange: [8, 20] as [number, number],
|
||||||
imageParticleCount = particleCount / 10;
|
},
|
||||||
}
|
];
|
||||||
|
imageParticleCount = particleCount / 8.45;
|
||||||
|
break;
|
||||||
|
|
||||||
// Dev easter egg
|
case Math.random() < 0.075:
|
||||||
const shouldShowCode = Math.random() < 0.03; // 3%
|
imageOverride = [
|
||||||
if (shouldShowCode) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/skull.png",
|
||||||
{
|
sizeRange: [20, 28] as [number, number],
|
||||||
image: "/lightbar-images/ts.png",
|
},
|
||||||
sizeRange: [20, 32] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/ship.png",
|
||||||
{
|
sizeRange: [23, 27] as [number, number],
|
||||||
image: "/lightbar-images/git.png",
|
},
|
||||||
sizeRange: [20, 28] as [number, number],
|
];
|
||||||
},
|
imageParticleCount = particleCount / 10;
|
||||||
];
|
break;
|
||||||
imageParticleCount = particleCount / 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
// DUI easter egg
|
case Math.random() < 0.03:
|
||||||
const shouldShowFlix = Math.random() < 0.08; // 8%
|
imageOverride = [
|
||||||
if (shouldShowFlix) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/ts.png",
|
||||||
{
|
sizeRange: [20, 32] as [number, number],
|
||||||
image: "/lightbar-images/beer.png",
|
},
|
||||||
sizeRange: [15, 35] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/git.png",
|
||||||
{
|
sizeRange: [20, 28] as [number, number],
|
||||||
image: "/lightbar-images/beer-bottle.png",
|
},
|
||||||
sizeRange: [10, 38] as [number, number],
|
];
|
||||||
},
|
imageParticleCount = particleCount / 9;
|
||||||
{
|
break;
|
||||||
image: "/lightbar-images/wine.png",
|
|
||||||
sizeRange: [15, 35] as [number, number],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
image: "/lightbar-images/cigarette.png",
|
|
||||||
sizeRange: [10, 38] as [number, number],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
image: "/lightbar-images/cigarette2.png",
|
|
||||||
sizeRange: [15, 35] as [number, number],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
imageParticleCount = particleCount / 11;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gangster easter egg
|
case Math.random() < 0.7:
|
||||||
const shouldShowCowboy = Math.random() < 0.05; // 5%
|
imageOverride = [
|
||||||
if (shouldShowCowboy) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/beer.png",
|
||||||
{
|
sizeRange: [15, 35] as [number, number],
|
||||||
image: "/lightbar-images/auto-gun.png",
|
},
|
||||||
sizeRange: [28, 36] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/beer-bottle.png",
|
||||||
{
|
sizeRange: [10, 38] as [number, number],
|
||||||
image: "/lightbar-images/gun.png",
|
},
|
||||||
sizeRange: [23, 30] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/wine.png",
|
||||||
];
|
sizeRange: [15, 35] as [number, number],
|
||||||
imageParticleCount = particleCount / 11.6;
|
},
|
||||||
}
|
{
|
||||||
|
image: "/lightbar-images/cigarette.png",
|
||||||
|
sizeRange: [10, 38] as [number, number],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "/lightbar-images/cigarette2.png",
|
||||||
|
sizeRange: [15, 35] as [number, number],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
imageParticleCount = particleCount / 11;
|
||||||
|
break;
|
||||||
|
|
||||||
// Star easter egg
|
case Math.random() < 0.05:
|
||||||
const shouldShowStars = Math.random() < 0.15; // 15%
|
imageOverride = [
|
||||||
if (shouldShowStars) {
|
{
|
||||||
imageOverride = [
|
image: "/lightbar-images/auto-gun.png",
|
||||||
{
|
sizeRange: [28, 36] as [number, number],
|
||||||
image: "/lightbar-images/star.png",
|
},
|
||||||
sizeRange: [18, 28] as [number, number],
|
{
|
||||||
},
|
image: "/lightbar-images/gun.png",
|
||||||
];
|
sizeRange: [23, 30] as [number, number],
|
||||||
imageParticleCount = particleCount / 6.6;
|
},
|
||||||
|
];
|
||||||
|
imageParticleCount = particleCount / 11.6;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Math.random() < 0.15:
|
||||||
|
imageOverride = [
|
||||||
|
{
|
||||||
|
image: "/lightbar-images/star.png",
|
||||||
|
sizeRange: [18, 28] as [number, number],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
imageParticleCount = particleCount / 6.6;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Default case
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// HOIST THE SAIL (of particles)!
|
// HOIST THE SAIL (of particles)!
|
||||||
|
|
|
@ -26,7 +26,7 @@ export function DmcaPage() {
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey="screens.dmca.text"
|
i18nKey="screens.dmca.text"
|
||||||
components={{
|
components={{
|
||||||
bold: <span className="font-bold" style={{ color: "#cfcfcf" }} />,
|
bold: <span className="font-bold text-white" />,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Paragraph>
|
</Paragraph>
|
||||||
|
@ -36,7 +36,7 @@ export function DmcaPage() {
|
||||||
href={`mailto:${conf().DMCA_EMAIL}`}
|
href={`mailto:${conf().DMCA_EMAIL}`}
|
||||||
style={{
|
style={{
|
||||||
transition: "color 0.3s ease",
|
transition: "color 0.3s ease",
|
||||||
color: isHovered ? "#cfcfcf" : "inherit",
|
color: isHovered ? "#ffffff" : "inherit",
|
||||||
}}
|
}}
|
||||||
onMouseEnter={() => setIsHovered(true)}
|
onMouseEnter={() => setIsHovered(true)}
|
||||||
onMouseLeave={() => setIsHovered(false)}
|
onMouseLeave={() => setIsHovered(false)}
|
||||||
|
|
Loading…
Reference in a new issue