본문 바로가기

PYTHON-BACK

# 24.11.19_영화추천 사이트 제작

728x90

개발한 내용이 많이 있지만 정리하고 있는 중이라 오늘 개발한 내용만 정리해서 포스팅 해보겠습니다.

 

오늘은 프로필 페이지 내에서 리메이크 영화와 원작 영화 평점 비교와 수익 비교하는 그래프를 제작해서 만들었습니다.

 

 

 

TMDB에서 api를 가져와서 제작했습니다.

 

 

RemakeMoviesAPIView (평점 비교)

리메이크 영화와 원작 영화의 평점 (vote_average) 를 비교했습니다.

 

 

class RemakeMoviesAPIView(View):
    def get(self, request):
        api_key = settings.TMDB_API_KEY  # TMDb API 키
        base_url = "https://api.themoviedb.org/3"  # TMDb API 기본 URL

        # 1. 사전에 정의된 리메이크 영화 리스트
predefined_remakes = [
            {"remake_title": "Let Me In", "original_title": "Let the Right One In"},
            {"remake_title": "The Departed", "original_title": "Infernal Affairs"},
            {"remake_title": "Oldboy", "original_title": "Oldeuboi"},
            {"remake_title": "Insomnia", "original_title": "Insomnia"},
            {"remake_title": "Scarface", "original_title": "Scarface"},
            {"remake_title": "A Fistful of Dollars", "original_title": "Yojimbo"},
            {"remake_title": "The Magnificent Seven", "original_title": "Seven Samurai"},
            {"remake_title": "12 Monkeys", "original_title": "La Jetée"},
            {"remake_title": "True Lies", "original_title": "La Totale!"},
            {"remake_title": "The Birdcage", "original_title": "La Cage aux Folles"},
        ]
        remake_comparison = []  # 결과를 저장할 리스트
        for pair in predefined_remakes:
            # 2. 원작 영화 검색
            url = f"{base_url}/search/movie"
            params = {"api_key": api_key, "query": pair["original_title"], "language": "ko-KR"}
            original_response = requests.get(url, params=params)

            # 3. 리메이크 영화 검색
            params = {"api_key": api_key, "query": pair["remake_title"], "language": "ko-KR"}
            remake_response = requests.get(url, params=params)

            if original_response.status_code == 200 and remake_response.status_code == 200:
                # 4. 검색 결과 처리
                original_data = original_response.json()
                remake_data = remake_response.json()

                if original_data["results"] and remake_data["results"]:
                    # 5. 적합한 영화 선택 (예: 개봉 연도 기준)
                    original_movie = original_data["results"][0]
                    remake_movie = remake_data["results"][0]

                    # 6. 평점 데이터 추가
                    remake_comparison.append({
                        "remake_title": remake_movie["title"],
                        "original_title": original_movie["title"],
                        "remake_vote_average": remake_movie["vote_average"],
                        "original_vote_average": original_movie["vote_average"]
                    })

        # 7. JSON 응답 반환
        return JsonResponse(remake_comparison, safe=False)

 

 

  • 리메이크 영화와 원작 영화의 제목을 사전에 정의  :  "The Departed"와 "Infernal Affairs"
    • 사전 정의의 경우 리메이크가 된 영화들을 따로 찾아서  10개 정도 구현해봤는데 추후에는 api를 통해서 필터링해서 가져올 예정입니다.
  • 원작과 리메이크 영화 검색: /search/movie:
    • 원작과 리메이크 영화를 각각 query 파라미터로 검색
    • 검색 결과는 results 리스트로 반환
  • 검색 결과 처리:
    • results 리스트에서 첫 번째 결과(results[0])를 사용
    • 영화 데이터를 선택할 때 조건(예: 개봉 연도)을 추가할 수 있다.
  • 평점 데이터 추가
    • 영화 데이터에서 vote_average를 가져와 비교 데이터 구성
  • Json 응답 반환
    • 결과를 리스트 형태로 JSON 응답으로 반환
