From 74f9a85afcf296606434ef8b3d48bcc4672c48eb Mon Sep 17 00:00:00 2001 From: DariusIII Date: Fri, 3 Oct 2025 23:27:02 +0200 Subject: [PATCH] Improve templates --- app/Extensions/helper/helpers.php | 85 +++--- app/Http/Controllers/CartController.php | 17 +- app/Http/Controllers/ConsoleController.php | 49 ++-- app/Http/Controllers/CoverController.php | 46 +++ app/Http/Controllers/MovieController.php | 28 +- app/Http/Controllers/SearchController.php | 88 +++--- app/Http/Controllers/SeriesController.php | 97 +++--- resources/views/browse/index.blade.php | 90 +++++- resources/views/cart/index.blade.php | 206 +++++++++++++ resources/views/console/index.blade.php | 276 ++++++++++++++++++ resources/views/details/index.blade.php | 12 +- resources/views/layouts/main.blade.php | 9 + resources/views/movies/index.blade.php | 9 +- .../views/movies/viewmoviefull.blade.php | 9 +- .../views/partials/cart-script.blade.php | 71 +++++ .../partials/toast-notifications.blade.php | 136 +++++++++ resources/views/search/index.blade.php | 42 ++- resources/views/series/viewseries.blade.php | 197 +++++++++++++ .../views/series/viewserieslist.blade.php | 180 ++++++++++++ routes/web.php | 6 + 20 files changed, 1423 insertions(+), 230 deletions(-) create mode 100644 app/Http/Controllers/CoverController.php create mode 100644 resources/views/cart/index.blade.php create mode 100644 resources/views/console/index.blade.php create mode 100644 resources/views/partials/cart-script.blade.php create mode 100644 resources/views/partials/toast-notifications.blade.php create mode 100644 resources/views/series/viewseries.blade.php create mode 100644 resources/views/series/viewserieslist.blade.php diff --git a/app/Extensions/helper/helpers.php b/app/Extensions/helper/helpers.php index e3d6820cd..f4c274944 100644 --- a/app/Extensions/helper/helpers.php +++ b/app/Extensions/helper/helpers.php @@ -419,49 +419,64 @@ if (! function_exists('getReleaseCover')) { /** * Get the cover image URL for a release based on its type and ID * - * @param object $release The release object - * @return string|null The cover image URL or null if no cover exists + * @param object|array $release The release object or array + * @return string The cover image URL or placeholder if no cover exists */ - function getReleaseCover($release): ?string + function getReleaseCover($release): string { - $coverPath = null; $coverType = null; $coverId = null; - // Determine cover type and ID based on category - if (! empty($release->imdbid) && $release->imdbid > 0) { - $coverType = 'movies'; - $coverId = str_pad($release->imdbid, 7, '0', STR_PAD_LEFT); - } elseif (! empty($release->musicinfo_id)) { - $coverType = 'music'; - $coverId = $release->musicinfo_id; - } elseif (! empty($release->consoleinfo_id)) { - $coverType = 'console'; - $coverId = $release->consoleinfo_id; - } elseif (! empty($release->bookinfo_id)) { - $coverType = 'book'; - $coverId = $release->bookinfo_id; - } elseif (! empty($release->gamesinfo_id)) { - $coverType = 'games'; - $coverId = $release->gamesinfo_id; - } elseif (! empty($release->xxxinfo_id)) { - $coverType = 'xxx'; - $coverId = $release->xxxinfo_id; - } elseif (! empty($release->anidbid)) { - $coverType = 'anime'; - $coverId = $release->anidbid; - } - - // Check if cover file exists - if ($coverType && $coverId) { - $coverFile = storage_path("covers/{$coverType}/{$coverId}-cover.jpg"); - if (file_exists($coverFile)) { - // Return URL to access the cover image - return asset("storage/covers/{$coverType}/{$coverId}-cover.jpg"); + // Helper function to get value from object or array + $getValue = function ($data, $key) { + if (is_array($data)) { + return $data[$key] ?? null; + } elseif (is_object($data)) { + return $data->$key ?? null; } + + return null; + }; + + // Determine cover type and ID based on category + $imdbid = $getValue($release, 'imdbid'); + $musicinfo_id = $getValue($release, 'musicinfo_id'); + $consoleinfo_id = $getValue($release, 'consoleinfo_id'); + $bookinfo_id = $getValue($release, 'bookinfo_id'); + $gamesinfo_id = $getValue($release, 'gamesinfo_id'); + $xxxinfo_id = $getValue($release, 'xxxinfo_id'); + $anidbid = $getValue($release, 'anidbid'); + + if (! empty($imdbid) && $imdbid > 0) { + $coverType = 'movies'; + $coverId = str_pad($imdbid, 7, '0', STR_PAD_LEFT); + } elseif (! empty($musicinfo_id)) { + $coverType = 'music'; + $coverId = $musicinfo_id; + } elseif (! empty($consoleinfo_id)) { + $coverType = 'console'; + $coverId = $consoleinfo_id; + } elseif (! empty($bookinfo_id)) { + $coverType = 'book'; + $coverId = $bookinfo_id; + } elseif (! empty($gamesinfo_id)) { + $coverType = 'games'; + $coverId = $gamesinfo_id; + } elseif (! empty($xxxinfo_id)) { + $coverType = 'xxx'; + $coverId = $xxxinfo_id; + } elseif (! empty($anidbid)) { + $coverType = 'anime'; + $coverId = $anidbid; } - // Return placeholder image if no cover found + // Return the cover URL if we have a type and ID + // The CoverController will handle serving the file or returning a placeholder + if ($coverType && $coverId) { + return url("/covers/{$coverType}/{$coverId}-cover.jpg"); + } + + // Return placeholder image if no cover type/ID found return asset('assets/images/no-cover.png'); } } diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php index 140d2b5c7..0740b134d 100644 --- a/app/Http/Controllers/CartController.php +++ b/app/Http/Controllers/CartController.php @@ -13,19 +13,20 @@ class CartController extends BasePageController /** * @throws \Exception */ - public function index(): void + public function index() { $this->setPreferences(); - $meta_title = 'My Download Basket'; - $meta_keywords = 'search,add,to,cart,download,basket,nzb,description,details'; - $meta_description = 'Manage Your Download Basket'; $results = UsersRelease::getCart(Auth::id()); - $this->smarty->assign('results', $results); - $content = $this->smarty->fetch('cart.tpl'); - $this->smarty->assign(compact('content', 'meta_title', 'meta_keywords', 'meta_description')); - $this->pagerender(); + $this->viewData = array_merge($this->viewData, [ + 'results' => $results, + 'meta_title' => 'My Download Basket', + 'meta_keywords' => 'search,add,to,cart,download,basket,nzb,description,details', + 'meta_description' => 'Manage Your Download Basket', + ]); + + return view('cart.index', $this->viewData); } /** diff --git a/app/Http/Controllers/ConsoleController.php b/app/Http/Controllers/ConsoleController.php index 38bd2966a..493fbb192 100644 --- a/app/Http/Controllers/ConsoleController.php +++ b/app/Http/Controllers/ConsoleController.php @@ -13,7 +13,7 @@ class ConsoleController extends BasePageController /** * @throws \Exception */ - public function show(Request $request, string $id = ''): void + public function show(Request $request, string $id = '') { $this->setPreferences(); if ($id === 'WiiVare') { @@ -43,10 +43,6 @@ class ConsoleController extends BasePageController $catarray = []; $catarray[] = $category; - $this->smarty->assign('catlist', $ctmp); - $this->smarty->assign('category', $category); - $this->smarty->assign('categorytitle', $id); - $ordering = $console->getConsoleOrdering(); $orderby = $request->has('ob') && \in_array($request->input('ob'), $ordering, false) ? $request->input('ob') : ''; $page = $request->has('page') && is_numeric($request->input('page')) ? $request->input('page') : 1; @@ -69,10 +65,7 @@ class ConsoleController extends BasePageController } $platform = ($request->has('platform') && ! empty($request->input('platform'))) ? stripslashes($request->input('platform')) : ''; - $this->smarty->assign('platform', $platform); - $title = ($request->has('title') && ! empty($request->input('title'))) ? stripslashes($request->input('title')) : ''; - $this->smarty->assign('title', $title); $genres = $gen->getGenres(Genres::CONSOLE_TYPE, true); $tmpgnr = []; @@ -80,35 +73,35 @@ class ConsoleController extends BasePageController $tmpgnr[$gn->id] = $gn->title; } $genre = ($request->has('genre') && array_key_exists($request->input('genre'), $tmpgnr)) ? $request->input('genre') : ''; - $this->smarty->assign('genres', $genres); - $this->smarty->assign('genre', $genre); if ((int) $category === -1) { - $this->smarty->assign('catname', 'All'); + $catname = 'All'; } else { $cdata = Category::find($category); if ($cdata !== null) { - $this->smarty->assign('catname', $cdata); + $catname = $cdata; } else { - $this->smarty->assign('catname', 'All'); + $catname = 'All'; } } - $this->smarty->assign( - [ - 'resultsadd' => $consoles, - 'results' => $results, - 'covgroup' => 'console', - ] - ); + $this->viewData = array_merge($this->viewData, [ + 'catlist' => $ctmp, + 'category' => $category, + 'categorytitle' => $id, + 'platform' => $platform, + 'title' => $title, + 'genres' => $genres, + 'genre' => $genre, + 'catname' => $catname, + 'resultsadd' => $consoles, + 'results' => $results, + 'covgroup' => 'console', + 'meta_title' => 'Browse Console', + 'meta_keywords' => 'browse,nzb,console,games,description,details', + 'meta_description' => 'Browse for Console Games', + ]); - $meta_title = 'Browse Console'; - $meta_keywords = 'browse,nzb,console,games,description,details'; - $meta_description = 'Browse for Console Games'; - $content = $this->smarty->fetch('console.tpl'); - - $this->smarty->assign(compact('content', 'meta_title', 'meta_keywords', 'meta_description')); - - $this->pagerender(); + return view('console.index', $this->viewData); } } diff --git a/app/Http/Controllers/CoverController.php b/app/Http/Controllers/CoverController.php new file mode 100644 index 000000000..3ca9a5f48 --- /dev/null +++ b/app/Http/Controllers/CoverController.php @@ -0,0 +1,46 @@ +file($placeholderPath); + } + abort(404); + } + + // Serve the file with proper headers + return response()->file($filePath, [ + 'Content-Type' => 'image/jpeg', + 'Cache-Control' => 'public, max-age=31536000', // Cache for 1 year + ]); + } +} diff --git a/app/Http/Controllers/MovieController.php b/app/Http/Controllers/MovieController.php index 06f06ce98..96257d751 100644 --- a/app/Http/Controllers/MovieController.php +++ b/app/Http/Controllers/MovieController.php @@ -46,18 +46,8 @@ class MovieController extends BasePageController $result['director'] = makeFieldLinks($result, 'director', 'movies'); $result['languages'] = explode(', ', $result['language']); - // Add cover image URL - if (! empty($result['imdbid'])) { - $coverId = str_pad($result['imdbid'], 7, '0', STR_PAD_LEFT); - $coverFile = storage_path("covers/movies/{$coverId}-cover.jpg"); - if (file_exists($coverFile)) { - $result['cover'] = asset("storage/covers/movies/{$coverId}-cover.jpg"); - } else { - $result['cover'] = asset('assets/images/no-cover.png'); - } - } else { - $result['cover'] = asset('assets/images/no-cover.png'); - } + // Add cover image URL using helper function + $result['cover'] = getReleaseCover($result); return $result; }); @@ -155,18 +145,8 @@ class MovieController extends BasePageController $movieArray['director'] = makeFieldLinks($movieArray, 'director', 'movies'); } - // Add cover image URL - if (! empty($imdbid)) { - $coverId = str_pad($imdbid, 7, '0', STR_PAD_LEFT); - $coverFile = storage_path("covers/movies/{$coverId}-cover.jpg"); - if (file_exists($coverFile)) { - $movieArray['cover'] = asset("storage/covers/movies/{$coverId}-cover.jpg"); - } else { - $movieArray['cover'] = asset('assets/images/no-cover.png'); - } - } else { - $movieArray['cover'] = asset('assets/images/no-cover.png'); - } + // Add cover image URL using helper function + $movieArray['cover'] = getReleaseCover($movieArray); // Process all releases $releaseNames = isset($movieData->grp_release_name) ? explode('#', $movieData->grp_release_name) : []; diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 427e71eb5..275f3f88b 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -12,15 +12,11 @@ class SearchController extends BasePageController /** * @throws \Exception */ - public function search(Request $request): void + public function search(Request $request) { $this->setPreferences(); $releases = new Releases; - $meta_title = 'Search Nzbs'; - $meta_keywords = 'search,nzb,description,details'; - $meta_description = 'Search for Nzbs'; - $results = []; $searchType = 'basic'; @@ -33,26 +29,26 @@ class SearchController extends BasePageController $page = $request->has('page') && is_numeric($request->input('page')) ? $request->input('page') : 1; $offset = ($page - 1) * config('nntmux.items_per_page'); - $this->smarty->assign( - [ - 'subject' => '', 'search' => '', 'category' => [0], 'covgroup' => '', - ] - ); + $subject = ''; + $search = ''; + $id = ''; + $category = [0]; + $lastvisit = $this->userdata->lastlogin; if ($searchType === 'basic' && $request->missing('searchadvr') && ($request->has('id') || $request->has('subject') || $request->has('search'))) { $searchString = []; switch (true) { case $request->filled('subject'): $searchString['searchname'] = (string) $request->input('subject') ?? []; - $this->smarty->assign('subject', $searchString['searchname']); + $subject = $searchString['searchname']; break; case $request->filled('id'): $searchString['searchname'] = (string) $request->input('id') ?? []; - $this->smarty->assign('id', $searchString['searchname']); + $id = $searchString['searchname']; break; case $request->filled('search'): $searchString['searchname'] = (string) $request->input('search') ?? []; - $this->smarty->assign('search', $searchString['searchname']); + $search = $searchString['searchname']; break; default: $searchString['searchname'] = ''; @@ -62,10 +58,10 @@ class SearchController extends BasePageController if ($request->has('t')) { $categoryID = explode(',', $request->input('t')); } + + $orderByUrls = []; foreach ($releases->getBrowseOrdering() as $orderType) { - $this->smarty->assign( - 'orderby'.$orderType, - url('/search?search='.htmlentities($searchString['searchname'], ENT_QUOTES | ENT_HTML5).'&t='.implode(',', $categoryID).'&ob='.$orderType)); + $orderByUrls['orderby'.$orderType] = url('/search?search='.htmlentities($searchString['searchname'], ENT_QUOTES | ENT_HTML5).'&t='.implode(',', $categoryID).'&ob='.$orderType); } $rslt = $releases->search( @@ -84,13 +80,9 @@ class SearchController extends BasePageController $categoryID); $results = $this->paginate($rslt ?? [], $rslt[0]->_totalrows ?? 0, config('nntmux.items_per_page'), $page, $request->url(), $request->query()); - - $this->smarty->assign( - [ - 'lastvisit' => $this->userdata->lastlogin, - 'category' => $categoryID, - ] - ); + $category = $categoryID; + } else { + $orderByUrls = []; } $searchVars = [ @@ -116,9 +108,6 @@ class SearchController extends BasePageController $searchVars['selectedcat'] = $searchVars['searchadvcat']; $searchVars['selectedsizefrom'] = $searchVars['searchadvsizefrom']; $searchVars['selectedsizeto'] = $searchVars['searchadvsizeto']; - foreach ($searchVars as $searchVarKey => $searchVar) { - $this->smarty->assign($searchVarKey, $searchVars[$searchVarKey]); - } if ($searchType !== 'basic' && $request->missing('id') && $request->missing('subject') && $request->anyFilled(['searchadvr', 'searchadvsubject', 'searchadvfilename', 'searchadvposter'])) { $orderByString = ''; @@ -127,11 +116,9 @@ class SearchController extends BasePageController } $orderByString = ltrim($orderByString, '&'); + $orderByUrls = []; foreach ($ordering as $orderType) { - $this->smarty->assign( - 'orderby'.$orderType, - url('/search?'.$orderByString.'&search_type=adv&ob='.$orderType - )); + $orderByUrls['orderby'.$orderType] = url('/search?'.$orderByString.'&search_type=adv&ob='.$orderType); } $searchArr = [ @@ -158,29 +145,28 @@ class SearchController extends BasePageController ); $results = $this->paginate($rslt ?? [], $rslt[0]->_totalrows ?? 0, config('nntmux.items_per_page'), $page, $request->url(), $request->query()); - - $this->smarty->assign( - [ - 'lastvisit' => $this->userdata->lastlogin, - ] - ); } - $this->smarty->assign( - [ - 'sizelist' => [ - -1 => '--Select--', 1 => '100MB', 2 => '250MB', 3 => '500MB', 4 => '1GB', 5 => '2GB', - 6 => '3GB', 7 => '4GB', 8 => '8GB', 9 => '16GB', 10 => '32GB', 11 => '64GB', - ], - 'results' => $results, - 'sadvanced' => $searchType !== 'basic', - 'grouplist' => UsenetGroup::getGroupsForSelect(), - 'catlist' => Category::getForSelect(), - ] - ); + $this->viewData = array_merge($this->viewData, $searchVars, $orderByUrls, [ + 'subject' => $subject, + 'search' => $search, + 'id' => $id, + 'category' => $category, + 'covgroup' => '', + 'lastvisit' => $lastvisit, + 'sizelist' => [ + -1 => '--Select--', 1 => '100MB', 2 => '250MB', 3 => '500MB', 4 => '1GB', 5 => '2GB', + 6 => '3GB', 7 => '4GB', 8 => '8GB', 9 => '16GB', 10 => '32GB', 11 => '64GB', + ], + 'results' => $results, + 'sadvanced' => $searchType !== 'basic', + 'grouplist' => UsenetGroup::getGroupsForSelect(), + 'catlist' => Category::getForSelect(), + 'meta_title' => 'Search Nzbs', + 'meta_keywords' => 'search,nzb,description,details', + 'meta_description' => 'Search for Nzbs', + ]); - $content = $this->smarty->fetch('search.tpl'); - $this->smarty->assign(compact('content', 'meta_title', 'meta_keywords', 'meta_description')); - $this->pagerender(); + return view('search.index', $this->viewData); } } diff --git a/app/Http/Controllers/SeriesController.php b/app/Http/Controllers/SeriesController.php index 103c32950..beaca0306 100644 --- a/app/Http/Controllers/SeriesController.php +++ b/app/Http/Controllers/SeriesController.php @@ -13,14 +13,10 @@ class SeriesController extends BasePageController /** * @throws \Exception */ - public function index(Request $request, string $id = ''): void + public function index(Request $request, string $id = '') { $this->setPreferences(); $releases = new Releases; - $title = 'Series'; - $meta_title = 'View TV Series'; - $meta_keywords = 'view,series,tv,show,description,details'; - $meta_description = 'View TV Series'; if ($id && ctype_digit($id)) { $category = -1; @@ -38,10 +34,17 @@ class SeriesController extends BasePageController $show = Video::getByVideoID($id); + $nodata = ''; + $seasons = []; + $myshows = null; + $seriestitles = ''; + $seriessummary = ''; + $seriescountry = ''; + if (! $show) { - $this->smarty->assign('nodata', 'No video information for this series.'); + $nodata = 'No video information for this series.'; } elseif (! $rel) { - $this->smarty->assign('nodata', 'No releases for this series.'); + $nodata = 'No releases for this series.'; } else { $myshows = UserSerie::getShow($this->userdata->id, $show['id']); @@ -59,49 +62,42 @@ class SeriesController extends BasePageController $series[$r->series][$r->episode][] = $r; } - $this->smarty->assign('seasons', Arr::sortRecursive($series)); - $this->smarty->assign('show', $show); - $this->smarty->assign('myshows', $myshows); + $seasons = Arr::sortRecursive($series); // get series name(s), description, country and genre - $seriestitles = $seriessummary = $seriescountry = []; - $seriestitles[] = $show['title']; + $seriestitlesArray = $seriessummaryArray = $seriescountryArray = []; + $seriestitlesArray[] = $show['title']; if (! empty($show['summary'])) { - $seriessummary[] = $show['summary']; + $seriessummaryArray[] = $show['summary']; } if (! empty($show['countries_id'])) { - $seriescountry[] = $show['countries_id']; + $seriescountryArray[] = $show['countries_id']; } - $seriestitles = implode('/', array_map('trim', $seriestitles)); - $this->smarty->assign('seriestitles', $seriestitles); - $this->smarty->assign('seriessummary', $seriessummary ? array_shift($seriessummary) : ''); - $this->smarty->assign('seriescountry', $seriescountry ? array_shift($seriescountry) : ''); - - $title = 'Series'; - $meta_title = 'View TV Series'; - $meta_keywords = 'view,series,tv,show,description,details'; - $meta_description = 'View TV Series'; - - if ($category !== -1) { - $catid = $category; - } else { - $catid = ''; - } - $this->smarty->assign('category', $catid); - $this->smarty->assign('nodata', ''); + $seriestitles = implode('/', array_map('trim', $seriestitlesArray)); + $seriessummary = $seriessummaryArray ? array_shift($seriessummaryArray) : ''; + $seriescountry = $seriescountryArray ? array_shift($seriescountryArray) : ''; } - $content = $this->smarty->fetch('viewseries.tpl'); - $this->smarty->assign([ - 'title' => $title, - 'content' => $content, - 'meta_title' => $meta_title, - 'meta_keywords' => $meta_keywords, - 'meta_description' => $meta_description, + + $catid = $category !== -1 ? $category : ''; + + $this->viewData = array_merge($this->viewData, [ + 'seasons' => $seasons, + 'show' => $show, + 'myshows' => $myshows, + 'seriestitles' => $seriestitles, + 'seriessummary' => $seriessummary, + 'seriescountry' => $seriescountry, + 'category' => $catid, + 'nodata' => $nodata, + 'meta_title' => 'View TV Series', + 'meta_keywords' => 'view,series,tv,show,description,details', + 'meta_description' => 'View TV Series', ]); - $this->pagerender(); + + return view('series.viewseries', $this->viewData); } else { $letter = ($id && preg_match('/^(0\-9|[A-Z])$/i', $id)) ? $id : '0-9'; @@ -113,11 +109,6 @@ class SeriesController extends BasePageController $masterserieslist = Video::getSeriesList($this->userdata->id, $letter, $showname); - $title = 'Series List'; - $meta_title = 'View Series List'; - $meta_keywords = 'view,series,tv,show,description,details'; - $meta_description = 'View Series List'; - $serieslist = []; foreach ($masterserieslist as $s) { if (preg_match('/^[0-9]/', $s['title'])) { @@ -130,15 +121,17 @@ class SeriesController extends BasePageController } ksort($serieslist); - $this->smarty->assign('serieslist', $serieslist); - $this->smarty->assign('seriesrange', range('A', 'Z')); - $this->smarty->assign('seriesletter', $letter); - $this->smarty->assign('showname', $showname); + $this->viewData = array_merge($this->viewData, [ + 'serieslist' => $serieslist, + 'seriesrange' => range('A', 'Z'), + 'seriesletter' => $letter, + 'showname' => $showname, + 'meta_title' => 'View Series List', + 'meta_keywords' => 'view,series,tv,show,description,details', + 'meta_description' => 'View Series List', + ]); - $content = $this->smarty->fetch('viewserieslist.tpl'); - - $this->smarty->assign(compact('title', 'content', 'meta_title', 'meta_keywords', 'meta_description')); - $this->pagerender(); + return view('series.viewserieslist', $this->viewData); } } } diff --git a/resources/views/browse/index.blade.php b/resources/views/browse/index.blade.php index f7535338b..b3824a27d 100644 --- a/resources/views/browse/index.blade.php +++ b/resources/views/browse/index.blade.php @@ -166,12 +166,15 @@
- + + + +
@@ -196,6 +199,7 @@ @push('scripts') @endpush @endsection diff --git a/resources/views/cart/index.blade.php b/resources/views/cart/index.blade.php new file mode 100644 index 000000000..fc546b2f9 --- /dev/null +++ b/resources/views/cart/index.blade.php @@ -0,0 +1,206 @@ +@extends('layouts.main') + +@section('content') +
+ +
+ +
+ +
+ +
+ +
+ RSS Feed +

+ Your download basket can also be accessed via an + RSS feed. + Some NZB downloaders can read this feed and automatically start downloading. +

+
+
+ + @if(count($results) > 0) + +
+
+
My Download Basket
+
+ With Selected: +
+ + +
+
+
+ +
+ + + + + + + + + + + @foreach($results as $result) + + + + + + + @endforeach + +
+ + NameAddedAction
+ + + + {{ $result->release->searchname }} + + +
+ + {{ \Carbon\Carbon::parse($result->created_at)->diffForHumans() }} +
+
+ +
+
+ +
+ Found {{ count($results) }} items in your basket +
+ With Selected: +
+ + +
+
+
+
+ @else + +
+ +

Your basket is empty

+

Add some releases to your download basket to get started.

+ + Browse Releases + +
+ @endif +
+
+@endsection + +@section('scripts') + +@endsection + diff --git a/resources/views/console/index.blade.php b/resources/views/console/index.blade.php new file mode 100644 index 000000000..14dd5f061 --- /dev/null +++ b/resources/views/console/index.blade.php @@ -0,0 +1,276 @@ +@extends('layouts.main') + +@section('content') +
+ +
+ +
+ + @if($results->count() > 0) +
+
+
+ +
+
+ View: Covers | + List +
+ +
+ With Selected: +
+ + + @if(isset($isadmin) && $isadmin) + + + @endif +
+
+
+ + +
+ {{ $results->onEachSide(5)->links() }} +
+
+
+ + +
+
+ @foreach($resultsadd as $result) +
+
+
+ +
+ + + +
+ @if(!empty($result->url)) + + Amazon + + @endif + + @if($result->nfoid > 0) + + NFO + + @endif + + + Group + +
+
+ + +
+ +
+ + {{ $result->title }} + +
+ + +
+ @if(isset($result->genre) && $result->genre != "") +
+ +
+ @foreach(explode(', ', $result->genre) as $genre) + {{ $genre }} + @endforeach +
+
+ @endif + + @if(isset($result->esrb) && $result->esrb != "") +
+ + Rating: {{ $result->esrb }} +
+ @endif + + @if(isset($result->publisher) && $result->publisher != "") +
+ + Publisher: {{ $result->publisher }} +
+ @endif + + @if(isset($result->releasedate) && $result->releasedate != "") +
+ + Released: {{ \Carbon\Carbon::parse($result->releasedate)->format('M d, Y') }} +
+ @endif + + @if(isset($result->review) && $result->review != "") +
+ {{ $result->review }} +
+ @endif +
+ + +
+
+ + +
+ + {{ \App\Support\Helpers::formatBytes($result->size) }} +
+
+ +
+ + Posted {{ \Carbon\Carbon::parse($result->postdate)->diffForHumans() }} +
+ + +
+ + + {{ $result->grabs }} + + + + + {{ $result->comments }} + + + + + + + @if(!empty($result->failed)) + + + {{ $result->failed }} Failed + + @endif +
+
+
+
+
+
+ @endforeach +
+
+ + +
+
+ +
+
+ View: Covers | + List +
+ +
+ With Selected: +
+ + + @if(isset($isadmin) && $isadmin) + + + @endif +
+
+
+ + +
+ {{ $results->onEachSide(5)->links() }} +
+
+
+
+ @else +
+
+ + No console releases with covers available! +
+
+ @endif +
+@endsection + +@push('scripts') +@include('partials.cart-script') +@endpush + diff --git a/resources/views/details/index.blade.php b/resources/views/details/index.blade.php index 7bf21d87d..a7cfd2c24 100644 --- a/resources/views/details/index.blade.php +++ b/resources/views/details/index.blade.php @@ -30,12 +30,12 @@

{{ $release->searchname }}

@@ -649,3 +649,7 @@ @endsection +@push('scripts') +@include('partials.cart-script') +@endpush + diff --git a/resources/views/layouts/main.blade.php b/resources/views/layouts/main.blade.php index b3594d88c..3ffea84b1 100644 --- a/resources/views/layouts/main.blade.php +++ b/resources/views/layouts/main.blade.php @@ -73,8 +73,17 @@ + +
+ +
+ + + + @include('partials.toast-notifications') + @stack('scripts') diff --git a/resources/views/movies/viewmoviefull.blade.php b/resources/views/movies/viewmoviefull.blade.php index 5bc20be13..9fa2a8453 100644 --- a/resources/views/movies/viewmoviefull.blade.php +++ b/resources/views/movies/viewmoviefull.blade.php @@ -206,21 +206,22 @@ function addToCart(guid) { method: 'POST', headers: { 'Content-Type': 'application/json', - 'X-CSRF-TOKEN': '{{ csrf_token() }}' + 'X-CSRF-TOKEN': '{{ csrf_token() }}', + 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify({ id: guid }) }) .then(response => response.json()) .then(data => { if (data.success) { - alert('Release added to cart successfully!'); + window.showToast('Added to cart successfully!', 'success'); } else { - alert('Failed to add release to cart: ' + (data.message || 'Unknown error')); + window.showToast('Failed to add to cart', 'error'); } }) .catch(error => { console.error('Error:', error); - alert('An error occurred while adding to cart'); + window.showToast('An error occurred', 'error'); }); } diff --git a/resources/views/partials/cart-script.blade.php b/resources/views/partials/cart-script.blade.php new file mode 100644 index 000000000..85d465d5d --- /dev/null +++ b/resources/views/partials/cart-script.blade.php @@ -0,0 +1,71 @@ +{{-- Cart functionality JavaScript --}} + + diff --git a/resources/views/partials/toast-notifications.blade.php b/resources/views/partials/toast-notifications.blade.php new file mode 100644 index 000000000..089291f29 --- /dev/null +++ b/resources/views/partials/toast-notifications.blade.php @@ -0,0 +1,136 @@ +{{-- Toast Notification Component --}} + + + + + diff --git a/resources/views/search/index.blade.php b/resources/views/search/index.blade.php index 61f26cf18..613b19498 100644 --- a/resources/views/search/index.blade.php +++ b/resources/views/search/index.blade.php @@ -30,14 +30,28 @@ @if(isset($parentcatlist)) @foreach($parentcatlist as $parentcat) - - @foreach($parentcat->categories as $subcat) - + @foreach($subcategories as $subcat) + @php + $subcatId = is_object($subcat) ? $subcat->id : ($subcat['id'] ?? ''); + $subcatTitle = is_object($subcat) ? $subcat->title : ($subcat['title'] ?? ''); + @endphp + @endforeach @endforeach + @elseif(isset($catlist)) + @foreach($catlist as $catId => $catTitle) + + @endforeach @endif @@ -101,15 +115,17 @@ - @if(isset($results) && $results->count() > 0) + @if(isset($results) && ((is_array($results) && count($results) > 0) || (is_object($results) && $results->count() > 0)))

- Search Results ({{ $results->total() }} found) + Search Results ({{ is_object($results) ? $results->total() : count($results) }} found)

-
- Page {{ $results->currentPage() }} of {{ $results->lastPage() }} -
+ @if(is_object($results)) +
+ Page {{ $results->currentPage() }} of {{ $results->lastPage() }} +
+ @endif
@@ -145,9 +161,11 @@
-
- {{ $results->appends(request()->query())->links() }} -
+ @if(is_object($results) && method_exists($results, 'links')) +
+ {{ $results->appends(request()->query())->links() }} +
+ @endif
@elseif(request()->has('search'))
diff --git a/resources/views/series/viewseries.blade.php b/resources/views/series/viewseries.blade.php new file mode 100644 index 000000000..6a993aab0 --- /dev/null +++ b/resources/views/series/viewseries.blade.php @@ -0,0 +1,197 @@ +@extends('layouts.main') + +@section('content') +
+ +
+ +
+ +
+ @if(!empty($nodata)) +
+ Sorry! {{ $nodata }} +
+ @else + +
+
+
+ {{ $seriestitles ?? '' }} + @if(!empty($show['publisher'])) + ({{ $show['publisher'] }}) + @endif +
+
+
+
+ +
+ @if(!empty($show['image']) && $show['image'] != 0) + {{ $seriestitles ?? '' }} Poster + @endif + + +
+
+ My Shows: +
+ @if(!empty($myshows) && !empty($myshows['id'])) + + + + + + + @else + + + + @endif +
+
+
+
+ + +
+

{{ $seriessummary ?? '' }}

+ + +
+ + RSS Feed + + + @if(!empty($show['tvdb']) && $show['tvdb'] > 0) + + TheTVDB + + @endif + + @if(!empty($show['tvmaze']) && $show['tvmaze'] > 0) + + TVMaze + + @endif + + @if(!empty($show['trakt']) && $show['trakt'] > 0) + + Trakt + + @endif + + @if(!empty($show['tvrage']) && $show['tvrage'] > 0) + + TV Rage + + @endif +
+
+
+
+
+ + + @if(!empty($seasons)) + @foreach($seasons as $seasonNumber => $episodes) +
+
+
+ + Season {{ $seasonNumber }} +
+
+
+ @foreach($episodes as $episodeNumber => $releases) +
+
+ Episode {{ $episodeNumber }} +
+
+ @foreach($releases as $release) +
+
+ + {{ $release->searchname }} + +
+ + {{ \App\Support\Helpers::formatBytes($release->size) }} + + + {{ \Carbon\Carbon::parse($release->postdate)->diffForHumans() }} + +
+
+ +
+ @endforeach +
+
+ @endforeach +
+
+ @endforeach + @else +
+ + No episodes/releases found for this series. +
+ @endif + @endif +
+
+@endsection + +@push('scripts') +@include('partials.cart-script') +@endpush + diff --git a/resources/views/series/viewserieslist.blade.php b/resources/views/series/viewserieslist.blade.php new file mode 100644 index 000000000..f6fb01761 --- /dev/null +++ b/resources/views/series/viewserieslist.blade.php @@ -0,0 +1,180 @@ +@extends('layouts.main') + +@section('content') +
+ +
+
+

+ TV Series +

+ +
+
+ +
+ +
+
+ Jump to: +
+ 0-9 + @foreach($seriesrange as $range) + {{ $range }} + @endforeach +
+
+
+ + +
+ + + +
+ + +
+
+ + + @if(count($serieslist) > 0) +
+ @foreach($serieslist as $sletter => $series) +
+
+

+ {{ $sletter }} +

+
+ + + + + + + + + + + + @foreach($series as $s) + @php + $sData = is_object($s) ? get_object_vars($s) : $s; + @endphp + + + + + + + + @endforeach + +
NameNetworkCountryActionsExternal Links
+ + @if(!empty($sData['prevdate'])) + + Last: {{ $sData['previnfo'] ?? '' }} aired {{ \Carbon\Carbon::parse($sData['prevdate'])->format('M d, Y') }} + + @endif + + @if(!empty($sData['publisher'])) + {{ $sData['publisher'] }} + @endif + + @if(!empty($sData['countries_id'])) + {{ $sData['countries_id'] }} + @endif + + @if(!empty($sData['userseriesid'])) + + @else + + Add + + @endif + +
+ + + + + @if($sData['id'] > 0) + @if(!empty($sData['tvdb']) && $sData['tvdb'] > 0) + + TVDB + + @endif + @if(!empty($sData['tvmaze']) && $sData['tvmaze'] > 0) + + TVMaze + + @endif + @if(!empty($sData['trakt']) && $sData['trakt'] > 0) + + Trakt + + @endif + @endif +
+
+
+ @endforeach +
+ @else +
+ + No series found. Try a different search or letter. +
+ @endif +
+
+@endsection + diff --git a/routes/web.php b/routes/web.php index a03f4fa27..5111a6459 100644 --- a/routes/web.php +++ b/routes/web.php @@ -72,6 +72,12 @@ use App\Http\Controllers\SearchController; use App\Http\Controllers\SeriesController; use App\Http\Controllers\TermsController; +// Serve cover images from storage - Must be public (no auth required) +Route::get('/covers/{type}/{filename}', [App\Http\Controllers\CoverController::class, 'show']) + ->where('type', 'anime|audio|audiosample|book|console|games|movies|music|preview|sample|tvrage|video|xxx') + ->where('filename', '.*') + ->name('covers.show'); + // Auth::routes(); Route::match(['GET', 'POST'], '/', [ContentController::class, 'show'])->name('home');