From df6f80b310608ec47095fffd070bbe402bfa606f Mon Sep 17 00:00:00 2001 From: DariusIII Date: Mon, 14 May 2018 13:48:25 +0200 Subject: [PATCH] Update Releases class, controllers and API responses --- Blacklight/ReleaseSearch.php | 12 +- Blacklight/Releases.php | 624 +++++++++++--------- Blacklight/http/API.php | 12 +- Blacklight/http/XML_Response.php | 116 ++-- Changelog | 2 + app/Http/Controllers/AdultController.php | 2 +- app/Http/Controllers/Api/ApiController.php | 10 +- app/Http/Controllers/BasePageController.php | 8 +- app/Http/Controllers/BooksController.php | 2 +- app/Http/Controllers/BrowseController.php | 6 +- app/Http/Controllers/ConsoleController.php | 2 +- app/Http/Controllers/GamesController.php | 2 +- app/Http/Controllers/MovieController.php | 2 +- app/Http/Controllers/MusicController.php | 2 +- app/Http/Controllers/SearchController.php | 11 +- app/Http/Controllers/SeriesController.php | 3 +- composer.lock | 75 ++- resources/views/themes/Charisma/search.tpl | 114 ++-- resources/views/themes/Gentele/search.tpl | 118 ++-- resources/views/themes/Omicron/search.tpl | 118 ++-- 20 files changed, 665 insertions(+), 576 deletions(-) diff --git a/Blacklight/ReleaseSearch.php b/Blacklight/ReleaseSearch.php index d61ffd318..dc0b35015 100755 --- a/Blacklight/ReleaseSearch.php +++ b/Blacklight/ReleaseSearch.php @@ -48,16 +48,14 @@ class ReleaseSearch * * @param array $options Array where keys are the column name, and value is the search string. * - * @param null $query - * @param bool $builder * * @return string|\Illuminate\Database\Query\Builder */ - public function getSearchSQL(array $options = [], $query = null, $builder = false) + public function getSearchSQL(array $options = []) { $this->searchOptions = $options; - return $this->sphinxSQL($query, $builder); + return $this->sphinxSQL(); } /** @@ -75,7 +73,7 @@ class ReleaseSearch * * @return string */ - private function sphinxSQL($query = null, $builder = false) + private function sphinxSQL() { $searchQuery = $fullReturn = ''; @@ -97,10 +95,6 @@ class ReleaseSearch } } if ($searchQuery !== '') { - if ($builder === true) { - return $query->whereRaw(sprintf("(rse.query = '@@relaxed %s')", trim($searchQuery).$this->sphinxQueryOpt)); - } - $fullReturn = sprintf("AND (rse.query = '@@relaxed %s')", trim($searchQuery).$this->sphinxQueryOpt); } diff --git a/Blacklight/Releases.php b/Blacklight/Releases.php index 3a0387dd9..0bb82d26c 100755 --- a/Blacklight/Releases.php +++ b/Blacklight/Releases.php @@ -558,29 +558,29 @@ class Releases /** * Function for searching on the site (by subject, searchname or advanced). * - * - * - * @param $searchName - * @param $usenetName - * @param $posterName - * @param $fileName - * @param $groupName - * @param $sizeFrom - * @param $sizeTo - * @param $hasNfo - * @param $hasComments - * @param $daysNew - * @param $daysOld + * @param string|int $searchName + * @param string|int $usenetName + * @param string|int $posterName + * @param string|int $fileName + * @param string|int $groupName + * @param int $sizeFrom + * @param int $sizeTo + * @param int $hasNfo + * @param int $hasComments + * @param int $daysNew + * @param int $daysOld + * @param int $offset + * @param int $limit * @param string|array $orderBy - * @param int $maxAge - * @param array $excludedCats + * @param int $maxAge + * @param int|array $excludedCats * @param string $type - * @param array $cat - * @param int $minSize + * @param array $cat * - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|mixed + * @param int $minSize + * @return array */ - public function search($searchName, $usenetName, $posterName, $fileName, $groupName, $sizeFrom, $sizeTo, $hasNfo, $hasComments, $daysNew, $daysOld, $orderBy = '', $maxAge = -1, array $excludedCats = [], $type = 'basic', array $cat = [-1], $minSize = 0) + public function search($searchName, $usenetName, $posterName, $fileName, $groupName, $sizeFrom, $sizeTo, $hasNfo, $hasComments, $daysNew, $daysOld, $offset = 0, $limit = 1000, $orderBy = '', $maxAge = -1, array $excludedCats = [], $type = 'basic', array $cat = [-1], $minSize = 0): array { $sizeRange = [ 1 => 1, @@ -595,15 +595,13 @@ class Releases 10 => 320, 11 => 640, ]; - if ($orderBy === '') { $orderBy = []; - $orderBy[0] = 'postdate'; - $orderBy[1] = 'desc'; + $orderBy[0] = 'postdate '; + $orderBy[1] = 'desc '; } else { $orderBy = $this->getBrowseOrder($orderBy); } - $searchOptions = []; if ($searchName !== -1) { $searchOptions['searchname'] = $searchName; @@ -617,122 +615,143 @@ class Releases if ($fileName !== -1) { $searchOptions['filename'] = $fileName; } - - return Release::query() - ->remember(config('nntmux.cache_expiry_medium')) - ->fromSub(function ($query) use ($maxAge, $groupName, $sizeFrom, $sizeRange, $sizeTo, $hasNfo, $hasComments, $cat, $excludedCats, $type, $daysNew, $daysOld, $searchOptions, $minSize) { - self::showPasswords($query, true); - $query->where('r.nzbstatus', '=', NZB::NZB_ADDED); - - if ($maxAge > 0) { - $query->where('r.postdate', '>', Carbon::now()->subDays($maxAge)); - } - - if ((int) $groupName !== -1) { - $query->where('r.groups_id', '=', Group::getIDByName($groupName)); - } - - if (array_key_exists($sizeFrom, $sizeRange)) { - $query->where('r.size', '<', (string) (104857600 * (int) $sizeRange[$sizeTo])); - } - - if ((int) $hasNfo !== 0) { - $query->where('r.nfostatus', '=', 1); - } - - if ((int) $hasComments !== 0) { - $query->where('r.comments', '>', 0); - } - - if ($type === 'basic') { - Category::getCategorySearch($cat, $query, true); - } elseif ($type === 'advanced' && (int) $cat[0] !== -1) { - $query->where('r.categories_id', '=', $cat[0]); - } - - if ((int) $daysNew !== -1) { - $query->where('r.postdate', '<', Carbon::now()->subDays($daysNew)); - } - - if ((int) $daysOld !== -1) { - $query->where('r.postdate', '>', Carbon::now()->subDays($daysOld)); - } - - if (\count($excludedCats) > 0) { - $query->whereNotIn('r.categories_id', $excludedCats); - } - - if (\count($searchOptions) > 0) { - $this->releaseSearch->getSearchSQL($searchOptions, $query, true); - } - - if ($minSize > 0) { - $query->where('r.size', '>=', $minSize); - } - $query->select(['r.*', 'r.categories_id AS category_ids', 'df.failed as failed', 'g.name as group_name', 'rn.releases_id as nfoid', 're.releases_id as reid', 'cp.id as categoryparentid', 'v.tvdb', 'v.trakt', 'v.tvrage', 'v.tvmaze', 'v.imdb', 'v.tmdb', 'tve.firstaired', DB::raw("CONCAT(cp.title, ' > ', c.title) AS category_name")]) - ->from('releases as r') - ->leftJoin('video_data as re', 're.releases_id', '=', 'r.id') - ->leftJoin('videos as v', 'v.id', '=', 'r.videos_id') - ->leftJoin('tv_episodes as tve', 'tve.id', '=', 'r.tv_episodes_id') - ->leftJoin('release_nfos as rn', 'rn.releases_id', '=', 'r.id') - ->leftJoin('groups as g', 'g.id', '=', 'r.groups_id') - ->leftJoin('categories as c', 'c.id', '=', 'r.categories_id') - ->leftJoin('categories as cp', 'cp.id', '=', 'c.parentid') - ->leftJoin('dnzb_failures as df', 'df.release_id', '=', 'r.id') - ->join('releases_se as rse', 'rse.id', '=', 'r.id'); - }, 'r') - ->orderBy('r.'.$orderBy[0], $orderBy[1]) - ->paginate(config('nntmux.items_per_page')); + $catQuery = ''; + if ($type === 'basic') { + $catQuery = Category::getCategorySearch($cat); + } elseif ($type === 'advanced' && (int) $cat[0] !== -1) { + $catQuery = sprintf('AND r.categories_id = %d', $cat[0]); + } + $whereSql = sprintf( + '%s WHERE r.passwordstatus %s AND r.nzbstatus = %d %s %s %s %s %s %s %s %s %s %s %s %s', + $this->releaseSearch->getFullTextJoinString(), + $this->showPasswords, + NZB::NZB_ADDED, + ($maxAge > 0 ? sprintf(' AND r.postdate > (NOW() - INTERVAL %d DAY) ', $maxAge) : ''), + ((int) $groupName !== -1 ? sprintf(' AND r.groups_id = %d ', Group::getIDByName($groupName)) : ''), + (array_key_exists($sizeFrom, $sizeRange) ? ' AND r.size > '.(string) (104857600 * (int) $sizeRange[$sizeFrom]).' ' : ''), + (array_key_exists($sizeTo, $sizeRange) ? ' AND r.size < '.(string) (104857600 * (int) $sizeRange[$sizeTo]).' ' : ''), + ((int) $hasNfo !== 0 ? ' AND r.nfostatus = 1 ' : ''), + ((int) $hasComments !== 0 ? ' AND r.comments > 0 ' : ''), + $catQuery, + ((int) $daysNew !== -1 ? sprintf(' AND r.postdate < (NOW() - INTERVAL %d DAY) ', $daysNew) : ''), + ((int) $daysOld !== -1 ? sprintf(' AND r.postdate > (NOW() - INTERVAL %d DAY) ', $daysOld) : ''), + (\count($excludedCats) > 0 ? ' AND r.categories_id NOT IN ('.implode(',', $excludedCats).')' : ''), + (\count($searchOptions) > 0 ? $this->releaseSearch->getSearchSQL($searchOptions) : ''), + ($minSize > 0 ? sprintf('AND r.size >= %d', $minSize) : '') + ); + $baseSql = sprintf( + "SELECT r.*, + CONCAT(cp.title, ' > ', c.title) AS category_name, + %s AS category_ids, + df.failed AS failed, + g.name AS group_name, + rn.releases_id AS nfoid, + re.releases_id AS reid, + cp.id AS categoryparentid, + v.tvdb, v.trakt, v.tvrage, v.tvmaze, v.imdb, v.tmdb, + tve.firstaired + FROM releases r + LEFT OUTER JOIN video_data re ON re.releases_id = r.id + LEFT OUTER JOIN videos v ON r.videos_id = v.id + LEFT OUTER JOIN tv_episodes tve ON r.tv_episodes_id = tve.id + LEFT OUTER JOIN release_nfos rn ON rn.releases_id = r.id + LEFT JOIN groups g ON g.id = r.groups_id + LEFT JOIN categories c ON c.id = r.categories_id + LEFT JOIN categories cp ON cp.id = c.parentid + LEFT OUTER JOIN dnzb_failures df ON df.release_id = r.id + %s", + $this->getConcatenatedCategoryIDs(), + $whereSql + ); + $sql = sprintf( + 'SELECT * FROM ( + %s + ) r + ORDER BY r.%s %s + LIMIT %d OFFSET %d', + $baseSql, + $orderBy[0], + $orderBy[1], + $limit, + $offset + ); + $releases = Cache::get(md5($sql)); + if ($releases !== null) { + return $releases; + } + $releases = DB::select($sql); + if (! empty($releases) && \count($releases) > 0) { + $releases['_totalrows'] = $this->getPagerCount($baseSql); + } + $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_medium')); + Cache::put(md5($sql), $releases, $expiresAt); + return $releases; } - /** - * @param $page - * @param array $siteIdArr - * @param string $series - * @param string $episode - * @param string $airdate - * @param int $limit - * @param string $name - * @param array $cat - * @param int $maxAge - * @param int $minSize - * - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|mixed - * @throws \Exception - */ - public function tvSearch($page, array $siteIdArr = [], $series = '', $episode = '', $airdate = '', $limit = 100, $name = '', array $cat = [-1], $maxAge = -1, $minSize = 0) - { - $show = null; - $showQry = Video::query()->where(function ($query) use ($siteIdArr) { - if (\is_array($siteIdArr) && ! empty($siteIdArr)) { - foreach ($siteIdArr as $column => $Id) { - if ($Id > 0) { - $query->orWhere('v.'.$column, $Id); - } + /** + * Search TV Shows via the API. + * + * @param array $siteIdArr Array containing all possible TV Processing site IDs desired + * @param string $series The series or season number requested + * @param string $episode The episode number requested + * @param string $airdate The airdate of the episode requested + * @param int $offset Skip this many releases + * @param int $limit Return this many releases + * @param string $name The show name to search + * @param array $cat The category to search + * @param int $maxAge The maximum age of releases to be returned + * @param int $minSize The minimum size of releases to be returned + * + * @return array + */ + public function tvSearch(array $siteIdArr = [], $series = '', $episode = '', $airdate = '', $offset = 0, $limit = 100, $name = '', array $cat = [-1], $maxAge = -1, $minSize = 0): array { + $siteSQL = []; + $showSql = ''; + if (\is_array($siteIdArr)) { + foreach ($siteIdArr as $column => $Id) { + if ($Id > 0) { + $siteSQL[] = sprintf('v.%s = %d', $column, $Id); } } - })->from('videos as v')->leftJoin('tv_episodes as tve', 'v.id', '=', 'tve.videos_id')->select([ - 'v.id as video', - DB::raw("GROUP_CONCAT(tve.id SEPARATOR ',') AS episodes"), - ]); - - if ($series !== '') { - $showQry->where('tve.series', (int) preg_replace('/^s0*/i', '', $series)); } - - if ($episode !== '') { - $showQry->where('tve.episode', (int) preg_replace('/^e0*/i', '', $episode)); + if (\count($siteSQL) > 0) { + // If we have show info, find the Episode ID/Video ID first to avoid table scans + $showQry = sprintf( + " + SELECT + v.id AS video, + GROUP_CONCAT(tve.id SEPARATOR ',') AS episodes + FROM videos v + LEFT JOIN tv_episodes tve ON v.id = tve.videos_id + WHERE (%s) %s %s %s + GROUP BY v.id", + implode(' OR ', $siteSQL), + ($series !== '' ? sprintf('AND tve.series = %d', (int) preg_replace('/^s0*/i', '', $series)) : ''), + ($episode !== '' ? sprintf('AND tve.episode = %d', (int) preg_replace('/^e0*/i', '', $episode)) : ''), + ($airdate !== '' ? sprintf('AND DATE(tve.firstaired) = %s', $this->pdo->escapeString($airdate)) : '') + ); + $show = $this->pdo->queryOneRow($showQry); + if ($show !== false) { + if ((! empty($series) || ! empty($episode) || ! empty($airdate)) && strlen((string) $show['episodes']) > 0) { + $showSql = sprintf('AND r.tv_episodes_id IN (%s)', $show['episodes']); + } elseif ((int) $show['video'] > 0) { + $showSql = 'AND r.videos_id = '.$show['video']; + // If $series is set but episode is not, return Season Packs only + if (! empty($series) && empty($episode)) { + $showSql .= ' AND r.tv_episodes_id = 0'; + } + } else { + // If we were passed Episode Info and no match was found, do not run the query + return []; + } + } else { + // If we were passed Site ID Info and no match was found, do not run the query + return []; + } } - - if ($airdate !== '') { - $showQry->whereDate('tve.firstaired', $airdate); - } - - $show = $showQry->first(); - // If $name is set it is a fallback search, add available SxxExx/airdate info to the query - if (! empty($name)) { + if (! empty($name) && $showSql === '') { if (! empty($series) && (int) $series < 1900) { $name .= sprintf(' S%s', str_pad($series, 2, '0', STR_PAD_LEFT)); if (! empty($episode) && strpos($episode, '/') === false) { @@ -742,185 +761,190 @@ class Releases $name .= sprintf(' %s', str_replace(['/', '-', '.', '_'], ' ', $airdate)); } } - - $query = Release::query() - ->remember(config('nntmux.cache_expiry_medium')) - ->where('r.nzbstatus', NZB::NZB_ADDED); - self::showPasswords($query, true); - if ($show !== null) { - if ((! empty($series) || ! empty($episode) || ! empty($airdate)) && \strlen((string) $show['episodes']) > 0) { - $query->whereIn('r.tv_episodes_id', $show['episodes']); - } elseif ((int) $show['video'] > 0) { - $query->where('r.videos_id', $show['video']); - // If $series is set but episode is not, return Season Packs only - if (! empty($series) && empty($episode)) { - $query->where('r.tv_epsiodes_id', '=', 0); - } - } + $whereSql = sprintf( + '%s + WHERE r.nzbstatus = %d + AND r.passwordstatus %s + %s %s %s %s %s', + ($name !== '' ? $this->releaseSearch->getFullTextJoinString() : ''), + NZB::NZB_ADDED, + $this->showPasswords, + $showSql, + ($name !== '' ? $this->releaseSearch->getSearchSQL(['searchname' => $name]) : ''), + Category::getCategorySearch($cat), + ($maxAge > 0 ? sprintf('AND r.postdate > NOW() - INTERVAL %d DAY', $maxAge) : ''), + ($minSize > 0 ? sprintf('AND r.size >= %d', $minSize) : '') + ); + $baseSql = sprintf( + "SELECT r.*, + v.title, v.countries_id, v.started, v.tvdb, v.trakt, + v.imdb, v.tmdb, v.tvmaze, v.tvrage, v.source, + tvi.summary, tvi.publisher, tvi.image, + tve.series, tve.episode, tve.se_complete, tve.title, tve.firstaired, tve.summary, + CONCAT(cp.title, ' > ', c.title) AS category_name, + %s AS category_ids, + g.name AS group_name, + rn.releases_id AS nfoid, + re.releases_id AS reid + FROM releases r + LEFT OUTER JOIN videos v ON r.videos_id = v.id AND v.type = 0 + LEFT OUTER JOIN tv_info tvi ON v.id = tvi.videos_id + LEFT OUTER JOIN tv_episodes tve ON r.tv_episodes_id = tve.id + LEFT JOIN categories c ON c.id = r.categories_id + LEFT JOIN categories cp ON cp.id = c.parentid + LEFT JOIN groups g ON g.id = r.groups_id + LEFT OUTER JOIN video_data re ON re.releases_id = r.id + LEFT OUTER JOIN release_nfos rn ON rn.releases_id = r.id + %s", + $this->getConcatenatedCategoryIDs(), + $whereSql + ); + $sql = sprintf( + '%s + ORDER BY postdate DESC + LIMIT %d OFFSET %d', + $baseSql, + $limit, + $offset + ); + $releases = Cache::get(md5($sql)); + if ($releases !== null) { + return $releases; } - $query->select( - [ - 'r.*', - 'v.title', - 'v.countries_id', - 'v.started', - 'v.tvdb', - 'v.trakt', - 'v.imdb', - 'v.tmdb', - 'v.tvmaze', - 'v.tvrage', - 'v.source', - 'tvi.summary', - 'tvi.publisher', - 'tvi.image', - 'tve.series', - 'tve.episode', - 'tve.se_complete', - 'tve.title', - 'tve.firstaired', - 'tve.summary', - DB::raw("CONCAT(cp.title, ' > ', c.title) AS category_name"), - 'g.name as group_name', - 'rn.releases_id as nfoid', - 're.releases_id as reid', - ] - ) - ->from('releases as r') - ->leftJoin('videos as v', function ($query) { - $query->on('v.id', '=', 'r.videos_id') - ->where('v.type', '=', 0); - }) - ->leftJoin('tv_info as tvi', 'tvi.videos_id', '=', 'v.id') - ->leftJoin('tv_episodes as tve', 'tve.id', '=', 'r.tv_episodes_id') - ->leftJoin('categories as c', 'c.id', '=', 'r.categories_id') - ->leftJoin('categories as cp', 'cp.id', '=', 'c.parentid') - ->leftJoin('groups as g', 'g.id', '=', 'r.groups_id') - ->leftJoin('video_data as re', 're.releases_id', '=', 'r.id') - ->leftJoin('release_nfos as rn', 'rn.releases_id', '=', 'r.id'); - - if ($name !== '') { - $this->releaseSearch->getSearchSQL(['searchname' => $name], $query, true); - $query->join('releases_se as rse', 'rse.id', '=', 'r.id'); + $releases = DB::select($sql); + if (! empty($releases) && \count($releases) > 0) { + $releases['_totalrows'] = $this->getPagerCount( + preg_replace('#LEFT(\s+OUTER)?\s+JOIN\s+(?!tv_episodes)\s+.*ON.*=.*\n#i', ' ', $baseSql) + ); } - - Category::getCategorySearch($cat, $query, true); - - if ($maxAge > 0) { - $query->where('r.postdate', '>', Carbon::now()->subDays($maxAge)); - } - - if ($minSize > 0) { - $query->where('r.size', '>=', $minSize); - } - - $query->orderByDesc('r.postdate')->limit($limit); - - return $query->paginate(config('nntmux.items_per_page')); + $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_medium')); + Cache::put(md5($sql), $releases, $expiresAt); + return $releases; } - /** * @param $aniDbID + * @param int $offset * @param int $limit * @param string $name * @param array $cat * @param int $maxAge * - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|mixed - * @throws \Exception + * @return array */ - public function animeSearch($aniDbID, $limit = 100, $name = '', array $cat = [-1], $maxAge = -1) + public function animeSearch($aniDbID, $offset = 0, $limit = 100, $name = '', array $cat = [-1], $maxAge = -1): array { - $query = Release::query()->remember(config('nntmux.cache_expiry_medium'))->where('r.nzbstatus', NZB::NZB_ADDED); - if ($name !== '') { - $query->join('releases_se as rse', 'rse.id', '=', 'r.id'); - $this->releaseSearch->getSearchSQL(['searchname' => $name], $query, true); + $whereSql = sprintf( + '%s + WHERE r.passwordstatus %s + AND r.nzbstatus = %d + %s %s %s %s', + ($name !== '' ? $this->releaseSearch->getFullTextJoinString() : ''), + $this->showPasswords, + NZB::NZB_ADDED, + ($aniDbID > -1 ? sprintf(' AND r.anidbid = %d ', $aniDbID) : ''), + ($name !== '' ? $this->releaseSearch->getSearchSQL(['searchname' => $name]) : ''), + Category::getCategorySearch($cat), + ($maxAge > 0 ? sprintf(' AND r.postdate > NOW() - INTERVAL %d DAY ', $maxAge) : '') + ); + $baseSql = sprintf( + "SELECT r.*, + CONCAT(cp.title, ' > ', c.title) AS category_name, + %s AS category_ids, + g.name AS group_name, + rn.releases_id AS nfoid, + re.releases_id AS reid + FROM releases r + LEFT JOIN categories c ON c.id = r.categories_id + LEFT JOIN categories cp ON cp.id = c.parentid + LEFT JOIN groups g ON g.id = r.groups_id + LEFT OUTER JOIN release_nfos rn ON rn.releases_id = r.id + LEFT OUTER JOIN releaseextrafull re ON re.releases_id = r.id + %s", + $this->getConcatenatedCategoryIDs(), + $whereSql + ); + $sql = sprintf( + '%s + ORDER BY postdate DESC + LIMIT %d OFFSET %d', + $baseSql, + $limit, + $offset + ); + $releases = Cache::get(md5($sql)); + if ($releases !== null) { + return $releases; } - - if ($aniDbID > -1) { - $query->where('r.anidbid', $aniDbID); + $releases = DB::select($sql); + if (! empty($releases) && \count($releases) > 0) { + $releases['_totalrows'] = $this->getPagerCount($baseSql); } - - self::showPasswords($query, true); - Category::getCategorySearch($cat, $query, true); - - if ($maxAge > 0) { - $query->where('r.postdate', '>', Carbon::now()->subDays($maxAge)); - } - - $query->select( - [ - 'r.*', - DB::raw("CONCAT(cp.title, ' > ', c.title) as category_name"), - 'g.name as group_name', - 'rn.releases_id as nfoid', - 're.releases_id as reid', - ] - ) - ->from('releases as r') - ->leftJoin('categories as c', 'c.id', '=', 'r.categories_id') - ->leftJoin('categories as cp', 'cp.id', '=', 'c.parentid') - ->leftJoin('groups as g', 'g.id', '=', 'r.groups_id') - ->leftJoin('release_nfos as rn', 'rn.releases_id', '=', 'r.id') - ->leftJoin('releaseextrafull as re', 're.releases_id', '=', 'r.id') - ->orderByDesc('r.postdate') - ->limit($limit); - - return $query->paginate(config('nntmux.items_per_page')); + $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_medium')); + Cache::put(md5($sql), $releases, $expiresAt); + return $releases; } - /** - * @param $imDbId - * @param int $limit + * @param int $imDbId + * @param int $offset + * @param int $limit * @param string $name - * @param array $cat - * @param int $maxAge - * @param int $minSize + * @param array $cat + * @param int $maxAge + * @param int $minSize * - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|mixed - * @throws \Exception + * @return array */ - public function moviesSearch($imDbId, $limit = 100, $name = '', array $cat = [-1], $maxAge = -1, $minSize = 0) + public function moviesSearch($imDbId, $offset = 0, $limit = 100, $name = '', array $cat = [-1], $maxAge = -1, $minSize = 0): array { - $query = Release::query()->remember(config('nntmux.cache_expiry_medium'))->where('r.nzbstatus', NZB::NZB_ADDED) - ->whereBetween('r.categories_id', [Category::MOVIE_ROOT, Category::MOVIE_OTHER]); - if ($name !== '') { - $query->join('releases_se as rse', 'rse.id', '=', 'r.id'); - $this->releaseSearch->getSearchSQL(['searchname' => $name], $query, true); + $whereSql = sprintf( + '%s + WHERE r.categories_id BETWEEN '.Category::MOVIE_ROOT.' AND '.Category::MOVIE_OTHER.' + AND r.nzbstatus = %d + AND r.passwordstatus %s + %s %s %s %s %s', + ($name !== '' ? $this->releaseSearch->getFullTextJoinString() : ''), + NZB::NZB_ADDED, + $this->showPasswords, + ($name !== '' ? $this->releaseSearch->getSearchSQL(['searchname' => $name]) : ''), + (($imDbId !== -1 && is_numeric($imDbId)) ? sprintf(' AND imdbid = %d ', str_pad($imDbId, 7, '0', STR_PAD_LEFT)) : ''), + Category::getCategorySearch($cat), + ($maxAge > 0 ? sprintf(' AND r.postdate > NOW() - INTERVAL %d DAY ', $maxAge) : ''), + ($minSize > 0 ? sprintf('AND r.size >= %d', $minSize) : '') + ); + $baseSql = sprintf( + "SELECT r.*, + concat(cp.title, ' > ', c.title) AS category_name, + %s AS category_ids, + g.name AS group_name, + rn.releases_id AS nfoid + FROM releases r + LEFT JOIN groups g ON g.id = r.groups_id + LEFT JOIN categories c ON c.id = r.categories_id + LEFT JOIN categories cp ON cp.id = c.parentid + LEFT OUTER JOIN release_nfos rn ON rn.releases_id = r.id + %s", + $this->getConcatenatedCategoryIDs(), + $whereSql + ); + $sql = sprintf( + '%s + ORDER BY postdate DESC + LIMIT %d OFFSET %d', + $baseSql, + $limit, + $offset + ); + $releases = Cache::get(md5($sql)); + if ($releases !== null) { + return $releases; } - - if ($imDbId !== -1) { - $query->where('r.imdbid', str_pad($imDbId, 7, '0', STR_PAD_LEFT)); + $releases = DB::select($sql); + if (! empty($releases) && \count($releases) > 0) { + $releases['_totalrows'] = $this->getPagerCount($baseSql); } - - self::showPasswords($query, true); - Category::getCategorySearch($cat, $query, true); - - if ($maxAge > 0) { - $query->where('r.postdate', '>', Carbon::now()->subDays($maxAge)); - } - - if ($minSize > 0) { - $query->where('r.size', '>=', $minSize); - } - - $query->select( - [ - 'r.*', - DB::raw("CONCAT(cp.title, ' > ', c.title) as category_name"), - 'g.name as group_name', - 'rn.releases_id as nfoid', - ] - ) - ->from('releases as r') - ->leftJoin('categories as c', 'c.id', '=', 'r.categories_id') - ->leftJoin('categories as cp', 'cp.id', '=', 'c.parentid') - ->leftJoin('groups as g', 'g.id', '=', 'r.groups_id') - ->leftJoin('release_nfos as rn', 'rn.releases_id', '=', 'r.id') - ->orderByDesc('r.postdate') - ->limit($limit); - - return $query->paginate(config('nntmux.items_per_page')); + $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_medium')); + Cache::put(md5($sql), $releases, $expiresAt); + return $releases; } /** @@ -1000,4 +1024,28 @@ class Releases return $zipFile->file(); } + + /** + * Get count of releases for pager. + * + * @param string $query The query to get the count from. + * + * @return int + */ + private function getPagerCount($query): int + { + $sql = sprintf( + 'SELECT COUNT(z.id) AS count FROM (%s LIMIT %s) z', + preg_replace('/SELECT.+?FROM\s+releases/is', 'SELECT r.id FROM releases', $query), + config('nntmux.max_pager_results') + ); + $count = Cache::get(md5($sql)); + if ($count !== null) { + return $count; + } + $count = DB::select($sql); + $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_short')); + Cache::put(md5($sql), $count[0]->count, $expiresAt); + return $count[0]->count ?? 0; + } } diff --git a/Blacklight/http/API.php b/Blacklight/http/API.php index 35c5ec6a4..e2a58b481 100755 --- a/Blacklight/http/API.php +++ b/Blacklight/http/API.php @@ -60,10 +60,10 @@ class API extends Capabilities { if ($releases && \count($releases)) { foreach ($releases as $key => $release) { - if (isset($release['id'])) { - $language = AudioData::query()->where('releases_id', $release['id'])->first(['audiolanguage']); + if (isset($release->id)) { + $language = AudioData::query()->where('releases_id', $release->id)->first(['audiolanguage']); if ($language !== null) { - $releases[$key]['searchname'] = $releases[$key]['searchname'].' '.$language['audiolanguage']; + $releases[$key]->searchname = $releases[$key]->searchname.' '.$language['audiolanguage']; } } } @@ -177,8 +177,10 @@ class API extends Capabilities { if ($releases && \count($releases)) { foreach ($releases as $key => $release) { - $coverURL = $getCoverURL($release); - $releases[$key]['coverurl'] = $coverURL; + if (isset($release->id)) { + $coverURL = $getCoverURL($release); + $releases[$key]->coverurl = $coverURL; + } } } } diff --git a/Blacklight/http/XML_Response.php b/Blacklight/http/XML_Response.php index 3db92d1aa..07d279191 100755 --- a/Blacklight/http/XML_Response.php +++ b/Blacklight/http/XML_Response.php @@ -348,8 +348,8 @@ class XML_Response { if ($this->releases instanceof LengthAwarePaginator) { $total = $this->releases->total(); - } elseif (isset($this->releases[0]['_totalrows'])) { - $total = $this->releases[0]['_totalrows']; + } elseif (isset($this->releases[0]->_totalrows)) { + $total = $this->releases[0]->_totalrows; } else { $total = 0; } @@ -366,10 +366,12 @@ class XML_Response { if (! empty($this->releases)) { foreach ($this->releases as $this->release) { - $this->xml->startElement('item'); - $this->includeReleaseMain(); - $this->setZedAttributes(); - $this->xml->endElement(); + if (isset($this->release->id)) { + $this->xml->startElement('item'); + $this->includeReleaseMain(); + $this->setZedAttributes(); + $this->xml->endElement(); + } } } } @@ -379,22 +381,22 @@ class XML_Response */ public function includeReleaseMain(): void { - $this->xml->writeElement('title', $this->release['searchname']); + $this->xml->writeElement('title', $this->release->searchname); $this->xml->startElement('guid'); $this->xml->writeAttribute('isPermaLink', 'true'); - $this->xml->text("{$this->server['server']['url']}details/{$this->release['guid']}"); + $this->xml->text("{$this->server['server']['url']}details/{$this->release->guid}"); $this->xml->endElement(); $this->xml->writeElement( 'link', - "{$this->server['server']['url']}getnzb?id={$this->release['guid']}.nzb". + "{$this->server['server']['url']}getnzb?id={$this->release->guid}.nzb". "&i={$this->parameters['uid']}"."&r={$this->parameters['token']}". ((int) $this->parameters['del'] === 1 ? '&del=1' : '') ); - $this->xml->writeElement('comments', "{$this->server['server']['url']}details/{$this->release['guid']}#comments"); - $this->xml->writeElement('pubDate', date(DATE_RSS, strtotime($this->release['adddate']))); - $this->xml->writeElement('category', $this->release['category_name']); + $this->xml->writeElement('comments', "{$this->server['server']['url']}details/{$this->release->guid}#comments"); + $this->xml->writeElement('pubDate', date(DATE_RSS, strtotime($this->release->adddate))); + $this->xml->writeElement('category', $this->release->category_name); if ($this->namespace === 'newznab') { - $this->xml->writeElement('description', $this->release['searchname']); + $this->xml->writeElement('description', $this->release->searchname); } else { $this->writeRssCdata(); } @@ -402,11 +404,11 @@ class XML_Response $this->xml->startElement('enclosure'); $this->xml->writeAttribute( 'url', - "{$this->server['server']['url']}getnzb?id={$this->release['guid']}.nzb". + "{$this->server['server']['url']}getnzb?id={$this->release->guid}.nzb". "&i={$this->parameters['uid']}"."&r={$this->parameters['token']}". ((int) $this->parameters['del'] === 1 ? '&del=1' : '') ); - $this->xml->writeAttribute('length', $this->release['size']); + $this->xml->writeAttribute('length', $this->release->size); $this->xml->writeAttribute('type', 'application/x-nzb'); $this->xml->endElement(); } @@ -417,45 +419,45 @@ class XML_Response */ protected function setZedAttributes(): void { - $this->writeZedAttr('category', $this->release['categories_id']); - $this->writeZedAttr('size', $this->release['size']); - if (isset($this->release['coverurl']) && ! empty($this->release['coverurl'])) { + $this->writeZedAttr('category', $this->release->categories_id); + $this->writeZedAttr('size', $this->release->size); + if (isset($this->release->coverurl) && ! empty($this->release->coverurl)) { $this->writeZedAttr( 'coverurl', - $this->server['server']['url']."covers/{$this->release['coverurl']}" + $this->server['server']['url']."covers/{$this->release->coverurl}" ); } if ((int) $this->parameters['extended'] === 1) { - $this->writeZedAttr('files', $this->release['totalpart']); - $this->writeZedAttr('poster', $this->release['fromname']); - if (($this->release['videos_id'] > 0 || $this->release['tv_episodes_id'] > 0) && $this->namespace === 'newznab') { + $this->writeZedAttr('files', $this->release->totalpart); + $this->writeZedAttr('poster', $this->release->fromname); + if (($this->release->videos_id > 0 || $this->release->tv_episodes_id > 0) && $this->namespace === 'newznab') { $this->setTvAttr(); } - if (isset($this->release['imdbid']) && $this->release['imdbid'] > 0) { - $this->writeZedAttr('imdb', $this->release['imdbid']); + if (isset($this->release->imdbid) && $this->release->imdbid > 0) { + $this->writeZedAttr('imdb', $this->release->imdbid); } - if (isset($this->release['anidbid']) && $this->release['anidbid'] > 0) { - $this->writeZedAttr('anidbid', $this->release['anidbid']); + if (isset($this->release->anidbid) && $this->release->anidbid > 0) { + $this->writeZedAttr('anidbid', $this->release->anidbid); } - if (isset($this->release['predb_id']) && $this->release['predb_id'] > 0) { + if (isset($this->release->predb_id) && $this->release->predb_id > 0) { $this->writeZedAttr('prematch', 1); } - if (isset($this->release['nfostatus']) && (int) $this->release['nfostatus'] === 1) { + if (isset($this->release->nfostatus) && (int) $this->release->nfostatus === 1) { $this->writeZedAttr( 'info', $this->server['server']['url']. - "api?t=info&id={$this->release['guid']}&r={$this->parameters['token']}" + "api?t=info&id={$this->release->guid}&r={$this->parameters['token']}" ); } - $this->writeZedAttr('grabs', $this->release['grabs']); - $this->writeZedAttr('comments', $this->release['comments']); - $this->writeZedAttr('password', $this->release['passwordstatus']); - $this->writeZedAttr('usenetdate', date_format(date_create($this->release['postdate']), 'D, d M Y H:i:s O')); - if (! empty($this->release['group_name'])) { - $this->writeZedAttr('group', $this->release['group_name']); + $this->writeZedAttr('grabs', $this->release->grabs); + $this->writeZedAttr('comments', $this->release->comments); + $this->writeZedAttr('password', $this->release->passwordstatus); + $this->writeZedAttr('usenetdate', date_format(date_create($this->release->postdate), 'D, d M Y H:i:s O')); + if (! empty($this->release->group_name)) { + $this->writeZedAttr('group', $this->release->group_name); } } } @@ -465,36 +467,36 @@ class XML_Response */ protected function setTvAttr(): void { - if (! empty($this->release['title'])) { - $this->writeZedAttr('title', $this->release['title']); + if (! empty($this->release->title)) { + $this->writeZedAttr('title', $this->release->title); } - if (isset($this->release['series']) && $this->release['series'] > 0) { - $this->writeZedAttr('season', $this->release['series']); + if (isset($this->release->series) && $this->release->series > 0) { + $this->writeZedAttr('season', $this->release->series); } - if (isset($this->release['episode']) && $this->release['episode'] > 0) { - $this->writeZedAttr('episode', $this->release['episode']); + if (isset($this->release->episode) && $this->release->episode > 0) { + $this->writeZedAttr('episode', $this->release->episode); } - if (! empty($this->release['firstaired'])) { - $this->writeZedAttr('tvairdate', $this->release['firstaired']); + if (! empty($this->release->firstaired)) { + $this->writeZedAttr('tvairdate', $this->release->firstaired); } - if (isset($this->release['tvdb']) && $this->release['tvdb'] > 0) { - $this->writeZedAttr('tvdbid', $this->release['tvdb']); + if (isset($this->release->tvdb) && $this->release->tvdb > 0) { + $this->writeZedAttr('tvdbid', $this->release->tvdb); } - if (isset($this->release['trakt']) && $this->release['trakt'] > 0) { - $this->writeZedAttr('traktid', $this->release['trakt']); + if (isset($this->release->trakt) && $this->release->trakt > 0) { + $this->writeZedAttr('traktid', $this->release->trakt); } - if (isset($this->release['tvrage']) && $this->release['tvrage'] > 0) { - $this->writeZedAttr('tvrageid', $this->release['tvrage']); - $this->writeZedAttr('rageid', $this->release['tvrage']); + if (isset($this->release->tvrage) && $this->release->tvrage > 0) { + $this->writeZedAttr('tvrageid', $this->release->tvrage); + $this->writeZedAttr('rageid', $this->release->tvrage); } - if (isset($this->release['tvmaze']) && $this->release['tvmaze'] > 0) { - $this->writeZedAttr('tvmazeid', $this->release['tvmaze']); + if (isset($this->release->tvmaze) && $this->release->tvmaze > 0) { + $this->writeZedAttr('tvmazeid', $this->release->tvmaze); } - if (isset($this->release['imdb']) && $this->release['imdb'] > 0) { - $this->writeZedAttr('imdbid', str_pad($this->release['imdb'], 7, '0', STR_PAD_LEFT)); + if (isset($this->release->imdb) && $this->release->imdb > 0) { + $this->writeZedAttr('imdbid', str_pad($this->release->imdb, 7, '0', STR_PAD_LEFT)); } - if (isset($this->release['tmdb']) && $this->release['tmdb'] > 0) { - $this->writeZedAttr('tmdbid', $this->release['tmdb']); + if (isset($this->release->tmdb) && $this->release->tmdb > 0) { + $this->writeZedAttr('tmdbid', $this->release->tmdb); } } @@ -593,7 +595,7 @@ class XML_Response $this->writeRssConsoleInfo(); } $w->startElement('description'); - $w->writeCData($this->cdata."\t"); + $w->writeCdata($this->cdata."\t"); $w->endElement(); } diff --git a/Changelog b/Changelog index 969d660ed..8586e7463 100755 --- a/Changelog +++ b/Changelog @@ -1,3 +1,5 @@ +2018-05-14 DariusIII + * Chg: Update Releases class, controllers and API responses 2018-05-12 DariusIII * Chg: Use function to call paginator * Chg: Update Adult and Music pages diff --git a/app/Http/Controllers/AdultController.php b/app/Http/Controllers/AdultController.php index c412a3677..b3d3d124a 100644 --- a/app/Http/Controllers/AdultController.php +++ b/app/Http/Controllers/AdultController.php @@ -50,7 +50,7 @@ class AdultController extends BasePageController $page = $request->has('page') ? $request->input('page') : 1; $offset = ($page - 1) * config('nntmux.items_per_cover_page'); $rslt = $adult->getXXXRange($page, $catarray, $offset, config('nntmux.items_per_cover_page'), $orderby, -1, $this->userdata['categoryexclusions']); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url(), $request->query()); foreach ($results as $result) { if (! empty($result->id)) { $result->genre = makeFieldLinks((array) $result, 'genre', 'movies'); diff --git a/app/Http/Controllers/Api/ApiController.php b/app/Http/Controllers/Api/ApiController.php index 43f93ef37..70ffd1318 100644 --- a/app/Http/Controllers/Api/ApiController.php +++ b/app/Http/Controllers/Api/ApiController.php @@ -124,6 +124,7 @@ class ApiController extends BasePageController $groupName = $api->group(); UserRequest::addApiRequest($uid, $request->getRequestUri()); $categoryID = $api->categoryID(); + $limit = $api->limit(); if ($request->has('q')) { $relData = $releases->search( @@ -138,6 +139,7 @@ class ApiController extends BasePageController 0, -1, -1, + $limit, '', $maxAge, $catExclusions, @@ -147,7 +149,10 @@ class ApiController extends BasePageController ); } else { $relData = $releases->getBrowseRange( + 1, $categoryID, + $offset, + $limit, '', $maxAge, $catExclusions, @@ -192,11 +197,11 @@ class ApiController extends BasePageController } $relData = $releases->tvSearch( - 1, $siteIdArr, $series, $episode, $airdate ?? '', + $api->offset(), $api->limit(), $request->input('q') ?? '', $api->categoryID(), @@ -219,6 +224,7 @@ class ApiController extends BasePageController $relData = $releases->moviesSearch( $imdbId, + $api->offset(), $api->limit(), $request->input('q') ?? '', $api->categoryID(), @@ -229,7 +235,7 @@ class ApiController extends BasePageController $api->addCoverURL( $relData, function ($release) { - return Utility::getCoverURL(['type' => 'movies', 'id' => $release['imdbid']]); + return Utility::getCoverURL(['type' => 'movies', 'id' => $release->imdbid]); } ); diff --git a/app/Http/Controllers/BasePageController.php b/app/Http/Controllers/BasePageController.php index daca6d6c8..4eaff6f69 100644 --- a/app/Http/Controllers/BasePageController.php +++ b/app/Http/Controllers/BasePageController.php @@ -95,15 +95,17 @@ class BasePageController extends Controller /** * @param $query - * @param $totalcount + * @param $totalCount * @param $items * @param $page * @param $path + * @param $reqQuery + * * @return \Illuminate\Pagination\LengthAwarePaginator */ - public function paginate($query, $totalcount, $items, $page, $path) + public function paginate($query, $totalCount, $items, $page, $path, $reqQuery) { - return new LengthAwarePaginator($query, $totalcount, $items, $page, ['path' => $path]); + return new LengthAwarePaginator($query, $totalCount, $items, $page, ['path' => $path, 'query' => $reqQuery]); } /** diff --git a/app/Http/Controllers/BooksController.php b/app/Http/Controllers/BooksController.php index dbda38cfe..be1b1cbb4 100644 --- a/app/Http/Controllers/BooksController.php +++ b/app/Http/Controllers/BooksController.php @@ -53,7 +53,7 @@ class BooksController extends BasePageController $page = $request->has('page') ? $request->input('page') : 1; $offset = ($page - 1) * config('nntmux.items_per_cover_page'); $rslt = $book->getBookRange($page, $catarray, $offset, config('nntmux.items_per_cover_page'), $orderby, $this->userdata['categoryexclusions']); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url(), $request->query()); $maxwords = 50; foreach ($results as $result) { if (! empty($result->overview)) { diff --git a/app/Http/Controllers/BrowseController.php b/app/Http/Controllers/BrowseController.php index e429bcdee..24d8128c6 100644 --- a/app/Http/Controllers/BrowseController.php +++ b/app/Http/Controllers/BrowseController.php @@ -28,7 +28,7 @@ class BrowseController extends BasePageController $offset = ($page - 1) * config('nntmux.items_per_page'); $rslt = $releases->getBrowseRange($page, [-1], $offset, config('nntmux.items_per_page'), $orderby, -1, $this->userdata['categoryexclusions'], -1); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_page'), $page, request()->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_page'), $page, request()->url(), request()->query()); $this->smarty->assign('catname', 'All'); @@ -85,7 +85,7 @@ class BrowseController extends BasePageController $offset = ($page - 1) * config('nntmux.items_per_page'); $rslt = $releases->getBrowseRange($page, $catarray, $offset, config('nntmux.items_per_page'), $orderby, -1, $this->userdata['categoryexclusions'], $grp); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_page'), $page, request()->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_page'), $page, request()->url(), request()->query()); $this->smarty->assign('catname', $id); @@ -147,7 +147,7 @@ class BrowseController extends BasePageController $page = \request()->has('page') ? \request()->input('page') : 1; $offset = ($page - 1) * config('nntmux.items_per_page'); $rslt = $releases->getBrowseRange($page, [-1], $offset, config('nntmux.items_per_page'), '', -1, $this->userdata['categoryexclusions'], $group); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_page'), $page, request()->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_page'), $page, request()->url(), request()->query()); $this->smarty->assign('results', $results); $meta_title = 'Browse Groups'; $meta_keywords = 'browse,nzb,description,details'; diff --git a/app/Http/Controllers/ConsoleController.php b/app/Http/Controllers/ConsoleController.php index 2f41bcaba..7f39e54f2 100644 --- a/app/Http/Controllers/ConsoleController.php +++ b/app/Http/Controllers/ConsoleController.php @@ -53,7 +53,7 @@ class ConsoleController extends BasePageController $consoles = []; $rslt = $console->getConsoleRange($page, $catarray, $offset, config('nntmux.items_per_cover_page'), $orderby, $this->userdata['categoryexclusions']); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url(), $request->query()); $maxwords = 50; foreach ($results as $result) { diff --git a/app/Http/Controllers/GamesController.php b/app/Http/Controllers/GamesController.php index b02408969..d1e9c65b9 100644 --- a/app/Http/Controllers/GamesController.php +++ b/app/Http/Controllers/GamesController.php @@ -41,7 +41,7 @@ class GamesController extends BasePageController $orderby = request()->has('ob') && \in_array(request()->input('ob'), $ordering, false) ? request()->input('ob') : ''; $offset = ($page - 1) * config('nntmux.items_per_cover_page'); $rslt = $games->getGamesRange($page, $catarray, $offset, config('nntmux.items_per_cover_page'), $orderby, '', $this->userdata['categoryexclusions']); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url(), $request->query()); $title = ($request->has('title') && ! empty($request->input('title'))) ? stripslashes($request->input('title')) : ''; $this->smarty->assign('title', $title); diff --git a/app/Http/Controllers/MovieController.php b/app/Http/Controllers/MovieController.php index 9bb55a315..0b95d5b1c 100644 --- a/app/Http/Controllers/MovieController.php +++ b/app/Http/Controllers/MovieController.php @@ -108,7 +108,7 @@ class MovieController extends BasePageController $movies = []; $rslt = $movie->getMovieRange($page, $catarray, $offset, config('nntmux.items_per_cover_page'), $orderby, -1, $this->userdata['categoryexclusions']); - $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, $request->url(), $request->query()); foreach ($results as $result) { if (! empty($result->id)) { diff --git a/app/Http/Controllers/MusicController.php b/app/Http/Controllers/MusicController.php index 38b59c381..1bba5cce6 100644 --- a/app/Http/Controllers/MusicController.php +++ b/app/Http/Controllers/MusicController.php @@ -54,7 +54,7 @@ class MusicController extends BasePageController $musics = []; $rslt = $music->getMusicRange($page, $catarray, $offset, config('nntmux.items_per_cover_page'), $orderby, $this->userdata['categoryexclusions']); - $results = $this->paginate($rslt, $rslt['_totalcount'][0]->total, config('nntmux.items_per_cover_page'), $page, $request->url()); + $results = $this->paginate($rslt, $rslt['_totalcount'][0]->total, config('nntmux.items_per_cover_page'), $page, $request->url(), $request->query()); $artist = ($request->has('artist') && ! empty($request->input('artist'))) ? stripslashes($request->input('artist')) : ''; $this->smarty->assign('artist', $artist); diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 987122640..4a2b47e62 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -32,6 +32,8 @@ class SearchController extends BasePageController $ordering = $releases->getBrowseOrdering(); $orderBy = ($request->has('ob') && \in_array($request->input('ob'), $ordering, false) ? $request->input('ob') : ''); + $page = $request->has('page') ? $request->input('page') : 1; + $offset = ($page - 1) * config('nntmux.items_per_page'); $this->smarty->assign( [ @@ -63,7 +65,7 @@ class SearchController extends BasePageController ); } - $results = $releases->search( + $rslt = $releases->search( $searchString, -1, -1, @@ -75,6 +77,8 @@ class SearchController extends BasePageController 0, -1, -1, + $offset, + config('nntmux.items_per_page'), $orderBy, -1, $this->userdata['categoryexclusions'], @@ -82,6 +86,8 @@ class SearchController extends BasePageController $categoryID ); + $results = $this->paginate($rslt, $rslt['_totalrows'], config('nntmux.items_per_page'), $page, $request->url(), $request->query()); + $this->smarty->assign( [ 'lastvisit' => $this->userdata['lastlogin'], @@ -171,7 +177,8 @@ You can combine some of these rules, but not all.
'; -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', + 'results' => $results, + 'sadvanced' => $searchType !== 'basic', 'grouplist' => Group::getGroupsForSelect(), 'catlist' => Category::getForSelect(), 'search_description' => $search_description, diff --git a/app/Http/Controllers/SeriesController.php b/app/Http/Controllers/SeriesController.php index 1cca31b7a..aee1f8a94 100644 --- a/app/Http/Controllers/SeriesController.php +++ b/app/Http/Controllers/SeriesController.php @@ -35,8 +35,9 @@ class SeriesController extends BasePageController $catarray[] = $category; $page = $request->has('page') ? $request->input('page') : 1; + $offset = ($page - 1) * config('nntmux.items_per_page'); - $rel = $releases->tvSearch($page, ['id' => $id], '', '', '', 1000, '', $catarray, -1); + $rel = $releases->tvSearch(['id' => $id], '', '', '', $offset, 1000, '', $catarray, -1); $show = Video::getByVideoID($id); diff --git a/composer.lock b/composer.lock index 2f1e6caf4..d63bc5d25 100644 --- a/composer.lock +++ b/composer.lock @@ -312,7 +312,8 @@ "Gemfile.lock", "*.md" ] - } + }, + "time": "2016-06-06T17:37:52+00:00" }, { "name": "bower-asset/autosize", @@ -341,7 +342,8 @@ "form", "textarea", "ui" - ] + ], + "time": "2017-05-19T15:36:30+00:00" }, { "name": "bower-asset/bootstrap", @@ -390,7 +392,8 @@ "mobile-first", "responsive", "web" - ] + ], + "time": "2016-07-25T15:51:55+00:00" }, { "name": "bower-asset/bootstrap-3.x", @@ -439,7 +442,8 @@ "mobile-first", "responsive", "web" - ] + ], + "time": "2016-07-25T15:51:55+00:00" }, { "name": "bower-asset/bootstrap-datepicker", @@ -468,7 +472,8 @@ }, "license": [ "Apache-2.0" - ] + ], + "time": "2016-08-05T09:50:13+00:00" }, { "name": "bower-asset/bootstrap-hover-dropdown", @@ -498,7 +503,8 @@ "dropdowns", "hover", "twitter" - ] + ], + "time": "2015-12-01T23:35:57+00:00" }, { "name": "bower-asset/bootstrap-progressbar", @@ -532,7 +538,8 @@ }, "license": [ "MIT" - ] + ], + "time": "2015-05-15T18:56:17+00:00" }, { "name": "bower-asset/bootswatch", @@ -663,7 +670,8 @@ "modal", "popup", "ui" - ] + ], + "time": "2016-05-10T22:21:33+00:00" }, { "name": "bower-asset/datatables", @@ -711,7 +719,8 @@ "jquery", "library", "table" - ] + ], + "time": "2017-08-31T13:52:17+00:00" }, { "name": "bower-asset/fancybox", @@ -777,7 +786,8 @@ "tests", "examples" ] - } + }, + "time": "2015-01-26T21:19:01+00:00" }, { "name": "bower-asset/flexboxgrid", @@ -813,7 +823,8 @@ "css", "flexbox", "grid" - ] + ], + "time": "2016-08-14T16:43:18+00:00" }, { "name": "bower-asset/font-awesome", @@ -858,7 +869,8 @@ "src", "build.xml" ] - } + }, + "time": "2015-07-20T20:04:00+00:00" }, { "name": "bower-asset/icheck", @@ -908,7 +920,8 @@ "replacement", "skins", "ui" - ] + ], + "time": "2014-03-03T17:36:28+00:00" }, { "name": "bower-asset/jquery", @@ -971,7 +984,8 @@ "javascript", "jquery", "library" - ] + ], + "time": "2016-05-20T17:24:43+00:00" }, { "name": "bower-asset/jquery-3.2.x", @@ -1038,7 +1052,8 @@ "scroll", "scrolltop", "scrolltotop" - ] + ], + "time": "2017-08-31T15:51:29+00:00" }, { "name": "bower-asset/jquery-migrate-1.4.x", @@ -1057,7 +1072,8 @@ "type": "bower-asset-library", "extra": { "bower-asset-main": "jquery-migrate.js" - } + }, + "time": "2016-04-15T06:38:34+00:00" }, { "name": "bower-asset/jquery-migrate-3.0.x", @@ -1076,7 +1092,8 @@ "type": "bower-asset-library", "extra": { "bower-asset-main": "jquery-migrate.js" - } + }, + "time": "2016-06-10T14:28:59+00:00" }, { "name": "bower-asset/jquery.nicescroll", @@ -1106,7 +1123,8 @@ "demo", "package.json" ] - } + }, + "time": "2016-03-01T20:38:24+00:00" }, { "name": "bower-asset/material-design-iconic-font", @@ -1145,7 +1163,8 @@ "font", "icons", "material" - ] + ], + "time": "2015-11-08T04:50:28+00:00" }, { "name": "bower-asset/materialize", @@ -1204,7 +1223,8 @@ "responsive", "sass", "ux" - ] + ], + "time": "2017-04-15T01:39:28+00:00" }, { "name": "bower-asset/pace", @@ -1250,7 +1270,8 @@ "progress", "progress", "spinner" - ] + ], + "time": "2014-11-06T16:31:34+00:00" }, { "name": "bower-asset/pnotify", @@ -1302,7 +1323,8 @@ "license": [ "Apache-2.0" ], - "description": "JavaScript notification plugin." + "description": "JavaScript notification plugin.", + "time": "2017-07-31T21:50:29+00:00" }, { "name": "bower-asset/respond", @@ -1326,7 +1348,8 @@ "test" ] }, - "description": "Fast and lightweight polyfill for min/max-width CSS3 Media Queries (for IE 6-8, and more)" + "description": "Fast and lightweight polyfill for min/max-width CSS3 Media Queries (for IE 6-8, and more)", + "time": "2013-12-19T04:44:31+00:00" }, { "name": "bower-asset/responsive-tables-js", @@ -1356,7 +1379,8 @@ "jquery", "responsive", "table" - ] + ], + "time": "2015-10-08T14:18:04+00:00" }, { "name": "bower-asset/select2", @@ -1424,7 +1448,8 @@ "scrolling", "slimscroll", "ui" - ] + ], + "time": "2016-06-11T09:19:14+00:00" }, { "name": "bower-asset/tinymce-dist", diff --git a/resources/views/themes/Charisma/search.tpl b/resources/views/themes/Charisma/search.tpl index f02572378..461d5f2c2 100755 --- a/resources/views/themes/Charisma/search.tpl +++ b/resources/views/themes/Charisma/search.tpl @@ -216,139 +216,139 @@ {foreach $results as $result} - + adddate|strtotime} new{/if}" + id="guid{$result->guid}"> - + -
- {release_flag($result.searchname, browse)} - {if $result.passwordstatus == 1} + {release_flag($result->searchname, browse)} + {if $result->passwordstatus == 1} RAR/ZIP Possibly Passworded. - {elseif $result.passwordstatus == 2} + {elseif $result->passwordstatus == 2} RAR/ZIP Possibly Damaged. - {elseif $result.passwordstatus == 10} + {elseif $result->passwordstatus == 10} RAR/ZIP is Passworded. {/if} - {if $result.videostatus > 0} + {if $result->videostatus > 0} {/if} - {if $result.nfoid > 0} - nfoid > 0} + Nfo {/if} - {if $result.imdbid > 0} - imdbid > 0} + Cover {/if} - {if $result.haspreview == 1 && $userdata.canpreview == 1} - haspreview == 1 && $userdata.canpreview == 1} + Preview{/if} - {if $result.jpgstatus == 1 && $userdata.canpreview == 1} - jpgstatus == 1 && $userdata.canpreview == 1} + Sample{/if} - {if $result.musicinfo_id > 0} - musicinfo_id > 0} + Cover {/if} - {if $result.consoleinfo_id > 0} - consoleinfo_id > 0} + Cover {/if} - {if $result.videos_id > 0} + {if $result->videos_id > 0} View Series {/if} - {if $result.anidbid > 0} + {if $result->anidbid > 0} View Anime {/if} - {if isset($result.firstaired) && $result.firstaired != ''} + {if isset($result->firstaired) && $result->firstaired != ''} Aired {if $result.firstaired|strtotime > $smarty.now}in future{else}{$result.firstaired|daysago}{/if} + title="{$result->guid}">Aired {if $result->firstaired|strtotime > $smarty.now}in future{else}{$result->firstaired|daysago}{/if} {/if} - {if $result.group_name != ""} + {if $result->group_name != ""} {$result.group_name|escape:"htmlall"|replace:"alt.binaries.":"a.b."} + href="{$smarty.const.WWW_TOP}/browse/group?g={$result->group_name|escape:"htmlall"}" + title="Browse {$result->group_name}">{$result->group_name|escape:"htmlall"|replace:"alt.binaries.":"a.b."} {/if} - {if !empty($result.failed)} + {if !empty($result->failed)} - {$result.grabs} Grab{if $result.grabs != 1}s{/if} / + {$result->grabs} Grab{if $result->grabs != 1}s{/if} / - {$result.failed} Failed Download{if $result.failed != 1}s{/if} + {$result->failed} Failed Download{if $result->failed != 1}s{/if} {/if}
- {$result.category_name} + {$result->category_name} - - {$result.postdate|timeago} + + {$result->postdate|timeago} - {$result.size|fsize_format:"MB"} - {if $result.completion > 0} + {$result->size|fsize_format:"MB"} + {if $result->completion > 0}
- {if $result.completion < 100} - {$result.completion}% + {if $result->completion < 100} + {$result->completion}% {else} - {$result.completion}% + {$result->completion}% {/if} {/if} {$result.totalpart} - {if $result.rarinnerfilecount > 0} + href="{$smarty.const.WWW_TOP}/filelist/{$result->guid}">{$result->totalpart} + {if $result->rarinnerfilecount > 0}
{$result.guid} + alt="{$result->guid}">
{/if} {$result.comments} - cmt{if $result.comments != 1}s{/if} -
{$result.grabs} grab{if $result.grabs != 1}s{/if} + href="{$smarty.const.WWW_TOP}/details/{$result->guid}/#comments">{$result->comments} + cmt{if $result->comments != 1}s{/if} +
{$result->grabs} grab{if $result->grabs != 1}s{/if} - - {if isset($sabintegrated) && $sabintegrated !=""} - {foreach $results as $result} - + adddate|strtotime} new{/if}" + id="guid{$result->guid}"> - + - {$result.searchname|escape:"htmlall"|truncate:150:"...":true}{if !empty($result.failed)} + href="{$smarty.const.WWW_TOP}/details/{$result->guid}">{$result->searchname|escape:"htmlall"|truncate:150:"...":true}{if !empty($result->failed)} {/if}
- {release_flag($result.searchname, browse)} - {if $result.passwordstatus == 1} + {release_flag($result->searchname, browse)} + {if $result->passwordstatus == 1} RAR/ZIP Possibly Passworded. - {elseif $result.passwordstatus == 2} + {elseif $result->passwordstatus == 2} RAR/ZIP Possibly Damaged. - {elseif $result.passwordstatus == 10} + {elseif $result->passwordstatus == 10} RAR/ZIP is Passworded. {/if} - {if $result.videostatus > 0} + {if $result->videostatus > 0} {/if} - {if $result.nfoid > 0} - nfoid > 0} + Nfo {/if} - {if $result.imdbid > 0} - imdbid > 0} + Cover {/if} - {if $result.haspreview == 1 && $userdata.canpreview == 1} - haspreview == 1 && $userdata.canpreview == 1} + Preview{/if} - {if $result.jpgstatus == 1 && $userdata.canpreview == 1} - jpgstatus == 1 && $userdata.canpreview == 1} + Sample{/if} - {if $result.musicinfo_id > 0} - musicinfo_id > 0} + Cover {/if} - {if $result.consoleinfo_id > 0} - consoleinfo_id > 0} + Cover {/if} - {if $result.videos_id > 0} + {if $result->videos_id > 0} View Series {/if} - {if $result.anidbid > 0} + {if $result->anidbid > 0} View Anime {/if} - {if isset($result.firstaired) && $result.firstaired != ''} + {if isset($result->firstaired) && $result->firstaired != ''} Aired {if $result.firstaired|strtotime > $smarty.now}in future{else}{$result.firstaired|daysago}{/if} + title="{$result->guid}">Aired {if $result->firstaired|strtotime > $smarty.now}in future{else}{$result->firstaired|daysago}{/if} {/if} - {if $result.group_name != ""} + {if $result->group_name != ""} {$result.group_name|escape:"htmlall"|replace:"alt.binaries.":"a.b."} + href="{$smarty.const.WWW_TOP}/browse/group?g={$result->group_name|escape:"htmlall"}" + title="Browse {$result->group_name}">{$result->group_name|escape:"htmlall"|replace:"alt.binaries.":"a.b."} {/if} - {if !empty($result.failed)} + {if !empty($result->failed)} - {$result.grabs} Grab{if $result.grabs != 1}s{/if} / + {$result->grabs} Grab{if $result->grabs != 1}s{/if} / - {$result.failed} Failed Download{if $result.failed != 1}s{/if} + {$result->failed} Failed Download{if $result->failed != 1}s{/if} {/if}
- {$result.category_name} + {$result->category_name} - - {$result.postdate|timeago} + + {$result->postdate|timeago} - {$result.size|fsize_format:"MB"} - {if $result.completion > 0} + {$result->size|fsize_format:"MB"} + {if $result->completion > 0}
- {if $result.completion < 100} - {$result.completion}% + {if $result->completion < 100} + {$result->completion}% {else} - {$result.completion}% + {$result->completion}% {/if} {/if} {$result.totalpart} - {if $result.rarinnerfilecount > 0} + href="{$smarty.const.WWW_TOP}/filelist/{$result->guid}">{$result->totalpart} + {if $result->rarinnerfilecount > 0}
{$result.guid} + alt="{$result->guid}">
{/if} {$result.comments} - cmt{if $result.comments != 1}s{/if} -
{$result.grabs} grab{if $result.grabs != 1}s{/if} + href="{$smarty.const.WWW_TOP}/details/{$result->guid}/#comments">{$result->comments} + cmt{if $result->comments != 1}s{/if} +
{$result->grabs} grab{if $result->grabs != 1}s{/if} - - {if isset($sabintegrated) && $sabintegrated !=""} -