This commit is contained in:
2025-09-18 15:31:27 +02:00
commit 2abba0c2b7
406 changed files with 31879 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
@inject('markdown', 'Parsedown')
@php
// TODO: There should be a better place for this.
$markdown->setSafeMode(true);
@endphp
<div id="comment-{{ $comment->id }}" class="flex rounded-lg bg-white p-1 mb-2 shadow-[0_2px_15px_-3px_rgba(0,0,0,0.07),0_10px_20px_-2px_rgba(0,0,0,0.04)] dark:bg-neutral-900">
@php $user = cache()->rememberForever('commentUser'.$comment->commenter_id, fn () => \App\Models\User::where('id', $comment->commenter_id)->first()); @endphp
<a class="contents" href="{{ route('user.index', ['username' => $user->username]) }}">
@if($user->avatar)
<img class="w-16 h-16 rounded-full m-2" src="https://external-content.duckduckgo.com/iu/?u=https://cdn.discordapp.com/avatars/{{ $comment->commenter_id }}/{{ $user->avatar }}.webp" alt="{{ $user->global_name ?? $user->username }} Avatar">
@else
<img class="w-16 h-16 rounded-full m-2" src="/images/default-avatar.webp" alt="{{ $user->global_name ?? $user->username }} Avatar">
@endif
</a>
<div class="text-gray-800 dark:text-gray-200">
<a href="{{ route('user.index', ['username' => $user->username]) }}">
@if($user->is_patreon)
<h5 class="text-gray-800 dark:text-gray-400">{{ $user->global_name ?? $user->username }} <a data-te-toggle="tooltip" title="Badge of appreciation for the horny people supporting us! :3"><i class="fa-solid fa-hand-holding-heart text-rose-600 animate-pulse"></i></a> <small class="text-muted">- {{ \Carbon\Carbon::parse($comment->created_at)->diffForHumans() }}</small></h5>
@else
<h5 class="text-gray-800 dark:text-gray-400">{{ $user->global_name ?? $user->username }} <small class="text-muted">- {{ \Carbon\Carbon::parse($comment->created_at)->diffForHumans() }}</small></h5>
@endif
</a>
<div style="white-space: pre-wrap;">{!! $markdown->line($comment->comment) !!}</div>
<br />
</div>
</div>

View File

@@ -0,0 +1,73 @@
@php $limitcounter = 0; @endphp
@foreach ($episodes as $ep)
@if (isset($popularView))
@php $episode = $ep->episode @endphp
@else
@php $episode = $ep @endphp
@endif
@if ($limitcounter >= $limit)
@break
@endif
<div
class="relative p-1 mb-8 w-full transition duration-300 ease-in-out md:p-2 hover:-translate-y-1 hover:scale-110">
<a class="hover:text-blue-600" href="{{ route('hentai.index', ['title' => $episode->slug]) }}">
<img alt="{{ $episode->title }} - {{ $episode->episode }}" loading="lazy" width="400"
class="block relative rounded-lg object-cover object-center aspect-[11/16] z-20 "
src="{{ $episode->cover_url }}"></img>
@guest
<p
class="absolute right-2 top-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
{{ $episode->getResolution() }}</p>
<p
class="absolute left-2 bottom-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
<i class="fa-regular fa-eye"></i> {{ $episode->viewCountFormatted() }} <i
class="fa-regular fa-heart"></i> {{ $episode->likeCount() }} <i class="fa-regular fa-comment"></i>
{{ $episode->commentCount() }}
</p>
@endguest
@php $problematic = cache()->rememberForever('episodeProblematic'.$episode->id, fn () => $episode->getProblematicTags()); @endphp
@if (!empty($problematic))
<p
class="absolute left-2 top-2 bg-red-700/70 !text-white rounded-br-lg rounded-tl-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
<i class="fa-solid fa-triangle-exclamation"></i> {{ $problematic }}
</p>
@endif
@auth
@if ($episode->userWatched(auth()->user()->id))
<p
class="absolute right-2 top-2 bg-green-600/80 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
{{ $episode->getResolution() }}</p>
<p
class="absolute left-2 bottom-2 bg-green-600/80 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
<i class="fa-regular fa-eye"></i> {{ $episode->viewCountFormatted() }} <i
class="fa-regular fa-heart"></i> {{ $episode->likeCount() }} <i
class="fa-regular fa-comment"></i> {{ $episode->commentCount() }}
</p>
@else
<p
class="absolute right-2 top-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
{{ $episode->getResolution() }}</p>
<p
class="absolute left-2 bottom-2 bg-rose-700/70 !text-white rounded-bl-lg rounded-tr-lg p-1 pr-2 pl-2 font-semibold text-sm z-30">
<i class="fa-regular fa-eye"></i> {{ $episode->viewCountFormatted() }} <i
class="fa-regular fa-heart"></i> {{ $episode->likeCount() }} <i
class="fa-regular fa-comment"></i> {{ $episode->commentCount() }}
</p>
@endif
@endauth
<div class="absolute w-[95%] grid grid-cols-1 text-center">
<p class="text-sm text-center text-black dark:text-white">{{ $episode->title }} -
{{ $episode->episode }}</p>
</div>
</a>
</div>
@php $limitcounter++; @endphp
@endforeach

