Quay lại dự án

Website Xem Phim

06/2023 - 09/2023 Dự án cá nhân

Tổng quan dự án

Website Xem Phim là một nền tảng trực tuyến cho phép người dùng xem phim, trailer, tìm kiếm phim theo nhiều tiêu chí, bình luận và lưu phim yêu thích. Dự án sử dụng TMDb API để lấy dữ liệu phim và lưu trữ vào MongoDB, đồng thời tích hợp các biện pháp bảo mật để chống lại việc download phim trái phép.

Công nghệ sử dụng:
Express.js Next.js MongoDB TMDb API JWT Socket.io Cloudinary

Tính năng chính

Xem phim trực tuyến

Hỗ trợ xem phim với nhiều chất lượng khác nhau (480p, 720p, 1080p), tự động lưu tiến độ xem và gợi ý phim liên quan.

Xem trailer

Tích hợp YouTube API để hiển thị trailer phim ngay trên trang web mà không cần chuyển hướng.

Bình luận và đánh giá

Người dùng có thể bình luận, đánh giá phim và tương tác với các bình luận khác theo thời gian thực.

Danh sách yêu thích

Lưu trữ và quản lý danh sách phim yêu thích, phim đã xem và phim muốn xem trong tương lai.

Bảo vệ nội dung

Triển khai các biện pháp chống download phim trái phép như mã hóa stream, chống F12 và chống ghi màn hình.

Tìm kiếm nâng cao

Hỗ trợ tìm kiếm phim theo tên, thể loại, diễn viên, đạo diễn, năm phát hành và nhiều tiêu chí khác.

Hình ảnh dự án

Chi tiết triển khai

Backend (Express.js)

Backend được xây dựng trên Express.js với kiến trúc RESTful API, sử dụng JWT để xác thực người dùng và phân quyền. Dữ liệu phim được lấy từ TMDb API và lưu trữ trong MongoDB để tối ưu hiệu suất và giảm số lượng request đến API bên ngoài.

// Ví dụ code lấy dữ liệu phim từ TMDb API
const fetchMovieData = async (movieId) => {
  try {
    const response = await axios.get(
      `https://api.themoviedb.org/3/movie/${movieId}?api_key=${process.env.TMDB_API_KEY}&language=vi`
    );
    
    // Lưu vào database để cache
    await Movie.findOneAndUpdate(
      { tmdbId: movieId },
      { 
        ...response.data,
        lastUpdated: new Date() 
      },
      { upsert: true, new: true }
    );
    
    return response.data;
  } catch (error) {
    console.error('Error fetching movie data:', error);
    throw error;
  }
};

Frontend (Next.js)

Frontend được phát triển với Next.js để tận dụng Server-Side Rendering, cải thiện SEO và tối ưu thời gian tải trang. Giao diện người dùng được thiết kế theo hướng responsive, hỗ trợ đầy đủ trên các thiết bị di động và máy tính bảng.

// Ví dụ component hiển thị danh sách phim
export default function MovieGrid({ movies }) {
  return (
    
{movies.map((movie) => (
{movie.title}
{movie.vote_average.toFixed(1)}

{movie.title}

{new Date(movie.release_date).getFullYear()}

))}
); }

Bảo vệ nội dung

Để chống lại việc download phim trái phép, dự án triển khai nhiều lớp bảo vệ như mã hóa stream, vô hiệu hóa các phím tắt và chuột phải, chống F12 và các công cụ developer, sử dụng watermark động và chia nhỏ video thành các segment.

// Ví dụ code chống download và F12
document.addEventListener('contextmenu', (e) => e.preventDefault());
document.addEventListener('keydown', (e) => {
  // Chặn F12, Ctrl+Shift+I, Ctrl+Shift+J, Ctrl+U
  if (
    e.keyCode === 123 || 
    (e.ctrlKey && e.shiftKey && e.keyCode === 73) ||
    (e.ctrlKey && e.shiftKey && e.keyCode === 74) ||
    (e.ctrlKey && e.keyCode === 85)
  ) {
    e.preventDefault();
    return false;
  }
});

Thách thức và giải pháp

Hiệu suất và tối ưu hóa

Thách thức: Xử lý lượng lớn dữ liệu phim và người dùng đồng thời mà không làm giảm hiệu suất.

Giải pháp: Triển khai caching với Redis, lazy loading cho hình ảnh, và phân trang cho kết quả tìm kiếm. Sử dụng CDN để phân phối nội dung tĩnh và tối ưu hóa kích thước bundle với code splitting.

Bảo mật và chống download

Thách thức: Ngăn chặn việc download phim trái phép trong khi vẫn đảm bảo trải nghiệm người dùng tốt.

Giải pháp: Sử dụng HLS (HTTP Live Streaming) với mã hóa, watermark động, và kiểm soát phiên xem. Triển khai hệ thống token ngắn hạn cho mỗi segment video và giới hạn số lượng phiên đồng thời cho mỗi tài khoản.

Đồng bộ hóa dữ liệu với TMDb

Thách thức: Duy trì dữ liệu phim luôn cập nhật mà không vượt quá giới hạn API của TMDb.

Giải pháp: Triển khai hệ thống cron job để cập nhật dữ liệu theo lịch trình, ưu tiên cập nhật phim mới và phim được xem nhiều. Sử dụng webhook để nhận thông báo khi có cập nhật từ TMDb.

Kết luận

Website Xem Phim là một dự án đầy thách thức nhưng cũng rất thú vị, giúp tôi nâng cao kỹ năng phát triển ứng dụng web full-stack và xử lý các vấn đề phức tạp như streaming video, bảo mật nội dung và tối ưu hiệu suất.

Dự án này cũng giúp tôi hiểu sâu hơn về cách làm việc với các API bên ngoài, quản lý dữ liệu lớn và xây dựng hệ thống có khả năng mở rộng. Những kinh nghiệm và bài học từ dự án này sẽ là nền tảng vững chắc cho các dự án tương lai của tôi.