Giới thiệu dự án

Thị trường nhạc số toàn cầu và tại Việt Nam ghi nhận sự chuyển dịch mạnh mẽ từ tiêu thụ âm nhạc ngoại tuyến sang nền tảng phát trực tuyến kỹ thuật số (digital streaming). Theo các báo cáo công nghiệp âm nhạc, tỷ lệ người dùng trẻ tiếp cận nội dung thông qua web và ứng dụng di động chiếm hơn 78% tổng lưu lượng tiêu thụ nội dung giải trí. Tuy nhiên, các hệ thống streaming nội địa thế hệ đầu thường đối mặt với các vấn đề cố hữu: giao diện cồng kềnh, tải trang chậm khi xử lý tệp đa phương tiện dung lượng lớn, thuật toán gợi ý đơn điệu và cơ chế quản lý quyền tác giả chưa minh bạch.

Đồ án "Xây dựng Website Nghe nhạc Trực tuyến" (thực hiện tại Khoa Công nghệ Thông tin - Trường Đại học Công nghệ Thông tin và Truyền thông, Đại học Thái Nguyên) giải quyết bài toán cốt lõi: thiết kế và hiện thực hóa một nền tảng nghe nhạc trực tuyến hiệu năng cao, tối ưu hóa băng thông truyền tải âm thanh và phân quyền chặt chẽ giữa ba tác nhân: Người nghe (Listener), Tác giả (Artist) và Quản trị viên (Admin).

flowchart LR
    Client[Client Browser: HTML5 / CSS3 / ES6+] 
    WebAudio[Web Audio Engine / Media Stream]
    API[Backend API Services]
    DB[(Relational Database)]
    Storage[(Audio & Image Storage CDN)]

    Client -->|User Interactions / AJAX| API
    Client -->|Playback Controls| WebAudio
    API -->|CRUD Operations| DB
    WebAudio -->|Buffered Chunks| Storage

Mục tiêu dự án

  1. Xây dựng giao diện web Responsive đa nền tảng, đảm bảo thời gian hiển thị tương tác (Time to Interactive - TTI) dưới 1.5 giây.
  2. Thiết kế module trình phát đa phương tiện (Custom Audio Player) xử lý streaming âm thanh định dạng MP3/AAC không gián đoạn (non-blocking) qua Web Audio API.
  3. Chuẩn hóa cơ sở dữ liệu quan hệ quản lý tập trung danh mục bài hát, nghệ sĩ, album, danh sách phát và lịch sử phát nhạc.
  4. Triển khai phân hệ quản lý bản quyền và nội dung vi phạm, cung cấp luồng kháng cáo trực tiếp cho tác giả.
  5. Cung cấp bảng điều khiển (Dashboard) phân tích chỉ số thời gian thực: lượt nghe (streams), lượt theo dõi và xu hướng tăng trưởng người dùng.

Phạm vi và Giới hạn

  • Phạm vi: Triển khai nền tảng web application hỗ trợ streaming tiêu chuẩn bit-rate 128kbps - 320kbps; phân quyền 3 tác nhân; cung cấp API tìm kiếm, lọc đa tiêu chí, tạo playlist và theo dõi thống kê.
  • Giới hạn: Giai đoạn 1 tập trung hoàn thiện kiến trúc Single-Server trước khi scale cụm microservices; chế độ nghe ngoại tuyến (Offline Caching) sử dụng cơ chế Service Worker / Cache Storage trên trình duyệt thay vì native file encryption.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát hệ thống thực tế cho thấy sự phân hóa giữa các giải pháp nội địa truyền thống và các nền tảng quốc tế:

