diff --git a/app/Http/Controllers/MovieController.php b/app/Http/Controllers/MovieController.php index 3cab483..f8d152e 100644 --- a/app/Http/Controllers/MovieController.php +++ b/app/Http/Controllers/MovieController.php @@ -22,14 +22,8 @@ class MovieController extends Controller ->where('slug', $slug) ->firstOrFail(); - // comments - $comments = Comment::where(function($query) use ($movie){ - $query->where(function($query) use ($movie){ - $query->where('entity_id', $movie->id) - ->where('entity_type', Comment::TYPE_MOVIE); - }) - ->orWhere('tmdb_id', $movie->tmdb_id); - }) + $comments = Comment::where('entity_id', $movie->id) + ->where('entity_type', Comment::TYPE_MOVIE) ->paginate(15); return view('movie.show', compact('movie', 'comments')); diff --git a/app/Livewire/MoviePage/Collection.php b/app/Livewire/MoviePage/Collection.php new file mode 100644 index 0000000..e9a8d1d --- /dev/null +++ b/app/Livewire/MoviePage/Collection.php @@ -0,0 +1,31 @@ +collection = $this->movie->collections()->first(); + + if ($this->collection) { + // Get all movies in this collection + $this->collectionMovies = $this->collection->movies() + ->where('movies.id', '!=', $this->movie->id) // Exclude the current movie + ->get(); + } + } +} diff --git a/app/Livewire/MoviePage/Tabs/Images.php b/app/Livewire/MoviePage/Tabs/Images.php new file mode 100644 index 0000000..00eef28 --- /dev/null +++ b/app/Livewire/MoviePage/Tabs/Images.php @@ -0,0 +1,23 @@ +movie = Movie::with('images')->where('id', $this->movie->id)->first(); + $this->images = $this->movie->images; + } +} diff --git a/app/Service/MediaProcessing/MovieProcessingService.php b/app/Service/MediaProcessing/MovieProcessingService.php index 7fb973a..b4abfa1 100644 --- a/app/Service/MediaProcessing/MovieProcessingService.php +++ b/app/Service/MediaProcessing/MovieProcessingService.php @@ -48,22 +48,11 @@ class MovieProcessingService implements ProcessingInterface public static function getBatch(int $batch, string $job) { - if ($job === ItemToFetchJobs::JOB_DETAILS) { - return ItemToFetchJobs::leftJoin('movies', function ($join) { - $join->on('movies.tmdb_id', '=', 'item_to_fetch_jobs.tmdb_id'); - }) - ->whereRaw("FIND_IN_SET('".ItemToFetchJobs::JOB_DETAILS."', item_to_fetch_jobs.jobs)") - ->whereIn('item_to_fetch_jobs.type', ['movies', 'movie']) - ->whereNull('movies.id') - ->take($batch) - ->get(); - } - return ItemToFetchJobs::leftJoin('movies', function ($join) { $join->on('movies.tmdb_id', '=', 'item_to_fetch_jobs.tmdb_id'); }) ->whereRaw("FIND_IN_SET('".$job."', item_to_fetch_jobs.jobs)") - ->where('item_to_fetch_jobs.type', 'tv_series') + ->where('item_to_fetch_jobs.type', 'movie') ->whereNotNull('movies.id') ->take($batch) ->get(); @@ -77,50 +66,57 @@ class MovieProcessingService implements ProcessingInterface // @todo maybe raise an exception here return; } - echo "Processing {$methodName} ".$item->tmdb_id."\n"; + echo "Processing {$methodName} ".$item->tmdb_id." (".$item->id.") \n"; $this->$methodName($item); + + // maybe we should sleep for a while so we do not spam the tmdb api + sleep(1); } private function getDetails($item) { $tmdbMovie = $this->moviesApi->getMovie($item->tmdb_id); + if (isset($tmdbMovie['status_code']) && $tmdbMovie['status_code'] == 34) { - echo "[N]"; + echo "[ApiError-Could not be found]\n]"; return; } + $tmdbMovie['tmdb_id'] = $tmdbMovie['id']; Log::channel('fetch_export_items_details')->info("Processing TmdbId ".$tmdbMovie['tmdb_id']); - $movie = Movie::where('tmdb_id', $tmdbMovie['tmdb_id'])->first(); - - if($movie) { - return; - } - $tmdbMovie['slug'] = Str::slug($tmdbMovie['title'].'-'.$tmdbMovie['tmdb_id']); $tmdbMovie['release_date'] = $tmdbMovie['release_date'] ? new \DateTime($tmdbMovie['release_date']) : null; - $movieId = Movie::create($tmdbMovie); + $movie = Movie::where('tmdb_id', $tmdbMovie['tmdb_id'])->first(); + + if(!$movie) { + $movie = Movie::create($tmdbMovie); + } + + $movieId = $movie->id; + +// $movieId = Movie::create($tmdbMovie); if (!empty($tmdbMovie['belongs_to_collection'])) { Log::channel('fetch_export_items_details')->info("Processing collections for ".$tmdbMovie['tmdb_id']); - $this->processMovieCollection($movieId->id, $tmdbMovie['belongs_to_collection']); + $this->processMovieCollection($movieId, $tmdbMovie['belongs_to_collection']); } if (!empty($tmdbMovie['genres'])) { Log::channel('fetch_export_items_details')->info("Processing genres for ".$tmdbMovie['tmdb_id']); - $this->processMovieGenres($movieId->id, $tmdbMovie['genres']); + $this->processMovieGenres($movieId, $tmdbMovie['genres']); } if (!empty($tmdbMovie['production_companies'])) { Log::channel('fetch_export_items_details')->info("Processing production companies ".$tmdbMovie['tmdb_id']); - $this->processProductionCompanies($movieId->id, $tmdbMovie['production_companies']); + $this->processProductionCompanies($movieId, $tmdbMovie['production_companies']); } if (!empty($tmdbMovie['production_countries'])) { Log::channel('fetch_export_items_details')->info("Processing production countries ".$tmdbMovie['tmdb_id']); - $this->processProductionCountries($movieId->id, $tmdbMovie['production_countries']); + $this->processProductionCountries($movieId, $tmdbMovie['production_countries']); } $this->removeElementFromRemainingJobs($tmdbMovie['id'], 'Details'); @@ -331,6 +327,7 @@ class MovieProcessingService implements ProcessingInterface $tmdbMovieReviews = $this->moviesApi->getReviews($item->tmdb_id); if (empty($tmdbMovieReviews) || !isset($tmdbMovieReviews['results'])){ + echo "Nope"; return; } @@ -346,6 +343,7 @@ class MovieProcessingService implements ProcessingInterface $user = User::where('name', $tmdbReview['author'])->first(); if (!$user) { + echo "Create user ".$tmdbReview['author']; $user = User::create([ 'name' => $tmdbReview['author'], 'slug' => Str::slug($tmdbReview['author']), @@ -357,6 +355,7 @@ class MovieProcessingService implements ProcessingInterface if (!$existingReview) { + echo "Create comment by user ".$tmdbReview['author']." on movie ".$movie->title; Comment::create([ 'entity_id' => $movie->id, 'entity_type' => Comment::TYPE_MOVIE, @@ -678,7 +677,7 @@ class MovieProcessingService implements ProcessingInterface ->first(); if (!$similarLink) { - MovieRecommendation::create([ + MovieSimilar::create([ 'movie_id' => $initialMovie->id, 'similar_movie_id' => $similarMovie->id, ]); @@ -719,6 +718,8 @@ class MovieProcessingService implements ProcessingInterface private function processMovieCollection(int $movieId, $belongsToCollection) { + dd($belongsToCollection); + $movieCollection = MovieCollection::where('tmdb_id', $belongsToCollection['id'])->first(); if (!$movieCollection) { @@ -784,6 +785,7 @@ class MovieProcessingService implements ProcessingInterface if (is_string($remainingJobs)) { $remainingJobs = explode(',', $remainingJobs); } else { + dd($remainingJobs); return; } diff --git a/resources/js/app.js b/resources/js/app.js index b12c34b..c690f88 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,5 +1,6 @@ import './bootstrap'; import './star_rating'; +import './theme-switcher'; import $ from 'jquery'; import Lightbox from "bs5-lightbox"; diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 9ce25f6..6456725 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -38,7 +38,6 @@ @livewireScripts @bukScripts - @stack('scripts') diff --git a/resources/views/livewire/movie-page/collection.blade.php b/resources/views/livewire/movie-page/collection.blade.php new file mode 100644 index 0000000..54cf9ee --- /dev/null +++ b/resources/views/livewire/movie-page/collection.blade.php @@ -0,0 +1,34 @@ +
+ @if($collection) +
+
Part of the {{ $collection->name }} Collection
+
+
+ @foreach($collectionMovies as $collectionMovie) + + @endforeach +
+ @endif +
diff --git a/resources/views/livewire/movie-page/recommendations.blade.php b/resources/views/livewire/movie-page/recommendations.blade.php index 7d30e7a..e196a0b 100644 --- a/resources/views/livewire/movie-page/recommendations.blade.php +++ b/resources/views/livewire/movie-page/recommendations.blade.php @@ -1,22 +1,26 @@
@foreach($recommendations as $recommendation) -
- + diff --git a/resources/views/livewire/movie-page/similar.blade.php b/resources/views/livewire/movie-page/similar.blade.php index 3e23c9c..a3ba571 100644 --- a/resources/views/livewire/movie-page/similar.blade.php +++ b/resources/views/livewire/movie-page/similar.blade.php @@ -1,22 +1,26 @@
@foreach($similarMovies as $similarMovie) -
- + diff --git a/resources/views/livewire/movie-page/tabs/images.blade.php b/resources/views/livewire/movie-page/tabs/images.blade.php new file mode 100644 index 0000000..9b3eff8 --- /dev/null +++ b/resources/views/livewire/movie-page/tabs/images.blade.php @@ -0,0 +1,25 @@ +
+ +
Backdrops
+
+ @foreach($images->where('type', 'backdrops') as $image) +
+ + Movie Backdrop + +
+ @endforeach +
+ + +
Posters
+
+ @foreach($images->where('type', 'posters') as $image) +
+ + Movie Poster + +
+ @endforeach +
+
diff --git a/resources/views/movie/show.blade.php b/resources/views/movie/show.blade.php index fd3f697..3dca956 100644 --- a/resources/views/movie/show.blade.php +++ b/resources/views/movie/show.blade.php @@ -103,6 +103,9 @@ +
@@ -120,6 +123,9 @@
@livewire(App\Livewire\MoviePage\Tabs\Releases::class, ['movie' => $movie])
+
+ @livewire(App\Livewire\MoviePage\Tabs\Images::class, ['movie' => $movie]) +
@@ -127,6 +133,18 @@
+ + @if($movie->collections()->exists()) +
+
+
Movie Collection
+
+
+ @livewire(App\Livewire\MoviePage\Collection::class, ['movie' => $movie]) +
+
+ @endif +
diff --git a/storage/movies_08_10_2025.json.gz b/storage/movies_08_10_2025.json.gz new file mode 100644 index 0000000..24f76e2 Binary files /dev/null and b/storage/movies_08_10_2025.json.gz differ