Pint
This commit is contained in:
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
];
|
];
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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'],
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -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([
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
@@ -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(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class Downloads extends Model
|
|||||||
$bytes /= 1024;
|
$bytes /= 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
return round($bytes, 2) . ' ' . $units[$i];
|
return round($bytes, 2).' '.$units[$i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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'),
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
|||||||
@@ -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,
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -38,5 +38,5 @@ return [
|
|||||||
'autoOrientation' => true,
|
'autoOrientation' => true,
|
||||||
'decodeAnimation' => true,
|
'decodeAnimation' => true,
|
||||||
'blendingColor' => 'ffffff',
|
'blendingColor' => 'ffffff',
|
||||||
]
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -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',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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']);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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 ]', '')"),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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']);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class DatabaseSeeder extends Seeder
|
|||||||
public function run(): void
|
public function run(): void
|
||||||
{
|
{
|
||||||
$this->call([
|
$this->call([
|
||||||
DeletedUserSeeder::class
|
DeletedUserSeeder::class,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user