+ {{-- Results Summary and Pagination --}}
+
- Showing {{ $results->firstItem() }} to {{ $results->lastItem() }} of {{ $results->total() }} movies
+ {{ $results->total() }} movies found
+
+ (showing {{ $results->firstItem() }}-{{ $results->lastItem() }})
+
{{ $results->links() }}
-
- @foreach($results as $result)
- @php
- // Get the first GUID from the comma-separated list
- $guid = isset($result->grp_release_guid) ? explode(',', $result->grp_release_guid)[0] : null;
- @endphp
-
-
-
-
+ {{-- Movies Grid - Conditionally include layout --}}
+ @if(($movie_layout ?? 2) == 1)
+ @include('movies.layouts.one-column', ['results' => $results, 'site' => $site])
+ @else
+ @include('movies.layouts.two-column', ['results' => $results, 'site' => $site])
+ @endif
-
-
-
-
- @if(isset($result->imdbid) && $result->imdbid)
-
- {{ $result->title }}
-
- @else
-
{{ $result->title }}
- @endif
-
- @if(!empty($result->grp_release_reports))
- @php
- $reportCounts = array_filter(explode(',', $result->grp_release_reports));
- $totalReports = array_sum($reportCounts);
- $reportReasonsRaw = !empty($result->grp_release_report_reasons)
- ? implode(',', array_unique(array_filter(preg_split('/[|,]/', $result->grp_release_report_reasons))))
- : '';
- $reportReasons = \App\Models\ReleaseReport::reasonKeysToLabels($reportReasonsRaw);
- @endphp
- @if($totalReports > 0)
-
-
- {{ $totalReports }} report{{ $totalReports > 1 ? 's' : '' }}
-
- @endif
- @endif
-
- @if(!empty($result->grp_release_failed))
- @php
- $failedCounts = array_filter(explode(',', $result->grp_release_failed));
- $totalFailed = array_sum($failedCounts);
- @endphp
- @if($totalFailed > 0)
-
-
- {{ $totalFailed }} failed report{{ $totalFailed > 1 ? 's' : '' }}
-
- @endif
- @endif
-
-
- @if(isset($result->year) && $result->year)
- {{ $result->year }}
- @endif
- @if(isset($result->rating) && $result->rating)
-
- {{ $result->rating }}
-
- @endif
-
-
-
-
- @if(isset($result->imdbid) && $result->imdbid)
-
- IMDb
-
- @endif
- @if(isset($result->tmdbid) && $result->tmdbid)
-
- TMDb
-
- @endif
- @if(isset($result->traktid) && $result->traktid)
-
- Trakt
-
- @endif
-
-
-
-
- @if(isset($result->plot) && $result->plot)
-
{{ $result->plot }}
- @endif
-
-
- @if(isset($result->genre) && $result->genre)
-
- Genre: {!! $result->genre !!}
-
- @endif
-
-
-
- @if(isset($result->director) && $result->director)
-
- Director: {!! $result->director !!}
-
- @endif
-
-
-
- @if(isset($result->actors) && $result->actors)
-
- Actors: {!! $result->actors !!}
-
- @endif
-
-
-
- @if($guid)
- @php
- $releaseNames = isset($result->grp_release_name) ? explode('#', $result->grp_release_name) : [];
- $releaseSizes = isset($result->grp_release_size) ? explode(',', $result->grp_release_size) : [];
- $releaseGuids = isset($result->grp_release_guid) ? explode(',', $result->grp_release_guid) : [];
- $releaseIds = isset($result->grp_release_id) ? explode(',', $result->grp_release_id) : [];
- $releasePostDates = isset($result->grp_release_postdate) ? explode(',', $result->grp_release_postdate) : [];
- $releaseAddDates = isset($result->grp_release_adddate) ? explode(',', $result->grp_release_adddate) : [];
- $releaseHasPreview = isset($result->grp_haspreview) ? explode(',', $result->grp_haspreview) : [];
- $releaseJpgStatus = isset($result->grp_jpgstatus) ? explode(',', $result->grp_jpgstatus) : [];
- $releaseNfoStatus = isset($result->grp_nfostatus) ? explode(',', $result->grp_nfostatus) : [];
- $releaseFromNames = isset($result->grp_release_fromname) ? explode(',', $result->grp_release_fromname) : [];
-
- // Limit to maximum 2 releases
- $maxReleases = 2;
- $totalReleases = count($releaseNames);
- $releaseNames = array_slice($releaseNames, 0, $maxReleases);
- $releaseSizes = array_slice($releaseSizes, 0, $maxReleases);
- $releaseGuids = array_slice($releaseGuids, 0, $maxReleases);
- $releaseIds = array_slice($releaseIds, 0, $maxReleases);
- $releasePostDates = array_slice($releasePostDates, 0, $maxReleases);
- $releaseAddDates = array_slice($releaseAddDates, 0, $maxReleases);
- $releaseHasPreview = array_slice($releaseHasPreview, 0, $maxReleases);
- $releaseJpgStatus = array_slice($releaseJpgStatus, 0, $maxReleases);
- $releaseNfoStatus = array_slice($releaseNfoStatus, 0, $maxReleases);
- $releaseFromNames = array_slice($releaseFromNames, 0, $maxReleases);
- @endphp
-
- @if(!empty($releaseNames[0]))
-
-
- Available Releases
- @if($totalReleases > $maxReleases)
- (Showing {{ $maxReleases }} of {{ $totalReleases }})
- @endif
-
-
- @foreach($releaseNames as $index => $releaseName)
- @if($releaseName && isset($releaseGuids[$index]))
-
-
-
-
-
- {{ $releaseName }}
-
-
-
-
- @if(isset($releaseSizes[$index]))
-
- {{ number_format($releaseSizes[$index] / 1073741824, 2) }} GB
-
- @endif
- @if(isset($releasePostDates[$index]))
-
- {{ userDate($releasePostDates[$index],'M d, Y H:i') }}
-
- @endif
- @if(isset($releaseAddDates[$index]))
-
- {{ userDateDiffForHumans($releaseAddDates[$index]) }}
-
- @endif
- @if(isset($releaseHasPreview[$index]) && $releaseHasPreview[$index] == 1)
-
- Preview
-
- @endif
- @if(isset($releaseJpgStatus[$index]) && $releaseJpgStatus[$index] == 1)
-
- Sample
-
- @endif
- @if(isset($releaseNfoStatus[$index]) && $releaseNfoStatus[$index] == 1)
-
- NFO
-
- @endif
- @if(isset($releaseFromNames[$index]) && !empty($releaseFromNames[$index]))
-
- {{ $releaseFromNames[$index] }}
-
- @endif
-
-
-
-
-
-
-
- @endif
- @endforeach
-
-
- @endif
- @endif
-
-
-
- @endforeach
-
-
-
-
+ {{-- Bottom Pagination --}}
+
{{ $results->links() }}
@else
-
-
-
No movies found.
+ {{-- Empty State --}}
+
+
+
+
+
No Movies Found
+
+ Try adjusting your search filters or check back later for new releases.
+
@endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- @include('partials.nfo-modal')
+{{-- Preview/Sample Image Modal - CSP Safe Alpine.js --}}
+@include('partials.preview-modal')
+
+{{-- NFO Modal - CSP Safe Alpine.js --}}
+@include('partials.nfo-modal')
@endsection
+@push('scripts')
+
+@endpush
diff --git a/resources/views/movies/layouts/one-column.blade.php b/resources/views/movies/layouts/one-column.blade.php
new file mode 100644
index 000000000..4be66ef40
--- /dev/null
+++ b/resources/views/movies/layouts/one-column.blade.php
@@ -0,0 +1,15 @@
+{{-- Movies 1-Column Layout --}}
+{{-- Props: $results, $site --}}
+
+
+ @foreach($results as $result)
+ @include('movies.partials.movie-card', [
+ 'result' => $result,
+ 'layout' => 1,
+ 'site' => $site,
+ ])
+ @endforeach
+
+
diff --git a/resources/views/movies/layouts/two-column.blade.php b/resources/views/movies/layouts/two-column.blade.php
new file mode 100644
index 000000000..8e158eaf2
--- /dev/null
+++ b/resources/views/movies/layouts/two-column.blade.php
@@ -0,0 +1,15 @@
+{{-- Movies 2-Column Layout --}}
+{{-- Props: $results, $site --}}
+
+
+ @foreach($results as $result)
+ @include('movies.partials.movie-card', [
+ 'result' => $result,
+ 'layout' => 2,
+ 'site' => $site,
+ ])
+ @endforeach
+
+
diff --git a/resources/views/movies/partials/movie-card.blade.php b/resources/views/movies/partials/movie-card.blade.php
new file mode 100644
index 000000000..0d7a4c709
--- /dev/null
+++ b/resources/views/movies/partials/movie-card.blade.php
@@ -0,0 +1,223 @@
+{{-- Movie Card Partial --}}
+{{-- Props: $result (movie object), $layout (1 or 2), $site (site configuration) --}}
+
+@props([
+ 'result',
+ 'layout' => 2,
+ 'site' => [],
+])
+
+@php
+ // Get the first GUID from the comma-separated list
+ $guid = isset($result->grp_release_guid) ? explode(',', $result->grp_release_guid)[0] : null;
+
+ // Parse release data
+ $releaseNames = isset($result->grp_release_name) ? explode('#', $result->grp_release_name) : [];
+ $releaseSizes = isset($result->grp_release_size) ? explode(',', $result->grp_release_size) : [];
+ $releaseGuids = isset($result->grp_release_guid) ? explode(',', $result->grp_release_guid) : [];
+ $releaseIds = isset($result->grp_release_id) ? explode(',', $result->grp_release_id) : [];
+ $releasePostDates = isset($result->grp_release_postdate) ? explode(',', $result->grp_release_postdate) : [];
+ $releaseAddDates = isset($result->grp_release_adddate) ? explode(',', $result->grp_release_adddate) : [];
+ $releaseHasPreview = isset($result->grp_haspreview) ? explode(',', $result->grp_haspreview) : [];
+ $releaseJpgStatus = isset($result->grp_jpgstatus) ? explode(',', $result->grp_jpgstatus) : [];
+ $releaseNfoStatus = isset($result->grp_nfostatus) ? explode(',', $result->grp_nfostatus) : [];
+ $releaseFromNames = isset($result->grp_release_fromname) ? explode(',', $result->grp_release_fromname) : [];
+
+ // Limit to maximum 2 releases
+ $maxReleases = 2;
+ $totalReleases = count($releaseNames);
+ $releaseNames = array_slice($releaseNames, 0, $maxReleases);
+ $releaseSizes = array_slice($releaseSizes, 0, $maxReleases);
+ $releaseGuids = array_slice($releaseGuids, 0, $maxReleases);
+ $releaseIds = array_slice($releaseIds, 0, $maxReleases);
+ $releasePostDates = array_slice($releasePostDates, 0, $maxReleases);
+ $releaseAddDates = array_slice($releaseAddDates, 0, $maxReleases);
+ $releaseHasPreview = array_slice($releaseHasPreview, 0, $maxReleases);
+ $releaseJpgStatus = array_slice($releaseJpgStatus, 0, $maxReleases);
+ $releaseNfoStatus = array_slice($releaseNfoStatus, 0, $maxReleases);
+ $releaseFromNames = array_slice($releaseFromNames, 0, $maxReleases);
+
+ // Image dimensions based on layout
+ $coverClass = $layout == 1 ? 'w-48 h-72' : 'w-32 h-48';
+@endphp
+
+
+
+ {{-- Movie Poster --}}
+
+
+ {{-- Movie Details --}}
+
+ {{-- Title and Report Badges --}}
+
+
+ @if(isset($result->imdbid) && $result->imdbid)
+
+ {{ $result->title }}
+
+ @else
+
{{ $result->title }}
+ @endif
+
+ {{-- Report Badges --}}
+
+ @if(!empty($result->grp_release_reports))
+ @php
+ $reportCounts = array_filter(explode(',', $result->grp_release_reports));
+ $totalReports = array_sum($reportCounts);
+ $reportReasonsRaw = !empty($result->grp_release_report_reasons)
+ ? implode(',', array_unique(array_filter(preg_split('/[|,]/', $result->grp_release_report_reasons))))
+ : '';
+ $reportReasons = \App\Models\ReleaseReport::reasonKeysToLabels($reportReasonsRaw);
+ @endphp
+ @if($totalReports > 0)
+
+
+ {{ $totalReports }} report{{ $totalReports > 1 ? 's' : '' }}
+
+ @endif
+ @endif
+
+ @if(!empty($result->grp_release_failed))
+ @php
+ $failedCounts = array_filter(explode(',', $result->grp_release_failed));
+ $totalFailed = array_sum($failedCounts);
+ @endphp
+ @if($totalFailed > 0)
+
+
+ {{ $totalFailed }} failed report{{ $totalFailed > 1 ? 's' : '' }}
+
+ @endif
+ @endif
+
+
+ {{-- Year and Rating --}}
+
+ @if(isset($result->year) && $result->year)
+ {{ $result->year }}
+ @endif
+ @if(isset($result->rating) && $result->rating)
+
+ {{ $result->rating }}
+
+ @endif
+
+
+ {{-- External Links --}}
+
+ @if(isset($result->imdbid) && $result->imdbid)
+
+ IMDb
+
+ @endif
+ @if(isset($result->tmdbid) && $result->tmdbid)
+
+ TMDb
+
+ @endif
+ @if(isset($result->traktid) && $result->traktid)
+
+ Trakt
+
+ @endif
+
+
+
+
+ {{-- Plot --}}
+ @if(isset($result->plot) && $result->plot)
+
{{ $result->plot }}
+ @endif
+
+ {{-- Metadata: Genre, Director, Actors --}}
+
+ @if(isset($result->genre) && $result->genre)
+
+ Genre: {!! $result->genre !!}
+
+ @endif
+ @if(isset($result->director) && $result->director)
+
+ Director: {!! $result->director !!}
+
+ @endif
+ @if(isset($result->actors) && $result->actors)
+
+ Actors: {!! Str::limit($result->actors, 100) !!}
+
+ @endif
+
+
+ {{-- Release Information --}}
+ @if($guid && !empty($releaseNames[0]))
+
+
+ Available Releases
+ @if($totalReleases > $maxReleases)
+
+ (Showing {{ $maxReleases }} of {{ $totalReleases }})
+
+ @endif
+
+
+ @foreach($releaseNames as $index => $releaseName)
+ @include('movies.partials.release-item', [
+ 'releaseName' => $releaseName,
+ 'releaseGuid' => $releaseGuids[$index] ?? '',
+ 'releaseId' => $releaseIds[$index] ?? null,
+ 'releaseSize' => $releaseSizes[$index] ?? 0,
+ 'releasePostDate' => $releasePostDates[$index] ?? null,
+ 'releaseAddDate' => $releaseAddDates[$index] ?? null,
+ 'hasPreview' => $releaseHasPreview[$index] ?? 0,
+ 'jpgStatus' => $releaseJpgStatus[$index] ?? 0,
+ 'nfoStatus' => $releaseNfoStatus[$index] ?? 0,
+ 'fromName' => $releaseFromNames[$index] ?? '',
+ 'layout' => $layout,
+ 'index' => $index,
+ ])
+ @endforeach
+
+
+ @endif
+
+
+
+
+
diff --git a/resources/views/movies/partials/release-item.blade.php b/resources/views/movies/partials/release-item.blade.php
new file mode 100644
index 000000000..2078c7627
--- /dev/null
+++ b/resources/views/movies/partials/release-item.blade.php
@@ -0,0 +1,112 @@
+{{-- Release Item Partial --}}
+{{-- Props: $releaseName, $releaseGuid, $releaseId, $releaseSize, $releasePostDate, $releaseAddDate, $hasPreview, $jpgStatus, $nfoStatus, $fromName, $layout, $index --}}
+
+@props([
+ 'releaseName' => '',
+ 'releaseGuid' => '',
+ 'releaseId' => null,
+ 'releaseSize' => 0,
+ 'releasePostDate' => null,
+ 'releaseAddDate' => null,
+ 'hasPreview' => 0,
+ 'jpgStatus' => 0,
+ 'nfoStatus' => 0,
+ 'fromName' => '',
+ 'layout' => 2,
+ 'index' => 0,
+])
+
+@if($releaseName && $releaseGuid)
+
+
+
+ {{-- Release Name --}}
+
+ {{ $releaseName }}
+
+
+ {{-- Info Badges --}}
+
+ @if($releaseSize)
+
+ {{ number_format($releaseSize / 1073741824, 2) }} GB
+
+ @endif
+
+ @if($releasePostDate)
+
+ {{ userDate($releasePostDate, 'M d, Y H:i') }}
+
+ @endif
+
+ @if($releaseAddDate)
+
+ {{ userDateDiffForHumans($releaseAddDate) }}
+
+ @endif
+
+ @if($hasPreview == 1)
+
+ Preview
+
+ @endif
+
+ @if($jpgStatus == 1)
+
+ Sample
+
+ @endif
+
+ @if($nfoStatus == 1)
+
+ NFO
+
+ @endif
+
+ @if(!empty($fromName))
+
+ {{ $fromName }}
+
+ @endif
+
+
+
+ {{-- Action Buttons --}}
+
+
+
+@endif
+
+