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 @@