Files
mtdb_movie/app/Http/Controllers/ApiTmdbController.php
maher 703f50a09d
Some checks failed
Build / run (push) Has been cancelled
first commit
2025-10-29 11:42:25 +01:00

298 lines
11 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use Common\Core\BaseController;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Http;
use App\Models\Genre;
use App\Models\ProductionCountry;
use App\Models\Title;
use App\Models\Image;
use App\Models\Keyword;
use App\Models\Person;
use App\Models\Video;
use Intervention\Image\Drivers\Gd\Driver;
use Intervention\Image\ImageManager;
use Illuminate\Support\Facades\DB;
class ApiTmdbController extends BaseController
{
protected $baseUrl = 'https://api.themoviedb.org/3';
protected $token = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJjYTJiNzZmNDkyZWQxNGFmMmU2Njk4N2E2YmRjZDY0ZiIsIm5iZiI6MTc0OTQ2MzY4NC41NjksInN1YiI6IjY4NDZiMjg0NDQ5MDEyOGMxMzNmYzk1NiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.PXMuq0fxXaC2kR1qrd-LDeezz0HAhL8o3-4QGaik0D4";
private array $sizes = [
'original' => null,
'large' => 500,
'medium' => 300,
'small' => 92,
];
public function index()
{
$movieId = request('movieId');
//$movieId = 1284120;
/****************************************** */
$responseMovie = Http::withHeaders([
'Authorization' => 'Bearer ' . $this->token,
'Accept' => 'application/json',
])->get("$this->baseUrl/movie/$movieId", [
'language' => 'fr-FR'
]);
$movie = $responseMovie->successful() ? $responseMovie->json() : [];
$title = Title::create([
'imdb_id' => $movie['id'],
'backdrop' => "https://image.tmdb.org/t/p/original".$movie['backdrop_path'],
'poster' => "https://image.tmdb.org/t/p/original".$movie['poster_path'],
'name' => $movie['title'],
'original_title' => $movie['original_title'],
'language' => $movie['original_language'],
'is_series' => false,
'release_date' => $movie['release_date'],
'tagline' => $movie['tagline'],
'description' => $movie['overview'],
'runtime' => $movie['runtime'],
//////////////////'certification' => $movie[''],
'budget' => $movie['budget'],
'revenue' => $movie['revenue'],
'popularity' => $movie['popularity'],
'language' => $movie['original_language'],
'adult' => $movie['adult'],
'type' => 'movie',
'tmdb_vote_average' => $movie['vote_average']
]);
$genres = $countrys = [];
foreach($movie['production_countries'] as $country)
{
$productionCountry = ProductionCountry::updateOrCreate(
['name' => $country['iso_3166_1']],
['name' => $country['iso_3166_1'], 'display_name' => $country['name']
]);
$countrys[] = $productionCountry->id;
}
foreach($movie['genres'] as $genre)
{
$genre = Genre::updateOrCreate(
['name' => $genre['name']],
[
'name' => $genre['name'],
'display_name' => $genre['name']
]);
$genres[] = $genre->id;
}
$title->productionCountries()->attach($countrys);
$title->genres()->attach($genres);
/*********************************************** */
$responseMovieKeyword = Http::withHeaders([
'Authorization' => 'Bearer ' . $this->token,
'Accept' => 'application/json',
])->get("$this->baseUrl/movie/$movieId/keywords", [
'language' => 'fr-FR'
]);
$movieKeywords = $responseMovieKeyword->successful() ? $responseMovieKeyword->json() : [];
$keywords = [];
foreach($movieKeywords['keywords'] as $valKey)
{
$keyword = Keyword::updateOrCreate(
['name' => $valKey['name']],
[
'name' => $valKey['name'],
'display_name' => $valKey['name']
]);
$keywords[] = $keyword->id;
}
$title->keywords()->attach($keywords);
/************************************************/
$responseMovieCredits = Http::withHeaders([
'Authorization' => 'Bearer ' . $this->token,
'Accept' => 'application/json',
])->get("$this->baseUrl/movie/$movieId/credits", [
'language' => 'fr-FR'
]);
$movieCredits = $responseMovieCredits->successful() ? $responseMovieCredits->json() : [];
foreach($movieCredits['cast'] as $cast)
{
$person_id = $this->getPeopleByTMDBid($cast['id']);
$title->createCredit([
'person_id'=>$person_id,
'department'=> "actors",
'job'=>"actor",
'order'=>$cast['order'],
'character'=>$cast['character'],
]);
}
foreach($movieCredits['crew'] as $cast)
{
$person_id = $this->getPeopleByTMDBid($cast['id']);
$title->createCredit([
'person_id'=>$person_id,
'department'=> $cast['department'],
'job'=>$cast['job'],
]);
}
/********************* Videos *******************************/
$responseMovieVideos = Http::withHeaders([
'Authorization' => 'Bearer ' . $this->token,
'Accept' => 'application/json',
])->get("$this->baseUrl/movie/$movieId/videos", [
'language' => 'fr-FR'
]);
$MovieVideos = $responseMovieVideos->successful() ? $responseMovieVideos->json() : [];
foreach($MovieVideos['results'] as $keyV =>$video)
{
if( ($video['site'] == "YouTube") && ($video['type'] == "Trailer") )
{
Video::create([
'name'=>$video['name'],
'src'=>"https://youtube.com/embed/".$video['key'],
'type'=>'embed',
'quality'=> ($video['size']==1080)? "1080p" : null,
'title_id'=>$title->id,
'origin'=>"local",
'downvotes'=>0,
'upvotes'=>0,
'approved'=>1,
'order'=>$keyV,
'user_id'=>auth()->id(),
'language'=>$video['iso_639_1'],
'category'=>'trailer',
]);
}
}
/***********************Images***************************/
$responseMovieImages = Http::withHeaders([
'Authorization' => 'Bearer ' . $this->token,
'Accept' => 'application/json',
])->get("$this->baseUrl/movie/$movieId/images", []);
$movieImages = $responseMovieImages->successful() ? $responseMovieImages->json() : [];
for($i=0; $i<=5; $i++)
{
$nameFileImage = isset($movieImages['backdrops'][$i]['file_path'])? $movieImages['backdrops'][$i]['file_path'] : null;
if($nameFileImage)
{
$url = $this->saveImage("https://image.tmdb.org/t/p/original$nameFileImage");
Image::where('model_type', Title::MODEL_TYPE)
->where('model_id', $title->id)
->increment('order');
Image::create([
'url' => $url,
'type' => 'backdrop',
'source' => 'local',
'model_type' => Title::MODEL_TYPE,
'model_id' => $title->id,
'order' => 0
]);
}
}
}
function getPeopleByTMDBid($tmdb_id)
{
$person = DB::table('people')->where('tmdb_id', $tmdb_id)->first();
if(!$person)
{
$responsePeople = Http::withHeaders([
'Authorization' => 'Bearer ' . $this->token,
'Accept' => 'application/json',
])->get("$this->baseUrl/person/$tmdb_id", [
'language' => 'fr-FR'
]);
$people = $responsePeople->successful() ? $responsePeople->json() : [];
$person = Person::create([
'tmdb_id' => $people['id'],
'name' => $people['name'],
'description'=>$people['biography'],
'gender'=>$people['gender'],
'birth_date'=>$people['birthday'],
'birth_place'=>$people['place_of_birth'],
'poster'=>"https://image.tmdb.org/t/p/w500".$people['profile_path'],
'imdb_id'=>$people['imdb_id'],
'known_for'=>$people['known_for_department'],
'popularity'=>$people['popularity'],
'death_date'=>$people['deathday'],
'adult'=>$people['adult'],
]);
}
return $person->id ;
}
public function saveImage(string $urlImage): string
{
$hash = Str::random(30);
$manager = new ImageManager(new Driver());
// Télécharger l'image depuis l'URL
$imageContent = file_get_contents($urlImage);
$tempFile = tempnam(sys_get_temp_dir(), 'img');
file_put_contents($tempFile, $imageContent);
try {
$img = $manager->read($tempFile);
// Déterminer l'extension à partir de l'URL ou utiliser jpeg par défaut
$pathInfo = pathinfo(parse_url($urlImage, PHP_URL_PATH));
$extension = $pathInfo['extension'] ?? 'jpeg';
$extension = in_array(strtolower($extension), ['jpg', 'jpeg', 'png']) ? $extension : 'jpeg';
foreach ($this->sizes as $key => $size) {
if ($size) {
$img->scale($size);
}
Storage::disk('public')->put(
"media-images/backdrops/$hash/$key.$extension",
$extension === 'png' ? $img->toPng() : $img->toJpeg(),
);
}
$endpoint = config('common.site.file_preview_endpoint');
$uri = "media-images/backdrops/$hash/original.$extension";
return $endpoint
? "$endpoint/storage/$uri"
: Storage::disk('public')->url($uri);
} finally {
// Nettoyer le fichier temporaire
if (file_exists($tempFile)) {
unlink($tempFile);
}
}
}
}