Update routes and browse controller

This commit is contained in:
DariusIII
2018-04-02 23:27:35 +02:00
parent dcdfa699f7
commit b901339de3
6 changed files with 137 additions and 102 deletions
+69 -70
View File
@@ -7,6 +7,7 @@ use Blacklight\db\DB;
use App\Models\Release;
use App\Models\Category;
use App\Models\Settings;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Carbon;
use Blacklight\utility\Utility;
use Illuminate\Support\Facades\Cache;
@@ -104,99 +105,97 @@ class Releases
}
/**
* Used for browse results.
*
* @param array $cat
* @param $start
* @param $num
* @param string|array $orderBy
* @param int $maxAge
* @param array $excludedCats
* @param string|int $groupName
* @param int $minSize
*
* @return array
* @param $cat
* @param $start
* @param $num
* @param $orderBy
* @param int $maxAge
* @param array $excludedCats
* @param int $groupName
* @param int $minSize
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
* @throws \Exception
* @throws \InvalidArgumentException
*/
public function getBrowseRange($cat, $start, $num, $orderBy, $maxAge = -1, array $excludedCats = [], $groupName = -1, $minSize = 0): array
public function getBrowseRange($cat, $orderBy, $maxAge = -1, array $excludedCats = [], $groupName = -1, $minSize = 0): LengthAwarePaginator
{
$orderBy = $this->getBrowseOrder($orderBy);
$qry = sprintf(
"SELECT r.*,
CONCAT(cp.title, ' > ', c.title) AS category_name,
CONCAT(cp.id, ',', c.id) AS category_ids,
df.failed AS failed,
rn.releases_id AS nfoid,
re.releases_id AS reid,
v.tvdb, v.trakt, v.tvrage, v.tvmaze, v.imdb, v.tmdb,
tve.title, tve.firstaired
FROM
(
SELECT r.*, g.name AS group_name
FROM releases r
LEFT JOIN groups g ON g.id = r.groups_id
WHERE r.nzbstatus = %d
AND r.passwordstatus %s
%s %s %s %s %s
ORDER BY %s %s %s
) r
LEFT JOIN categories c ON c.id = r.categories_id
LEFT JOIN categories cp ON cp.id = c.parentid
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 video_data re ON re.releases_id = r.id
LEFT OUTER JOIN release_nfos rn ON rn.releases_id = r.id
LEFT OUTER JOIN dnzb_failures df ON df.release_id = r.id
GROUP BY r.id
ORDER BY %8\$s %9\$s",
NZB::NZB_ADDED,
$this->showPasswords,
Category::getCategorySearch($cat),
($maxAge > 0 ? (' AND postdate > NOW() - INTERVAL '.$maxAge.' DAY ') : ''),
(\count($excludedCats) ? (' AND r.categories_id NOT IN ('.implode(',', $excludedCats).')') : ''),
((int) $groupName !== -1 ? sprintf(' AND g.name = %s ', $this->pdo->escapeString($groupName)) : ''),
($minSize > 0 ? sprintf('AND r.size >= %d', $minSize) : ''),
$orderBy[0],
$orderBy[1],
($start === false ? '' : ' LIMIT '.$num.' OFFSET '.$start)
);
$releases = Cache::get(md5($qry));
$qry = Release::query()
->fromSub(function ($query) use ($cat, $maxAge, $excludedCats, $groupName, $minSize, $orderBy) {
$query->select(['releases.*', 'g.name as group_name'])
->from('releases')
->where('releases.nzbstatus', NZB::NZB_ADDED)
->where('releases.categories_id', $cat);
self::showPasswords($query, true);
$query->leftJoin('groups as g', 'g.id', '=', 'releases.groups_id');
if ($maxAge > 0) {
$query->where('releases.postdate', '>', Carbon::now()->subDays($maxAge));
}
if (\count($excludedCats) > 0) {
$query->whereNotIn('releases.categories_id', $excludedCats);
}
if ($groupName !== -1) {
$query->where('g.name', $groupName);
}
if ($minSize > 0) {
$query->where('releases.size', '>=', $minSize);
}
$query->orderBy($orderBy[0], $orderBy[1]);
}, 'r')
->select(['r.*', 'df.failed as failed', 'rn.releases_id as nfoid', 're.releases_id as reid', 'v.tvdb', 'v.trakt', 'v.tvrage', 'v.tvmaze', 'v.imdb', 'v.tmdb', 'tve.title', 'tve.firstaired'])
->selectRaw("CONCAT(cp.title, ' > ', c.title) AS category_name")
->selectRaw("CONCAT(cp.id, ',', c.id) AS category_ids")
->leftJoin('categories as c', 'c.id', '=', 'r.categories_id')
->leftJoin('categories as cp', 'cp.id', '=', 'c.parentid')
->leftJoin('videos as v', 'v.id', '=', 'r.videos_id')
->leftJoin('tv_episodes as tve', 'tve.id', '=', 'r.tv_episodes_id')
->leftJoin('video_data as re', 're.releases_id', '=', 'r.id')
->leftJoin('release_nfos as rn', 're.releases_id', '=', 'r.id')
->leftJoin('dnzb_failures as df', 'df.release_id', '=', 'r.id')
->groupBy('r.id')
->orderBy($orderBy[0], $orderBy[1]);
$releases = Cache::get(md5(implode('.', $cat).implode('.', $orderBy).$maxAge.implode('.', $excludedCats).$minSize));
if ($releases !== null) {
return $releases;
}
$sql = $this->pdo->query($qry);
if (\count($sql) > 0) {
$possibleRows = $this->getBrowseCount($cat, $maxAge, $excludedCats, $groupName);
$sql[0]['_totalcount'] = $sql[0]['_totalrows'] = $possibleRows;
}
$sql = $qry->paginate(config('nntmux.items_per_page'));
$expiresAt = Carbon::now()->addSeconds(config('nntmux.cache_expiry_medium'));
Cache::put(md5($qry), $sql, $expiresAt);
Cache::put(md5(implode('.', $cat).implode('.', $orderBy).$maxAge.implode('.', $excludedCats).$minSize), $sql, $expiresAt);
return $sql;
}
/**
* Return site setting for hiding/showing passworded releases.
* @param null $query
* @param bool $builder
*
* @return string
* @throws \Exception
*/
public static function showPasswords(): ?string
public static function showPasswords($query = null, $builder = false)
{
$setting = Settings::settingValue('..showpasswordedrelease', true);
$setting = ($setting !== null && is_numeric($setting)) ? $setting : 10;
switch ($setting) {
case 0: // Hide releases with a password or a potential password (Hide unprocessed releases).
return '='.self::PASSWD_NONE;
if ($builder === false) {
return '='.self::PASSWD_NONE;
}
return $query->where('releases.passwordstatus', self::PASSWD_NONE);
case 1: // Show releases with no password or a potential password (Show unprocessed releases).
return '<= '.self::PASSWD_POTENTIAL;
if ($builder === false) {
return '<= '.self::PASSWD_POTENTIAL;
}
return $query->where('releases.passwordstatus', '=<', self::PASSWD_POTENTIAL);
case 2: // Hide releases with a password or a potential password (Show unprocessed releases).
return '<= '.self::PASSWD_NONE;
if ($builder === false) {
return '<= '.self::PASSWD_NONE;
}
return $query->where('releases.passwordstatus', '=<', self::PASSWD_NONE);
case 10: // Shows everything.
default:
return '<= '.self::PASSWD_RAR;
if ($builder === false) {
return '<= '.self::PASSWD_RAR;
}
return $query->where('releases.passwordstatus', '=<', self::PASSWD_RAR);
}
}
+2
View File
@@ -1,3 +1,5 @@
2018-04-02 DariusIII
* Chg: Update routes and browse controller
2018-04-01 DariusIII
* Chg: Update Base and Browse controllers
* Chg: Allow disabling of captcha on login page
+40 -17
View File
@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\Models\Category;
use Blacklight\Releases;
use Illuminate\Http\Request;
@@ -35,26 +36,9 @@ class BrowseController extends BasePageController
$results = $releases->getBrowseRange($catarray, $offset, config('nntmux.items_per_page'), $orderby, -1, $this->userdata['categoryexclusions'], $grp);
$browsecount = $results[0]['_totalcount'] ?? 0;
$this->smarty->assign(
[
'pagertotalitems' => $browsecount,
'pageroffset'=> $offset,
'pageritemsperpage'=> config('nntmux.items_per_page'),
'pagerquerybase' => WWW_TOP.'/browse?t='.$category.'&amp;g='.$grp.'&amp;ob='.$orderby.'&amp;offset=',
'pagerquerysuffix' => '#results',
]
);
$pager = $this->smarty->fetch('pager.tpl');
$this->smarty->assign('pager', $pager);
$covgroup = '';
$this->smarty->assign('catname', 'All');
$this->smarty->assign('covgroup', $covgroup);
$this->smarty->assign('lastvisit', $this->userdata['lastlogin']);
$this->smarty->assign('results', $results);
@@ -67,4 +51,43 @@ class BrowseController extends BasePageController
$this->smarty->assign('content', $this->content);
$this->pagerender();
}
/**
* @param $id
* @throws \Exception
*/
public function showMovies($id)
{
$this->setPrefs();
$releases = new Releases(['Settings' => $this->settings]);
$category = Category::query()->where('title', $id)->where('parentid', '2000')->first(['id']);
$grp = -1;
$catarray = [];
$catarray[] = $category['id'];
$this->smarty->assign('category', $category);
$orderby = '';
$results = $releases->getBrowseRange($catarray, $orderby, -1, $this->userdata['categoryexclusions'], $grp);
$covgroup = '';
$this->smarty->assign('catname', $id);
$this->smarty->assign('lastvisit', $this->userdata['lastlogin']);
$this->smarty->assign('results', $results);
$this->meta_title = 'Browse Movies > ' . $id;
$this->meta_keywords = 'browse,nzb,description,details';
$this->meta_description = 'Browse for Nzbs';
$this->content = $this->smarty->fetch('browse.tpl');
$this->smarty->assign('content', $this->content);
$this->pagerender();
}
}
+20 -12
View File
@@ -191,16 +191,15 @@ class Category extends Model
}
/**
* Parse category search constraints.
*
* @param array $cat
* @param $query
* @param bool $builder
*
* @return string $catsrch
* @return string
*/
public static function getCategorySearch(array $cat = []): string
public static function getCategorySearch(array $cat = [], $query, $builder = false)
{
$categories = [];
// If multiple categories were sent in a single array position, slice and add them
if (strpos($cat[0], ',') !== false) {
$tmpcats = explode(',', $cat[0]);
@@ -211,7 +210,6 @@ class Category extends Model
$cat[] = $tmpcat;
}
}
foreach ($cat as $category) {
if ($category !== -1 && self::isParent($category)) {
foreach (self::getChildren($category) as $child) {
@@ -221,27 +219,37 @@ class Category extends Model
$categories[] = $category;
}
}
$catCount = \count($categories);
switch ($catCount) {
//No category constraint
case 0:
$catsrch = ' AND 1=1 ';
if ($builder === false) {
$catsrch = 'AND 1=1';
} else {
$catsrch = '';
}
break;
// One category constraint
case 1:
$catsrch = $categories[0] !== -1 ? ' AND r.categories_id = '.$categories[0] : '';
if ($builder === false) {
$catsrch = $categories[0] !== -1 ? ' AND releases.categories_id = '.$categories[0] : '';
} else {
$catsrch = $query->where('releases.categories_id', '=', $categories[0]);
}
break;
// Multiple category constraints
default:
$catsrch = ' AND r.categories_id IN ('.implode(', ', $categories).') ';
if ($builder === false) {
$catsrch = ' AND releases.categories_id IN ('.implode(', ', $categories).') ';
} else {
$catsrch = $query->whereIn('releases.categories_id', $categories);
}
break;
}
return $catsrch;
}
/**
* Returns a concatenated list of other categories.
*
+2 -2
View File
@@ -70,7 +70,7 @@
</div>
</div>
<div class="col-md-4">
{$pager}
{$results->links()}
</div>
</div>
<hr>
@@ -228,7 +228,7 @@
</div>
</div>
<div class="col-md-4">
{$pager}
{$results->links()}
</div>
</div>
</div>
+4 -1
View File
@@ -41,7 +41,10 @@ Route::post('/resetpassword', 'Auth\ResetPasswordController@reset');
Route::get('/profile', 'ProfileController@show');
Route::get('/browse', 'BrowseController@index');
Route::prefix('browse')->group(function () {
Route::get('all', 'BrowseController@index');
Route::get('movies/{id}', 'BrowseController@showMovies');
});
Route::get('/console', function () {
redirect('/console');