View File

@@ -0,0 +1,17 @@
@php $limitcounter = 0; @endphp
@foreach ($episodes as $ep)
@if (isset($popularView))
@php $episode = $ep->episode @endphp
@else
@php $episode = $ep @endphp
@endif
@if ($limitcounter >= $limit)
@break
@endif
<x-episode-thumbnail :episode="$episode" />
@php $limitcounter++; @endphp
@endforeach

View File

@@ -0,0 +1,65 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
@if (Route::currentRouteName() == 'hentai.index')
@if (isset($episode))
<title>Watch {{ $episode->title }} - {{ $episode->episode }} in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
@elseif (isset($hentai))
<title>Watch {{ $hentai->episodes[0]->title }} in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
@else
<title>Watch Highest Quality Hentai in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
@endif
@else
<title>Watch Highest Quality Hentai in 4k, 1080p, UHD, HD for Free - hstream.moe</title>
<meta name="description" content="The best free 4k hentai site you will ever need online! Free 1080p hentai downloads and 4k hentai streams!">
@endif
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.bunny.net">
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-400-normal.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-ext-400-normal.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-600-normal.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://fonts.bunny.net/figtree/files/figtree-latin-ext-600-normal.woff2" as="font" type="font/woff2" crossorigin>
<!-- Styles -->
@vite(['resources/css/app.css', 'resources/js/app.js', 'resources/js/theme.js'])
@livewireStyles
<!-- Icons -->
<link rel="icon" href="/images/cropped-HS-1-32x32.png" sizes="32x32">
<link rel="icon" href="/images/cropped-HS-1-192x192.png" sizes="192x192">
<link rel="apple-touch-icon" href="/images/cropped-HS-1-180x180.png">
<meta name="msapplication-TileImage" content="/images/cropped-HS-1-270x270.png">
<!-- Color -->
<meta name="theme-color" content="#be123c">
<meta name="msapplication-navbutton-color" content="#be123c">
<meta name="apple-mobile-web-app-status-bar-style" content="#be123c">
<!-- OG -->
@if (isset($episode) || isset($hentai))
@include('partials.social-preview')
@endif
<script>
document.documentElement.classList.add('dark');
</script>
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u = "//hstream.moe/";
_paq.push(['setTrackerUrl', u + 'app.php']);
_paq.push(['setSiteId', '1']);
var d = document,
g = d.createElement('script'),
s = d.getElementsByTagName('script')[0];
g.async = true;
g.src = u + 'app.js';
s.parentNode.insertBefore(g, s);
})();
</script>
</head>

View File

