This commit is contained in:
2026-04-18 14:18:52 +02:00
parent 5b4d3d435e
commit f3e5100d5d
126 changed files with 743 additions and 795 deletions

View File

@@ -3,11 +3,10 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Models\PopularDaily; use App\Models\PopularDaily;
use App\Models\PopularWeekly;
use App\Models\PopularMonthly; use App\Models\PopularMonthly;
use App\Models\PopularWeekly;
use Illuminate\Support\Carbon;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
class AutoStats extends Command class AutoStats extends Command
{ {

View File

@@ -4,7 +4,6 @@ namespace App\Console\Commands;
use App\Models\Episode; use App\Models\Episode;
use App\Models\Hentai; use App\Models\Hentai;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Spatie\Sitemap\Sitemap; use Spatie\Sitemap\Sitemap;

View File

@@ -2,9 +2,8 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use App\Models\Downloads;
use App\Jobs\GetFileSizeFromCDN; use App\Jobs\GetFileSizeFromCDN;
use App\Models\Downloads;
use Illuminate\Console\Command; use Illuminate\Console\Command;
class GetFileSize extends Command class GetFileSize extends Command
@@ -28,7 +27,7 @@ class GetFileSize extends Command
*/ */
public function handle() public function handle()
{ {
foreach(Downloads::whereNull('size')->get() as $download) { foreach (Downloads::whereNull('size')->get() as $download) {
GetFileSizeFromCDN::dispatch($download->id); GetFileSizeFromCDN::dispatch($download->id);
} }

View File

@@ -4,9 +4,8 @@ namespace App\Console\Commands;
use App\Models\User; use App\Models\User;
use App\Models\UserDownload; use App\Models\UserDownload;
use Illuminate\Support\Carbon;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
class ResetUserDownloads extends Command class ResetUserDownloads extends Command
{ {

View File

@@ -5,21 +5,20 @@ namespace App\Helpers;
use App\Models\Comment; use App\Models\Comment;
use App\Models\Episode; use App\Models\Episode;
use App\Models\Hentai; use App\Models\Hentai;
use App\Models\PopularDaily;
use App\Models\PopularMonthly; use App\Models\PopularMonthly;
use App\Models\PopularWeekly; use App\Models\PopularWeekly;
use App\Models\PopularDaily;
use Conner\Tagging\Model\Tag; use Conner\Tagging\Model\Tag;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class CacheHelper class CacheHelper
{ {
public static function getRecentlyReleased(bool $guest) public static function getRecentlyReleased(bool $guest)
{ {
$guestString = $guest ? 'guest' : 'authed'; $guestString = $guest ? 'guest' : 'authed';
return Cache::remember("recently_released_".$guestString, now()->addMinutes(60), function () use ($guest) {
return Cache::remember('recently_released_'.$guestString, now()->addMinutes(60), function () use ($guest) {
return Episode::with('gallery') return Episode::with('gallery')
->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota'])) ->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota']))
->orderBy('release_date', 'desc') ->orderBy('release_date', 'desc')
@@ -31,7 +30,8 @@ class CacheHelper
public static function getRecentlyUploaded(bool $guest) public static function getRecentlyUploaded(bool $guest)
{ {
$guestString = $guest ? 'guest' : 'authed'; $guestString = $guest ? 'guest' : 'authed';
return Cache::remember("recently_uploaded".$guestString, now()->addMinutes(5), function () use ($guest) {
return Cache::remember('recently_uploaded'.$guestString, now()->addMinutes(5), function () use ($guest) {
return Episode::with('gallery') return Episode::with('gallery')
->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota'])) ->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota']))
->orderBy('created_at', 'desc') ->orderBy('created_at', 'desc')
@@ -42,21 +42,21 @@ class CacheHelper
public static function getTotalViewCount() public static function getTotalViewCount()
{ {
return Cache::remember("total_view_count", now()->addMinutes(60), function () { return Cache::remember('total_view_count', now()->addMinutes(60), function () {
return Episode::sum('view_count'); return Episode::sum('view_count');
}); });
} }
public static function getTotalEpisodeCount() public static function getTotalEpisodeCount()
{ {
return Cache::remember("total_episode_count", now()->addMinutes(60), function () { return Cache::remember('total_episode_count', now()->addMinutes(60), function () {
return Episode::count(); return Episode::count();
}); });
} }
public static function getTotalHentaiCount() public static function getTotalHentaiCount()
{ {
return Cache::remember("total_hentai_count", now()->addMinutes(60), function () { return Cache::remember('total_hentai_count', now()->addMinutes(60), function () {
return Hentai::count(); return Hentai::count();
}); });
} }
@@ -64,10 +64,11 @@ class CacheHelper
public static function getPopularAllTime(bool $guest) public static function getPopularAllTime(bool $guest)
{ {
$guestString = $guest ? 'guest' : 'authed'; $guestString = $guest ? 'guest' : 'authed';
return Cache::remember("top_hentai_alltime".$guestString, now()->addMinutes(360), function () use ($guest) {
return Cache::remember('top_hentai_alltime'.$guestString, now()->addMinutes(360), function () use ($guest) {
return Episode::with('gallery') return Episode::with('gallery')
->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota'])) ->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota']))
->orderBy('view_count','desc') ->orderBy('view_count', 'desc')
->limit(16) ->limit(16)
->get(); ->get();
}); });
@@ -75,7 +76,7 @@ class CacheHelper
public static function getPopularMonthly() public static function getPopularMonthly()
{ {
return Cache::remember("top_hentai_monthly", now()->addMinutes(360), function () { return Cache::remember('top_hentai_monthly', now()->addMinutes(360), function () {
return PopularMonthly::groupBy('episode_id') return PopularMonthly::groupBy('episode_id')
->select('episode_id', DB::raw('count(*) as total')) ->select('episode_id', DB::raw('count(*) as total'))
->with('episode.gallery') ->with('episode.gallery')
@@ -87,7 +88,7 @@ class CacheHelper
public static function getPopularWeekly() public static function getPopularWeekly()
{ {
return Cache::remember("top_hentai_weekly", now()->addMinutes(360), function () { return Cache::remember('top_hentai_weekly', now()->addMinutes(360), function () {
return PopularWeekly::groupBy('episode_id') return PopularWeekly::groupBy('episode_id')
->select('episode_id', DB::raw('count(*) as total')) ->select('episode_id', DB::raw('count(*) as total'))
->with('episode.gallery') ->with('episode.gallery')
@@ -100,7 +101,7 @@ class CacheHelper
public static function getPopularDaily() public static function getPopularDaily()
{ {
return Cache::remember("top_hentai_daily", now()->addMinutes(30), function () { return Cache::remember('top_hentai_daily', now()->addMinutes(30), function () {
return PopularDaily::groupBy('episode_id') return PopularDaily::groupBy('episode_id')
->select('episode_id', DB::raw('count(*) as total')) ->select('episode_id', DB::raw('count(*) as total'))
->with('episode.gallery') ->with('episode.gallery')
@@ -112,21 +113,21 @@ class CacheHelper
public static function getMostLikes() public static function getMostLikes()
{ {
return Cache::remember("top_likes", now()->addMinutes(30), function () { return Cache::remember('top_likes', now()->addMinutes(30), function () {
return DB::table('markable_likes')->groupBy('markable_id')->select('markable_id', DB::raw('count(*) as total'))->orderBy('total', 'desc')->limit(16)->get(); return DB::table('markable_likes')->groupBy('markable_id')->select('markable_id', DB::raw('count(*) as total'))->orderBy('total', 'desc')->limit(16)->get();
}); });
} }
public static function getAllTags() public static function getAllTags()
{ {
return Cache::remember("all_tags", now()->addMinutes(10080), function () { return Cache::remember('all_tags', now()->addMinutes(10080), function () {
return Tag::where('count', '>', 0)->orderBy('slug', 'ASC')->get(); return Tag::where('count', '>', 0)->orderBy('slug', 'ASC')->get();
}); });
} }
public static function getLatestComments() public static function getLatestComments()
{ {
return Cache::remember("latest_comments", now()->addMinutes(60), function () { return Cache::remember('latest_comments', now()->addMinutes(60), function () {
return Comment::latest()->take(10)->get(); return Comment::latest()->take(10)->get();
}); });
} }

View File

@@ -8,7 +8,7 @@ class GitHelper
{ {
public static function shortCommit() public static function shortCommit()
{ {
return Cache::remember("git_commit", now()->addMinutes(60), function () { return Cache::remember('git_commit', now()->addMinutes(60), function () {
try { try {
return trim(exec('git rev-parse --short HEAD')); return trim(exec('git rev-parse --short HEAD'));
} catch (\Exception $e) { } catch (\Exception $e) {

View File

@@ -15,7 +15,7 @@ class ContactController extends Controller
$contacts = Contact::orderBy('created_at', 'DESC')->get(); $contacts = Contact::orderBy('created_at', 'DESC')->get();
return view('admin.contact.index', [ return view('admin.contact.index', [
'contacts' => $contacts 'contacts' => $contacts,
]); ]);
} }

View File

@@ -3,9 +3,8 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Episode;
use App\Jobs\DiscordReleaseNotification; use App\Jobs\DiscordReleaseNotification;
use App\Models\Episode;
use App\Services\DownloadService; use App\Services\DownloadService;
use App\Services\EpisodeService; use App\Services\EpisodeService;
use App\Services\GalleryService; use App\Services\GalleryService;
@@ -14,14 +13,16 @@ use Illuminate\Http\Request;
class EpisodeController extends Controller class EpisodeController extends Controller
{ {
protected EpisodeService $episodeService; protected EpisodeService $episodeService;
protected GalleryService $galleryService; protected GalleryService $galleryService;
protected DownloadService $downloadService; protected DownloadService $downloadService;
public function __construct( public function __construct(
EpisodeService $episodeService, EpisodeService $episodeService,
GalleryService $galleryService, GalleryService $galleryService,
DownloadService $downloadService DownloadService $downloadService
) { ) {
$this->episodeService = $episodeService; $this->episodeService = $episodeService;
$this->galleryService = $galleryService; $this->galleryService = $galleryService;
$this->downloadService = $downloadService; $this->downloadService = $downloadService;
@@ -43,7 +44,7 @@ class EpisodeController extends Controller
// Discord Alert // Discord Alert
if ($request->has('censored')) { if ($request->has('censored')) {
DiscordReleaseNotification::dispatch($referenceEpisode->title." - ".$episodeNumber, 'release-censored'); DiscordReleaseNotification::dispatch($referenceEpisode->title.' - '.$episodeNumber, 'release-censored');
} else { } else {
DiscordReleaseNotification::dispatch($episode->slug, 'release'); DiscordReleaseNotification::dispatch($episode->slug, 'release');
} }
@@ -51,7 +52,7 @@ class EpisodeController extends Controller
cache()->flush(); cache()->flush();
return to_route('hentai.index', [ return to_route('hentai.index', [
'title' => $episode->slug 'title' => $episode->slug,
]); ]);
} }
@@ -87,7 +88,7 @@ class EpisodeController extends Controller
cache()->flush(); cache()->flush();
return to_route('hentai.index', [ return to_route('hentai.index', [
'title' => $episode->slug 'title' => $episode->slug,
]); ]);
} }
} }

View File

@@ -3,9 +3,8 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Hentai;
use App\Jobs\DiscordReleaseNotification; use App\Jobs\DiscordReleaseNotification;
use App\Models\Hentai;
use App\Services\DownloadService; use App\Services\DownloadService;
use App\Services\EpisodeService; use App\Services\EpisodeService;
use App\Services\GalleryService; use App\Services\GalleryService;
@@ -14,14 +13,16 @@ use Illuminate\Http\Request;
class ReleaseController extends Controller class ReleaseController extends Controller
{ {
protected EpisodeService $episodeService; protected EpisodeService $episodeService;
protected GalleryService $galleryService; protected GalleryService $galleryService;
protected DownloadService $downloadService; protected DownloadService $downloadService;
public function __construct( public function __construct(
EpisodeService $episodeService, EpisodeService $episodeService,
GalleryService $galleryService, GalleryService $galleryService,
DownloadService $downloadService DownloadService $downloadService
) { ) {
$this->episodeService = $episodeService; $this->episodeService = $episodeService;
$this->galleryService = $galleryService; $this->galleryService = $galleryService;
$this->downloadService = $downloadService; $this->downloadService = $downloadService;

View File

@@ -3,15 +3,13 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\SiteBackground; use App\Models\SiteBackground;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Intervention\Image\Laravel\Facades\Image;
use Intervention\Image\Encoders\WebpEncoder; use Intervention\Image\Encoders\WebpEncoder;
use Intervention\Image\Laravel\Facades\Image;
class SiteBackgroundController extends Controller class SiteBackgroundController extends Controller
{ {
@@ -31,12 +29,12 @@ class SiteBackgroundController extends Controller
public function create(Request $request): \Illuminate\Http\RedirectResponse public function create(Request $request): \Illuminate\Http\RedirectResponse
{ {
$request->validate([ $request->validate([
'images' => 'required', 'images' => 'required',
'date_start' => 'required', 'date_start' => 'required',
'date_end' => 'required', 'date_end' => 'required',
]); ]);
foreach($request->file('images') as $file) { foreach ($request->file('images') as $file) {
// Initiating a database transaction in case something goes wrong. // Initiating a database transaction in case something goes wrong.
DB::beginTransaction(); DB::beginTransaction();
@@ -44,24 +42,25 @@ class SiteBackgroundController extends Controller
$bg = SiteBackground::create(array_merge( $bg = SiteBackground::create(array_merge(
$request->only(['date_start', 'date_end']), $request->only(['date_start', 'date_end']),
[ [
'default' => (bool) $request->input('default', false) 'default' => (bool) $request->input('default', false),
] ]
)); ));
$resolutions = [1440, 1080, 720, 640]; $resolutions = [1440, 1080, 720, 640];
foreach($resolutions as $resolution) { foreach ($resolutions as $resolution) {
// /images/background/1-2560p.webp // /images/background/1-2560p.webp
$targetPath = "/images/background/{$bg->id}-{$resolution}p.webp"; $targetPath = "/images/background/{$bg->id}-{$resolution}p.webp";
Image::read($file->getRealPath()) Image::read($file->getRealPath())
->scaleDown(height: $resolution) ->scaleDown(height: $resolution)
->encode(new WebpEncoder()) ->encode(new WebpEncoder)
->save(public_path($targetPath)); ->save(public_path($targetPath));
} }
} catch (\Exception $e) { } catch (\Exception $e) {
DB::rollBack(); DB::rollBack();
Log::error($e->getMessage()); Log::error($e->getMessage());
return redirect()->back(); return redirect()->back();
} }
@@ -77,15 +76,15 @@ class SiteBackgroundController extends Controller
public function update(Request $request): \Illuminate\Http\RedirectResponse public function update(Request $request): \Illuminate\Http\RedirectResponse
{ {
$request->validate([ $request->validate([
'id' => 'required|exists:site_backgrounds,id', 'id' => 'required|exists:site_backgrounds,id',
'date_start' => 'required', 'date_start' => 'required',
'date_end' => 'required', 'date_end' => 'required',
]); ]);
SiteBackground::where('id', $request->input('id'))->update(array_merge( SiteBackground::where('id', $request->input('id'))->update(array_merge(
$request->only(['date_start', 'date_end']), $request->only(['date_start', 'date_end']),
[ [
'default' => (bool) $request->input('default', false) 'default' => (bool) $request->input('default', false),
] ]
)); ));
@@ -109,13 +108,14 @@ class SiteBackgroundController extends Controller
$resolutions = [1440, 1080, 720, 640]; $resolutions = [1440, 1080, 720, 640];
try { try {
foreach($resolutions as $resolution) { foreach ($resolutions as $resolution) {
$targetPath = "/images/background/{$id}-{$resolution}p.webp"; $targetPath = "/images/background/{$id}-{$resolution}p.webp";
File::delete(public_path($targetPath)); File::delete(public_path($targetPath));
} }
} catch (\Exception $e) { } catch (\Exception $e) {
DB::rollBack(); DB::rollBack();
Log::error($e->getMessage()); Log::error($e->getMessage());
return redirect()->back(); return redirect()->back();
} }

View File

@@ -2,10 +2,10 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Episode; use App\Models\Episode;
use App\Models\EpisodeSubtitle; use App\Models\EpisodeSubtitle;
use App\Models\Subtitle; use App\Models\Subtitle;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class SubtitleController extends Controller class SubtitleController extends Controller
@@ -16,8 +16,8 @@ class SubtitleController extends Controller
public function store(Request $request): \Illuminate\Http\RedirectResponse public function store(Request $request): \Illuminate\Http\RedirectResponse
{ {
$subtitle = Subtitle::create([ $subtitle = Subtitle::create([
'name' => $request->name, 'name' => $request->name,
'slug' => $request->slug, 'slug' => $request->slug,
]); ]);
// Add to Episode // Add to Episode
@@ -37,7 +37,7 @@ class SubtitleController extends Controller
$episode = Episode::where('id', $request->input('episode_id'))->firstOrFail(); $episode = Episode::where('id', $request->input('episode_id'))->firstOrFail();
// Clear everything // Clear everything
foreach($episode->subtitles as $sub) { foreach ($episode->subtitles as $sub) {
$sub->delete(); $sub->delete();
} }

View File

@@ -3,8 +3,8 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Enums\UserRole; use App\Enums\UserRole;
use App\Models\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class UserController extends Controller class UserController extends Controller
@@ -23,11 +23,10 @@ class UserController extends Controller
public function update(Request $request) public function update(Request $request)
{ {
$validated = $request->validate([ $validated = $request->validate([
'id' => 'required|exists:users,id', 'id' => 'required|exists:users,id',
'action' => 'required', 'action' => 'required',
]); ]);
$user = User::findOrFail($validated['id']); $user = User::findOrFail($validated['id']);
switch ($validated['action']) { switch ($validated['action']) {
@@ -40,7 +39,7 @@ class UserController extends Controller
alert()->success('Unbanned', 'User has been unbanned.'); alert()->success('Unbanned', 'User has been unbanned.');
break; break;
default: default:
alert()->error('Error','Invalid action provided'); alert()->error('Error', 'Invalid action provided');
} }
return redirect()->back(); return redirect()->back();

View File

@@ -3,10 +3,10 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Helpers\CacheHelper; use App\Helpers\CacheHelper;
use App\Http\Controllers\Controller;
use App\Models\Episode; use App\Models\Episode;
use App\Models\Studios; use App\Models\Studios;
use App\Models\Subtitle; use App\Models\Subtitle;
use App\Http\Controllers\Controller;
class AdminApiController extends Controller class AdminApiController extends Controller
{ {

View File

@@ -2,13 +2,11 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Downloads; use App\Models\Downloads;
use App\Models\Episode; use App\Models\Episode;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use GrantHolle\Altcha\Rules\ValidAltcha; use GrantHolle\Altcha\Rules\ValidAltcha;
use Illuminate\Http\Request;
class DownloadApiController extends Controller class DownloadApiController extends Controller
{ {
@@ -18,8 +16,8 @@ class DownloadApiController extends Controller
public function getDownload(Request $request) public function getDownload(Request $request)
{ {
$validated = $request->validate([ $validated = $request->validate([
'episode_id' => ['required'], 'episode_id' => ['required'],
'captcha' => ['required', new ValidAltcha], 'captcha' => ['required', new ValidAltcha],
]); ]);
$episode = Episode::where('id', $request->input('episode_id')) $episode = Episode::where('id', $request->input('episode_id'))
@@ -33,9 +31,9 @@ class DownloadApiController extends Controller
$download->save(); $download->save();
return response()->json([ return response()->json([
'message' => 'success', 'message' => 'success',
'download_url' => $download->url, 'download_url' => $download->url,
'download_count' => $oldCount, 'download_count' => $oldCount,
], 200); ], 200);
} }
} }

View File

@@ -2,12 +2,11 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Hentai; use App\Models\Hentai;
use App\Models\PopularMonthly; use App\Models\PopularMonthly;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use App\Http\Controllers\Controller;
class HentaiApiController extends Controller class HentaiApiController extends Controller
{ {
@@ -23,13 +22,13 @@ class HentaiApiController extends Controller
->get() ->get()
->map(function ($hentai) { ->map(function ($hentai) {
return [ return [
'title' => $hentai->episodes[0]->title, 'title' => $hentai->episodes[0]->title,
'title_jpn' => $hentai->episodes[0]->title_jpn, 'title_jpn' => $hentai->episodes[0]->title_jpn,
'slug' => $hentai->slug, 'slug' => $hentai->slug,
'episodes' => $hentai->episodes->map(function ($ep) { 'episodes' => $hentai->episodes->map(function ($ep) {
return [ return [
'episode' => $ep->episode, 'episode' => $ep->episode,
'slug' => $ep->slug, 'slug' => $ep->slug,
]; ];
}), }),
]; ];

View File

@@ -3,9 +3,7 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Episode; use App\Models\Episode;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class StreamApiController extends Controller class StreamApiController extends Controller
@@ -16,24 +14,24 @@ class StreamApiController extends Controller
public function getStream(Request $request) public function getStream(Request $request)
{ {
$validated = $request->validate([ $validated = $request->validate([
'episode_id' => 'required', 'episode_id' => 'required',
]); ]);
$episode = Episode::where('id', $request->input('episode_id'))->firstOrFail(); $episode = Episode::where('id', $request->input('episode_id'))->firstOrFail();
$subtitles = $episode->subtitles $subtitles = $episode->subtitles
->mapWithKeys(fn($sub) => [$sub->subtitle->slug => $sub->subtitle->name]) ->mapWithKeys(fn ($sub) => [$sub->subtitle->slug => $sub->subtitle->name])
->toArray(); ->toArray();
return response()->json([ return response()->json([
'title' => $episode->title.' - '.$episode->episode, 'title' => $episode->title.' - '.$episode->episode,
'poster' => $episode->gallery()->first()->image_url, 'poster' => $episode->gallery()->first()->image_url,
'interpolated' => $episode->interpolated, 'interpolated' => $episode->interpolated,
'interpolated_uhd' => $episode->interpolated_uhd, 'interpolated_uhd' => $episode->interpolated_uhd,
'stream_url' => $episode->dmca_takedown ? 'stuff/dmca' : $episode->url, 'stream_url' => $episode->dmca_takedown ? 'stuff/dmca' : $episode->url,
'stream_domains' => config('hstream.stream_domain'), 'stream_domains' => config('hstream.stream_domain'),
'asia_stream_domains' => config('hstream.asia_stream_domain'), 'asia_stream_domains' => config('hstream.asia_stream_domain'),
'extra_subtitles' => $subtitles 'extra_subtitles' => $subtitles,
], 200); ], 200);
} }
} }

View File

@@ -4,9 +4,8 @@ namespace App\Http\Controllers\Api;
use App\Helpers\CacheHelper; use App\Helpers\CacheHelper;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Conner\Tagging\Model\Tag; use Conner\Tagging\Model\Tag;
use Illuminate\Http\Request;
class UserApiController extends Controller class UserApiController extends Controller
{ {
@@ -33,11 +32,10 @@ class UserApiController extends Controller
} }
} }
return response()->json([ return response()->json([
'message' => 'success', 'message' => 'success',
'tags' => $tagWhiteList, 'tags' => $tagWhiteList,
'usertags' => $tagBlackList 'usertags' => $tagBlackList,
], 200); ], 200);
} }
} }

View File

@@ -3,11 +3,9 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\Enums\UserRole; use App\Enums\UserRole;
use App\Models\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -32,7 +30,7 @@ class DiscordAuthController extends Controller
$user = User::where('discord_id', $discordUser->id)->first(); $user = User::where('discord_id', $discordUser->id)->first();
if (!$user) { if (! $user) {
// link by email if it already exists // link by email if it already exists
$user = User::where('email', $discordUser->email)->first(); $user = User::where('email', $discordUser->email)->first();
@@ -77,7 +75,7 @@ class DiscordAuthController extends Controller
private function checkDiscordRoles(User $user): void private function checkDiscordRoles(User $user): void
{ {
// Should not ever happen // Should not ever happen
if (!$user->discord_id) { if (! $user->discord_id) {
return; return;
} }
@@ -90,6 +88,7 @@ class DiscordAuthController extends Controller
// User is not in the guild // User is not in the guild
if ($response->status() === 404) { if ($response->status() === 404) {
$user->removeRole(UserRole::SUPPORTER); $user->removeRole(UserRole::SUPPORTER);
return; return;
} }
@@ -109,11 +108,12 @@ class DiscordAuthController extends Controller
$patreonRoles = config('discord.patreon_roles', []); $patreonRoles = config('discord.patreon_roles', []);
// If intersect of array is empty, then the user doesn't have the role // If intersect of array is empty, then the user doesn't have the role
$hasSupporterRole = !empty(array_intersect($discordRoles, $patreonRoles)); $hasSupporterRole = ! empty(array_intersect($discordRoles, $patreonRoles));
if (!$hasSupporterRole) { if (! $hasSupporterRole) {
// Remove role if not found // Remove role if not found
$user->removeRole(UserRole::SUPPORTER); $user->removeRole(UserRole::SUPPORTER);
return; return;
} }

View File

@@ -16,8 +16,7 @@ class PasswordController extends Controller
public function update(Request $request): RedirectResponse public function update(Request $request): RedirectResponse
{ {
// If user logged in with Discord and has not yet a password, allow to set password // If user logged in with Discord and has not yet a password, allow to set password
if ($request->user()->discord_id && is_null($request->user()->password)) if ($request->user()->discord_id && is_null($request->user()->password)) {
{
$validated = $request->validateWithBag('updatePassword', [ $validated = $request->validateWithBag('updatePassword', [
'password' => ['required', Password::defaults(), 'confirmed'], 'password' => ['required', Password::defaults(), 'confirmed'],
]); ]);

View File

@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User; use App\Models\User;
use GrantHolle\Altcha\Rules\ValidAltcha;
use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Events\Registered;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -11,8 +12,6 @@ use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules; use Illuminate\Validation\Rules;
use GrantHolle\Altcha\Rules\ValidAltcha;
class RegisteredUserController extends Controller class RegisteredUserController extends Controller
{ {
/** /**
@@ -26,7 +25,7 @@ class RegisteredUserController extends Controller
'name' => ['required', 'string', 'max:255'], 'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
'password' => ['required', 'confirmed', Rules\Password::defaults()], 'password' => ['required', 'confirmed', Rules\Password::defaults()],
'altcha' => ['required', new ValidAltcha], 'altcha' => ['required', new ValidAltcha],
]); ]);
$user = User::create([ $user = User::create([

View File

@@ -3,9 +3,8 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Contact; use App\Models\Contact;
use Illuminate\Http\Request;
use GrantHolle\Altcha\Rules\ValidAltcha; use GrantHolle\Altcha\Rules\ValidAltcha;
use Illuminate\Http\Request;
class ContactController extends Controller class ContactController extends Controller
{ {
@@ -23,14 +22,14 @@ class ContactController extends Controller
public function store(Request $request): \Illuminate\Http\RedirectResponse public function store(Request $request): \Illuminate\Http\RedirectResponse
{ {
$validated = $request->validate([ $validated = $request->validate([
'name' => 'required|max:30', 'name' => 'required|max:30',
'email' => 'required|max:50', 'email' => 'required|max:50',
'message' => 'required|max:1000', 'message' => 'required|max:1000',
'subject' => 'required|max:50', 'subject' => 'required|max:50',
'altcha' => ['required', new ValidAltcha], 'altcha' => ['required', new ValidAltcha],
]); ]);
$contact = new Contact(); $contact = new Contact;
$contact->name = $request->input('name'); $contact->name = $request->input('name');
$contact->email = $request->input('email'); $contact->email = $request->input('email');
$contact->message = $request->input('message'); $contact->message = $request->input('message');

View File

@@ -2,11 +2,10 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Episode;
use App\Helpers\CacheHelper; use App\Helpers\CacheHelper;
use App\Models\Episode;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cookie;
class HomeController extends Controller class HomeController extends Controller
{ {
@@ -19,28 +18,27 @@ class HomeController extends Controller
$guestString = $guest ? 'guest' : 'authed'; $guestString = $guest ? 'guest' : 'authed';
$mostLikes = \cache()->remember('mostLikes'.$guestString, 300, fn () => $mostLikes = \cache()->remember('mostLikes'.$guestString, 300, fn () => Episode::with('gallery')
Episode::with('gallery') ->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota']))
->when($guest, fn ($query) => $query->withoutTags(['loli', 'shota'])) ->whereIn('id', function ($query) {
->whereIn('id', function($query) { $mostLikesIds = CacheHelper::getMostLikes()->pluck('markable_id')->toArray();
$mostLikesIds = CacheHelper::getMostLikes()->pluck('markable_id')->toArray(); $query->selectRaw('id')
$query->selectRaw('id') ->from('episodes')
->from('episodes') ->whereIn('id', $mostLikesIds)
->whereIn('id', $mostLikesIds) ->orderByRaw('FIELD(id, '.implode(',', $mostLikesIds).')');
->orderByRaw("FIELD(id, " . implode(',', $mostLikesIds) . ")"); })
}) ->get()
->get()
); );
return view('home.index', [ return view('home.index', [
'recentlyReleased' => CacheHelper::getRecentlyReleased($guest), 'recentlyReleased' => CacheHelper::getRecentlyReleased($guest),
'recentlyUploaded' => CacheHelper::getRecentlyUploaded($guest), 'recentlyUploaded' => CacheHelper::getRecentlyUploaded($guest),
'popularAllTime' => CacheHelper::getPopularAllTime($guest), 'popularAllTime' => CacheHelper::getPopularAllTime($guest),
'popularMonthly' => CacheHelper::getPopularMonthly(), 'popularMonthly' => CacheHelper::getPopularMonthly(),
'popularWeekly' => CacheHelper::getPopularWeekly(), 'popularWeekly' => CacheHelper::getPopularWeekly(),
'popularDaily' => CacheHelper::getPopularDaily(), 'popularDaily' => CacheHelper::getPopularDaily(),
'mostLikes' => $mostLikes, 'mostLikes' => $mostLikes,
'latestComments' => CacheHelper::getLatestComments(), 'latestComments' => CacheHelper::getLatestComments(),
]); ]);
} }
@@ -100,9 +98,9 @@ class HomeController extends Controller
public function stats(): \Illuminate\View\View public function stats(): \Illuminate\View\View
{ {
return view('home.stats', [ return view('home.stats', [
'viewCount' => CacheHelper::getTotalViewCount(), 'viewCount' => CacheHelper::getTotalViewCount(),
'episodeCount' => CacheHelper::getTotalEpisodeCount(), 'episodeCount' => CacheHelper::getTotalEpisodeCount(),
'hentaiCount' => CacheHelper::getTotalHentaiCount(), 'hentaiCount' => CacheHelper::getTotalHentaiCount(),
]); ]);
} }

View File

@@ -17,7 +17,7 @@ class MatrixController extends Controller
['name' => '🏠 General', 'description' => 'Our main chat.', 'alias' => 'https://matrix.to/#/#general:hstream.moe'], ['name' => '🏠 General', 'description' => 'Our main chat.', 'alias' => 'https://matrix.to/#/#general:hstream.moe'],
['name' => '📡 Releases', 'description' => 'Were we @everyone for new releases.', 'alias' => 'https://matrix.to/#/#releases:hstream.moe'], ['name' => '📡 Releases', 'description' => 'Were we @everyone for new releases.', 'alias' => 'https://matrix.to/#/#releases:hstream.moe'],
['name' => '👗 NSFW 2D', 'description' => 'Channel for R18 2D Media.', 'alias' => 'https://matrix.to/#/#nsfw:hstream.moe'], ['name' => '👗 NSFW 2D', 'description' => 'Channel for R18 2D Media.', 'alias' => 'https://matrix.to/#/#nsfw:hstream.moe'],
['name' => '👗 NSFW IRL', 'description' => 'Channel for R18 IRL Media.', 'alias' => 'https://matrix.to/#/#nsfw-irl:hstream.moe'] ['name' => '👗 NSFW IRL', 'description' => 'Channel for R18 IRL Media.', 'alias' => 'https://matrix.to/#/#nsfw-irl:hstream.moe'],
]; ];
return view('matrix.index', [ return view('matrix.index', [
@@ -49,7 +49,7 @@ class MatrixController extends Controller
} catch (\Exception $e) { } catch (\Exception $e) {
return back() return back()
->withErrors([ ->withErrors([
'username' => $e->getMessage() 'username' => $e->getMessage(),
]) ])
->withInput(); ->withInput();
} }

View File

@@ -3,7 +3,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class NotificationController extends Controller class NotificationController extends Controller
{ {
@@ -13,7 +12,7 @@ class NotificationController extends Controller
public function index(Request $request): \Illuminate\View\View public function index(Request $request): \Illuminate\View\View
{ {
return view('profile.notifications', [ return view('profile.notifications', [
'user' => $request->user(), 'user' => $request->user(),
'notifications' => $request->user()->unreadNotifications, 'notifications' => $request->user()->unreadNotifications,
]); ]);
} }
@@ -24,7 +23,7 @@ class NotificationController extends Controller
public function delete(Request $request): \Illuminate\Http\RedirectResponse public function delete(Request $request): \Illuminate\Http\RedirectResponse
{ {
$request->validate([ $request->validate([
'id' => 'required|exists:notifications,id', 'id' => 'required|exists:notifications,id',
]); ]);
$notification = $request->user() $notification = $request->user()

View File

@@ -7,7 +7,6 @@ use App\Models\Playlist;
use App\Models\PlaylistEpisode; use App\Models\PlaylistEpisode;
use App\Services\PlaylistService; use App\Services\PlaylistService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use RealRashid\SweetAlert\Facades\Alert;
class PlaylistController extends Controller class PlaylistController extends Controller
{ {
@@ -31,7 +30,7 @@ class PlaylistController extends Controller
*/ */
public function show($playlist_id): \Illuminate\View\View public function show($playlist_id): \Illuminate\View\View
{ {
if (!is_numeric($playlist_id)) { if (! is_numeric($playlist_id)) {
abort(404); abort(404);
} }
@@ -42,18 +41,17 @@ class PlaylistController extends Controller
]); ]);
} }
/** /**
* Display the user's playlists page. * Display the user's playlists page.
*/ */
public function playlists(Request $request): \Illuminate\View\View public function playlists(Request $request): \Illuminate\View\View
{ {
$title = 'Delete Playlist!'; $title = 'Delete Playlist!';
$text = "Are you sure you want to delete?"; $text = 'Are you sure you want to delete?';
confirmDelete($title, $text); confirmDelete($title, $text);
return view('profile.playlists', [ return view('profile.playlists', [
'user' => $request->user(), 'user' => $request->user(),
'playlists' => $request->user()->playlists, 'playlists' => $request->user()->playlists,
]); ]);
} }
@@ -63,7 +61,7 @@ class PlaylistController extends Controller
*/ */
public function showPlaylist(Request $request, $playlist_id): \Illuminate\View\View public function showPlaylist(Request $request, $playlist_id): \Illuminate\View\View
{ {
if (!is_numeric($playlist_id)) { if (! is_numeric($playlist_id)) {
abort(404); abort(404);
} }
@@ -82,10 +80,10 @@ class PlaylistController extends Controller
public function createPlaylist(Request $request): \Illuminate\Http\RedirectResponse public function createPlaylist(Request $request): \Illuminate\Http\RedirectResponse
{ {
$validated = $request->validate([ $validated = $request->validate([
'name' => 'required|max:30', 'name' => 'required|max:30',
]); ]);
$playlist = new Playlist(); $playlist = new Playlist;
$playlist->user_id = $request->user()->id; $playlist->user_id = $request->user()->id;
$playlist->name = $request->input('name'); $playlist->name = $request->input('name');
$playlist->is_private = $request->input('visiblity') === 'private'; $playlist->is_private = $request->input('visiblity') === 'private';
@@ -99,7 +97,7 @@ class PlaylistController extends Controller
*/ */
public function deletePlaylist(Request $request, $playlist_id): \Illuminate\Http\RedirectResponse public function deletePlaylist(Request $request, $playlist_id): \Illuminate\Http\RedirectResponse
{ {
if (!is_numeric($playlist_id)) { if (! is_numeric($playlist_id)) {
abort(404); abort(404);
} }
@@ -119,10 +117,10 @@ class PlaylistController extends Controller
*/ */
public function deleteEpisodeFromPlaylist(Request $request): \Illuminate\Http\JsonResponse public function deleteEpisodeFromPlaylist(Request $request): \Illuminate\Http\JsonResponse
{ {
if (!is_numeric($request->input('playlist')) || !is_numeric($request->input('episode'))) { if (! is_numeric($request->input('playlist')) || ! is_numeric($request->input('episode'))) {
return response()->json([ return response()->json([
'message' => 'not-numeric', 'message' => 'not-numeric',
'user' => $request->user(), 'user' => $request->user(),
], 404); ], 404);
} }
@@ -138,7 +136,7 @@ class PlaylistController extends Controller
return response()->json([ return response()->json([
'message' => 'success', 'message' => 'success',
'user' => $request->user(), 'user' => $request->user(),
], 200); ], 200);
} }
@@ -150,8 +148,8 @@ class PlaylistController extends Controller
$user = $request->user(); $user = $request->user();
$validated = $request->validate([ $validated = $request->validate([
'playlist' => 'required|max:30', 'playlist' => 'required|max:30',
'episode_id' => 'required' 'episode_id' => 'required',
]); ]);
$playlist = Playlist::where('user_id', $user->id)->where('id', $request->input('playlist'))->firstOrFail(); $playlist = Playlist::where('user_id', $user->id)->where('id', $request->input('playlist'))->firstOrFail();
@@ -161,7 +159,7 @@ class PlaylistController extends Controller
$exists = PlaylistEpisode::where('playlist_id', $playlist->id)->where('episode_id', $episode->id)->exists(); $exists = PlaylistEpisode::where('playlist_id', $playlist->id)->where('episode_id', $episode->id)->exists();
if ($exists) { if ($exists) {
return response()->json([ return response()->json([
'message' => 'already-added' 'message' => 'already-added',
], 200); ], 200);
} }
@@ -175,7 +173,7 @@ class PlaylistController extends Controller
]); ]);
return response()->json([ return response()->json([
'message' => 'success' 'message' => 'success',
], 200); ], 200);
} }
@@ -185,18 +183,18 @@ class PlaylistController extends Controller
public function createPlaylistApi(Request $request): \Illuminate\Http\JsonResponse public function createPlaylistApi(Request $request): \Illuminate\Http\JsonResponse
{ {
$validated = $request->validate([ $validated = $request->validate([
'name' => 'required|max:30', 'name' => 'required|max:30',
]); ]);
$playlist = new Playlist(); $playlist = new Playlist;
$playlist->user_id = $request->user()->id; $playlist->user_id = $request->user()->id;
$playlist->name = $request->input('name'); $playlist->name = $request->input('name');
$playlist->is_private = $request->input('visiblity') === 'private'; $playlist->is_private = $request->input('visiblity') === 'private';
$playlist->save(); $playlist->save();
return response()->json([ return response()->json([
'message' => 'success', 'message' => 'success',
'playlist_id' => $playlist->id 'playlist_id' => $playlist->id,
], 200); ], 200);
} }
} }

View File

@@ -2,22 +2,20 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Http\Requests\ProfileUpdateRequest;
use App\Models\Episode; use App\Models\Episode;
use App\Models\User; use App\Models\User;
use App\Http\Requests\ProfileUpdateRequest; use Conner\Tagging\Model\Tag;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect; use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\View\View; use Illuminate\View\View;
use Intervention\Image\Laravel\Facades\Image; use Intervention\Image\Laravel\Facades\Image;
use Conner\Tagging\Model\Tag;
class ProfileController extends Controller class ProfileController extends Controller
{ {
/** /**
@@ -38,8 +36,8 @@ class ProfileController extends Controller
$example = Episode::where('title', 'Succubus Yondara Gibo ga Kita!?')->first(); $example = Episode::where('title', 'Succubus Yondara Gibo ga Kita!?')->first();
return view('profile.settings', [ return view('profile.settings', [
'user' => $request->user(), 'user' => $request->user(),
'example' => $example, 'example' => $example,
]); ]);
} }
@@ -92,7 +90,7 @@ class ProfileController extends Controller
public function likes(Request $request): View public function likes(Request $request): View
{ {
return view('profile.likes', [ return view('profile.likes', [
'user' => $request->user(), 'user' => $request->user(),
]); ]);
} }
@@ -118,9 +116,10 @@ class ProfileController extends Controller
$user = $request->user(); $user = $request->user();
$tags = json_decode($request->input('tags')); $tags = json_decode($request->input('tags'));
if (!$tags) { if (! $tags) {
$user->tag_blacklist = null; $user->tag_blacklist = null;
$user->save(); $user->save();
return Redirect::route('profile.settings')->with('status', 'blacklist-updated'); return Redirect::route('profile.settings')->with('status', 'blacklist-updated');
} }
@@ -144,7 +143,7 @@ class ProfileController extends Controller
$user = $request->user(); $user = $request->user();
// Verify password if user has password // Verify password if user has password
if (!is_null($user->password)) { if (! is_null($user->password)) {
$request->validateWithBag('userDeletion', [ $request->validateWithBag('userDeletion', [
'password' => ['required', 'current_password'], 'password' => ['required', 'current_password'],
]); ]);
@@ -177,8 +176,8 @@ class ProfileController extends Controller
protected function storeAvatar(\Illuminate\Http\UploadedFile $file, User $user): void protected function storeAvatar(\Illuminate\Http\UploadedFile $file, User $user): void
{ {
// Create Folder for Image Upload // Create Folder for Image Upload
if (! Storage::disk('public')->exists("/images/avatars")) { if (! Storage::disk('public')->exists('/images/avatars')) {
Storage::disk('public')->makeDirectory("/images/avatars"); Storage::disk('public')->makeDirectory('/images/avatars');
} }
// Delete old avatar if it exists // Delete old avatar if it exists
@@ -196,5 +195,4 @@ class ProfileController extends Controller
$user->avatar = $filename; $user->avatar = $filename;
} }
} }

View File

@@ -2,20 +2,18 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Helpers\CacheHelper;
use App\Models\Episode; use App\Models\Episode;
use App\Models\Gallery; use App\Models\Gallery;
use App\Models\Hentai; use App\Models\Hentai;
use App\Models\Playlist; use App\Models\Playlist;
use App\Models\PlaylistEpisode; use App\Models\PlaylistEpisode;
use App\Models\Watched; use App\Models\Watched;
use App\Helpers\CacheHelper; use hisorange\BrowserDetect\Facade as Browser;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use hisorange\BrowserDetect\Facade as Browser;
class StreamController extends Controller class StreamController extends Controller
{ {
/** /**
@@ -32,12 +30,11 @@ class StreamController extends Controller
} }
return view('series.index', [ return view('series.index', [
'hentai' => $hentai, 'hentai' => $hentai,
'popularWeekly' => CacheHelper::getPopularWeekly(), 'popularWeekly' => CacheHelper::getPopularWeekly(),
]); ]);
} }
$episode = Episode::where('slug', $title)->firstOrFail(); $episode = Episode::where('slug', $title)->firstOrFail();
$gallery = Gallery::where('episode_id', $episode->id)->get(); $gallery = Gallery::where('episode_id', $episode->id)->get();
$moreEpisodes = Episode::with(['gallery', 'studio'])->where('hentai_id', $episode->hentai_id)->whereNot('id', $episode->id)->get(); $moreEpisodes = Episode::with(['gallery', 'studio'])->where('hentai_id', $episode->hentai_id)->whereNot('id', $episode->id)->get();
@@ -54,15 +51,15 @@ class StreamController extends Controller
// Increment Popular Count // Increment Popular Count
$episode->incrementPopularCount(); $episode->incrementPopularCount();
if (!Auth::guest()) { if (! Auth::guest()) {
$user = Auth::user(); $user = Auth::user();
// Add to user watched list // Add to user watched list
$time = Carbon::now()->subHour(1); $time = Carbon::now()->subHour(1);
$alreadyWatched = Watched::where('user_id', $user->id)->where('episode_id', $episode->id)->where('created_at', '>=', $time)->exists(); $alreadyWatched = Watched::where('user_id', $user->id)->where('episode_id', $episode->id)->where('created_at', '>=', $time)->exists();
if (!$alreadyWatched) { if (! $alreadyWatched) {
Watched::create(['user_id' => $user->id, 'episode_id' => $episode->id]); Watched::create(['user_id' => $user->id, 'episode_id' => $episode->id]);
cache()->forget('user' . $user->id . 'watched' . $episode->id); cache()->forget('user'.$user->id.'watched'.$episode->id);
} }
} }
@@ -81,29 +78,29 @@ class StreamController extends Controller
$playlistEpisodes = $playlist->episodes()->orderBy('position')->get(); $playlistEpisodes = $playlist->episodes()->orderBy('position')->get();
// Check if authorized // Check if authorized
if ($playlist->is_private && (Auth::guest() || (!Auth::guest() && Auth::user()->id != $playlist->user_id))) { if ($playlist->is_private && (Auth::guest() || (! Auth::guest() && Auth::user()->id != $playlist->user_id))) {
abort(404); abort(404);
} }
return view('stream.index', [ return view('stream.index', [
'episode' => $episode, 'episode' => $episode,
'moreEpisodes' => $moreEpisodes, 'moreEpisodes' => $moreEpisodes,
'studioEpisodes' => $studioEpisodes, 'studioEpisodes' => $studioEpisodes,
'gallery' => $gallery, 'gallery' => $gallery,
'playlist' => $playlist, 'playlist' => $playlist,
'playlistEpisodes' => $playlistEpisodes, 'playlistEpisodes' => $playlistEpisodes,
'popularWeekly' => CacheHelper::getPopularWeekly(), 'popularWeekly' => CacheHelper::getPopularWeekly(),
'isMobile' => $isMobile, 'isMobile' => $isMobile,
]); ]);
} }
return view('stream.index', [ return view('stream.index', [
'episode' => $episode, 'episode' => $episode,
'moreEpisodes' => $moreEpisodes, 'moreEpisodes' => $moreEpisodes,
'studioEpisodes' => $studioEpisodes, 'studioEpisodes' => $studioEpisodes,
'gallery' => $gallery, 'gallery' => $gallery,
'popularWeekly' => CacheHelper::getPopularWeekly(), 'popularWeekly' => CacheHelper::getPopularWeekly(),
'isMobile' => $isMobile, 'isMobile' => $isMobile,
]); ]);
} }
} }

View File

@@ -1,29 +1,28 @@
<?php namespace app\Http\Middleware; <?php
namespace app\Http\Middleware;
use App\Enums\UserRole; use App\Enums\UserRole;
use Closure; use Closure;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
class IsAdmin { class IsAdmin
{
/** /**
* Handle an incoming request. * Handle an incoming request.
* *
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed * @return mixed
*/ */
public function handle(Request $request, Closure $next): Response public function handle(Request $request, Closure $next): Response
{ {
if(Auth::check() && Auth::user()->hasRole(UserRole::ADMINISTRATOR)) if (Auth::check() && Auth::user()->hasRole(UserRole::ADMINISTRATOR)) {
{
return $next($request); return $next($request);
} }
session()->flash('error_msg','This resource is restricted to Administrators!'); session()->flash('error_msg', 'This resource is restricted to Administrators!');
return redirect()->route('home.index'); return redirect()->route('home.index');
} }
} }

View File

@@ -1,32 +1,30 @@
<?php namespace app\Http\Middleware; <?php
namespace app\Http\Middleware;
use App\Enums\UserRole; use App\Enums\UserRole;
use Closure; use Closure;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
class IsBanned { class IsBanned
{
/** /**
* Handle an incoming request. * Handle an incoming request.
* *
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed * @return mixed
*/ */
public function handle(Request $request, Closure $next): Response public function handle(Request $request, Closure $next): Response
{ {
if(Auth::check() && Auth::user()->hasRole(UserRole::BANNED)) if (Auth::check() && Auth::user()->hasRole(UserRole::BANNED)) {
{
Auth::logout(); Auth::logout();
$request->session()->invalidate(); $request->session()->invalidate();
$request->session()->regenerateToken(); $request->session()->regenerateToken();
return redirect()->route('home.banned'); return redirect()->route('home.banned');
} }
return $next($request); return $next($request);
} }
} }

View File

@@ -3,7 +3,6 @@
namespace App\Http\Middleware; namespace App\Http\Middleware;
use App\Enums\UserRole; use App\Enums\UserRole;
use Closure; use Closure;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -18,12 +17,12 @@ class IsModerator
*/ */
public function handle(Request $request, Closure $next): Response public function handle(Request $request, Closure $next): Response
{ {
if (Auth::check() && Auth::user()->hasRole(UserRole::MODERATOR)) if (Auth::check() && Auth::user()->hasRole(UserRole::MODERATOR)) {
{
return $next($request); return $next($request);
} }
session()->flash('error_msg','This resource is restricted to Administrators!'); session()->flash('error_msg', 'This resource is restricted to Administrators!');
return redirect()->route('home.index'); return redirect()->route('home.index');
} }
} }

View File

@@ -20,12 +20,14 @@ class SetLocale
// 1. Logged-in user preference // 1. Logged-in user preference
if (Auth::check() && Auth::user()->locale) { if (Auth::check() && Auth::user()->locale) {
App::setLocale(Auth::user()->locale); App::setLocale(Auth::user()->locale);
return $next($request); return $next($request);
} }
// 2. Session (guest or user override) // 2. Session (guest or user override)
if (session()->has('locale') && in_array($request->language, config('app.supported_locales'), true)) { if (session()->has('locale') && in_array($request->language, config('app.supported_locales'), true)) {
App::setLocale(session('locale')); App::setLocale(session('locale'));
return $next($request); return $next($request);
} }

View File

@@ -2,6 +2,7 @@
namespace App\Http\Requests\Auth; namespace App\Http\Requests\Auth;
use GrantHolle\Altcha\Rules\ValidAltcha;
use Illuminate\Auth\Events\Lockout; use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest; use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -9,8 +10,6 @@ use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use GrantHolle\Altcha\Rules\ValidAltcha;
class LoginRequest extends FormRequest class LoginRequest extends FormRequest
{ {
/** /**
@@ -31,7 +30,7 @@ class LoginRequest extends FormRequest
return [ return [
'email' => ['required', 'string', 'email'], 'email' => ['required', 'string', 'email'],
'password' => ['required', 'string'], 'password' => ['required', 'string'],
'altcha' => ['required', new ValidAltcha], 'altcha' => ['required', new ValidAltcha],
]; ];
} }

View File

@@ -12,7 +12,8 @@ class MatrixRegisterRequest extends FormRequest
public function authorize(): bool public function authorize(): bool
{ {
$isOldEnough = $this->user()->created_at->lt(now()->subMonth()); $isOldEnough = $this->user()->created_at->lt(now()->subMonth());
$noAccount = !$this->user()->matrix_id; $noAccount = ! $this->user()->matrix_id;
return $isOldEnough && $noAccount; return $isOldEnough && $noAccount;
} }

View File

@@ -21,7 +21,7 @@ class ProfileUpdateRequest extends FormRequest
'nullable', 'nullable',
'image', 'image',
'mimes:jpg,png,jpeg,webp,gif', 'mimes:jpg,png,jpeg,webp,gif',
'max:8192' 'max:8192',
], ],
'email' => [ 'email' => [
'required', 'required',

View File

@@ -7,7 +7,6 @@ use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Spatie\DiscordAlerts\Facades\DiscordAlert; use Spatie\DiscordAlerts\Facades\DiscordAlert;
class DiscordReleaseNotification implements ShouldQueue class DiscordReleaseNotification implements ShouldQueue
@@ -32,26 +31,25 @@ class DiscordReleaseNotification implements ShouldQueue
*/ */
public function handle(): void public function handle(): void
{ {
switch($this->messageType) switch ($this->messageType) {
{
case 'release': case '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; break;
case 'release-censored': case 'release-censored':
# Because Discord TOS // Because Discord TOS
DiscordAlert::message("<@&868457842250764289> (´• ω •`)ノ New **4k** Release: ".$this->slug." - *No link here because of* :pLoli:"); DiscordAlert::message('<@&868457842250764289> (´• ω •`)ノ New **4k** Release: '.$this->slug.' - *No link here because of* :pLoli:');
break; break;
case 'update': case 'update':
# 1080p 48fps added // 1080p 48fps added
DiscordAlert::to('update')->message("<@&1283518462584426598> (´• ω •`)ノ Added **48fps** to Release! Check it out here: https://hstream.moe/hentai/".$this->slug); DiscordAlert::to('update')->message('<@&1283518462584426598> (´• ω •`)ノ Added **48fps** to Release! Check it out here: https://hstream.moe/hentai/'.$this->slug);
break; break;
case 'updateUHD': case 'updateUHD':
# 4k 48fps added // 4k 48fps added
DiscordAlert::to('update')->message("<@&1326860920902778963> (´• ω •`)ノ Added **48fps 4k** 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; break;
case 'v2': case 'v2':
# v2 re-release // v2 re-release
DiscordAlert::to('rerelease')->message("<@&1425505303075754035> (´• ω •`)ノ **v2 Re-**Release! Check it out here: https://hstream.moe/hentai/".$this->slug); DiscordAlert::to('rerelease')->message('<@&1425505303075754035> (´• ω •`)ノ **v2 Re-**Release! Check it out here: https://hstream.moe/hentai/'.$this->slug);
break; break;
default: default:
break; break;

View File

@@ -7,12 +7,12 @@ use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Http\Client\RequestException; use Illuminate\Http\Client\RequestException;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class GetFileSizeFromCDN implements ShouldQueue class GetFileSizeFromCDN implements ShouldQueue
{ {
@@ -35,8 +35,9 @@ class GetFileSizeFromCDN implements ShouldQueue
{ {
// Retrieve the download record, return if not found // Retrieve the download record, return if not found
$download = Downloads::find($this->downloadId); $download = Downloads::find($this->downloadId);
if (!$download) { if (! $download) {
Log::error("Download not found for ID: {$this->downloadId}"); Log::error("Download not found for ID: {$this->downloadId}");
return; return;
} }
@@ -52,7 +53,7 @@ class GetFileSizeFromCDN implements ShouldQueue
try { try {
// Send HTTP request to the endpoint // Send HTTP request to the endpoint
$response = Http::get($endpoint . '/getSize/' . $file . '/' . $expire); $response = Http::get($endpoint.'/getSize/'.$file.'/'.$expire);
// Check if response is successful // Check if response is successful
if ($response->successful()) { if ($response->successful()) {
@@ -67,9 +68,9 @@ class GetFileSizeFromCDN implements ShouldQueue
Log::error("Failed to retrieve size for download ID: {$this->downloadId}, HTTP status: {$response->status()}"); Log::error("Failed to retrieve size for download ID: {$this->downloadId}, HTTP status: {$response->status()}");
} }
} catch (RequestException $e) { } catch (RequestException $e) {
Log::error("HTTP request failed for download ID: {$this->downloadId}, error: " . $e->getMessage()); Log::error("HTTP request failed for download ID: {$this->downloadId}, error: ".$e->getMessage());
} catch (\Exception $e) { } catch (\Exception $e) {
Log::error("An error occurred for download ID: {$this->downloadId}, error: " . $e->getMessage()); Log::error("An error occurred for download ID: {$this->downloadId}, error: ".$e->getMessage());
} }
} }
} }

View File

@@ -5,7 +5,6 @@ namespace App\Livewire;
use App\Models\Comment; use App\Models\Comment;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Illuminate\Support\Facades\DB;
class AdminCommentSearch extends Component class AdminCommentSearch extends Component
{ {
@@ -41,7 +40,7 @@ class AdminCommentSearch extends Component
->paginate(12); ->paginate(12);
return view('livewire.admin-comment-search', [ return view('livewire.admin-comment-search', [
'comments' => $comments 'comments' => $comments,
]); ]);
} }
} }

View File

@@ -5,10 +5,9 @@ namespace App\Livewire;
use App\Enums\UserRole; use App\Enums\UserRole;
use App\Models\Comment; use App\Models\Comment;
use App\Models\User; use App\Models\User;
use Livewire\Attributes\Url;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Livewire\Attributes\Url;
class AdminUserSearch extends Component class AdminUserSearch extends Component
{ {
@@ -41,12 +40,12 @@ class AdminUserSearch extends Component
{ {
$users = User::when($this->patreon !== [], fn ($query) => $query->whereJsonContains('roles', UserRole::SUPPORTER->value)) $users = User::when($this->patreon !== [], fn ($query) => $query->whereJsonContains('roles', UserRole::SUPPORTER->value))
->when($this->banned !== [], fn ($query) => $query->whereJsonContains('roles', UserRole::BANNED->value)) ->when($this->banned !== [], fn ($query) => $query->whereJsonContains('roles', UserRole::BANNED->value))
->when($this->search !== '', fn ($query) => $query->where('name', 'like', '%'.$this->search.'%')) ->when($this->search !== '', fn ($query) => $query->where('name', 'like', '%'.$this->search.'%'))
->when($this->discordId !== '', fn ($query) => $query->where('discord_id', '=', $this->discordId)) ->when($this->discordId !== '', fn ($query) => $query->where('discord_id', '=', $this->discordId))
->paginate(20); ->paginate(20);
return view('livewire.admin-user-search', [ return view('livewire.admin-user-search', [
'users' => $users 'users' => $users,
]); ]);
} }
} }

View File

@@ -2,12 +2,11 @@
namespace App\Livewire; namespace App\Livewire;
use Livewire\Component;
use Livewire\WithPagination;
use Livewire\Attributes\Url;
use App\Models\SiteBackground; use App\Models\SiteBackground;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Livewire\Attributes\Url;
use Livewire\Component;
use Livewire\WithPagination;
class BackgroundImages extends Component class BackgroundImages extends Component
{ {
@@ -20,16 +19,14 @@ class BackgroundImages extends Component
{ {
$now = Carbon::now(); $now = Carbon::now();
$images = SiteBackground::when($this->filter === 'active', fn ($query) => $images = SiteBackground::when($this->filter === 'active', fn ($query) => $query->whereDate('date_start', '<=', $now)->whereDate('date_end', '>=', $now)
$query->whereDate('date_start', '<=', $now)->whereDate('date_end', '>=', $now) )
) ->when($this->filter === 'inactive', fn ($query) => $query->whereDate('date_start', '>', $now)->orWhereDate('date_end', '<', $now)
->when($this->filter === 'inactive', fn ($query) =>
$query->whereDate('date_start', '>', $now)->orWhereDate('date_end', '<', $now)
) )
->paginate(10); ->paginate(10);
return view('livewire.background-images', [ return view('livewire.background-images', [
'images' => $images 'images' => $images,
]); ]);
} }
} }

View File

@@ -1,20 +1,16 @@
<?php <?php
namespace App\Livewire; namespace App\Livewire;
use App\Models\User;
use App\Models\Episode; use App\Models\Episode;
use App\Models\User;
use App\Notifications\CommentNotification; use App\Notifications\CommentNotification;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Livewire\Component;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Str;
use Livewire\Component;
use Maize\Markable\Models\Like; use Maize\Markable\Models\Like;
class Comment extends Component class Comment extends Component
@@ -30,21 +26,21 @@ class Comment extends Component
public $liked = false; public $liked = false;
public $replyState = [ public $replyState = [
'body' => '' 'body' => '',
]; ];
public $isEditing = false; public $isEditing = false;
public $editState = [ public $editState = [
'body' => '' 'body' => '',
]; ];
protected $listeners = [ protected $listeners = [
'refresh' => '$refresh' 'refresh' => '$refresh',
]; ];
protected $validationAttributes = [ protected $validationAttributes = [
'replyState.body' => 'reply' 'replyState.body' => 'reply',
]; ];
public function updatedIsEditing($isEditing) public function updatedIsEditing($isEditing)
@@ -54,7 +50,7 @@ class Comment extends Component
} }
$this->editState = [ $this->editState = [
'body' => $this->comment->body 'body' => $this->comment->body,
]; ];
} }
@@ -78,8 +74,9 @@ class Comment extends Component
public function postReply() public function postReply()
{ {
if (!($this->comment->depth() < 2)) { if (! ($this->comment->depth() < 2)) {
$this->addError('replyState.body', "Too many sub comments."); $this->addError('replyState.body', 'Too many sub comments.');
return; return;
} }
@@ -91,13 +88,14 @@ class Comment extends Component
$seconds = RateLimiter::availableIn($rateLimitKey); $seconds = RateLimiter::availableIn($rateLimitKey);
$this->addError('replyState.body', "Too many comments. Try again in {$seconds} seconds."); $this->addError('replyState.body', "Too many comments. Try again in {$seconds} seconds.");
return; return;
} }
RateLimiter::hit($rateLimitKey, $rateLimitMinutes); RateLimiter::hit($rateLimitKey, $rateLimitMinutes);
$this->validate([ $this->validate([
'replyState.body' => 'required' 'replyState.body' => 'required',
]); ]);
$reply = $this->comment->children()->make($this->replyState); $reply = $this->comment->children()->make($this->replyState);
@@ -123,7 +121,7 @@ class Comment extends Component
} }
$this->replyState = [ $this->replyState = [
'body' => '' 'body' => '',
]; ];
$this->isReplying = false; $this->isReplying = false;
@@ -144,6 +142,7 @@ class Comment extends Component
if ($this->liked) { if ($this->liked) {
$this->liked = false; $this->liked = false;
$this->likeCount--; $this->likeCount--;
return; return;
} }

View File

@@ -2,11 +2,10 @@
namespace App\Livewire; namespace App\Livewire;
use Illuminate\Support\Facades\RateLimiter;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Illuminate\Support\Facades\RateLimiter;
class Comments extends Component class Comments extends Component
{ {
use WithPagination; use WithPagination;
@@ -14,21 +13,21 @@ class Comments extends Component
public $model; public $model;
public $newCommentState = [ public $newCommentState = [
'body' => '' 'body' => '',
]; ];
protected $validationAttributes = [ protected $validationAttributes = [
'newCommentState.body' => 'comment' 'newCommentState.body' => 'comment',
]; ];
protected $listeners = [ protected $listeners = [
'refresh' => '$refresh' 'refresh' => '$refresh',
]; ];
public function postComment() public function postComment()
{ {
$this->validate([ $this->validate([
'newCommentState.body' => 'required' 'newCommentState.body' => 'required',
]); ]);
$user = auth()->user(); $user = auth()->user();
@@ -39,6 +38,7 @@ class Comments extends Component
$seconds = RateLimiter::availableIn($rateLimitKey); $seconds = RateLimiter::availableIn($rateLimitKey);
$this->addError('newCommentState.body', "Too many comments. Try again in {$seconds} seconds."); $this->addError('newCommentState.body', "Too many comments. Try again in {$seconds} seconds.");
return; return;
} }
@@ -49,7 +49,7 @@ class Comments extends Component
$comment->save(); $comment->save();
$this->newCommentState = [ $this->newCommentState = [
'body' => '' 'body' => '',
]; ];
$this->resetPage(); $this->resetPage();
@@ -65,7 +65,7 @@ class Comments extends Component
->paginate(50); ->paginate(50);
return view('livewire.comments', [ return view('livewire.comments', [
'comments' => $comments 'comments' => $comments,
]); ]);
} }
} }

View File

@@ -33,7 +33,7 @@ class DownloadButton extends Component
public function clicked($downloadId) public function clicked($downloadId)
{ {
$download = Downloads::find($downloadId); $download = Downloads::find($downloadId);
if (!$download) { if (! $download) {
return; return;
} }

View File

@@ -5,11 +5,9 @@ namespace App\Livewire;
use App\Models\Episode; use App\Models\Episode;
use App\Models\User; use App\Models\User;
use App\Models\UserDownload; use App\Models\UserDownload;
use Livewire\Component;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Livewire\Component;
class DownloadsFree extends Component class DownloadsFree extends Component
{ {
@@ -51,6 +49,7 @@ class DownloadsFree extends Component
if (Carbon::parse($alreadyDownloaded->created_at)->addHours(6) <= Carbon::now()) { if (Carbon::parse($alreadyDownloaded->created_at)->addHours(6) <= Carbon::now()) {
// Already expired // Already expired
$alreadyDownloaded->delete(); $alreadyDownloaded->delete();
return; return;
} }
@@ -65,6 +64,7 @@ class DownloadsFree extends Component
if ($user->downloads_left <= 0) { if ($user->downloads_left <= 0) {
// Daily limit reached // Daily limit reached
$this->granted = 3; $this->granted = 3;
return; return;
} }
@@ -75,9 +75,9 @@ class DownloadsFree extends Component
$this->granted = 1; $this->granted = 1;
UserDownload::create([ UserDownload::create([
'user_id' => $user->id, 'user_id' => $user->id,
'episode_id' => $this->episodeId, 'episode_id' => $this->episodeId,
'interpolated' => $this->interpolated, 'interpolated' => $this->interpolated,
]); ]);
} }

View File

@@ -3,9 +3,9 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\Downloads; use App\Models\Downloads;
use Livewire\Attributes\Url;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Livewire\Attributes\Url;
class DownloadsSearch extends Component class DownloadsSearch extends Component
{ {
@@ -17,7 +17,7 @@ class DownloadsSearch extends Component
public $order = 'created_at_desc'; public $order = 'created_at_desc';
public $options = [ public $options = [
'FHD' => true, 'FHD' => true,
'FHD 48fps' => true, 'FHD 48fps' => true,
]; ];
@@ -25,24 +25,25 @@ class DownloadsSearch extends Component
#[Url(history: true)] #[Url(history: true)]
public $studios = []; public $studios = [];
public $studiosCopy = []; public $studiosCopy = [];
// To toggle individual option selection // To toggle individual option selection
public function toggleOption($option) public function toggleOption($option)
{ {
$this->options[$option] = !$this->options[$option]; $this->options[$option] = ! $this->options[$option];
$this->resetPage(); $this->resetPage();
} }
// To toggle dropdown visibility // To toggle dropdown visibility
public function toggleDropdown() public function toggleDropdown()
{ {
$this->isOpen = !$this->isOpen; $this->isOpen = ! $this->isOpen;
} }
protected $queryString = [ protected $queryString = [
'fileSearch' => ['except' => '', 'as' => 'fS'], 'fileSearch' => ['except' => '', 'as' => 'fS'],
'order' => ['except' => '', 'as' => 'order'], 'order' => ['except' => '', 'as' => 'order'],
]; ];
public function updatingFileSearch() public function updatingFileSearch()
@@ -87,7 +88,7 @@ class DownloadsSearch extends Component
public function clicked($downloadId) public function clicked($downloadId)
{ {
$download = Downloads::find($downloadId); $download = Downloads::find($downloadId);
if (!$download) { if (! $download) {
return; return;
} }
@@ -98,7 +99,7 @@ class DownloadsSearch extends Component
public function mount() public function mount()
{ {
if (!auth()->user()->hasRole(\App\Enums\UserRole::SUPPORTER)) { if (! auth()->user()->hasRole(\App\Enums\UserRole::SUPPORTER)) {
return; return;
} }
@@ -144,15 +145,17 @@ class DownloadsSearch extends Component
$downloads = Downloads::when($this->fileSearch != '', fn ($query) => $query->where('url', 'like', '%'.$this->fileSearch.'%')) $downloads = Downloads::when($this->fileSearch != '', fn ($query) => $query->where('url', 'like', '%'.$this->fileSearch.'%'))
->whereIn('type', $this->getSelectedTypes()) ->whereIn('type', $this->getSelectedTypes())
->when($this->studios !== [], fn ($q) => $q->whereHas('episode', fn ($query) => $query->whereHas('studio', function ($query) { $query->whereIn('slug', $this->studios); }))) ->when($this->studios !== [], fn ($q) => $q->whereHas('episode', fn ($query) => $query->whereHas('studio', function ($query) {
$query->whereIn('slug', $this->studios);
})))
->whereNotNull('size') ->whereNotNull('size')
->orderBy($orderby, $orderdirection) ->orderBy($orderby, $orderdirection)
->paginate(20); ->paginate(20);
return view('livewire.downloads-search', [ return view('livewire.downloads-search', [
'downloads' => $downloads, 'downloads' => $downloads,
'query' => $this->fileSearch, 'query' => $this->fileSearch,
'studiocount' => is_array($this->studios) ? count($this->studios) : 0, 'studiocount' => is_array($this->studios) ? count($this->studios) : 0,
]); ]);
} }
} }

View File

@@ -4,10 +4,9 @@ namespace App\Livewire;
use App\Models\Episode; use App\Models\Episode;
use App\Models\User; use App\Models\User;
use Livewire\Component;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Livewire\Component;
use Maize\Markable\Models\Like; use Maize\Markable\Models\Like;
class LikeButton extends Component class LikeButton extends Component
@@ -52,6 +51,7 @@ class LikeButton extends Component
if ($this->liked) { if ($this->liked) {
$this->liked = false; $this->liked = false;
$this->likeCount--; $this->likeCount--;
return; return;
} }

View File

@@ -3,10 +3,10 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\Episode; use App\Models\Episode;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Url;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Livewire\Attributes\Url;
use Illuminate\Support\Facades\Auth;
class LiveSearch extends Component class LiveSearch extends Component
{ {
@@ -20,14 +20,17 @@ class LiveSearch extends Component
#[Url(history: true)] #[Url(history: true)]
public $tags = []; public $tags = [];
public $tagsCopy = []; public $tagsCopy = [];
#[Url(history: true)] #[Url(history: true)]
public $studios = []; public $studios = [];
public $studiosCopy = []; public $studiosCopy = [];
#[Url(history: true)] #[Url(history: true)]
public $blacklist = []; public $blacklist = [];
public $blacklistCopy = []; public $blacklistCopy = [];
#[Url(history: true)] #[Url(history: true)]
@@ -72,7 +75,7 @@ class LiveSearch extends Component
public function mount() public function mount()
{ {
// User blacklist // User blacklist
if (Auth::check() && empty($this->blacklist) && !empty(auth()->user()->tag_blacklist)) { if (Auth::check() && empty($this->blacklist) && ! empty(auth()->user()->tag_blacklist)) {
$this->blacklist = auth()->user()->tag_blacklist; $this->blacklist = auth()->user()->tag_blacklist;
} }
@@ -118,10 +121,14 @@ class LiveSearch extends Component
} }
$user_id = Auth::check() ? auth()->user()->id : 0; $user_id = Auth::check() ? auth()->user()->id : 0;
$episodes = Episode::with('gallery')->when($this->search != '', fn ($query) => $query->where(function($query) { $query->where('title', 'like', '%'.$this->search.'%')->orWhere('title_search', 'like', '%'.$this->search.'%')->orWhere('title_jpn', 'like', '%'.$this->search.'%'); })) $episodes = Episode::with('gallery')->when($this->search != '', fn ($query) => $query->where(function ($query) {
->when($this->tags !== [], fn ($query) => $query->withAllTags($this->tags)) $query->where('title', 'like', '%'.$this->search.'%')->orWhere('title_search', 'like', '%'.$this->search.'%')->orWhere('title_jpn', 'like', '%'.$this->search.'%');
->when($this->blacklist !== [], fn ($query) => $query->withoutTags($this->blacklist)) }))
->when($this->studios !== [], fn ($query) => $query->whereHas('studio', function ($query) { $query->whereIn('slug', $this->studios); })) ->when($this->tags !== [], fn ($query) => $query->withAllTags($this->tags))
->when($this->blacklist !== [], fn ($query) => $query->withoutTags($this->blacklist))
->when($this->studios !== [], fn ($query) => $query->whereHas('studio', function ($query) {
$query->whereIn('slug', $this->studios);
}))
->when($this->hideWatched !== [] && Auth::check(), fn ($query) => $query->whereDoesntHave('watched', function ($query) use ($user_id) { ->when($this->hideWatched !== [] && Auth::check(), fn ($query) => $query->whereDoesntHave('watched', function ($query) use ($user_id) {
$query->where('user_id', $user_id); $query->where('user_id', $user_id);
})) }))
@@ -140,16 +147,16 @@ class LiveSearch extends Component
$this->dispatch('contentChanged'); $this->dispatch('contentChanged');
return view('livewire.live-search', [ return view('livewire.live-search', [
'episodes' => $episodes, 'episodes' => $episodes,
'tagcount' => is_array($this->tags) ? count($this->tags) : 0, 'tagcount' => is_array($this->tags) ? count($this->tags) : 0,
'studiocount' => is_array($this->studios) ? count($this->studios) : 0, 'studiocount' => is_array($this->studios) ? count($this->studios) : 0,
'blacklistcount' => is_array($this->blacklist) ? count($this->blacklist) : 0, 'blacklistcount' => is_array($this->blacklist) ? count($this->blacklist) : 0,
'query' => $this->search, 'query' => $this->search,
'selectedtags' => $this->tags, 'selectedtags' => $this->tags,
'selectedstudios' => $this->studios, 'selectedstudios' => $this->studios,
'selectedblacklist' => $this->blacklist, 'selectedblacklist' => $this->blacklist,
'searchIsJpn' => $searchIsJpn, 'searchIsJpn' => $searchIsJpn,
'view' => $this->view, 'view' => $this->view,
]); ]);
} }
} }

View File

@@ -3,8 +3,8 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\Episode; use App\Models\Episode;
use Livewire\Component;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Livewire\Component;
class NavLiveSearch extends Component class NavLiveSearch extends Component
{ {
@@ -25,9 +25,9 @@ class NavLiveSearch extends Component
} }
return view('livewire.nav-live-search', [ return view('livewire.nav-live-search', [
'episodes' => $episodes, 'episodes' => $episodes,
'query' => $this->navSearch, 'query' => $this->navSearch,
'hide' => empty($this->navSearch), 'hide' => empty($this->navSearch),
]); ]);
} }
} }

View File

@@ -5,13 +5,11 @@ namespace App\Livewire;
use App\Models\Playlist; use App\Models\Playlist;
use App\Models\PlaylistEpisode; use App\Models\PlaylistEpisode;
use App\Services\PlaylistService; use App\Services\PlaylistService;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Url;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Livewire\Attributes\Url;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\Eloquent\Collection;
class PlaylistOverview extends Component class PlaylistOverview extends Component
{ {

View File

@@ -3,10 +3,9 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\Playlist; use App\Models\Playlist;
use Livewire\Attributes\Url;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Livewire\Attributes\Url;
class Playlists extends Component class Playlists extends Component
{ {
@@ -54,12 +53,12 @@ class Playlists extends Component
$playlists = Playlist::where('is_private', 0) $playlists = Playlist::where('is_private', 0)
->withCount('episodes') ->withCount('episodes')
->having('episodes_count', '>', 1) ->having('episodes_count', '>', 1)
->when($this->search != '', fn($query) => $query->where('name', 'like', '%' . $this->search . '%')) ->when($this->search != '', fn ($query) => $query->where('name', 'like', '%'.$this->search.'%'))
->orderBy($orderby, $orderdirection) ->orderBy($orderby, $orderdirection)
->paginate($this->pagination); ->paginate($this->pagination);
return view('livewire.playlists', [ return view('livewire.playlists', [
'playlists' => $playlists 'playlists' => $playlists,
]); ]);
} }
} }

View File

@@ -3,7 +3,6 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\Comment; use App\Models\Comment;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
@@ -36,14 +35,13 @@ class UserComments extends Component
$orderdirection = 'desc'; $orderdirection = 'desc';
} }
$comments = Comment::where('user_id', $this->model->id) $comments = Comment::where('user_id', $this->model->id)
->when($this->commentSearch != '', fn ($query) => $query->where('body', 'like', '%'.$this->commentSearch.'%')) ->when($this->commentSearch != '', fn ($query) => $query->where('body', 'like', '%'.$this->commentSearch.'%'))
->orderBy($orderby, $orderdirection) ->orderBy($orderby, $orderdirection)
->paginate(10); ->paginate(10);
return view('livewire.user-comments', [ return view('livewire.user-comments', [
'comments' => $comments 'comments' => $comments,
]); ]);
} }
} }

View File

@@ -3,10 +3,10 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\Episode; use App\Models\Episode;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Url;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Livewire\Attributes\Url;
use Illuminate\Support\Facades\Auth;
class UserLikes extends Component class UserLikes extends Component
{ {
@@ -20,14 +20,17 @@ class UserLikes extends Component
#[Url(history: true)] #[Url(history: true)]
public $tags = []; public $tags = [];
public $tagsCopy = []; public $tagsCopy = [];
#[Url(history: true)] #[Url(history: true)]
public $studios = []; public $studios = [];
public $studiosCopy = []; public $studiosCopy = [];
#[Url(history: true)] #[Url(history: true)]
public $blacklist = []; public $blacklist = [];
public $blacklistCopy = []; public $blacklistCopy = [];
#[Url(history: true)] #[Url(history: true)]
@@ -72,7 +75,7 @@ class UserLikes extends Component
public function mount() public function mount()
{ {
// User blacklist // User blacklist
if (Auth::check() && empty($this->blacklist) && !empty(auth()->user()->tag_blacklist)) { if (Auth::check() && empty($this->blacklist) && ! empty(auth()->user()->tag_blacklist)) {
$this->blacklist = auth()->user()->tag_blacklist; $this->blacklist = auth()->user()->tag_blacklist;
} }
@@ -119,10 +122,14 @@ class UserLikes extends Component
$user_id = Auth::check() ? auth()->user()->id : 0; $user_id = Auth::check() ? auth()->user()->id : 0;
$episodes = Episode::whereHasLike(auth()->user()) $episodes = Episode::whereHasLike(auth()->user())
->when($this->search !== '', fn ($query) => $query->where(function($query) { $query->where('title', 'like', '%'.$this->search.'%')->orWhere('title_search', 'like', '%'.$this->search.'%')->orWhere('title_jpn', 'like', '%'.$this->search.'%'); })) ->when($this->search !== '', fn ($query) => $query->where(function ($query) {
->when($this->tags !== [], fn ($query) => $query->withAllTags($this->tags)) $query->where('title', 'like', '%'.$this->search.'%')->orWhere('title_search', 'like', '%'.$this->search.'%')->orWhere('title_jpn', 'like', '%'.$this->search.'%');
->when($this->blacklist !== [], fn ($query) => $query->withoutTags($this->blacklist)) }))
->when($this->studios !== [], fn ($query) => $query->whereHas('studio', function ($query) { $query->whereIn('slug', $this->studios); })) ->when($this->tags !== [], fn ($query) => $query->withAllTags($this->tags))
->when($this->blacklist !== [], fn ($query) => $query->withoutTags($this->blacklist))
->when($this->studios !== [], fn ($query) => $query->whereHas('studio', function ($query) {
$query->whereIn('slug', $this->studios);
}))
->when($this->hideWatched !== [] && Auth::check(), fn ($query) => $query->whereDoesntHave('watched', function ($query) use ($user_id) { ->when($this->hideWatched !== [] && Auth::check(), fn ($query) => $query->whereDoesntHave('watched', function ($query) use ($user_id) {
$query->where('user_id', $user_id); $query->where('user_id', $user_id);
})) }))
@@ -137,16 +144,16 @@ class UserLikes extends Component
} }
return view('livewire.user-likes', [ return view('livewire.user-likes', [
'episodes' => $episodes, 'episodes' => $episodes,
'tagcount' => is_array($this->tags) ? count($this->tags) : 0, 'tagcount' => is_array($this->tags) ? count($this->tags) : 0,
'studiocount' => is_array($this->studios) ? count($this->studios) : 0, 'studiocount' => is_array($this->studios) ? count($this->studios) : 0,
'blacklistcount' => is_array($this->blacklist) ? count($this->blacklist) : 0, 'blacklistcount' => is_array($this->blacklist) ? count($this->blacklist) : 0,
'query' => $this->search, 'query' => $this->search,
'selectedtags' => $this->tags, 'selectedtags' => $this->tags,
'selectedstudios' => $this->studios, 'selectedstudios' => $this->studios,
'selectedblacklist' => $this->blacklist, 'selectedblacklist' => $this->blacklist,
'searchIsJpn' => $searchIsJpn, 'searchIsJpn' => $searchIsJpn,
'view' => $this->view, 'view' => $this->view,
]); ]);
} }
} }

View File

@@ -3,7 +3,6 @@
namespace App\Livewire; namespace App\Livewire;
use App\Models\Watched as UserWatched; use App\Models\Watched as UserWatched;
use App\Models\User;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
@@ -27,8 +26,8 @@ class Watched extends Component
}); });
return view('livewire.watched', [ return view('livewire.watched', [
'watched' => $watched, 'watched' => $watched,
'watchedGrouped' => $watchedGrouped, 'watchedGrouped' => $watchedGrouped,
]); ]);
} }
} }

View File

@@ -4,19 +4,18 @@ namespace App\Models;
use App\Models\Presenters\CommentPresenter; use App\Models\Presenters\CommentPresenter;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Maize\Markable\Markable; use Maize\Markable\Markable;
use Maize\Markable\Models\Like; use Maize\Markable\Models\Like;
class Comment extends Model class Comment extends Model
{ {
use HasFactory, SoftDeletes, Markable; use HasFactory, Markable, SoftDeletes;
protected static $marks = [ protected static $marks = [
Like::class Like::class,
]; ];
/** /**
@@ -25,7 +24,7 @@ class Comment extends Model
* @var string[] * @var string[]
*/ */
protected $fillable = [ protected $fillable = [
'body' 'body',
]; ];
public function presenter() public function presenter()
@@ -71,6 +70,6 @@ class Comment extends Model
*/ */
public function likeCount(): int public function likeCount(): int
{ {
return cache()->remember('commentLikes' . $this->id, 300, fn() => $this->likes->count()); return cache()->remember('commentLikes'.$this->id, 300, fn () => $this->likes->count());
} }
} }

View File

@@ -39,7 +39,7 @@ class Downloads extends Model
$bytes /= 1024; $bytes /= 1024;
} }
return round($bytes, 2) . ' ' . $units[$i]; return round($bytes, 2).' '.$units[$i];
} }
/** /**

View File

@@ -2,35 +2,28 @@
namespace App\Models; namespace App\Models;
use App\Models\Downloads;
use App\Models\PopularMonthly;
use App\Models\PopularWeekly;
use App\Models\PopularDaily;
use Conner\Tagging\Taggable; use Conner\Tagging\Taggable;
use Laravel\Scout\Searchable;
use Maize\Markable\Markable;
use Maize\Markable\Models\Like;
use Spatie\Sitemap\Contracts\Sitemapable;
use Spatie\Sitemap\Tags\Url;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Laravel\Scout\Searchable;
use Maize\Markable\Markable;
use Maize\Markable\Models\Like;
use Spatie\Sitemap\Contracts\Sitemapable;
use Spatie\Sitemap\Tags\Url;
class Episode extends Model implements Sitemapable class Episode extends Model implements Sitemapable
{ {
use Markable, Taggable;
use HasFactory; use HasFactory;
use Markable, Taggable;
use Searchable; use Searchable;
protected static $marks = [ protected static $marks = [
Like::class Like::class,
]; ];
/** /**
@@ -49,14 +42,14 @@ class Episode extends Model implements Sitemapable
public function toSearchableArray() public function toSearchableArray()
{ {
return [ return [
'title' => $this->title, 'title' => $this->title,
'title_search' => $this->title_search, 'title_search' => $this->title_search,
'title_jpn' => $this->title_jpn, 'title_jpn' => $this->title_jpn,
'slug' => $this->slug, 'slug' => $this->slug,
'description' => $this->description, 'description' => $this->description,
'tags' => $this->tagNames(), 'tags' => $this->tagNames(),
'release_date' => $this->release_date, 'release_date' => $this->release_date,
'created_at' => $this->created_at, 'created_at' => $this->created_at,
]; ];
} }
@@ -125,7 +118,7 @@ class Episode extends Model implements Sitemapable
*/ */
public function viewCount(): int public function viewCount(): int
{ {
return cache()->remember('episodeViews' . $this->id, 300, fn() => $this->view_count); return cache()->remember('episodeViews'.$this->id, 300, fn () => $this->view_count);
} }
/** /**
@@ -141,7 +134,7 @@ class Episode extends Model implements Sitemapable
$index = floor(log($this->viewCount(), 1000)); $index = floor(log($this->viewCount(), 1000));
$shortNumber = $this->viewCount() / pow(1000, $index); $shortNumber = $this->viewCount() / pow(1000, $index);
return round($shortNumber, 0) . $units[$index - 1]; return round($shortNumber, 0).$units[$index - 1];
} }
/** /**
@@ -149,7 +142,7 @@ class Episode extends Model implements Sitemapable
*/ */
public function likeCount(): int public function likeCount(): int
{ {
return cache()->remember('episodeLikes' . $this->id, 300, fn() => $this->likes->count()); return cache()->remember('episodeLikes'.$this->id, 300, fn () => $this->likes->count());
} }
/** /**
@@ -157,7 +150,7 @@ class Episode extends Model implements Sitemapable
*/ */
public function commentCount(): int public function commentCount(): int
{ {
return cache()->remember('episodeComments' . $this->id, 300, fn() => $this->comments->count()); return cache()->remember('episodeComments'.$this->id, 300, fn () => $this->comments->count());
} }
public function comments() public function comments()
@@ -180,6 +173,7 @@ class Episode extends Model implements Sitemapable
$problematicResults .= $pTag; $problematicResults .= $pTag;
} }
return $problematicResults; return $problematicResults;
} }
@@ -202,17 +196,17 @@ class Episode extends Model implements Sitemapable
*/ */
public function hasAutoTrans(): bool public function hasAutoTrans(): bool
{ {
return cache()->remember('mt' . $this->id, 900, fn() => $this->subtitles()->exists()); return cache()->remember('mt'.$this->id, 900, fn () => $this->subtitles()->exists());
} }
public function is48Fps(): bool public function is48Fps(): bool
{ {
return cache()->remember('48fps' . $this->id, 900, fn() => $this->interpolated); return cache()->remember('48fps'.$this->id, 900, fn () => $this->interpolated);
} }
public function isUHD48Fps(): bool public function isUHD48Fps(): bool
{ {
return cache()->remember('48fpsUHD' . $this->id, 900, fn() => $this->interpolated_uhd); return cache()->remember('48fpsUHD'.$this->id, 900, fn () => $this->interpolated_uhd);
} }
public function getResolution(): string public function getResolution(): string
@@ -226,7 +220,7 @@ class Episode extends Model implements Sitemapable
public function userWatched(int $user_id): bool public function userWatched(int $user_id): bool
{ {
return cache()->remember('user' . $user_id . 'watched' . $this->id, 300, fn() => Watched::where('user_id', $user_id)->where('episode_id', $this->id)->exists()); return cache()->remember('user'.$user_id.'watched'.$this->id, 300, fn () => Watched::where('user_id', $user_id)->where('episode_id', $this->id)->exists());
} }
public function watched(): HasMany public function watched(): HasMany
@@ -234,15 +228,16 @@ class Episode extends Model implements Sitemapable
return $this->hasMany(Watched::class); return $this->hasMany(Watched::class);
} }
public function getDownloadByType(string $type): Downloads | null public function getDownloadByType(string $type): ?Downloads
{ {
$cacheKey = "episode_{$this->id}_download_{$type}"; $cacheKey = "episode_{$this->id}_download_{$type}";
return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($type) { return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($type) {
return $this->downloads()->where('type', $type)->first(); return $this->downloads()->where('type', $type)->first();
}); });
} }
public function toSitemapTag(): Url | string | array public function toSitemapTag(): Url|string|array
{ {
return Url::create(route('hentai.index', $this->slug)) return Url::create(route('hentai.index', $this->slug))
->setLastModificationDate(Carbon::create($this->created_at)); ->setLastModificationDate(Carbon::create($this->created_at));

View File

@@ -2,19 +2,18 @@
namespace App\Models; namespace App\Models;
use Conner\Tagging\Taggable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Cache;
use Spatie\Sitemap\Contracts\Sitemapable; use Spatie\Sitemap\Contracts\Sitemapable;
use Spatie\Sitemap\Tags\Url; use Spatie\Sitemap\Tags\Url;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Conner\Tagging\Taggable;
class Hentai extends Model implements Sitemapable class Hentai extends Model implements Sitemapable
{ {
use Taggable;
use HasFactory; use HasFactory;
use Taggable;
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
@@ -31,7 +30,7 @@ class Hentai extends Model implements Sitemapable
return $this->hasMany(Episode::class, 'hentai_id'); return $this->hasMany(Episode::class, 'hentai_id');
} }
public function title(): String public function title(): string
{ {
return $this->episodes->first()->title; return $this->episodes->first()->title;
} }
@@ -63,7 +62,7 @@ class Hentai extends Model implements Sitemapable
); );
} }
public function toSitemapTag(): Url | string | array public function toSitemapTag(): Url|string|array
{ {
return Url::create(route('hentai.index', $this->slug)) return Url::create(route('hentai.index', $this->slug))
->setLastModificationDate(Carbon::create($this->created_at)); ->setLastModificationDate(Carbon::create($this->created_at));

View File

@@ -2,8 +2,8 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Playlist extends Model class Playlist extends Model
{ {

View File

@@ -2,8 +2,8 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class PlaylistEpisode extends Model class PlaylistEpisode extends Model
{ {

View File

@@ -13,7 +13,7 @@ class PopularDaily extends Model
* *
* @var string[] * @var string[]
*/ */
protected $fillable = [ 'episode_id' ]; protected $fillable = ['episode_id'];
/** /**
* Get the Episode. * Get the Episode.

View File

@@ -13,7 +13,7 @@ class PopularMonthly extends Model
* *
* @var string[] * @var string[]
*/ */
protected $fillable = [ 'episode_id' ]; protected $fillable = ['episode_id'];
/** /**
* Get the Episode. * Get the Episode.

View File

@@ -13,7 +13,7 @@ class PopularWeekly extends Model
* *
* @var string[] * @var string[]
*/ */
protected $fillable = [ 'episode_id' ]; protected $fillable = ['episode_id'];
/** /**
* Get the Episode. * Get the Episode.

View File

@@ -4,7 +4,6 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
class SiteBackground extends Model class SiteBackground extends Model
{ {
@@ -16,13 +15,13 @@ class SiteBackground extends Model
protected $fillable = [ protected $fillable = [
'date_start', 'date_start',
'date_end', 'date_end',
'default' 'default',
]; ];
/** /**
* Returns the current IDs of active wallpaper * Returns the current IDs of active wallpaper
*/ */
public function getImages(): ? \Illuminate\Support\Collection public function getImages(): ?\Illuminate\Support\Collection
{ {
$now = Carbon::now(); $now = Carbon::now();

View File

@@ -3,8 +3,8 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Studios extends Model class Studios extends Model
{ {

View File

@@ -2,16 +2,15 @@
namespace App\Models; namespace App\Models;
//use Illuminate\Contracts\Auth\MustVerifyEmail; // use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Enums\UserRole; use App\Enums\UserRole;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class User extends Authenticatable class User extends Authenticatable
{ {
@@ -62,7 +61,6 @@ class User extends Authenticatable
'discord_avatar' => 'string', 'discord_avatar' => 'string',
]; ];
/** /**
* Has Many Playlists. * Has Many Playlists.
*/ */
@@ -100,7 +98,7 @@ class User extends Authenticatable
*/ */
public function commentCount(): int public function commentCount(): int
{ {
return cache()->remember('userComments' . $this->id, 300, fn() => $this->comments->count()); return cache()->remember('userComments'.$this->id, 300, fn () => $this->comments->count());
} }
/** /**
@@ -108,13 +106,11 @@ class User extends Authenticatable
*/ */
public function getAvatar(): string public function getAvatar(): string
{ {
if ($this->discord_id && $this->discord_avatar && !$this->avatar) if ($this->discord_id && $this->discord_avatar && ! $this->avatar) {
{
return "https://external-content.duckduckgo.com/iu/?u={$this->discord_avatar}"; return "https://external-content.duckduckgo.com/iu/?u={$this->discord_avatar}";
} }
if ($this->avatar) if ($this->avatar) {
{
return Storage::url($this->avatar); return Storage::url($this->avatar);
} }
@@ -153,7 +149,7 @@ class User extends Authenticatable
*/ */
public function removeRole(UserRole $role): void public function removeRole(UserRole $role): void
{ {
if (!$this->hasRole($role)) { if (! $this->hasRole($role)) {
return; return;
} }

View File

@@ -2,8 +2,8 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class UserDownload extends Model class UserDownload extends Model
{ {

View File

@@ -2,8 +2,8 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Watched extends Model class Watched extends Model
{ {

View File

@@ -3,8 +3,6 @@
namespace App\Notifications; namespace App\Notifications;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification; use Illuminate\Notifications\Notification;
class CommentNotification extends Notification class CommentNotification extends Notification
@@ -12,7 +10,9 @@ class CommentNotification extends Notification
use Queueable; use Queueable;
protected $type; protected $type;
protected $message; protected $message;
protected $url; protected $url;
/** /**
@@ -38,9 +38,9 @@ class CommentNotification extends Notification
public function toDatabase($notifiable) public function toDatabase($notifiable)
{ {
return [ return [
'type' => $this->type, 'type' => $this->type,
'message' => $this->message, 'message' => $this->message,
'url' => $this->url, 'url' => $this->url,
]; ];
} }
} }

View File

@@ -2,8 +2,8 @@
namespace App\Policies; namespace App\Policies;
use App\Models\User;
use App\Models\Comment; use App\Models\Comment;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\HandlesAuthorization;
class CommentPolicy class CommentPolicy

View File

@@ -2,11 +2,9 @@
namespace App\Services; namespace App\Services;
use App\Jobs\GetFileSizeFromCDN;
use App\Models\Downloads; use App\Models\Downloads;
use App\Models\Episode; use App\Models\Episode;
use App\Jobs\GetFileSizeFromCDN;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class DownloadService class DownloadService
@@ -14,10 +12,10 @@ class DownloadService
public function createOrUpdateDownloads(Request $request, Episode $episode, int $index): void public function createOrUpdateDownloads(Request $request, Episode $episode, int $index): void
{ {
$downloadTypes = [ $downloadTypes = [
'episodedlurl' => 'FHD', 'episodedlurl' => 'FHD',
'episodedlurlinterpolated' => 'FHDi', 'episodedlurlinterpolated' => 'FHDi',
'episodedlurl4k' => 'UHD', 'episodedlurl4k' => 'UHD',
'downloadUHDi' => 'UHDi', 'downloadUHDi' => 'UHDi',
]; ];
foreach ($downloadTypes as $inputField => $type) { foreach ($downloadTypes as $inputField => $type) {
@@ -25,9 +23,9 @@ class DownloadService
if ($request->filled($fieldName)) { if ($request->filled($fieldName)) {
$download = Downloads::updateOrCreate([ $download = Downloads::updateOrCreate([
'episode_id' => $episode->id, 'episode_id' => $episode->id,
'type' => $type, 'type' => $type,
], [ ], [
'url' => $request->input($fieldName), 'url' => $request->input($fieldName),
]); ]);
// Dispatch Job to get File Size from CDN // Dispatch Job to get File Size from CDN

View File

@@ -5,14 +5,12 @@ namespace App\Services;
use App\Models\Episode; use App\Models\Episode;
use App\Models\Hentai; use App\Models\Hentai;
use App\Models\Studios; use App\Models\Studios;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Intervention\Image\Laravel\Facades\Image;
use Intervention\Image\Encoders\WebpEncoder; use Intervention\Image\Encoders\WebpEncoder;
use Intervention\Image\Laravel\Facades\Image;
class EpisodeService class EpisodeService
{ {
@@ -24,6 +22,7 @@ class EpisodeService
if (is_numeric($lastPart) && $lastPart < 1000) { if (is_numeric($lastPart) && $lastPart < 1000) {
$slugParts[array_key_last($slugParts)] = 's'.$lastPart; $slugParts[array_key_last($slugParts)] = 's'.$lastPart;
return implode('-', $slugParts); return implode('-', $slugParts);
} }
@@ -36,11 +35,10 @@ class EpisodeService
int $episodeNumber, int $episodeNumber,
?Studios $studio = null, ?Studios $studio = null,
?Episode $referenceEpisode = null ?Episode $referenceEpisode = null
): Episode ): Episode {
{ $episode = new Episode;
$episode = new Episode();
$episode->title = $referenceEpisode->title ?? $request->input('title'); $episode->title = $referenceEpisode->title ?? $request->input('title');
$episode->title_search = preg_replace("/[^A-Za-z0-9 ]/", '', $episode->title); $episode->title_search = preg_replace('/[^A-Za-z0-9 ]/', '', $episode->title);
$episode->title_jpn = $referenceEpisode->title_jpn ?? $request->input('title_jpn'); $episode->title_jpn = $referenceEpisode->title_jpn ?? $request->input('title_jpn');
$episode->slug = "{$hentai->slug}-{$episodeNumber}"; $episode->slug = "{$hentai->slug}-{$episodeNumber}";
$episode->hentai_id = $hentai->id; $episode->hentai_id = $hentai->id;
@@ -96,7 +94,6 @@ class EpisodeService
); );
} }
public function createOrUpdateCover(Request $request, Episode $episode, string $slug, int $episodeNumber): void public function createOrUpdateCover(Request $request, Episode $episode, string $slug, int $episodeNumber): void
{ {
if (! $request->hasFile("episodecover{$episodeNumber}")) { if (! $request->hasFile("episodecover{$episodeNumber}")) {
@@ -111,7 +108,7 @@ class EpisodeService
// Encode and save cover image // Encode and save cover image
Image::read($request->file("episodecover{$episodeNumber}")->getRealPath()) Image::read($request->file("episodecover{$episodeNumber}")->getRealPath())
->cover(268, 394) ->cover(268, 394)
->encode(new WebpEncoder()) ->encode(new WebpEncoder)
->save(Storage::disk('public')->path($episode->cover_url)); ->save(Storage::disk('public')->path($episode->cover_url));
} }
} }

View File

@@ -5,29 +5,25 @@ namespace App\Services;
use App\Models\Episode; use App\Models\Episode;
use App\Models\Gallery; use App\Models\Gallery;
use App\Models\Hentai; use App\Models\Hentai;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Intervention\Image\Laravel\Facades\Image;
use Intervention\Image\Encoders\WebpEncoder; use Intervention\Image\Encoders\WebpEncoder;
use Intervention\Image\Laravel\Facades\Image;
class GalleryService class GalleryService
{ {
public function createOrUpdateGallery(Request $request, Hentai $hentai, Episode $episode, int $episodeNumber, bool $override = false): void public function createOrUpdateGallery(Request $request, Hentai $hentai, Episode $episode, int $episodeNumber, bool $override = false): void
{ {
$galleryInputNumber = $override ? 1 : $episodeNumber; $galleryInputNumber = $override ? 1 : $episodeNumber;
if($request->hasFile('episodegallery'.$galleryInputNumber)) { if ($request->hasFile('episodegallery'.$galleryInputNumber)) {
$this->deleteOldGallery($episode); $this->deleteOldGallery($episode);
$this->createGalleryFolder($hentai); $this->createGalleryFolder($hentai);
$counter = 0; $counter = 0;
foreach($request->file('episodegallery'.$galleryInputNumber) as $file) { foreach ($request->file('episodegallery'.$galleryInputNumber) as $file) {
$gallery = $this->createGallery($hentai, $episode, $episodeNumber, $counter); $gallery = $this->createGallery($hentai, $episode, $episodeNumber, $counter);
$this->saveGalleryImage($gallery, $file); $this->saveGalleryImage($gallery, $file);
$counter += 1; $counter += 1;
@@ -45,7 +41,7 @@ class GalleryService
private function createGallery(Hentai $hentai, Episode $episode, int $episodeNumber, int $counter): Gallery private function createGallery(Hentai $hentai, Episode $episode, int $episodeNumber, int $counter): Gallery
{ {
$gallery = new Gallery(); $gallery = new Gallery;
$gallery->hentai_id = $hentai->id; $gallery->hentai_id = $hentai->id;
$gallery->episode_id = $episode->id; $gallery->episode_id = $episode->id;
$gallery->image_url = "/images/hentai/{$hentai->slug}/gallery-ep-{$episodeNumber}-{$counter}.webp"; $gallery->image_url = "/images/hentai/{$hentai->slug}/gallery-ep-{$episodeNumber}-{$counter}.webp";
@@ -59,12 +55,12 @@ class GalleryService
{ {
Image::read($sourceImage->getRealPath()) Image::read($sourceImage->getRealPath())
->cover(1920, 1080) ->cover(1920, 1080)
->encode(new WebpEncoder()) ->encode(new WebpEncoder)
->save(Storage::disk('public')->path($gallery->image_url)); ->save(Storage::disk('public')->path($gallery->image_url));
Image::read($sourceImage->getRealPath()) Image::read($sourceImage->getRealPath())
->cover(960, 540) ->cover(960, 540)
->encode(new WebpEncoder()) ->encode(new WebpEncoder)
->save(Storage::disk('public')->path($gallery->thumbnail_url)); ->save(Storage::disk('public')->path($gallery->thumbnail_url));
} }

View File

@@ -14,8 +14,8 @@ class MatrixRegistrationService
// Get nonce from Synapse // Get nonce from Synapse
$nonceResponse = Http::get("$server/_synapse/admin/v1/register"); $nonceResponse = Http::get("$server/_synapse/admin/v1/register");
if (!$nonceResponse->ok()) { if (! $nonceResponse->ok()) {
throw new \Exception("Could not fetch nonce from Matrix."); throw new \Exception('Could not fetch nonce from Matrix.');
} }
$nonce = $nonceResponse->json()['nonce']; $nonce = $nonceResponse->json()['nonce'];
@@ -23,10 +23,10 @@ class MatrixRegistrationService
// Generate MAC // Generate MAC
$mac = hash_hmac( $mac = hash_hmac(
'sha1', 'sha1',
$nonce . "\0" . $nonce."\0".
$username . "\0" . $username."\0".
$password . "\0" . $password."\0".
"notadmin", 'notadmin',
$secret $secret
); );

View File

@@ -5,8 +5,8 @@ return [
* The webhook URLs that we'll use to send a message to Discord. * The webhook URLs that we'll use to send a message to Discord.
*/ */
'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'), 'rerelease' => env('DISCORD_ALERT_RERELEASE_WEBHOOK'),
], ],

View File

@@ -1,9 +1,9 @@
<?php <?php
return [ return [
'invite_link' => 'https://discord.gg/yAqgVKNgG5', 'invite_link' => 'https://discord.gg/yAqgVKNgG5',
'guild_id' => 802233383710228550, 'guild_id' => 802233383710228550,
'patreon_roles' => [ 'patreon_roles' => [
'841798154999169054', // ???? '841798154999169054', // ????
@@ -12,7 +12,7 @@ return [
'803325441942356059', // Tier-3 '803325441942356059', // Tier-3
'803322725576736858', // Tier-2 '803322725576736858', // Tier-2
'802270568912519198', // Tier-1 '802270568912519198', // Tier-1
'802234830384267315' // admin '802234830384267315', // admin
], ],
'discord_bot_token' => env('DISCORD_BOT_TOKEN'), 'discord_bot_token' => env('DISCORD_BOT_TOKEN'),

View File

@@ -2,7 +2,7 @@
return [ return [
// Download Domain // Download Domain
'download_domain' => [ 'download_domain' => [
'https://imoto-ddl.ane-h.xyz', 'https://imoto-ddl.ane-h.xyz',
'https://chibi-ddl.imoto-h.xyz', 'https://chibi-ddl.imoto-h.xyz',
'https://koneko-ddl.musume-h.xyz', 'https://koneko-ddl.musume-h.xyz',
@@ -11,7 +11,7 @@ return [
], ],
// 4k Download Domain // 4k Download Domain
'download_domain_4k' => [ 'download_domain_4k' => [
'https://imoto-ddlp.ane-h.xyz', 'https://imoto-ddlp.ane-h.xyz',
'https://chibi-ddlp.imoto-h.xyz', 'https://chibi-ddlp.imoto-h.xyz',
'https://koneko-ddlp.musume-h.xyz', 'https://koneko-ddlp.musume-h.xyz',
@@ -20,7 +20,7 @@ return [
], ],
// Stream Domain // Stream Domain
'stream_domain' => [ 'stream_domain' => [
'https://imoto-str.ane-h.xyz', 'https://imoto-str.ane-h.xyz',
'https://chibi-str.imoto-h.xyz', 'https://chibi-str.imoto-h.xyz',
'https://koneko-str.musume-h.xyz', 'https://koneko-str.musume-h.xyz',
@@ -29,15 +29,15 @@ return [
], ],
// Asia Fallback (HTTP) // Asia Fallback (HTTP)
'asia_download_domain' => [ 'asia_download_domain' => [
'https://komako-b-ddl.musume-h.xyz' 'https://komako-b-ddl.musume-h.xyz',
], ],
'asia_stream_domain' => [ 'asia_stream_domain' => [
'https://komako-b-str.musume-h.xyz' 'https://komako-b-str.musume-h.xyz',
], ],
// Free 4k Downloads // Free 4k Downloads
'free_downloads' => true, 'free_downloads' => true,
'free_downloads_count' => 10, 'free_downloads_count' => 10,
]; ];

View File

@@ -38,5 +38,5 @@ return [
'autoOrientation' => true, 'autoOrientation' => true,
'decodeAnimation' => true, 'decodeAnimation' => true,
'blendingColor' => 'ffffff', 'blendingColor' => 'ffffff',
] ],
]; ];

View File

@@ -143,18 +143,18 @@ return [
'key' => env('MEILISEARCH_KEY'), 'key' => env('MEILISEARCH_KEY'),
'index-settings' => [ 'index-settings' => [
Episode::class => [ Episode::class => [
'filterableAttributes' => [ 'filterableAttributes' => [
'title', 'title',
'title_search', 'title_search',
'title_jpn', 'title_jpn',
'slug', 'slug',
'description', 'description',
'tags' 'tags',
], ],
'sortableAttributes' => [ 'sortableAttributes' => [
'created_at', 'created_at',
'release_date', 'release_date',
'title' 'title',
], ],
], ],
], ],

View File

@@ -263,5 +263,4 @@ return [
'confirm_delete_icon' => env('SWEET_ALERT_CONFIRM_DELETE_ICON', 'warning'), 'confirm_delete_icon' => env('SWEET_ALERT_CONFIRM_DELETE_ICON', 'warning'),
'confirm_delete_show_loader_on_confirm' => env('SWEET_ALERT_CONFIRM_DELETE_SHOW_LOADER_ON_CONFIRM', true), 'confirm_delete_show_loader_on_confirm' => env('SWEET_ALERT_CONFIRM_DELETE_SHOW_LOADER_ON_CONFIRM', true),
]; ];

View File

@@ -12,7 +12,7 @@ return [
'displayer' => '\Illuminate\Support\Str::title', 'displayer' => '\Illuminate\Support\Str::title',
// Database connection for Conner\Taggable\Tag model to use // Database connection for Conner\Taggable\Tag model to use
// 'connection' => 'mysql', // 'connection' => 'mysql',
// When deleting a model, remove all the tags first // When deleting a model, remove all the tags first
'untag_on_delete' => true, 'untag_on_delete' => true,

View File

@@ -2,7 +2,6 @@
namespace Database\Factories; namespace Database\Factories;
use App\Models\Studios;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
/** /**
@@ -18,19 +17,19 @@ class EpisodeFactory extends Factory
public function definition(): array public function definition(): array
{ {
return [ return [
'title' => $this->faker->title(), 'title' => $this->faker->title(),
'title_search' => $this->faker->title(), 'title_search' => $this->faker->title(),
'title_jpn' => $this->faker->title(), 'title_jpn' => $this->faker->title(),
'slug' => $this->faker->slug, 'slug' => $this->faker->slug,
'episode' => $this->faker->randomDigit(), 'episode' => $this->faker->randomDigit(),
'description' => $this->faker->text(), 'description' => $this->faker->text(),
'url' => $this->faker->url(), 'url' => $this->faker->url(),
'cover_url' => $this->faker->url(), 'cover_url' => $this->faker->url(),
'view_count' => $this->faker->randomNumber(), 'view_count' => $this->faker->randomNumber(),
'interpolated' => $this->faker->boolean(), 'interpolated' => $this->faker->boolean(),
'interpolated_uhd' => $this->faker->boolean(), 'interpolated_uhd' => $this->faker->boolean(),
'release_date' => $this->faker->date(), 'release_date' => $this->faker->date(),
'is_dvd_aspect' => $this->faker->boolean(), 'is_dvd_aspect' => $this->faker->boolean(),
]; ];
} }
} }

View File

@@ -17,8 +17,8 @@ class HentaiFactory extends Factory
public function definition(): array public function definition(): array
{ {
return [ return [
'slug' => $this->faker->slug, 'slug' => $this->faker->slug,
'description' => $this->faker->text(), 'description' => $this->faker->text(),
]; ];
} }
} }

View File

@@ -17,8 +17,8 @@ class StudiosFactory extends Factory
public function definition(): array public function definition(): array
{ {
return [ return [
'name' => $this->faker->company(), 'name' => $this->faker->company(),
'slug' => $this->faker->slug, 'slug' => $this->faker->slug,
]; ];
} }
} }

View File

@@ -5,8 +5,8 @@ use App\Models\Hentai;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration return new class extends Migration
{ {
@@ -17,16 +17,16 @@ return new class extends Migration
{ {
// Change Tagging from Hentai to Episode // Change Tagging from Hentai to Episode
$hentai = DB::table('hentai')->get(); $hentai = DB::table('hentai')->get();
foreach($hentai as $h) { foreach ($hentai as $h) {
$episodes = Episode::where('hentai_id', $h->id)->get(); $episodes = Episode::where('hentai_id', $h->id)->get();
foreach($episodes as $episode) { foreach ($episodes as $episode) {
$episode->tag($h->tagNames()); $episode->tag($h->tagNames());
} }
} }
// Delete Hentai Tags // Delete Hentai Tags
foreach($hentai as $h) { foreach ($hentai as $h) {
$h->untag(); $h->untag();
} }
@@ -39,7 +39,7 @@ return new class extends Migration
}); });
$episodes = DB::table('episode')->get(); $episodes = DB::table('episode')->get();
foreach($episodes as $episode) { foreach ($episodes as $episode) {
$hentai = Hentai::where('id', $episode->hentai_id)->first(); $hentai = Hentai::where('id', $episode->hentai_id)->first();
$episode->title = $hentai->title; $episode->title = $hentai->title;

View File

@@ -12,11 +12,11 @@ return new class extends Migration
public function up(): void public function up(): void
{ {
$episodes = DB::table('episode')->whereNull('download_url_4k') $episodes = DB::table('episode')->whereNull('download_url_4k')
->where('legacy_stream', 0) ->where('legacy_stream', 0)
->where('resolution', '4k') ->where('resolution', '4k')
->get(); ->get();
foreach($episodes as $episode) { foreach ($episodes as $episode) {
$episode->download_url_4k = Str::replace('1080p', '2160p', $episode->download_url); $episode->download_url_4k = Str::replace('1080p', '2160p', $episode->download_url);
$episode->save(); $episode->save();
} }

View File

@@ -22,8 +22,7 @@ return new class extends Migration
*/ */
public function down() public function down()
{ {
Schema::table('gallery', function (Blueprint $table) Schema::table('gallery', function (Blueprint $table) {
{
$table->dropIndex(['episode_id', 'hentai_id']); $table->dropIndex(['episode_id', 'hentai_id']);
}); });
} }

View File

@@ -2,8 +2,8 @@
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration return new class extends Migration
{ {

View File

@@ -23,13 +23,13 @@ return new class extends Migration
}); });
// Migrate old entries // Migrate old entries
foreach(Episode::all() as $episode) { foreach (Episode::all() as $episode) {
// 1080p // 1080p
if (! empty($episode->download_url)) { if (! empty($episode->download_url)) {
Downloads::create([ Downloads::create([
'episode_id' => $episode->id, 'episode_id' => $episode->id,
'type' => 'FHD', 'type' => 'FHD',
'url' => $episode->download_url 'url' => $episode->download_url,
]); ]);
} }
@@ -37,8 +37,8 @@ return new class extends Migration
if (! empty($episode->download_url_interpolated)) { if (! empty($episode->download_url_interpolated)) {
Downloads::create([ Downloads::create([
'episode_id' => $episode->id, 'episode_id' => $episode->id,
'type' => 'FHDi', 'type' => 'FHDi',
'url' => $episode->download_url_interpolated 'url' => $episode->download_url_interpolated,
]); ]);
} }
@@ -46,8 +46,8 @@ return new class extends Migration
if (! empty($episode->download_url_4k)) { if (! empty($episode->download_url_4k)) {
Downloads::create([ Downloads::create([
'episode_id' => $episode->id, 'episode_id' => $episode->id,
'type' => 'UHD', 'type' => 'UHD',
'url' => $episode->download_url_4k 'url' => $episode->download_url_4k,
]); ]);
} }
} }

View File

@@ -2,7 +2,6 @@
use App\Models\Episode; use App\Models\Episode;
use App\Models\Hentai; use App\Models\Hentai;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;

View File

@@ -18,7 +18,7 @@ return new class extends Migration
// Update the title_search field with sanitized titles // Update the title_search field with sanitized titles
DB::table('episodes')->update([ DB::table('episodes')->update([
'title_search' => DB::raw("REGEXP_REPLACE(title, '[^A-Za-z0-9 ]', '')") 'title_search' => DB::raw("REGEXP_REPLACE(title, '[^A-Za-z0-9 ]', '')"),
]); ]);
} }

View File

@@ -2,8 +2,8 @@
use App\Models\Playlist; use App\Models\Playlist;
use App\Models\PlaylistEpisode; use App\Models\PlaylistEpisode;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;

View File

@@ -1,11 +1,10 @@
<?php <?php
use App\Models\Downloads; use App\Models\Downloads;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration return new class extends Migration
{ {
@@ -14,10 +13,10 @@ return new class extends Migration
*/ */
public function up(): void public function up(): void
{ {
# Delete entries with "#" as URL // Delete entries with "#" as URL
Downloads::where('url', '#')->delete(); Downloads::where('url', '#')->delete();
# Remove duplicate entries // Remove duplicate entries
$duplicates = DB::table('downloads') $duplicates = DB::table('downloads')
->select('episode_id', 'type', DB::raw('COUNT(*) as count')) ->select('episode_id', 'type', DB::raw('COUNT(*) as count'))
->groupBy('episode_id', 'type') ->groupBy('episode_id', 'type')

View File

@@ -1,7 +1,6 @@
<?php <?php
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class extends Migration return new class extends Migration

View File

@@ -46,7 +46,6 @@ return new class extends Migration
$table->rememberToken()->after('password'); $table->rememberToken()->after('password');
}); });
/** /**
* -------------------------------------------------------------------- * --------------------------------------------------------------------
* Fix Discord Profile Pictures * Fix Discord Profile Pictures
@@ -54,8 +53,7 @@ return new class extends Migration
* The oauth package by socialite now returns a full url of the avatar. * The oauth package by socialite now returns a full url of the avatar.
* Meaning all the old entries have to be fixed. * Meaning all the old entries have to be fixed.
*/ */
foreach (User::whereNotNull('discord_avatar')->get() as $user) foreach (User::whereNotNull('discord_avatar')->get() as $user) {
{
$isGif = preg_match('/a_.+/m', $user->discord_avatar) === 1; $isGif = preg_match('/a_.+/m', $user->discord_avatar) === 1;
$extension = $isGif ? 'gif' : 'webp'; $extension = $isGif ? 'gif' : 'webp';
$user->discord_avatar = sprintf('https://cdn.discordapp.com/avatars/%s/%s.%s', $user->id, $user->discord_avatar, $extension); $user->discord_avatar = sprintf('https://cdn.discordapp.com/avatars/%s/%s.%s', $user->id, $user->discord_avatar, $extension);

View File

@@ -3,8 +3,8 @@
use App\Models\Playlist; use App\Models\Playlist;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration return new class extends Migration
{ {
@@ -150,7 +150,7 @@ return new class extends Migration
$playlists = Playlist::where('user_id', '>', 1_000_000) $playlists = Playlist::where('user_id', '>', 1_000_000)
->get(); ->get();
foreach($playlists as $playlist) { foreach ($playlists as $playlist) {
DB::table('playlist_episodes') DB::table('playlist_episodes')
->where('playlist_id', '=', $playlist->id) ->where('playlist_id', '=', $playlist->id)
->delete(); ->delete();

View File

@@ -69,7 +69,7 @@ return new class extends Migration
// Re-Add foreign key constraint and index // Re-Add foreign key constraint and index
Schema::table('comments', function (Blueprint $table) { Schema::table('comments', function (Blueprint $table) {
$table->foreign('child_id')->references('id')->on('comments')->onDelete('cascade'); $table->foreign('child_id')->references('id')->on('comments')->onDelete('cascade');
$table->index(["commenter_id", "commenter_type"]); $table->index(['commenter_id', 'commenter_type']);
}); });
} }
}; };

View File

@@ -13,8 +13,8 @@ return new class extends Migration
{ {
Schema::table('users', function (Blueprint $table) { Schema::table('users', function (Blueprint $table) {
$table->string('locale', 10) $table->string('locale', 10)
->nullable() ->nullable()
->after('discord_avatar'); ->after('discord_avatar');
}); });
} }

View File

@@ -14,17 +14,17 @@ return new class extends Migration
{ {
// Migrate supporters // Migrate supporters
DB::table('users')->where('is_patreon', 1)->update([ DB::table('users')->where('is_patreon', 1)->update([
'roles' => DB::raw("JSON_ARRAY('supporter')") 'roles' => DB::raw("JSON_ARRAY('supporter')"),
]); ]);
// Migrate banned // Migrate banned
DB::table('users')->where('is_banned', 1)->update([ DB::table('users')->where('is_banned', 1)->update([
'roles' => DB::raw("JSON_ARRAY('banned')") 'roles' => DB::raw("JSON_ARRAY('banned')"),
]); ]);
// Migrate admins // Migrate admins
DB::table('users')->where('is_admin', 1)->update([ DB::table('users')->where('is_admin', 1)->update([
'roles' => DB::raw("JSON_ARRAY('admin')") 'roles' => DB::raw("JSON_ARRAY('admin')"),
]); ]);
// Drop columns // Drop columns

View File

@@ -13,8 +13,8 @@ return new class extends Migration
{ {
Schema::table('users', function (Blueprint $table) { Schema::table('users', function (Blueprint $table) {
$table->string('matrix_id') $table->string('matrix_id')
->nullable() ->nullable()
->after('discord_id'); ->after('discord_id');
}); });
} }

View File

@@ -13,7 +13,7 @@ class DatabaseSeeder extends Seeder
public function run(): void public function run(): void
{ {
$this->call([ $this->call([
DeletedUserSeeder::class DeletedUserSeeder::class,
]); ]);
} }
} }

View File

@@ -3,11 +3,9 @@
namespace Database\Seeders; namespace Database\Seeders;
use App\Models\User; use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DeletedUserSeeder extends Seeder class DeletedUserSeeder extends Seeder
{ {
@@ -18,7 +16,7 @@ class DeletedUserSeeder extends Seeder
{ {
$userexists = User::where('id', '=', 1)->first(); $userexists = User::where('id', '=', 1)->first();
if (!$userexists) { if (! $userexists) {
DB::table('users')->insert([ DB::table('users')->insert([
'id' => 1, 'id' => 1,
'username' => 'deleted', 'username' => 'deleted',

Some files were not shown because too many files have changed in this diff Show More