/* HTML부분*/

    <button class="tab" onclick="showSection('remakeComparison')">리메이크</button>

    <!-- 리메이크 원작 비교 타임라인 -->
    <div id="remakeComparison" class="profile-section" style="display: none;">
        <h3>리메이크 영화 원작 영화 평점 비교</h3>
        <canvas id="remakeChart"></canvas>
    </div>
    /* 원작 영화와 리메이크 영화 비교 자바 스크립트 버전 */

    async function loadRemakeComparisonChart() {
    const response = await fetch('/userprofile/api/remake-movies/');
    const data = await response.json();

    const labels = data.map(item => item.remake_title);
    const originalVotes = data.map(item => item.original_vote_average);
    const remakeVotes = data.map(item => item.remake_vote_average);

    const ctx = document.getElementById('remakeChart').getContext('2d');
    new Chart(ctx, {
        type: 'bar',
        data: {
            labels: labels,
            datasets: [
                {
                    label: '원작 평점',
                    data: originalVotes,
                    backgroundColor: 'rgba(54, 162, 235, 0.5)',  // 파란색
                    borderColor: 'rgba(54, 162, 235, 1)', 
                    borderWidth: 1
                },
                {
                    label: '리메이크 평점',
                    data: remakeVotes,
                    backgroundColor: 'rgba(255, 206, 86, 0.5)', // 노란색
                    borderColor: 'rgba(255, 206, 86, 1)',  
                    borderWidth: 1
                },
            ]
        },
        options: {
            responsive: true,
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        }
    });
}

 

 

 

RemakeMoviesRevenueAPIView (수익 비교)

 

class RemakeMoviesRevenueAPIView(View):
    def get(self, request):
        api_key = settings.TMDB_API_KEY  # TMDb API 키
        base_url = "https://api.themoviedb.org/3"  # TMDb API 기본 URL

        # 1. 사전에 정의된 영화 리스트
        predefined_remakes = [
            {"remake_title": "The Departed", "original_title": "Infernal Affairs"},
            {"remake_title": "Oldboy", "original_title": "Oldeuboi"}
            {"remake_title": "Oldboy", "original_title": "Oldeuboi"},
            {"remake_title": "The Magnificent Seven", "original_title": "Seven Samurai"},
            {"remake_title": "The Birdcage", "original_title": "La Cage aux Folles"},
        ]

        remake_comparison = []  # 결과를 저장할 리스트
        for pair in predefined_remakes:
            # 2. 원작 영화 검색
            original_response = requests.get(
                f"{base_url}/search/movie",
                params={"api_key": api_key, "query": pair["original_title"], "language": "ko-KR"}
            )

            # 3. 리메이크 영화 검색
            remake_response = requests.get(
                f"{base_url}/search/movie",
                params={"api_key": api_key, "query": pair["remake_title"], "language": "ko-KR"}
            )

            if original_response.status_code == 200 and remake_response.status_code == 200:
                original_data = original_response.json()
                remake_data = remake_response.json()

                if original_data["results"] and remake_data["results"]:
                    # 4. 영화 ID로 상세 정보 요청
                    original_movie = original_data["results"][0]
                    remake_movie = remake_data["results"][0]

                    # 원작 영화 상세 정보 요청
                    original_details_response = requests.get(
                        f"{base_url}/movie/{original_movie['id']}",
                        params={"api_key": api_key, "language": "ko-KR"}
                    )

                    # 리메이크 영화 상세 정보 요청
                    remake_details_response = requests.get(
                        f"{base_url}/movie/{remake_movie['id']}",
                        params={"api_key": api_key, "language": "ko-KR"}
                    )

                    if original_details_response.status_code == 200 and remake_details_response.status_code == 200:
                        # 5. 수익 데이터 가져오기
                        original_details = original_details_response.json()
                        remake_details = remake_details_response.json()

                        original_revenue = original_details.get("revenue", 0)
                        remake_revenue = remake_details.get("revenue", 0)

                        # 6. 비교 데이터 추가
                        remake_comparison.append({
                            "remake_title": remake_details["title"],
                            "original_title": original_details["title"],
                            "remake_revenue": remake_revenue,
                            "original_revenue": original_revenue,
                        })

        # 7. JSON 응답 반환
        return JsonResponse(remake_comparison, safe=False)

 

  • 사전 정의된 영화 리스트:
    • 리메이크 영화와 원작 영화의 제목 쌍을 정의
  • 원작과 리메이크 영화 검색:
    • TMDb API의 /search/movie 엔드포인트를 사용하여 각 영화 데이터를 검색
  • 영화 ID로 상세 정보 요청:
    • 검색 결과에서 영화 id를 가져와 TMDb API의 /movie/{id} 엔드포인트를 호출
    • 이 요청에서 revenue 데이터를 가져옴
  • 수익 데이터 가져오기:
    • 각 영화의 revenue(전 세계 총 수익)를 가져옴
    • 수익 데이터가 없으면 기본값 0으로 처리
  • 비교 데이터 추가:
    • 수익 데이터를 비교 데이터 리스트에 추가
  • JSON 응답 반환:
    • 최종 비교 데이터를 JSON 형식으로 반환