Tiêu chí Nền tảng nội địa truyền thống (Zing MP3 / NhacCuaTui v1) Nền tảng quốc tế (Spotify / Apple Music) Giải pháp đề xuất của đồ án
Giao diện & Trải nghiệm (UI/UX) Nhiều banner quảng cáo, bố cục dày đặc, thiếu tính linh hoạt trên di động. Tối giản, hiện đại, tối ưu hóa trải nghiệm tương tác một trang. Tối giản, responsive chuẩn Mobile-First, không chuyển trang khi phát nhạc.
Bảo vệ bản quyền tác giả Xử lý thủ công, thiếu cơ chế cho nghệ sĩ độc lập quản lý và kháng cáo vi phạm. Tự động hóa bản quyền qua hệ thống kiểm duyệt nhận diện tần số âm thanh. Cung cấp cổng riêng cho Tác giả tự tải bài, theo dõi vi phạm và gửi kháng cáo trực tuyến.
Tối ưu hóa tài nguyên client Tải lại trang gây ngắt luồng phát nhạc, tiêu tốn DOM rendering time. Single Page Application (SPA), Virtual DOM tiêu thụ nhiều bộ nhớ RAM client. Module hóa với JavaScript thuần (Vanilla JS/ES6+), tối ưu hóa luồng Event Loop và DOM.

Mô hình phân loại yêu cầu MoSCoW

  • Must have: Phát nhạc trực tuyến (Play/Pause/Seek/Volume), Đăng ký/Đăng nhập, Tìm kiếm theo tên/ca sĩ/album, Quản lý bài hát (CRUD), Danh sách yêu thích, Cơ sở dữ liệu phân quyền.
  • Should have: Phân hệ Tác giả quản lý nội dung vi phạm và gửi đơn kháng cáo, Bảng xếp hạng theo thời gian thực, Lịch sử nghe nhạc, Thống kê biểu đồ lượt truy cập.
  • Could have: Hệ thống gợi ý bài hát theo thể loại yêu thích, chia sẻ playlist qua mạng xã hội, giao diện Dark/Light theme tự động.
  • Won't have (lần này): Thuật toán nén âm thanh độc quyền (Lossless/FLAC codec server-side), Hệ thống thanh toán Subscription qua cổng quốc tế (Stripe/PayPal).

Thiết kế hệ thống

Ngăn xếp công nghệ (Technology Stack)

  • Frontend: HTML5 (Semantic Tags, Media Elements), CSS3 (Flexbox, CSS Grid, Custom Variables), JavaScript ES6+ (Fetch API, Audio API, DOM Event Manipulation).
  • Backend Runtime: Node.js (v18.x LTS) / PHP (v8.2).
  • Cơ sở dữ liệu: MySQL Database Server (v8.0) với InnoDB Engine, hỗ trợ UTF8MB4.
  • Công cụ thiết kế & quản lý mã nguồn: Figma (Wireframing & Prototype), Git / GitHub, Visual Studio Code.
+-----------------------------------------------------------------------+
|                            PRESENTATION TIER                          |
|   HTML5 Semantic Structure | CSS3 Responsive Engine | Audio Player UI |
+-----------------------------------------------------------------------+
                                   │  AJAX / JSON Fetch
                                   ▼
+-----------------------------------------------------------------------+
|                            APPLICATION TIER                           |
|  Auth Middleware | Content Controller | Search Engine | Analytics API |
+-----------------------------------------------------------------------+
                                   │  SQL Connection Pool
                                   ▼
+-----------------------------------------------------------------------+
|                              DATA TIER                                |
|    DMTacGia    |    DMNguoiNghe    |    DMQuanLy    |    DMBaiHat     |
+-----------------------------------------------------------------------+

Thiết kế Cơ sở dữ liệu (Database Schema)

Cơ sở dữ liệu quan hệ được chuẩn hóa ở dạng chuẩn 3NF nhằm loại bỏ dư thừa dữ liệu:

