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.
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.
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.
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.
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.
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.
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.
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 đượ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.vote_average.toFixed(1)}
{movie.title}
{new Date(movie.release_date).getFullYear()}
))}
);
}
Để 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: 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.
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.
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.
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.