@@ -0,0 +1,20 @@
<form
class="inherit right-2 left-2 sm:relative sm:min-w-[200px] md:min-w-[300px] lg:min-w-[400px] xl:min-w-[500px] h-[54px]"
method="POST" action="{{ route('hentai.searchredirect') }}">
@csrf
<label for="default-search" class="mb-2 text-sm font-medium text-gray-900 sr-only dark:text-white">Search</label>
<div class="absolute right-2 left-2 sm:relative sm:min-w-[200px] md:min-w-[300px] lg:min-w-[400px] xl:min-w-[500px]">
<div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
<svg class="w-4 h-4 text-gray-500 dark:text-gray-400" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
fill="none" viewBox="0 0 20 20">
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z" />
</svg>
</div>
<input type="search" id="live-search" name="live-search"
class="block w-full p-4 pl-10 text-sm text-gray-900 border border-gray-300 rounded-lg bg-gray-50 focus:ring-rose-800 focus:border-rose-900 dark:bg-neutral-900 dark:border-neutral-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-rose-800 dark:focus:border-rose-900"
placeholder="{{ __('search.search-hentai') }}" required>
<button type="submit"
class="text-white absolute right-2.5 bottom-2.5 bg-rose-700 hover:bg-rose-800 focus:ring-4 focus:outline-none focus:ring-rose-300 font-medium rounded-lg text-sm px-4 py-2 dark:bg-rose-600 dark:hover:bg-rose-700 dark:focus:ring-rose-800">{{ __('search.search') }}</button>
</div>
</form>

View File

@@ -0,0 +1,52 @@
@if (Route::currentRouteName() == 'hentai.index')
@php
$title = '';
if (! isset($episode) && isset($hentai)) {
$episode = $hentai->episodes[0];
$gallery = $episode->gallery;
$title = 'Watch all episodes from '.$episode->title.' in 4k, 2160p, 1080p, UHD, HD - hstream.moe';
} else {
$title = 'Watch '.$episode->title.' - '.$episode->episode.' in 4k, 2160p, 1080p, UHD, HD - hstream.moe';
}
@endphp
<meta property="og:title" content="{{ $title }}" />
<meta property="og:description" content="{{ Str::limit($episode->description, 250) }}" />
<meta property="og:type" content="video.episode" />
<meta property="og:url" content="https://hstream.moe/hentai/{{ $episode->slug }}" />
@if(isset($gallery) && $episode->gallery->isNotEmpty())
<meta property="og:image" content="https://hstream.moe{{ $gallery[0]->image_url }}" />
@endif
<meta property="og:locale" content="en_US" />
<meta property="og:site_name" content="hstream.moe" />
<meta name="twitter:card" content="summary_large_image" />
@php
$tags = '';
foreach ($episode->tags as $tag) {
if (!$tags){
$tags .= $tag->name;
} else {
$tags .= ', '.$tag->name;
}
}
@endphp
<meta name="description" content="{{ $episode->description }} {{ $tags }}">
<meta name="keywords" content="hstream,hentaistream,hentai,stream,4k,hentai 4k,4k hentai,download,free">
@elseif (Route::currentRouteName() == 'home.index')
<meta property="og:title" content="Watch Hentai in 4k, 1080p, 720p, UHD, HD for Free! - hstream.moe" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://hstream.moe/" />
<meta property="og:image" content="https://hstream.moe/images/cropped-HS-1-192x192.webp" />
<meta property="og:image:width" content="300" />
<meta property="og:image:height" content="100" />
<meta property="og:locale" content="en_US" />
<meta property="og:site_name" content="hstream.moe" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="description" content="Watch Hentai free download in 4k, 2160p, 1080p, UHD, HD! Daily upload, no ads, subbed in 2160p!">
@else
<meta name="description" content="Watch Hentai free download in 4k, 2160p, 1080p, UHD, HD! Daily upload, no ads, subbed in 2160p!">
@endif

View File

@@ -0,0 +1,16 @@
<label for="toogleTheme" class="flex items-center cursor-pointer">
<!-- toggle -->
<div class="relative">
<!-- input -->
<input id="toogleTheme" type="checkbox" class="sr-only" />
<!-- line -->
<div class="w-10 h-4 bg-rose-600 dark:bg-gray-400 rounded-full shadow-inner"></div>
<!-- dot -->
<div class="dot absolute w-6 h-6 bg-white dark:bg-neutral-950 rounded-full shadow -left-1 -top-1 transition">
<div class="items-center ml-[5px] w-6 h-6 font-medium flex">
<i class="fa-regular fa-moon text-white hidden dark:inline"></i>
<i class="fa-regular fa-sun text-yellow-400 dark:hidden"></i>
</div>
</div>
</div>
</label>