From 00c6c12da0eb4a6b3efa4ebcbacdc95e64a08a01 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Fri, 10 Apr 2026 15:09:51 +0200 Subject: [PATCH] Update indexing of releases --- app/Models/Release.php | 2 +- app/Observers/ReleaseObserver.php | 68 ++++++------------- .../Search/Drivers/ElasticSearchDriver.php | 12 ++++ .../Search/Drivers/ManticoreSearchDriver.php | 12 ++++ 4 files changed, 44 insertions(+), 50 deletions(-) diff --git a/app/Models/Release.php b/app/Models/Release.php index 8fc310b16..6cc8bacdb 100644 --- a/app/Models/Release.php +++ b/app/Models/Release.php @@ -212,7 +212,7 @@ class Release extends Model ] ); - Search::insertRelease($parameters); + Search::updateRelease($parameters['id']); return $parameters['id']; } diff --git a/app/Observers/ReleaseObserver.php b/app/Observers/ReleaseObserver.php index b3c5b7afe..d0124d7ed 100644 --- a/app/Observers/ReleaseObserver.php +++ b/app/Observers/ReleaseObserver.php @@ -5,9 +5,7 @@ declare(strict_types=1); namespace App\Observers; use App\Facades\Search; -use App\Models\MovieInfo; use App\Models\Release; -use App\Models\Video; use App\Services\Nzb\NzbService; use App\Services\ReleaseImageService; use Illuminate\Support\Facades\Log; @@ -15,9 +13,8 @@ use Illuminate\Support\Facades\Log; /** * Observer for Release model to keep search indexes in sync. * - * This observer ensures that when releases are updated with movie/TV information - * during post-processing, the search index is updated with the external IDs - * (imdbid, tmdbid, tvdb, etc.) for efficient searching. + * Delegates document building to Search::updateRelease(), which loads the full + * row (including movieinfo/videos joins and release_files filenames). */ class ReleaseObserver { @@ -39,21 +36,27 @@ class ReleaseObserver */ public function updated(Release $release): void { - // Check if any of the external ID fields were changed - $externalIdFields = [ + $indexedFields = [ + 'name', + 'searchname', + 'fromname', + 'categories_id', 'imdbid', 'movieinfo_id', 'videos_id', - 'tv_episodes_id', - 'anidbid', - 'searchname', - 'name', - 'fromname', - 'categories_id', + 'size', + 'totalpart', + 'grabs', + 'passwordstatus', + 'groups_id', + 'nzbstatus', + 'haspreview', + 'postdate', + 'adddate', ]; $changed = false; - foreach ($externalIdFields as $field) { + foreach ($indexedFields as $field) { if ($release->isDirty($field)) { $changed = true; break; @@ -114,49 +117,16 @@ class ReleaseObserver } /** - * Sync the release to the search index with all external IDs. + * Sync the release to the search index (full document from DB + joins). */ private function syncToSearchIndex(Release $release): void { try { - // Load related models if needed - $movieInfo = null; - $video = null; - - if ($release->movieinfo_id > 0) { - $movieInfo = MovieInfo::find($release->movieinfo_id); - } - - if ($release->videos_id > 0) { - $video = Video::find($release->videos_id); - } - - $parameters = [ - 'id' => $release->id, - 'name' => $release->name ?? '', - 'searchname' => $release->searchname ?? '', - 'fromname' => $release->fromname ?? '', - 'categories_id' => $release->categories_id ?? 0, - 'filename' => '', // Not available from model - // Movie external IDs - 'imdbid' => $release->imdbid ?? ($movieInfo?->imdbid ?? 0), // @phpstan-ignore nullsafe.neverNull - 'tmdbid' => $movieInfo?->tmdbid ?? 0, // @phpstan-ignore nullsafe.neverNull - 'traktid' => $movieInfo?->traktid ?? 0, // @phpstan-ignore nullsafe.neverNull - // TV show external IDs - 'tvdb' => $video?->tvdb ?? 0, // @phpstan-ignore nullsafe.neverNull - 'tvmaze' => $video?->tvmaze ?? 0, // @phpstan-ignore nullsafe.neverNull - 'tvrage' => $video?->tvrage ?? 0, // @phpstan-ignore nullsafe.neverNull - 'videos_id' => $release->videos_id ?? 0, - 'movieinfo_id' => $release->movieinfo_id ?? 0, - ]; - - Search::insertRelease($parameters); + Search::updateRelease($release->id); if (config('app.debug')) { Log::debug('ReleaseObserver: Updated search index for release', [ 'release_id' => $release->id, - 'imdbid' => $parameters['imdbid'], - 'videos_id' => $parameters['videos_id'], ]); } } catch (\Throwable $e) { diff --git a/app/Services/Search/Drivers/ElasticSearchDriver.php b/app/Services/Search/Drivers/ElasticSearchDriver.php index 484900ead..e67fc7647 100644 --- a/app/Services/Search/Drivers/ElasticSearchDriver.php +++ b/app/Services/Search/Drivers/ElasticSearchDriver.php @@ -1060,6 +1060,8 @@ class ElasticSearchDriver implements SearchDriverInterface $release = Release::query() ->where('releases.id', $releaseID) ->leftJoin('release_files as rf', 'releases.id', '=', 'rf.releases_id') + ->leftJoin('movieinfo as mi', 'releases.movieinfo_id', '=', 'mi.id') + ->leftJoin('videos as v', 'releases.videos_id', '=', 'v.id') ->select([ 'releases.id', 'releases.name', @@ -1078,6 +1080,11 @@ class ElasticSearchDriver implements SearchDriverInterface 'releases.imdbid', 'releases.videos_id', 'releases.movieinfo_id', + DB::raw('IFNULL(mi.tmdbid, 0) AS tmdbid'), + DB::raw('IFNULL(mi.traktid, 0) AS traktid'), + DB::raw('IFNULL(v.tvdb, 0) AS tvdb'), + DB::raw('IFNULL(v.tvmaze, 0) AS tvmaze'), + DB::raw('IFNULL(v.tvrage, 0) AS tvrage'), DB::raw('IFNULL(GROUP_CONCAT(rf.name SEPARATOR " "),"") filename'), ]) ->groupBy([ @@ -1098,6 +1105,11 @@ class ElasticSearchDriver implements SearchDriverInterface 'releases.imdbid', 'releases.videos_id', 'releases.movieinfo_id', + 'mi.tmdbid', + 'mi.traktid', + 'v.tvdb', + 'v.tvmaze', + 'v.tvrage', ]) ->first(); diff --git a/app/Services/Search/Drivers/ManticoreSearchDriver.php b/app/Services/Search/Drivers/ManticoreSearchDriver.php index c1e2fa3f3..59e8cc4fb 100644 --- a/app/Services/Search/Drivers/ManticoreSearchDriver.php +++ b/app/Services/Search/Drivers/ManticoreSearchDriver.php @@ -572,6 +572,8 @@ class ManticoreSearchDriver implements SearchDriverInterface $release = Release::query() ->where('releases.id', $releaseID) ->leftJoin('release_files as rf', 'releases.id', '=', 'rf.releases_id') + ->leftJoin('movieinfo as mi', 'releases.movieinfo_id', '=', 'mi.id') + ->leftJoin('videos as v', 'releases.videos_id', '=', 'v.id') ->select([ 'releases.id', 'releases.name', @@ -590,6 +592,11 @@ class ManticoreSearchDriver implements SearchDriverInterface 'releases.imdbid', 'releases.videos_id', 'releases.movieinfo_id', + DB::raw('IFNULL(mi.tmdbid, 0) AS tmdbid'), + DB::raw('IFNULL(mi.traktid, 0) AS traktid'), + DB::raw('IFNULL(v.tvdb, 0) AS tvdb'), + DB::raw('IFNULL(v.tvmaze, 0) AS tvmaze'), + DB::raw('IFNULL(v.tvrage, 0) AS tvrage'), DB::raw('IFNULL(GROUP_CONCAT(rf.name SEPARATOR " "),"") filename'), ]) ->groupBy([ @@ -610,6 +617,11 @@ class ManticoreSearchDriver implements SearchDriverInterface 'releases.imdbid', 'releases.videos_id', 'releases.movieinfo_id', + 'mi.tmdbid', + 'mi.traktid', + 'v.tvdb', + 'v.tvmaze', + 'v.tvrage', ]) ->first();