From ba3cc0a478a3f35a696c24154bc70710da02589f Mon Sep 17 00:00:00 2001 From: DariusIII Date: Sat, 12 May 2018 22:42:30 +0200 Subject: [PATCH] Update Adult and Music pages --- Blacklight/Music.php | 16 +-- Blacklight/XXX.php | 172 ++++++++++++++--------- Changelog | 1 + app/Http/Controllers/AdultController.php | 16 ++- 4 files changed, 124 insertions(+), 81 deletions(-) diff --git a/Blacklight/Music.php b/Blacklight/Music.php index 75d7fcd1d..4aaba3d16 100755 --- a/Blacklight/Music.php +++ b/Blacklight/Music.php @@ -23,10 +23,9 @@ use ApaiIO\ResponseTransformer\XmlToSimpleXmlObject; class Music { protected const MATCH_PERCENT = 60; - /** - * @var \Blacklight\db\DB - */ - public $pdo; + + + protected $pdo; /** * @var bool @@ -121,11 +120,8 @@ class Music $album = preg_replace('/( - | -|\(.+\)|\(|\))/', ' ', $album); $album = preg_replace('/[^\w ]+/', '', $album); $album = preg_replace('/(WEB|FLAC|CD)/', '', $album); - $album = trim(preg_replace('/\s\s+/i', ' ', $album)); - $album = trim($album); - $words = explode(' ', $album); - - foreach ($words as $word) { + $album = trim(trim(preg_replace('/\s\s+/i', ' ', $album))); + foreach (explode(' ', $album) as $word) { $word = trim(rtrim(trim($word), '-')); if ($word !== '' && $word !== '-') { $word = '+'.$word; @@ -159,7 +155,7 @@ class Music $exccatlist = ' AND r.categories_id NOT IN ('.implode(',', $excludedcats).')'; } $order = $this->getMusicOrder($orderby); - $expiresAt = Carbon::now()->addSeconds(config('nntmux.cache_expiry_medium')); + $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_medium')); $musicSql = sprintf( " diff --git a/Blacklight/XXX.php b/Blacklight/XXX.php index 16661ec61..68f63afe0 100755 --- a/Blacklight/XXX.php +++ b/Blacklight/XXX.php @@ -72,6 +72,8 @@ class XXX */ public $catWhere; + protected $pdo; + /** * @param array $options Echo to cli / Class instances. * @@ -86,6 +88,7 @@ class XXX ]; $options += $defaults; $this->releaseImage = ($options['ReleaseImage'] instanceof ReleaseImage ? $options['ReleaseImage'] : new ReleaseImage()); + $this->pdo = DB::connection()->getPdo(); $this->movieqty = Settings::settingValue('..maxxxxprocessed') !== '' ? (int) Settings::settingValue('..maxxxxprocessed') : 100; $this->showPasswords = Releases::showPasswords(); @@ -108,73 +111,110 @@ class XXX /** * Get XXX releases with covers for xxx browse page. * - * - * @param $page + * @param $page * @param $cat + * @param $start + * @param $num * @param $orderBy - * @param array $excludedcats + * @param int $maxAge + * @param array $excludedCats * - * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|mixed - * @throws \Exception + * @return array */ - public function getXXXRange($page, $cat, $orderBy, array $excludedcats = []) + public function getXXXRange($page, $cat, $start, $num, $orderBy, $maxAge = -1, array $excludedCats = []): array { - $order = $this->getXXXOrder($orderBy); - - $sql = Release::query() - ->where('r.nzbstatus', '=', 1) - ->where('xxx.title', '<>', ''); - Releases::showPasswords($sql, true); - if (\count($excludedcats) > 0) { - $sql->whereNotIn('r.categories_id', $excludedcats); - } - + $catsrch = ''; if (\count($cat) > 0 && $cat[0] !== -1) { - Category::getCategorySearch($cat, $sql, true); + $catsrch = Category::getCategorySearch($cat); } - $sql->select( - [ - 'xxx.*', - DB::raw('UNCOMPRESS(xxx.plot) AS plot'), - 'r.xxxinfo_id', - 'g.name as group_name', - 'rn.releases_id as nfoid', - DB::raw("GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_id"), - DB::raw("GROUP_CONCAT(r.rarinnerfilecount ORDER BY r.postdate DESC SEPARATOR ',') as grp_rarinnerfilecount"), - DB::raw("GROUP_CONCAT(r.haspreview ORDER BY r.postdate DESC SEPARATOR ',') as grp_haspreview"), - DB::raw("GROUP_CONCAT(r.passwordstatus ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_password"), - DB::raw("GROUP_CONCAT(r.guid ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_guid"), - DB::raw("GROUP_CONCAT(rn.releases_id ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_nfoid"), - DB::raw("GROUP_CONCAT(g.name ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_grpname"), - DB::raw("GROUP_CONCAT(r.searchname ORDER BY r.postdate DESC SEPARATOR '#') as grp_release_name"), - DB::raw("GROUP_CONCAT(r.postdate ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_postdate"), - DB::raw("GROUP_CONCAT(r.size ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_size"), - DB::raw("GROUP_CONCAT(r.totalpart ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_totalparts"), - DB::raw("GROUP_CONCAT(r.comments ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_comments"), - DB::raw("GROUP_CONCAT(r.grabs ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_grabs"), - DB::raw("GROUP_CONCAT(df.failed ORDER BY r.postdate DESC SEPARATOR ',') as grp_release_failed"), - ] - ) - ->from('releases as r') - ->leftJoin('groups as g', 'g.id', '=', 'r.groups_id') - ->leftJoin('release_nfos as rn', 'rn.releases_id', '=', 'r.id') - ->leftJoin('dnzb_failures as df', 'df.release_id', '=', 'r.id') - ->leftJoin('categories as c', 'c.id', '=', 'r.categories_id') - ->leftJoin('categories as cp', 'cp.id', '=', 'c.parentid') - ->join('xxxinfo as xxx', 'xxx.id', '=', 'r.xxxinfo_id') - ->groupBy('xxx.id') - ->orderBy($order[0], $order[1]); - - $return = Cache::get(md5($page.implode('.', $cat).implode('.', $excludedcats))); + $order = $this->getXXXOrder($orderBy); + $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_medium')); + $xxxmoviesSql = + sprintf( + " + SELECT SQL_CALC_FOUND_ROWS + xxx.id, + GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_id + FROM xxxinfo xxx + LEFT JOIN releases r ON xxx.id = r.xxxinfo_id + WHERE r.nzbstatus = 1 + AND xxx.title != '' + AND r.passwordstatus %s + %s %s %s %s + GROUP BY xxx.id + ORDER BY %s %s %s", + $this->showPasswords, + $this->getBrowseBy(), + $catsrch, + ( + $maxAge > 0 + ? 'AND r.postdate > NOW() - INTERVAL '.$maxAge.'DAY ' + : '' + ), + (\count($excludedCats) > 0 ? ' AND r.categories_id NOT IN ('.implode(',', $excludedCats).')' : ''), + $order[0], + $order[1], + ($start === false ? '' : ' LIMIT '.$num.' OFFSET '.$start) + ); + $xxxmoviesCache = Cache::get(md5($xxxmoviesSql.$page)); + if ($xxxmoviesCache !== null) { + $xxxmovies = $xxxmoviesCache; + } else { + $data = DB::select($xxxmoviesSql); + $xxxmovies = ['total' => DB::select('SELECT FOUND_ROWS() AS total'), 'result' => $data]; + Cache::put(md5($xxxmoviesSql.$page), $xxxmovies, $expiresAt); + } + $xxxIDs = $releaseIDs = false; + if (\is_array($xxxmovies['result'])) { + foreach ($xxxmovies['result'] as $xxx => $id) { + $xxxIDs[] = $id->id; + $releaseIDs[] = $id->grp_release_id; + } + } + $sql = sprintf( + " + SELECT + r.id, r.rarinnerfilecount, r.grabs, r.comments, r.totalpart, r.size, r.postdate, r.searchname, r.haspreview, r.passwordstatus, r.guid, df.failed AS failed, + CONCAT(cp.title, ' > ', c.title) AS catname, + xxx.*, UNCOMPRESS(xxx.plot) AS plot, + g.name AS group_name, + rn.releases_id AS nfoid + FROM releases r + LEFT OUTER JOIN groups g ON g.id = r.groups_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 + LEFT OUTER JOIN categories c ON c.id = r.categories_id + LEFT OUTER JOIN categories cp ON cp.id = c.parentid + INNER JOIN xxxinfo xxx ON xxx.id = r.xxxinfo_id + WHERE r.nzbstatus = 1 + AND xxx.id IN (%s) + AND xxx.title != '' + AND r.passwordstatus %s + %s %s %s %s + GROUP BY xxx.id + ORDER BY %s %s", + (\is_array($xxxIDs) ? implode(',', $xxxIDs) : -1), + $this->showPasswords, + $this->getBrowseBy(), + $catsrch, + ( + $maxAge > 0 + ? 'AND r.postdate > NOW() - INTERVAL '.$maxAge.'DAY ' + : '' + ), + (\count($excludedCats) > 0 ? ' AND r.categories_id NOT IN ('.implode(',', $excludedCats).')' : ''), + $order[0], + $order[1] + ); + $return = Cache::get(md5($sql.$page)); if ($return !== null) { return $return; } - - $return = $sql->paginate(config('nntmux.items_per_cover_page')); - - $expiresAt = Carbon::now()->addMinutes(config('nntmux.cache_expiry_long')); - Cache::put(md5($page.implode('.', $cat).implode('.', $excludedcats)), $return, $expiresAt); - + $return = DB::select($sql); + if (\count($return) > 0) { + $return['_totalcount'] = $xxxmovies['total'][0]->total ?? 0; + } + Cache::put(md5($sql.$page), $return, $expiresAt); return $return; } @@ -212,25 +252,25 @@ class XXX } /** - * @param $query - * - * @return mixed + * @return string */ - protected function getBrowseBy($query) + protected function getBrowseBy(): string { + $browseBy = ' '; foreach (['title', 'director', 'actors', 'genre', 'id'] as $bb) { - if (request()->has($bb) && request()->input($bb) !== null) { - $bbv = stripslashes(request()->input($bb)); + if (isset($_REQUEST[$bb]) && ! empty($_REQUEST[$bb])) { + $bbv = stripslashes($_REQUEST[$bb]); if ($bb === 'genre') { $bbv = $this->getGenreID($bbv); } if ($bb === 'id') { - return $query->where('xxx.'.$bb, '=', $bbv); + $browseBy .= 'AND xxx.'.$bb.'='.$bbv; + } else { + $browseBy .= 'AND xxx.'.$bb.' '.$this->pdo->quote('%'.$bbv.'%'); } - - return $query->where('xxx.'.$bb, 'like', '%'.$bbv.'%'); } } + return $browseBy; } /** diff --git a/Changelog b/Changelog index b2738c20e..fb75659be 100755 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ 2018-05-12 DariusIII + * Chg: Update Adult and Music pages * Chg: Update music cover pages * Fix: Fix games covers page 2018-05-11 DariusIII diff --git a/app/Http/Controllers/AdultController.php b/app/Http/Controllers/AdultController.php index 33b3e92fc..cb77fcd06 100644 --- a/app/Http/Controllers/AdultController.php +++ b/app/Http/Controllers/AdultController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Blacklight\XXX; use App\Models\Category; use Illuminate\Http\Request; +use Illuminate\Pagination\LengthAwarePaginator; class AdultController extends BasePageController { @@ -48,12 +49,17 @@ class AdultController extends BasePageController $movies = []; $page = $request->has('page') ? $request->input('page') : 1; - $results = $adult->getXXXRange($page, $catarray, $orderby, $this->userdata['categoryexclusions']); + $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 = new LengthAwarePaginator($rslt, $rslt['_totalcount'], config('nntmux.items_per_cover_page'), $page, ['path' => $request->url()]); foreach ($results as $result) { - $result['genre'] = makeFieldLinks($result, 'genre', 'xxx'); - $result['actors'] = makeFieldLinks($result, 'actors', 'xxx'); - $result['director'] = makeFieldLinks($result, 'director', 'xxx'); - $movies[] = $result; + if (! empty($result->id)) { + $result->genre = makeFieldLinks((array) $result, 'genre', 'movies'); + $result->actors = makeFieldLinks((array) $result, 'actors', 'movies'); + $result->director = makeFieldLinks((array) $result, 'director', 'movies'); + + $movies[] = $result; + } } $title = ($request->has('title') && ! empty($request->input('title'))) ? stripslashes($request->input('title')) : ''; $this->smarty->assign('title', stripslashes($title));