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 @@
+ Your download basket can also be accessed via an + RSS feed. + Some NZB downloaders can read this feed and automatically start downloading. +
+| + + | +Name | +Added | +Action | +
|---|---|---|---|
| + + | ++ + {{ $result->release->searchname }} + + | +
+
+
+ {{ \Carbon\Carbon::parse($result->created_at)->diffForHumans() }}
+
+ |
+ + + | +
Add some releases to your download basket to get started.
+ + Browse Releases + +