가로형 이미지 목록을 가져온 후
https://api.themoviedb.org/3/movie/1071215/images?api_key=0a08e3348b874d0aa2d426ffc04357069d&language=en-US&include_image_language=en
const {data: widthImageList}= await axiosWidthImageInnstance.get(`${movieId}/images`,{});
setBackgroundPositionPoster( widthImageList?.backdrops[0]?.file_path);
목록중 하나를 선택해서 backdrops 데이터를 가져오면된다. 다음은 0번째 배열값 데이터를 가져오는 코드이다.
//가로형 이미지 목록 가져오기
//https://api.themoviedb.org/3/movie/1071215/images/?api_key=08d90cc4e7968b1f8323e51588a0d42cf06&language=en-US&include_image_language=en
//https://api.themoviedb.org/3/movie/1071215/images?api_key=0a08e38b874d0aa2d42326ffc04357069d&language=en-US&include_image_language=en
const {data: widthImageList}= await axiosWidthImageInnstance.get(`${movieId}/images`,{});
setBackgroundPositionPoster( widthImageList?.backdrops[0]?.file_path);
// console.log("widthImageList ==> ", widthImageList.backdrops);
// console.log("한개 가져오기 widthImageList ==> ",movieId , widthImageList.backdrops[0].file_path);
github => react-disney-plus-app 프로젝트
다음 전체 코드
Banner.js
import React, { useEffect, useS
tate } from 'react'
import {axiosInnstance, axiosWidthImageInnstance} from '../api/axios';
import requests from '../api/requests';
import './Banner.css';
import styled from 'styled-components';
// const fetch = require('node-fetch');
// const url = 'https://api.themoviedb.org/3/movie/movie_id?language=en-US';
// const options = {method: 'GET', headers: {accept: 'application/json'}};
// fetch(url, options)
// .then(res => res.json())
// .then(json => console.log(json))
// .catch(err => console.error('error:' + err));
const Container =styled.div`
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
height: 100vh;
`;
const HomeContainer =styled.div`
width: 100%;
height: 100%;
`;
const Iframe =styled.iframe`
width: 100%;
height: 100%;
z-index: -1;
opacity: 0.65;
border:none;
&::after{
content:"";
position: absolute;
top: 0;
left:0;
width: 100%;
height: 100%;
}
`
const Banner = () => {
const [movie, setMovie] = useState([]);
const [isClicked, setIsClicked] = useState(false);
const [backgroundPositionPoster, setBackgroundPositionPoster] =useState("");
useEffect(() => {
fetchData();
}, []);
const fetchData = async () => {
//현재 상영중인 영화 정보를 가져오기(여러 영화)
//const response=await axiosInnstance.get(requests.fetchPopularMovies); //fetchNowPlaying
const response=await axiosInnstance.get(requests.fetchNowPlaying);
// console.log("response ==> " , response.data.results);
//여러 영화 중 영화 하나의 ID를 가져오기
const movieId=response.data.results[
Math.floor(Math.random() * response.data.results.length)
].id;
//console.log("movieId ==> " ,movieId);
//특정 영화의 더 상세한 정보를 가져오기
//https://api.themoviedb.org/3/movies/848326
const {data:movieDetail}=await axiosInnstance.get(`/movie/${movieId}`,{
params:{append_to_response:"videos"}
});
console.log("widthImageList", movieId);
//가로형 이미지 목록 가져오기
//https://api.themoviedb.org/3/movie/1071215/images/?api_key=08d90cc4e7964348b1f8e51588a0d42cf06&language=en-US&include_image_language=en
//https://api.themoviedb.org/3/movie/1071215/images?api_key=0a08e3348b874d0aa2d426ffc04357069d&language=en-US&include_image_language=en
const {data: widthImageList}= await axiosWidthImageInnstance.get(`${movieId}/images`,{});
setBackgroundPositionPoster( widthImageList?.backdrops[0]?.file_path);
// console.log("widthImageList ==> ", widthImageList.backdrops);
// console.log("한개 가져오기 widthImageList ==> ",movieId , widthImageList.backdrops[0].file_path);
setMovie(movieDetail);
}
//https://image.tmdb.org/t/p/original/iNgn9LP0iMuLSnWqolivcY3Y7F6.jpg
//https://image.tmdb.org/t/p/w1280/qzgEPduJyQ6RkgMdn4nbjdKUYJM.jpg
//https://api.themoviedb.org/3/movie//buvBq2zLP7CcJth8tjrI4znvfEO/images
//`url(https://image.tmdb.org/t/p/original${movie.poster_path})`
const truncate=(str, n) => {
return str?.length > n? str.substr(0, n) + '...' : str;
};
if(isClicked){
return (
<>
<Container >
<HomeContainer>
<Iframe
src={`https://youtube.com/embed/${movie?.videos?.results[0]?.key}?controls=0&loop=1&mute=1&playlist=${movie?.videos?.results[0]?.key}`}
width="640"
height="360"
allow='autoplay; fullscreen'
>
</Iframe>
</HomeContainer>
</Container>
<button onClick={()=>setIsClicked(false)} className='btn-close'>X</button>
</>
)
}else{
console.log("movie ==> ", movie);
return (
<header className='banner'
style={{
// backgroundImage: `url(https://image.tmdb.org/t/p/original${movie.poster_path})` ,
backgroundImage: `url(https://image.tmdb.org/t/p/original${backgroundPositionPoster})`,
backgroundPosition:"top center",
backgroundSize:"100% 100%",
backgroundRepeat:"no-repeat",
}}
>
<div className='banner__contents'>
<h1 className='banner__title'>
{movie.title || movie.name || movie.original_name}
</h1>
<div className='banner__buttons'>
{movie?.videos?.results[0]?.key&&
<button className='banner__button play'
onClick={()=>setIsClicked(true)}
>Play</button>
}
</div>
<p className='banner__description'>
{truncate(movie?.overview, 100)}
</p>
</div>
<div className='bannner--fadeBottom' />
</header>
)
}
}
export default Banner
requests.js
const requests = {
fetchNowPlaying: "/movie/now_playing",
fetchTrending: "/trending/all/week",
fetchTopRated: "/movies/top_rated",
fetchActionMovies: "/discover/movie?with_genres=28",
fetchComedyMovies: "/discover/movie?with_genres=35",
fetchHorrorMovies: "/discover/movie?with_genres=27",
fetchRomanceMovies: "/discover/movie?with_genres=10749",
fetchDocumentaryMovies: "/discover/movie?with_genres=99",
fetchThrillerMovies: "/discover/movie?with_genres=12",
fetchPopularMovies: "/movie/popular",
}
export default requests ;
axios.js
import axios from 'axios'
export const axiosInnstance = axios.create({
baseURL: 'https://api.themoviedb.org/3',
params: {
api_key: '08d90cc4e7968b1f8e515883213a0d42cf06',
language: 'ko-KR'
}
});
//가로 이미지 목록 가졀오기
//https://api.themoviedb.org/3/movie/1071215/images?api_key=0a08e22338b874d0aa2d426ffc04357069d&language=en-US&include_image_language=en
export const axiosWidthImageInnstance = axios.create({
baseURL: 'https://api.themoviedb.org/3/movie/',
params: {
api_key: '08d90cc4e7968b1f8e5158823123a0d42cf06',
language: 'en-US',
include_image_language:'en'
}
});














댓글 ( 0)
댓글 남기기