From 347a849c850b4b48c2d2a3dc782dd0e917162e7d Mon Sep 17 00:00:00 2001 From: DoarMihai Date: Mon, 30 Dec 2024 23:55:01 +0200 Subject: [PATCH] [#1] similar movies --- app/Models/MovieSimilar.php | 13 ++++ .../MovieProcessingService.php | 78 +++++++++++++++++++ ..._30_214806_create_movie_similars_table.php | 29 +++++++ 3 files changed, 120 insertions(+) create mode 100644 app/Models/MovieSimilar.php create mode 100644 database/migrations/2024_12_30_214806_create_movie_similars_table.php diff --git a/app/Models/MovieSimilar.php b/app/Models/MovieSimilar.php new file mode 100644 index 0000000..3e5c4cd --- /dev/null +++ b/app/Models/MovieSimilar.php @@ -0,0 +1,13 @@ +tmdb_id)->first(); + foreach ($tmdbRecommendations['results'] as $tmdbRecommendation) { $itemToFetch = ItemToFetch::where('tmdb_id', $tmdbRecommendation['id'])->where('type', ItemToFetch::TYPE_MOVIE)->first(); @@ -518,6 +521,17 @@ class MovieProcessingService implements ProcessingInterface $movie = Movie::where('tmdb_id', $tmdbRecommendation['id'])->first(); if ($movie) { + $recommendationLink = MovieRecommendation::where('movie_id', $initialMovie->id) + ->where('recommended_movie_id', $movie->id) + ->first(); + + if (!$recommendationLink) { + MovieRecommendation::create([ + 'movie_id' => $initialMovie->id, + 'recommended_movie_id' => $movie->id, + ]); + } + continue; } @@ -546,6 +560,70 @@ class MovieProcessingService implements ProcessingInterface 'recommended_movie_id' => $recommendedMovie->id, ]); } + + $this->removeElementFromRemainingJobs($item->tmdb_id, ItemToFetchJobs::JOB_RECOMMNDATION); + } + + private function getSimilar($item) + { + $tmdbSimilarMovies = $this->moviesApi->getSimilar($item->tmdb_id); + + if (empty($tmdbSimilarMovies) || empty($tmdbSimilarMovies['results'])) { + return; + } + + $initialMovie = Movie::where('tmdb_id', $item->tmdb_id)->first(); + + foreach ($tmdbSimilarMovies['results'] as $tmdbSimilarMovie) { + $itemToFetch = ItemToFetch::where('tmdb_id', $tmdbSimilarMovie['id'])->where('type', ItemToFetch::TYPE_MOVIE)->first(); + + if ($itemToFetch) { + $this->getDetails($itemToFetch); + continue; + } + + $similarMovie = Movie::where('tmdb_id', $tmdbSimilarMovie['id'])->first(); + + if ($similarMovie) { + $similarLink = MovieSimilar::where('movie_id', $initialMovie->id) + ->where('similar_movie_id', $similarMovie->id) + ->first(); + + if (!$similarLink) { + MovieRecommendation::create([ + 'movie_id' => $initialMovie->id, + 'similar_movie_id' => $similarMovie->id, + ]); + } + + continue; + } + + + $itemToFetch = ItemToFetch::create([ + 'tmdb_id' => $tmdbSimilarMovie['id'], + 'type' => ItemToFetch::TYPE_MOVIE, + ]); + + $jobs = ItemToFetchJobs::JOBS; + $jobs[] = "Details"; + + ItemToFetchJobs::create([ + 'tmdb_id' => $tmdbSimilarMovie['id'], + 'type' => ItemToFetch::TYPE_MOVIE, + 'remaining_jobs' => json_encode($jobs), + ]); + + $this->getDetails($itemToFetch); + + $movie = Movie::where('tmdb_id', $item->tmdb_id)->first(); + $recommendedMovie = Movie::where('tmdb_id', $tmdbSimilarMovie['id'])->first(); + + MovieSimilar::create([ + 'movie_id' => $movie->id, + 'similar_movie_id' => $recommendedMovie->id, + ]); + } } private function processMovieCollection(int $movieId, $belongsToCollection) diff --git a/database/migrations/2024_12_30_214806_create_movie_similars_table.php b/database/migrations/2024_12_30_214806_create_movie_similars_table.php new file mode 100644 index 0000000..110d499 --- /dev/null +++ b/database/migrations/2024_12_30_214806_create_movie_similars_table.php @@ -0,0 +1,29 @@ +id(); + $table->unsignedBigInteger('movie_id'); + $table->unsignedBigInteger('similar_movie_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('movie_similars'); + } +};