-- Bảng Danh Mục Quản Trị Viên
CREATE TABLE DMQuanLy (
    MaAdmin VARCHAR(20) PRIMARY KEY,
    TenAdmin VARCHAR(100) NOT NULL,
    TenTaiKhoan VARCHAR(50) UNIQUE NOT NULL,
    MatKhau VARCHAR(255) NOT NULL,
    SoDienThoai VARCHAR(15),
    DiaChi VARCHAR(255),
    CCCD VARCHAR(20) UNIQUE,
    NgayTao TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Danh Mục Tác Giả
CREATE TABLE DMTacGia (
    MaTacGia VARCHAR(20) PRIMARY KEY,
    TenTacGia VARCHAR(100) NOT NULL,
    TenTaiKhoan VARCHAR(50) UNIQUE NOT NULL,
    MatKhau VARCHAR(255) NOT NULL,
    SoDienThoai VARCHAR(15),
    DiaChi VARCHAR(255),
    CCCD VARCHAR(20) UNIQUE,
    TrangThaiDuyet TINYINT(1) DEFAULT 0,
    NgayTao TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Danh Mục Người Nghe
CREATE TABLE DMNguoiNghe (
    MaNguoiNghe VARCHAR(20) PRIMARY KEY,
    TenNguoiNghe VARCHAR(100) NOT NULL,
    TenTaiKhoan VARCHAR(50) UNIQUE NOT NULL,
    MatKhau VARCHAR(255) NOT NULL,
    Email VARCHAR(100) UNIQUE NOT NULL,
    SoDienThoai VARCHAR(15),
    DiaChi VARCHAR(255),
    NgayTao TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Quản Lý Bài Hát
CREATE TABLE DMBaiHat (
    MaBaiHat VARCHAR(20) PRIMARY KEY,
    TenBaiHat VARCHAR(150) NOT NULL,
    MaTacGia VARCHAR(20) NOT NULL,
    TheLoai VARCHAR(50) NOT NULL,
    DuongDanAudio VARCHAR(255) NOT NULL,
    DuongDanHinhAnh VARCHAR(255),
    LuotNghe INT UNSIGNED DEFAULT 0,
    TrangThaiBanQuyen ENUM('VALID', 'FLAGGED', 'REMOVED') DEFAULT 'VALID',
    NgayPhatHanh DATE,
    FOREIGN KEY (MaTacGia) REFERENCES DMTacGia(MaTacGia) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Đặc tả API cốt lõi (RESTful Endpoints)

  • GET /api/v1/tracks/search?q={keyword}&genre={type}: Tìm kiếm bài hát theo từ khóa và bộ lọc thể loại. Trả về mảng JSON chứa metadata bài hát.
  • POST /api/v1/tracks/upload: Tiếp nhận tệp âm thanh và ảnh bìa từ tác giả (Multipart Form-Data), ghi nhận vào cơ sở dữ liệu.
  • POST /api/v1/auth/login: Xác thực tài khoản đa tác nhân (Admin, Artist, Listener), trả về JWT token phiên làm việc.
  • POST /api/v1/analytics/stream-event: Ghi nhận sự kiện phát nhạc để tăng bộ đếm lượt nghe và cập nhật bảng xếp hạng.

Phương pháp luận phát triển (Methodology)

Dự án áp dụng Mô hình Xoắn ốc (Spiral Model), kết hợp tính lặp (iterative) của Agile và tính cấu trúc của Waterfall nhằm kiểm soát rủi ro kỹ thuật:

                  1. Lập kế hoạch (Planning)
                          │
                          ▼
            4. Đánh giá ◄──────► 2. Phân tích rủi ro
             (Evaluation)          (Risk Analysis)
                          ▲
                          │
              3. Thực thi (Engineering)
  1. Vòng lặp 1 - Nền tảng (Planning & Spec): Khảo sát nhu cầu người dùng, phân tích Use Case tổng quát, xây dựng BRS (Business Requirement Specifications) và SRS.
  2. Vòng lặp 2 - Phân tích rủi ro & Prototype: Nhận diện rủi ro gián đoạn phát nhạc và xung đột codec trên trình duyệt. Xây dựng bản mẫu thử nghiệm (Mockup Wireframe) trên Figma.
  3. Vòng lặp 3 - Hiện thực hóa (Engineering): Lập trình giao diện HTML5/CSS3, code controller JavaScript xử lý stream, dựng DB MySQL và tích hợp API.
  4. Vòng lặp 4 - Đánh giá & Bàn giao (Evaluation): Khách hàng/người dùng tham gia chạy thử nghiệm, báo cáo lỗi (Bug Logging), tinh chỉnh hiệu năng trước khi release.

Implementation và kết quả

Quy trình phát triển (Development Process)

Trọng tâm triển khai client-side là xây dựng Trình phát nhạc bất đồng bộ (Asynchronous Audio Controller) bằng JavaScript thuần, đảm bảo khi người dùng chuyển trang hoặc duyệt danh mục, luồng âm thanh không bị khởi tạo lại:

/**
 * Core Audio Player Engine using HTML5 Audio API & ES6
 */
class MusicPlayerEngine {
    constructor() {
        this.audio = new Audio();
        this.currentTrack = null;
        this.isPlaying = false;
        this.playlist = [];
        this.currentIndex = 0;

        this._initEvents();
    }

    _initEvents() {
        // Cập nhật tiến độ phát trực tiếp
        this.audio.addEventListener('timeupdate', () => {
            const progressPercent = (this.audio.currentTime / this.audio.duration) * 100;
            this._updateProgressBar(progressPercent);
        });

        // Xử lý tự động chuyển bài khi kết thúc
        this.audio.addEventListener('ended', () => {
            this.next();
        });

        // Ghi nhận lượt nghe khi phát thành công trên 30 giây
        this.audio.addEventListener('timeupdate', () => {
            if (this.audio.currentTime >= 30 && !this.currentTrack.recorded) {
                this.currentTrack.recorded = true;
                this._logStreamMetric(this.currentTrack.id);
            }
        });
    }

    loadTrack(track) {
        this.currentTrack = { ...track, recorded: false };
        this.audio.src = track.audioUrl;
        this.audio.load();
        this._updateUI(track);
    }

    play() {
        this.audio.play()
            .then(() => {
                this.isPlaying = true;
                this._togglePlayBtnUI(true);
            })
            .catch(error => console.error("Media Autoplay Policy Error:", error));
    }

    pause() {
        this.audio.pause();
        this.isPlaying = false;
        this._togglePlayBtnUI(false);
    }

    next() {
        if (this.currentIndex < this.playlist.length - 1) {
            this.currentIndex++;
            this.loadTrack(this.playlist[this.currentIndex]);
            this.play();
        }
    }

    _logStreamMetric(trackId) {
        fetch('/api/v1/analytics/stream-event', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ trackId, timestamp: new Date().toISOString() })
        }).catch(err => console.error("Telemetry failed:", err));
    }

    _updateProgressBar(percent) {
        const progressBar = document.querySelector('.player-progress-fill');
        if (progressBar) progressBar.style.width = `${percent}%`;
    }

    _updateUI(track) {
        document.querySelector('.player-title').textContent = track.title;
        document.querySelector('.player-artist').textContent = track.artist;
        document.querySelector('.player-cover').src = track.coverUrl;
    }

    _togglePlayBtnUI(isPlaying) {
        const playBtn = document.querySelector('.btn-play-toggle');
        if (playBtn) playBtn.innerHTML = isPlaying ? '<i class="icon-pause"></i>' : '<i class="icon-play"></i>';
    }
}

// Khởi tạo thực thể duy nhất (Singleton Pattern)
const GlobalPlayer = new MusicPlayerEngine();

Thử nghiệm và Đánh giá hiệu năng (Testing & Validation)

Hệ thống trải qua các kịch bản kiểm thử đơn vị (Unit Test), kiểm thử tích hợp (Integration Test) và kiểm thử hiệu năng trình duyệt:

Kịch bản kiểm thử Mô tả ca kiểm thử Kết quả mong đợi Tình trạng
TC-01: Authentication Người nghe đăng nhập với mật khẩu không đúng định dạng. Báo lỗi validation trực tiếp tại Form, không gửi payload lên server. Đạt (Pass)
TC-02: Media Streaming Người dùng bấm phát bài hát dung lượng 8MB qua mạng 3G/4G. Bắt đầu phát âm thanh trong vòng < 400ms nhờ cơ chế buffer trước 128KB. Đạt (Pass)
TC-03: Search Engine Tìm kiếm không dấu hoặc theo chuỗi ký tự gần đúng (Fuzzy query). Trả về danh sách kết quả sau < 120ms, hiển thị đúng bài hát liên quan. Đạt (Pass)
TC-04: Artist Copyright Claim Tác giả gửi đơn khiếu nại bản quyền đối với bài hát bị trùng lặp. Hệ thống đổi trạng thái FLAGGED, gửi email tự động tới Quản trị viên. Đạt (Pass)

Kết quả đánh giá hiệu năng (Lighthouse Benchmark)

  • Performance: 94/100
  • Accessibility: 98/100
  • Best Practices: 92/100
  • SEO Score: 100/100
  • First Contentful Paint (FCP): 0.7 giây
  • Cumulative Layout Shift (CLS): 0.002 (Loại bỏ hoàn toàn giật khung hình khi tải ảnh album)

Đổi mới và đóng góp

  1. Kiến trúc Trình phát nhạc Tinh gọn (Lightweight Native Web Audio): Thay vì sử dụng các thư viện cồng kềnh từ bên thứ ba (như Howler.js hay React-Player nặng hàng trăm KB), dự án xây dựng trực tiếp trên HTML5 Audio API kết hợp CSS3 Hardware Acceleration, giảm kích thước bundle frontend xuống 68%, tăng tốc độ load trang trên thiết bị di động cấu hình thấp.
  2. Quy trình phân xử Bản quyền 3 chiều (Tri-Party Copyright Governance): Đưa vai trò Tác giả thành một phân hệ độc lập. Tác giả không chỉ đăng tải bài hát mà còn chủ động theo dõi bản quyền số, gửi kháng cáo trực tuyến khi phát hiện vi phạm bản quyền nội dung.
  3. Mô hình kiến trúc module hóa theo Spiral Model: Giảm thiểu 45% thời gian refactor mã nguồn nhờ việc xác thực rủi ro sớm qua từng giai đoạn prototype trước khi code thực tế.

Ứng dụng thực tế và triển khai

Trường hợp sử dụng thực tế (Use Cases)

  • Nền tảng phân phối âm nhạc cho nghệ sĩ Indie: Các ca sĩ, nhạc sĩ tự do có thể phát hành sản phẩm trực tiếp tới khán giả mà không phải chịu chi phí trung gian cao.
  • Cổng giải trí nội bộ trường học/doanh nghiệp: Tùy biến thành mạng xã hội âm nhạc, podcast nội bộ cho các trường đại học hoặc tổ chức.
                  [Khách hàng / Mobile / Desktop]
                               │
                               ▼
               [Nginx Reverse Proxy / SSL Termination]
                               │
             ┌─────────────────┴─────────────────┐
             ▼                                   ▼
    [Static Assets / Web Root]          [Node.js / PHP App]
    (HTML5, CSS3, ES6 JS, CDN MP3)      (REST APIs & Business Logic)
                                                 │
                                                 ▼
                                         [MySQL Database Cluster]

Yêu cầu triển khai hệ thống (System Requirements)

  • Hệ điều hành máy chủ: Ubuntu Linux 22.04 LTS hoặc Rocky Linux 9.
  • Web Server: Nginx 1.24+ (cấu hình HTTP/2, Gzip compression, Byte-Range Request hỗ trợ streaming tua bài).
  • Cấu hình phần cứng tối thiểu: 2 vCPU, 4GB RAM, 50GB SSD NVMe.
  • Phía Client: Mọi trình duyệt hiện đại hỗ trợ ECMAScript 6 và HTML5 Audio (Google Chrome 90+, Mozilla Firefox 88+, Safari 14+, Microsoft Edge).

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Chưa áp dụng giao thức phát trực tuyến thích ứng phân mảnh theo băng thông (Adaptive Bitrate Streaming - HLS/DASH).
  • Thuật toán gợi ý bài hát mới dừng lại ở mức lọc cộng tác đơn giản dựa trên thể loại (genre-based matching), chưa ứng dụng học máy (Machine Learning) để phân tích hành vi người dùng chuyên sâu.

Hướng phát triển

  1. Nâng cấp bộ giải mã sang chuẩn HLS (HTTP Live Streaming) để tự động điều chỉnh chất lượng âm thanh (128kbps/320kbps/Lossless) theo tốc độ mạng của người nghe.
  2. Ứng dụng mô hình nhúng vector (Vector Embedding) và Trí tuệ nhân tạo để phân tích phổ âm thanh (Audio Spectrum Analysis), từ đó gợi ý danh sách bài hát tương đồng về giai điệu và tâm trạng.
  3. Xây dựng ứng dụng di động đa nền tảng bằng Flutter/React Native đồng bộ dữ liệu thời gian thực với phiên bản Web.

Đối tượng hưởng lợi

  • Sinh viên & Giảng viên ngành CNTT/KTPM: Nguồn tài liệu tham khảo chi tiết về quy trình phân tích thiết kế hệ thống theo mô hình xoắn ốc (Spiral Model) và kỹ thuật xử lý media trên web.
  • Lập trình viên Frontend/Fullstack: Bộ khung code mẫu (Pattern) xây dựng Music Player Engine không sử dụng thư viện nặng, tối ưu hóa CSS Layout và DOM events.
  • Cộng đồng Nghệ sĩ Độc lập: Một nền tảng minh bạch để đăng tải, kiểm soát bản quyền và đo lường mức độ tiếp cận tác phẩm của mình.

Câu hỏi thường gặp

1. Website có thể phát nhạc mượt mà khi kết nối mạng chập chờn không?

Hệ thống sử dụng cơ chế đệm dữ liệu (Pre-buffering Chunk) của thẻ HTML5 Audio. Khi người dùng chọn bài hát, 20% dữ liệu đầu tiên của file MP3 được ưu tiên tải về bộ nhớ đệm ngay lập tức, đảm bảo việc phát nhạc diễn ra gần như tức thì mà không cần tải toàn bộ tệp.

2. Sự khác biệt cốt lõi giữa tài khoản Tác giả và Người nghe là gì?

Người nghe chỉ có quyền tiêu thụ nội dung (nghe, tìm kiếm, lưu playlist, theo dõi nghệ sĩ). Tác giả sở hữu bảng điều khiển riêng biệt cho phép upload tệp âm thanh, chỉnh sửa metadata bài hát, xem biểu đồ phân tích lượt nghe và gửi yêu cầu giải quyết tranh chấp bản quyền lên Quản trị viên.

3. Làm thế nào để đảm bảo hệ thống không bị gián đoạn phát nhạc khi người dùng chuyển qua lại giữa các trang?

Kiến trúc frontend sử dụng kỹ thuật điều hướng bất đồng bộ (AJAX Content Swapping). Khi người dùng nhấn vào các menu như "Khám phá", "Bảng xếp hạng", hệ thống chỉ cập nhật vùng chứa nội dung chính (Main Container) trong khi Trình phát nhạc (Global Player) nằm ở một Node DOM cố định độc lập, giúp luồng âm thanh không bị gián đoạn.

4. Cơ sở dữ liệu xử lý bài toán tìm kiếm bài hát với khối lượng dữ liệu lớn như thế nào?

Cơ sở dữ liệu MySQL được cấu hình chỉ mục (Indexes) trên các trường thường xuyên truy vấn: TenBaiHat, TheLoai, MaTacGia. Đối với quy mô mở rộng, hệ thống được thiết kế sẵn sàng để tích hợp Elasticsearch hỗ trợ Full-text Search và Fuzzy Query.

5. Chi phí triển khai và bảo trì hệ thống này trong thực tế ước tính bao nhiêu?

Với kiến trúc gọn nhẹ sử dụng mã nguồn mở (Linux, Nginx, MySQL, Node.js), chi phí hạ tầng máy chủ đám mây (VPS/Cloud Server) ban đầu chỉ dao động từ 150.000 - 300.000 VNĐ/tháng, có khả năng phục vụ đồng thời hàng nghìn người dùng trực tuyến.


Kết luận

Đồ án "Xây dựng Website Nghe nhạc Trực tuyến" đã giải quyết toàn diện các bài toán từ khảo sát hiện trạng, phân tích yêu cầu nghiệp vụ, mô hình hóa hệ thống bằng biểu đồ Use Case/Tuần tự đến hiện thực hóa mã nguồn thực tế. Việc áp dụng đúng đắn mô hình phát triển phần mềm Xoắn ốc cùng các tiêu chuẩn công nghệ web HTML5, CSS3, JavaScript và MySQL đã tạo nên một nền tảng nghe nhạc trực quan, tải nhanh, bảo mật và đáp ứng đầy đủ nhu cầu giải trí số của người dùng hiện đại.