From cb161052d5441e68dd3be21041ad6d50e62c3b87 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Fri, 3 Oct 2025 17:06:35 +0200 Subject: [PATCH] Update movie pages --- Blacklight/Movie.php | 1 + app/Http/Controllers/MovieController.php | 115 ++++++++++++++ resources/views/movies/index.blade.php | 143 +++++++++++++++--- .../views/movies/viewmoviefull.blade.php | 142 ++++++++++++++--- routes/web.php | 1 + 5 files changed, 364 insertions(+), 38 deletions(-) diff --git a/Blacklight/Movie.php b/Blacklight/Movie.php index cd0aac02f..79edbc4e3 100755 --- a/Blacklight/Movie.php +++ b/Blacklight/Movie.php @@ -231,6 +231,7 @@ class Movie GROUP_CONCAT(g.name ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_grpname, GROUP_CONCAT(r.searchname ORDER BY r.postdate DESC SEPARATOR '#') AS grp_release_name, GROUP_CONCAT(r.postdate ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_postdate, + GROUP_CONCAT(r.adddate ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_adddate, GROUP_CONCAT(r.size ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_size, GROUP_CONCAT(r.totalpart ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_totalparts, GROUP_CONCAT(r.comments ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_comments, diff --git a/app/Http/Controllers/MovieController.php b/app/Http/Controllers/MovieController.php index 337d04c08..06f06ce98 100644 --- a/app/Http/Controllers/MovieController.php +++ b/app/Http/Controllers/MovieController.php @@ -46,6 +46,19 @@ class MovieController extends BasePageController $result['director'] = makeFieldLinks($result, 'director', 'movies'); $result['languages'] = explode(', ', $result['language']); + // Add cover image URL + if (! empty($result['imdbid'])) { + $coverId = str_pad($result['imdbid'], 7, '0', STR_PAD_LEFT); + $coverFile = storage_path("covers/movies/{$coverId}-cover.jpg"); + if (file_exists($coverFile)) { + $result['cover'] = asset("storage/covers/movies/{$coverId}-cover.jpg"); + } else { + $result['cover'] = asset('assets/images/no-cover.png'); + } + } else { + $result['cover'] = asset('assets/images/no-cover.png'); + } + return $result; }); @@ -84,6 +97,108 @@ class MovieController extends BasePageController return view($viewName, $this->viewData); } + /** + * Show a single movie with all its releases + * + * @throws \Exception + */ + public function showMovie(Request $request, string $imdbid) + { + $this->setPreferences(); + $movie = new Movie(['Settings' => $this->settings]); + + // Get movie info + $movieInfo = $movie->getMovieInfo($imdbid); + + if (! $movieInfo) { + return redirect()->route('Movies')->with('error', 'Movie not found'); + } + + // Get all releases for this movie + $rslt = $movie->getMovieRange(1, [], 0, 1000, '', -1, $this->userdata->categoryexclusions); + + // Filter to only this movie's IMDB ID + $movieData = collect($rslt)->firstWhere('imdbid', $imdbid); + + if (! $movieData) { + return redirect()->route('Movies')->with('error', 'No releases found for this movie'); + } + + // Process movie data - ensure we handle both objects and arrays + if (is_object($movieInfo)) { + // If it's an Eloquent model, use toArray() + if (method_exists($movieInfo, 'toArray')) { + $movieArray = $movieInfo->toArray(); + } else { + $movieArray = get_object_vars($movieInfo); + } + } else { + $movieArray = $movieInfo; + } + + // Ensure we have at least the basic fields + if (empty($movieArray['title'])) { + $movieArray['title'] = 'Unknown Title'; + } + if (empty($movieArray['imdbid'])) { + $movieArray['imdbid'] = $imdbid; + } + + // Only process fields if they exist and are not empty + if (! empty($movieArray['genre'])) { + $movieArray['genre'] = makeFieldLinks($movieArray, 'genre', 'movies'); + } + if (! empty($movieArray['actors'])) { + $movieArray['actors'] = makeFieldLinks($movieArray, 'actors', 'movies'); + } + if (! empty($movieArray['director'])) { + $movieArray['director'] = makeFieldLinks($movieArray, 'director', 'movies'); + } + + // Add cover image URL + if (! empty($imdbid)) { + $coverId = str_pad($imdbid, 7, '0', STR_PAD_LEFT); + $coverFile = storage_path("covers/movies/{$coverId}-cover.jpg"); + if (file_exists($coverFile)) { + $movieArray['cover'] = asset("storage/covers/movies/{$coverId}-cover.jpg"); + } else { + $movieArray['cover'] = asset('assets/images/no-cover.png'); + } + } else { + $movieArray['cover'] = asset('assets/images/no-cover.png'); + } + + // Process all releases + $releaseNames = isset($movieData->grp_release_name) ? explode('#', $movieData->grp_release_name) : []; + $releaseSizes = isset($movieData->grp_release_size) ? explode(',', $movieData->grp_release_size) : []; + $releaseGuids = isset($movieData->grp_release_guid) ? explode(',', $movieData->grp_release_guid) : []; + $releasePostDates = isset($movieData->grp_release_postdate) ? explode(',', $movieData->grp_release_postdate) : []; + $releaseAddDates = isset($movieData->grp_release_adddate) ? explode(',', $movieData->grp_release_adddate) : []; + + $releases = []; + foreach ($releaseNames as $index => $releaseName) { + if ($releaseName && isset($releaseGuids[$index])) { + $releases[] = [ + 'name' => $releaseName, + 'guid' => $releaseGuids[$index], + 'size' => $releaseSizes[$index] ?? 0, + 'postdate' => $releasePostDates[$index] ?? null, + 'adddate' => $releaseAddDates[$index] ?? null, + ]; + } + } + + $this->viewData = array_merge($this->viewData, [ + 'movie' => $movieArray, + 'releases' => $releases, + 'meta_title' => ($movieArray['title'] ?? 'Movie').' - Movie Details', + 'meta_keywords' => 'movie,details,releases', + 'meta_description' => 'View all releases for '.($movieArray['title'] ?? 'this movie'), + ]); + + return view('movies.viewmoviefull', $this->viewData); + } + /** * @return \Illuminate\Http\JsonResponse|\Illuminate\View\View */ diff --git a/resources/views/movies/index.blade.php b/resources/views/movies/index.blade.php index 13a6a1eb3..f3801d7a6 100644 --- a/resources/views/movies/index.blade.php +++ b/resources/views/movies/index.blade.php @@ -93,23 +93,23 @@
-
+
@if($guid) @if(isset($result->cover) && $result->cover) - {{ $result->title }} + {{ $result->title }} @else -
- +
+
@endif
@else @if(isset($result->cover) && $result->cover) - {{ $result->title }} + {{ $result->title }} @else -
- +
+
@endif @endif @@ -119,8 +119,8 @@
- @if($guid) - + @if(isset($result->imdbid) && $result->imdbid) +

{{ $result->title }}

@else @@ -136,17 +136,31 @@ {{ $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 }}

+

{{ $result->plot }}

@endif
@@ -157,7 +171,7 @@ @endif
-
+
@if(isset($result->director) && $result->director)
Director: {!! $result->director !!} @@ -165,7 +179,7 @@ @endif
-
+
@if(isset($result->actors) && $result->actors)
Actors: {!! $result->actors !!} @@ -173,12 +187,78 @@ @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) : []; + $releasePostDates = isset($result->grp_release_postdate) ? explode(',', $result->grp_release_postdate) : []; + $releaseAddDates = isset($result->grp_release_adddate) ? explode(',', $result->grp_release_adddate) : []; + + // 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); + $releasePostDates = array_slice($releasePostDates, 0, $maxReleases); + $releaseAddDates = array_slice($releaseAddDates, 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])) + + Posted: {{ \Carbon\Carbon::parse($releasePostDates[$index])->format('M d, Y') }} + + @endif + @if(isset($releaseAddDates[$index])) + + Added: {{ \Carbon\Carbon::parse($releaseAddDates[$index])->diffForHumans() }} + + @endif +
+
+ +
+
+ @endif + @endforeach +
+
+ @endif @endif
@@ -198,5 +278,32 @@
@endif
+ +@push('scripts') + +@endpush @endsection diff --git a/resources/views/movies/viewmoviefull.blade.php b/resources/views/movies/viewmoviefull.blade.php index a968cbe33..5bc20be13 100644 --- a/resources/views/movies/viewmoviefull.blade.php +++ b/resources/views/movies/viewmoviefull.blade.php @@ -32,20 +32,43 @@
- @if(isset($movie['cover']) && $movie['cover']) - {{ $movie['title'] }} + @if(!empty($movie['cover'] ?? null)) + {{ $movie['title'] ?? 'Movie' }} @else
@endif + + +
+ @if(!empty($movie['imdbid'] ?? null)) + + View on IMDb + + @endif + @if(!empty($movie['tmdbid'] ?? null)) + + View on TMDb + + @endif + @if(!empty($movie['traktid'] ?? null)) + + View on Trakt + + @endif +
-

{{ $movie['title'] }}

+

{{ $movie['title'] ?? 'Unknown Title' }}

- @if(isset($movie['rating']) && $movie['rating']) + @if(!empty($movie['tagline'] ?? null)) +

"{{ $movie['tagline'] }}"

+ @endif + + @if(!empty($movie['rating'] ?? null))
@@ -56,35 +79,35 @@ @endif
- @if(isset($movie['year']) && $movie['year']) + @if(!empty($movie['year'] ?? null))
Year: {{ $movie['year'] }}
@endif - @if(isset($movie['genre']) && $movie['genre']) + @if(!empty($movie['genre'] ?? null))
Genre: {!! $movie['genre'] !!}
@endif - @if(isset($movie['director']) && $movie['director']) + @if(!empty($movie['director'] ?? null))
Director: {!! $movie['director'] !!}
@endif - @if(isset($movie['actors']) && $movie['actors']) + @if(!empty($movie['actors'] ?? null))
- Actors: + Cast: {!! $movie['actors'] !!}
@endif - @if(isset($movie['language']) && $movie['language']) + @if(!empty($movie['language'] ?? null))
Language: {{ $movie['language'] }} @@ -92,29 +115,81 @@ @endif
- @if(isset($movie['plot']) && $movie['plot']) + @if(!empty($movie['plot'] ?? null))
-

Plot

+

Plot Synopsis

{{ $movie['plot'] }}

@endif - @if(isset($movie['trailer']) && $movie['trailer']) + @if(!empty($movie['trailer'] ?? null))

Trailer

-
- +
+ {!! $movie['trailer'] !!}
@endif
+ + + @if(isset($releases) && count($releases) > 0) +
+

+ Available Releases + ({{ count($releases) }} total) +

+ +
+ @foreach($releases as $release) +
+
+
+ + {{ $release['name'] }} + +
+ + {{ number_format($release['size'] / 1073741824, 2) }} GB + + @if($release['postdate']) + + Posted: {{ \Carbon\Carbon::parse($release['postdate'])->format('M d, Y') }} + + @endif + @if($release['adddate']) + + Added: {{ \Carbon\Carbon::parse($release['adddate'])->diffForHumans() }} + + @endif +
+
+
+ + Download + + + + Details + +
+
+
+ @endforeach +
+
+ @else +
+
+ +

No releases available for this movie.

+
+
+ @endif
@else
@@ -123,5 +198,32 @@
@endif
+ +@push('scripts') + +@endpush @endsection diff --git a/routes/web.php b/routes/web.php index 97b1a1a88..a03f4fa27 100644 --- a/routes/web.php +++ b/routes/web.php @@ -119,6 +119,7 @@ Route::middleware('isVerified')->group(function () { Route::middleware('clearance')->group(function () { Route::match(['GET', 'POST'], 'Games', [GamesController::class, 'show'])->name('Games'); + Route::match(['GET', 'POST'], 'movie/{imdbid}', [MovieController::class, 'showMovie'])->name('movie.view'); Route::match(['GET', 'POST'], 'Movies/{id?}', [MovieController::class, 'showMovies'])->name('Movies'); Route::match(['GET', 'POST'], 'movie', [MovieController::class, 'showMovies'])->name('movie'); Route::match(['GET', 'POST'], 'movietrailers', [MovieController::class, 'showTrailer'])->name('movietrailers');