/* HTML 부분*/

<button class="tab" onclick="showSection('revenueComparison_money')">수익비교</button>    

<div id="revenueComparison_money" class="profile-section" style="display: none;"> 
        <h3>리메이크 영화와 원작 영화 수익 비교</h3>
        <canvas id="revenueChart"></canvas>
    </div>

 

 

/* 리메이크 영화와 원작 영화 수익 비교 자바스크립트*/
async function loadRemakeRevenueChart() {
    const response = await fetch('/userprofile/api/remake-revenues/');
    const data = await response.json();

    // 환율을 1,300원으로 가정
    const exchangeRate = 1300;

    const labels = data.map(item => item.remake_title);
    
    // 수익을 원화로 변환
    const originalRevenuesKRW = data.map(item => item.original_revenue * exchangeRate);
    const remakeRevenuesKRW = data.map(item => item.remake_revenue * exchangeRate);

    const ctx = document.getElementById('revenueChart').getContext('2d');
    new Chart(ctx, {
        type: 'bar',
        data: {
            labels: labels,
            datasets: [
                {
                    label: '원작 수익 (KRW)',
                    data: originalRevenuesKRW,
                    backgroundColor: 'rgba(54, 162, 235, 0.5)', // 파란색
                    borderColor: 'rgba(54, 162, 235, 1)',
                    borderWidth: 1
                },
                {
                    label: '리메이크 수익 (KRW)',
                    data: remakeRevenuesKRW,
                    backgroundColor: 'rgba(255, 206, 86, 0.5)', // 노란색
                    borderColor: 'rgba(255, 206, 86, 1)',
                    borderWidth: 1
                }
            ]
        },
        options: {
            responsive: true,
            scales: {
                y: {
                    beginAtZero: true,
                    ticks: {
                        callback: function(value) {
                            return `₩${value.toLocaleString()}`; // 원화로 표시
                        }
                    }
                }
            }
        }
    });
}

// 차트를 로드할 때 호출
document.addEventListener('DOMContentLoaded', () => {
    loadRemakeRevenueChart();
});

 

 

흐름을 정리하면 다음과 같다

 

 

  • TMDb API 활용:
    • /search/movie로 영화 검색 → /movie/{id}로 상세 정보 요청.
  • 데이터 비교:
    • vote_average(평점)과 revenue(수익)를 각각 비교.
  • JSON으로 반환:
    • 최종 결과를 JSON 형태로 반환하여 클라이언트에서 처리 가능.

 

 

728x90