Compare commits
8 Commits
96a9019eba
...
main
Author | SHA1 | Date | |
---|---|---|---|
444feac1e0 | |||
c034c94db5 | |||
ca52584da9 | |||
dca4924e9a | |||
9ad7c7afc2 | |||
6c8d34b030 | |||
35a0d61437 | |||
725a441d9e |
@@ -42,7 +42,11 @@ class EpisodeController extends Controller
|
|||||||
$this->galleryService->createOrUpdateGallery($request, $referenceEpisode->hentai, $episode, $episodeNumber, true);
|
$this->galleryService->createOrUpdateGallery($request, $referenceEpisode->hentai, $episode, $episodeNumber, true);
|
||||||
|
|
||||||
// Discord Alert
|
// Discord Alert
|
||||||
DiscordReleaseNotification::dispatch($episode->slug, 'release');
|
if ($request->has('censored')) {
|
||||||
|
DiscordReleaseNotification::dispatch($referenceEpisode->title." - ".$episodeNumber, 'release-censored');
|
||||||
|
} else {
|
||||||
|
DiscordReleaseNotification::dispatch($episode->slug, 'release');
|
||||||
|
}
|
||||||
|
|
||||||
cache()->flush();
|
cache()->flush();
|
||||||
|
|
||||||
@@ -76,6 +80,10 @@ class EpisodeController extends Controller
|
|||||||
DiscordReleaseNotification::dispatch($episode->slug, 'updateUHD');
|
DiscordReleaseNotification::dispatch($episode->slug, 'updateUHD');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($request->has('v2')) {
|
||||||
|
DiscordReleaseNotification::dispatch($episode->slug, 'v2');
|
||||||
|
}
|
||||||
|
|
||||||
cache()->flush();
|
cache()->flush();
|
||||||
|
|
||||||
return to_route('hentai.index', [
|
return to_route('hentai.index', [
|
||||||
|
@@ -72,9 +72,13 @@ class ReleaseController extends Controller
|
|||||||
$releasedEpisodes[] = $episode->slug;
|
$releasedEpisodes[] = $episode->slug;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($releasedEpisodes as $slug) {
|
if ($request->has('censored')) {
|
||||||
// Dispatch Discord Alert
|
DiscordReleaseNotification::dispatch($request->input('title'), 'release-censored');
|
||||||
DiscordReleaseNotification::dispatch($slug, 'release');
|
} else {
|
||||||
|
foreach ($releasedEpisodes as $slug) {
|
||||||
|
// Dispatch Discord Alert
|
||||||
|
DiscordReleaseNotification::dispatch($slug, 'release');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cache()->flush();
|
cache()->flush();
|
||||||
|
@@ -44,7 +44,7 @@ class HentaiApiController extends Controller
|
|||||||
public function getMonthlyViews()
|
public function getMonthlyViews()
|
||||||
{
|
{
|
||||||
// Cache for 60 minutes
|
// Cache for 60 minutes
|
||||||
$data = Cache::remember('api_hentai_list', now()->addMinutes(60), function () {
|
$data = Cache::remember('api_monthly_views', now()->addMinutes(60), function () {
|
||||||
return PopularMonthly::selectRaw('DATE(created_at) as date, COUNT(*) as count')
|
return PopularMonthly::selectRaw('DATE(created_at) as date, COUNT(*) as count')
|
||||||
->groupBy('date')
|
->groupBy('date')
|
||||||
->orderBy('date', 'asc')
|
->orderBy('date', 'asc')
|
||||||
|
@@ -52,6 +52,22 @@ class HomeController extends Controller
|
|||||||
return view('auth.banned');
|
return view('auth.banned');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Redirects to a random Hentai episode
|
||||||
|
* Done due to performance reasons
|
||||||
|
*/
|
||||||
|
public function random(): \Illuminate\Http\RedirectResponse
|
||||||
|
{
|
||||||
|
$random = Episode::inRandomOrder()
|
||||||
|
->limit(1)
|
||||||
|
->pluck('slug')
|
||||||
|
->first();
|
||||||
|
|
||||||
|
return redirect()->route('hentai.index', [
|
||||||
|
'title' => $random,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display Search Page.
|
* Display Search Page.
|
||||||
*/
|
*/
|
||||||
|
@@ -32,19 +32,29 @@ class DiscordReleaseNotification implements ShouldQueue
|
|||||||
*/
|
*/
|
||||||
public function handle(): void
|
public function handle(): void
|
||||||
{
|
{
|
||||||
// Wait 2s to avoid Discord API Rate limit
|
switch($this->messageType)
|
||||||
sleep(2);
|
{
|
||||||
|
case 'release':
|
||||||
if ($this->messageType == 'release') {
|
DiscordAlert::message("<@&868457842250764289> (´• ω •`)ノ New **4k** Release! Check it out here: https://hstream.moe/hentai/".$this->slug);
|
||||||
DiscordAlert::message("<@&868457842250764289> (´• ω •`)ノ New **4k** Release! Check it out here: https://hstream.moe/hentai/".$this->slug);
|
break;
|
||||||
}
|
case 'release-censored':
|
||||||
|
# Because Discord TOS
|
||||||
if ($this->messageType == 'update') {
|
DiscordAlert::message("<@&868457842250764289> (´• ω •`)ノ New **4k** Release: ".$this->slug." - *No link here because of* :pLoli:");
|
||||||
DiscordAlert::to('update')->message("<@&1283518462584426598> (´• ω •`)ノ Added **48fps** to Release! Check it out here: https://hstream.moe/hentai/".$this->slug);
|
break;
|
||||||
}
|
case 'update':
|
||||||
|
# 1080p 48fps added
|
||||||
if ($this->messageType == 'updateUHD') {
|
DiscordAlert::to('update')->message("<@&1283518462584426598> (´• ω •`)ノ Added **48fps** to Release! Check it out here: https://hstream.moe/hentai/".$this->slug);
|
||||||
DiscordAlert::to('update')->message("<@&1326860920902778963> (´• ω •`)ノ Added **48fps 4k** to Release! Check it out here: https://hstream.moe/hentai/".$this->slug);
|
break;
|
||||||
|
case 'updateUHD':
|
||||||
|
# 4k 48fps added
|
||||||
|
DiscordAlert::to('update')->message("<@&1326860920902778963> (´• ω •`)ノ Added **48fps 4k** to Release! Check it out here: https://hstream.moe/hentai/".$this->slug);
|
||||||
|
break;
|
||||||
|
case 'v2':
|
||||||
|
# v2 re-release
|
||||||
|
DiscordAlert::to('rerelease')->message("<@&1425505303075754035> (´• ω •`)ノ **v2 Re-**Release! Check it out here: https://hstream.moe/hentai/".$this->slug);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,7 @@ return [
|
|||||||
'webhook_urls' => [
|
'webhook_urls' => [
|
||||||
'default' => env('DISCORD_ALERT_WEBHOOK'),
|
'default' => env('DISCORD_ALERT_WEBHOOK'),
|
||||||
'update' => env('DISCORD_ALERT_UPDATE_WEBHOOK'),
|
'update' => env('DISCORD_ALERT_UPDATE_WEBHOOK'),
|
||||||
|
'rerelease' => env('DISCORD_ALERT_RERELEASE_WEBHOOK'),
|
||||||
],
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -97,6 +97,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-wrap flex-shrink-0 justify-end items-center p-4 rounded-b-md">
|
<div class="flex flex-wrap flex-shrink-0 justify-end items-center p-4 rounded-b-md">
|
||||||
|
<div class="inline-block mr-2">
|
||||||
|
<input class="w-4 h-4 text-rose-600 bg-gray-100 border-gray-300 rounded focus:ring-rose-500 dark:focus:ring-rose-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"
|
||||||
|
type="checkbox" value="true" id="v2" name="v2" />
|
||||||
|
<label class="inline-block hover:cursor-pointer dark:text-white" for="v2">
|
||||||
|
v2 Re-Release Notification
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
<button type="button" class="inline-block px-6 pt-2.5 pb-2 text-xs font-medium leading-normal uppercase rounded transition duration-150 ease-in-out bg-primary-100 text-primary-700 hover:bg-primary-accent-100 focus:bg-primary-accent-100 focus:outline-none focus:ring-0 active:bg-primary-accent-200" data-te-modal-dismiss data-te-ripple-init data-te-ripple-color="light">
|
<button type="button" class="inline-block px-6 pt-2.5 pb-2 text-xs font-medium leading-normal uppercase rounded transition duration-150 ease-in-out bg-primary-100 text-primary-700 hover:bg-primary-accent-100 focus:bg-primary-accent-100 focus:outline-none focus:ring-0 active:bg-primary-accent-200" data-te-modal-dismiss data-te-ripple-init data-te-ripple-color="light">
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
@@ -56,6 +56,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-shrink-0 flex-wrap items-center justify-end rounded-b-md p-4">
|
<div class="flex flex-shrink-0 flex-wrap items-center justify-end rounded-b-md p-4">
|
||||||
|
<div class="inline-block mr-2">
|
||||||
|
<input class="w-4 h-4 text-rose-600 bg-gray-100 border-gray-300 rounded focus:ring-rose-500 dark:focus:ring-rose-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"
|
||||||
|
type="checkbox" value="true" id="censored" name="censored" />
|
||||||
|
<label class="inline-block hover:cursor-pointer dark:text-white" for="censored">
|
||||||
|
Censored Notification
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
<button type="button" class="inline-block rounded bg-primary-100 px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-primary-700 transition duration-150 ease-in-out hover:bg-primary-accent-100 focus:bg-primary-accent-100 focus:outline-none focus:ring-0 active:bg-primary-accent-200" data-te-modal-dismiss data-te-ripple-init data-te-ripple-color="light">
|
<button type="button" class="inline-block rounded bg-primary-100 px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-primary-700 transition duration-150 ease-in-out hover:bg-primary-accent-100 focus:bg-primary-accent-100 focus:outline-none focus:ring-0 active:bg-primary-accent-200" data-te-modal-dismiss data-te-ripple-init data-te-ripple-color="light">
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
@@ -62,13 +62,12 @@
|
|||||||
|
|
||||||
<div class="p-4 pt-0">
|
<div class="p-4 pt-0">
|
||||||
<label class="leading-tight text-gray-800 dark:text-gray-200 w-full" for="description1">Description 1:</label>
|
<label class="leading-tight text-gray-800 dark:text-gray-200 w-full" for="description1">Description 1:</label>
|
||||||
<textarea rows="4" cols="50" id="description1" name="description1" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-neutral-900 dark:text-gray-300 focus:border-rose-500 dark:focus:border-rose-600 focus:ring-rose-500 dark:focus:ring-rose-600 rounded-md shadow-sm" required>
|
<textarea rows="4" cols="50" id="description1" name="description1" class="mt-1 block w-full border-gray-300 dark:border-gray-700 dark:bg-neutral-900 dark:text-gray-300 focus:border-rose-500 dark:focus:border-rose-600 focus:ring-rose-500 dark:focus:ring-rose-600 rounded-md shadow-sm" required></textarea>
|
||||||
</textarea>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-4 pt-0">
|
<div class="p-4 pt-0">
|
||||||
<label class="leading-tight text-gray-800 dark:text-gray-200 w-full" for="episodedlurl1">Download 1080p 1:</label>
|
<label class="leading-tight text-gray-800 dark:text-gray-200 w-full" for="episodedlurl1">Download 1080p 1:</label>
|
||||||
<x-text-input id="episodedlurl1" class="block w-full" type="text" name="episodedlurl1" required />
|
<x-text-input id="episodedlurl1" class="block w-full" type="text" name="episodedlurl1" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-4 pt-0">
|
<div class="p-4 pt-0">
|
||||||
@@ -78,7 +77,7 @@
|
|||||||
|
|
||||||
<div class="p-4 pt-0">
|
<div class="p-4 pt-0">
|
||||||
<label class="leading-tight text-gray-800 dark:text-gray-200 w-full" for="episodedlurl4k1">Download 4k 1:</label>
|
<label class="leading-tight text-gray-800 dark:text-gray-200 w-full" for="episodedlurl4k1">Download 4k 1:</label>
|
||||||
<x-text-input id="episodedlurl4k1" class="block w-full" type="text" name="episodedlurl4k1" required />
|
<x-text-input id="episodedlurl4k1" class="block w-full" type="text" name="episodedlurl4k1" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-4 pt-0">
|
<div class="p-4 pt-0">
|
||||||
@@ -90,6 +89,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-shrink-0 flex-wrap items-center justify-end rounded-b-md p-4">
|
<div class="flex flex-shrink-0 flex-wrap items-center justify-end rounded-b-md p-4">
|
||||||
|
<div class="inline-block mr-2">
|
||||||
|
<input class="w-4 h-4 text-rose-600 bg-gray-100 border-gray-300 rounded focus:ring-rose-500 dark:focus:ring-rose-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"
|
||||||
|
type="checkbox" value="true" id="censored" name="censored" />
|
||||||
|
<label class="inline-block hover:cursor-pointer dark:text-white" for="censored">
|
||||||
|
Censored Notification
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
<button type="button" class="inline-block rounded bg-primary-100 px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-primary-700 transition duration-150 ease-in-out hover:bg-primary-accent-100 focus:bg-primary-accent-100 focus:outline-none focus:ring-0 active:bg-primary-accent-200" data-te-modal-dismiss data-te-ripple-init data-te-ripple-color="light">
|
<button type="button" class="inline-block rounded bg-primary-100 px-6 pb-2 pt-2.5 text-xs font-medium uppercase leading-normal text-primary-700 transition duration-150 ease-in-out hover:bg-primary-accent-100 focus:bg-primary-accent-100 focus:outline-none focus:ring-0 active:bg-primary-accent-200" data-te-modal-dismiss data-te-ripple-init data-te-ripple-color="light">
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
@@ -24,9 +24,8 @@
|
|||||||
@include('home.partials.random')
|
@include('home.partials.random')
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- Comments -->
|
<!-- Comments -->
|
||||||
<div class="mx-auto pt-6 sm:px-6 lg:px-8 space-y-6 max-w-[100%] xl:max-w-[95%] 2xl:max-w-[85%]">
|
<div class="mx-auto pt-6 sm:px-6 lg:px-8 space-y-6 max-w-[100%] xl:max-w-[95%] 2xl:max-w-[85%] pb-2">
|
||||||
@include('home.partials.comments')
|
@include('home.partials.comments')
|
||||||
</div>
|
</div>
|
||||||
</x-app-layout>
|
</x-app-layout>
|
@@ -1,8 +1,12 @@
|
|||||||
<p class="leading-normal font-bold text-lg text-neutral-800 dark:text-white">
|
<p class="leading-normal font-bold text-lg text-neutral-800 dark:text-white">
|
||||||
Random
|
Random <span class="font-light text-xs text-neutral-800/60 dark:text-white/40">(Cached for 5 minutes)</span>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@php $random = \App\Models\Episode::inRandomOrder()->limit(8)->get(); @endphp
|
@php
|
||||||
|
$random = \cache()->remember('random_home', 300, function () {
|
||||||
|
return \App\Models\Episode::inRandomOrder()->limit(8)->get(); ;
|
||||||
|
});
|
||||||
|
@endphp
|
||||||
|
|
||||||
<div class="mb-6">
|
<div class="mb-6">
|
||||||
@include('home.partials.tab.template', ['episodes' => $random, 'showThumbnails' => false])
|
@include('home.partials.tab.template', ['episodes' => $random, 'showThumbnails' => false])
|
||||||
|
@@ -67,8 +67,7 @@
|
|||||||
@livewire('nav-live-search')
|
@livewire('nav-live-search')
|
||||||
<div class="hidden lg:block pl-4">
|
<div class="hidden lg:block pl-4">
|
||||||
<div class="flex flex-col items-center bg-gray-50/20 dark:bg-neutral-900/40 rounded-md">
|
<div class="flex flex-col items-center bg-gray-50/20 dark:bg-neutral-900/40 rounded-md">
|
||||||
@php $random = App\Models\Episode::inRandomOrder()->limit(1)->pluck('slug')->first(); @endphp
|
<a href="{{ route('hentai.random') }}"
|
||||||
<a href="{{ route('hentai.index', ['title' => $random]) }}"
|
|
||||||
class="cursor-pointer px-4 py-2 text-sm font-medium dark:hover:text-white text-gray-500 dark:text-white/90 focus:outline-none flex flex-col items-center md:flex-row">
|
class="cursor-pointer px-4 py-2 text-sm font-medium dark:hover:text-white text-gray-500 dark:text-white/90 focus:outline-none flex flex-col items-center md:flex-row">
|
||||||
<i class="fa-solid fa-shuffle"></i>
|
<i class="fa-solid fa-shuffle"></i>
|
||||||
<p class="md:pl-1 pl-0">Random</p>
|
<p class="md:pl-1 pl-0">Random</p>
|
||||||
|
@@ -22,6 +22,7 @@ use Illuminate\Support\Facades\Route;
|
|||||||
Route::get('/', [HomeController::class, 'index'])->name('home.index');
|
Route::get('/', [HomeController::class, 'index'])->name('home.index');
|
||||||
Route::get('/stats', [HomeController::class, 'stats'])->name('home.stats');
|
Route::get('/stats', [HomeController::class, 'stats'])->name('home.stats');
|
||||||
Route::get('/banned', [HomeController::class, 'banned'])->name('home.banned');
|
Route::get('/banned', [HomeController::class, 'banned'])->name('home.banned');
|
||||||
|
Route::get('/random', [HomeController::class, 'random'])->name('hentai.random');
|
||||||
|
|
||||||
// API Endpoint
|
// API Endpoint
|
||||||
Route::get('/v1/hentai-list', [HentaiApiController::class, 'index'])->name('api.hentai.index');
|
Route::get('/v1/hentai-list', [HentaiApiController::class, 'index'])->name('api.hentai.index');
|
||||||
|
@@ -20,7 +20,8 @@ export default defineConfig({
|
|||||||
'resources/js/user-blacklist.js',
|
'resources/js/user-blacklist.js',
|
||||||
'resources/js/admin-edit.js',
|
'resources/js/admin-edit.js',
|
||||||
'resources/js/admin-subtitles.js',
|
'resources/js/admin-subtitles.js',
|
||||||
'resources/js/preview.js'
|
'resources/js/preview.js',
|
||||||
|
'resources/js/stats.js'
|
||||||
],
|
],
|
||||||
refresh: true,
|
refresh: true,
|
||||||
}),
|
}),
|
||||||
|
Reference in New Issue
Block a user