Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Dashboard web tĩnh để tổng hợp tiếng nói người chơi Play Together Thailand. Giao diện dùng vanilla JavaScript, Chart.js 4.4.1 và dữ liệu JSON trong public/data.
npm ci
npm run check
npm run serve
Mở http://127.0.0.1:4173.
Tài liệu đầy đủ về mục tiêu, nguồn, quy tắc, phân loại và quy trình nằm ở public/how-it-works.md, mở được từ nút ? trên dashboard (có nút "Sao chép cho AI") hoặc trực tiếp tại https://tiennn3.github.io/PTGTHPlayerSentiment/how-it-works.md. Cập nhật tài liệu này mỗi khi đổi nguồn hoặc quy tắc.
Mặc định mở 7 ngày gần nhất. Mọi số liệu được tính lại theo kỳ đang chọn và so với kỳ liền trước có cùng số ngày. Mỗi tab có link riêng qua hash (#overview, #sources, #store, #feedback).
Quy tắc hiển thị:
date_basis=observed_at (chưa rõ ngày đăng) không được cộng vào thống kê; chỉ xem được trong danh sách khi bật tùy chọn.full, partial, pending, not_collected, store) nằm trong public/data/sources.json. Tab Theo nguồn luôn hiện đủ các nguồn này, kể cả nguồn chưa có dữ liệu, để phân biệt "0 phản hồi" với "chưa thu thập". Khi thu thập thêm group, cập nhật trạng thái ở file này. Tên chủ đề trung tính lấy từ THEME_NAMES trong public/index.html. Dữ liệu gốc không đổi; nguồn chưa có trong danh sách sẽ hiện ID.public/data/index.json: danh sách ngày có dữ liệu.public/data/themes.json: từ điển theme dùng lại qua nhiều ngày.public/data/daily/YYYY-MM-DD.json: metrics, alert, báo cáo và item của từng ngày.npm run validate: kiểm tra JSON, trường bắt buộc, che tên tác giả, theme và quy tắc review confidence thấp.Không ghi đè file ngày cũ trừ khi chủ động chạy lại đúng ngày đó. Không đưa service account, token, file .p8 hoặc export chứa dữ liệu cá nhân vào Git.
Gộp an toàn, không xoá dữ liệu cũ: rating theo ngày (Rating Count - Star Ratings ... Detailed.csv) và review đã dịch + gắn nhãn (staging JSON, xem public/how-it-works.md).
node scripts/import-sensortower-vng.mjs --ratings "/path/to/Google Play Rating Count ... Detailed.csv" --ratings "/path/to/App Store Rating Count ... Detailed.csv" --reviews .staging/store/reviews-labeled.json
File export iOS Thailand dạng UTF-16/TSV có thể nhập bằng:
node scripts/import-sensortower-ios.mjs "/path/to/Review iOS TH.csv"
npm run check
Importer hiện xử lý các review năm 2026, che tên tác giả, loại PII/noise, phân loại chủ đề và cập nhật index production. Không commit file CSV gốc vì có thể chứa dữ liệu cá nhân. Facebook group/fanpage dùng importer riêng bên dưới; Google Play và nguồn CS chưa có collector phải được ghi rõ trong data_health.
File export Android Thailand năm 2026 có thể nhập bằng:
node scripts/import-sensortower-android.mjs "/path/to/Android TH 2026.csv"
npm run check
Importer Android gộp dữ liệu với iOS theo ngày. Cột tiếng Việt là tóm tắt phân loại có đánh dấu needs_review, không được xem là bản dịch nguyên văn.
Chỉ nhập staging đã làm sạch, đã che tên và không còn PII. Thư mục .staging/ được ignore và không được dùng để lưu cookie, token, browser profile hoặc export thô:
node scripts/import-facebook.mjs .staging/facebook-observations.json
node scripts/translate-facebook-vietnamese.mjs
npm run check
Importer tạo ID ổn định, chuẩn hóa permalink, chống trùng theo permalink + nội dung + tác giả đã che + loại nội dung, định danh từng group/fanpage trong community, gộp với review store theo ngày và cập nhật metrics/report/index. Mọi post/comment truy cập được đều được giữ lại, gồm bài khoe ảnh, rao bán và thảo luận chung; reaction và số comment được lưu trong engagement. Mục không có ngày đăng hiển thị được dùng ngày quan sát với date_basis=observed_at, không tự suy đoán ngày đăng.
Phạm vi fanpage được giới hạn ở comment trên facebook.com/playtogetherthailandofficial. Bài đăng fanpage và nội dung từ PlayTogetherGame global bị loại; group vẫn giữ cả post và comment.
Script dịch thay các câu trạng thái cần dịch bằng tiếng Việt để Feedback Explorer luôn ưu tiên nội dung người vận hành đọc được. Bản dịch máy được đánh dấu bằng translation_method=machine_translation; bài chỉ có hình được ghi rõ là không có chữ để dịch.
Mỗi phản hồi có intent (loại nội dung), keywords (1–4 từ khoá tiếng Việt) và summary_vn (một câu mô tả người chơi nói/làm gì). Danh sách loại nội dung: question (hỏi), answer (trả lời/hướng dẫn), share (chia sẻ/khoe), event_entry (tham gia sự kiện), bug, performance (crash/lag), account (tài khoản/đăng nhập), complaint (phàn nàn), suggestion (góp ý), praise (khen), trade (mua bán), social (tìm bạn), chat (trò chuyện chung).
Nhãn do AI gán theo hướng dẫn cố định và bộ từ khoá chuẩn, lưu ở .staging/labels/ rồi áp vào dữ liệu:
node scripts/apply-labels.mjs .staging/labels/*.json
npm run check
Script chuẩn hoá các cách viết khác nhau của cùng một từ khoá, không đổi nội dung phản hồi, và giữ cảm xúc cũ trong sentiment_rule khi nhãn mới khác. import-facebook.mjs giữ lại nhãn đã gán khi import lại. Mục mới chưa được gán nhãn sẽ được dashboard suy ra loại nội dung từ nhãn hoạt động cũ (test yêu cầu mọi mục đều có nhãn trước khi deploy).
Tìm video theo tên game và từ khoá tiếng Thái (vùng TH, lọc 30 ngày), chỉ giữ video có chữ Thái. Mỗi video của người chơi tính là 1 phản hồi; bình luận của người xem được tính riêng. Video của kênh chính thức chỉ lấy bình luận. Bỏ bình luận của chủ kênh và bình luận chỉ có link/lời chào. Tên kênh và tác giả được che.
node scripts/import-youtube.mjs .staging/youtube-YYYY-MM-DD.json
npm run check
Importer chỉ thêm hoặc cập nhật mục source=YouTube theo id và không đụng tới Facebook, store hay rating. Bình luận cũ hơn vài tuần chỉ có ngày gần đúng (date_precision=approximate) vì YouTube chỉ hiển thị "2 tuần trước".
Tìm video bằng từ khoá tiếng Thái (trang tìm kiếm có CAPTCHA, người dùng tự giải) và quét kênh creator Thái cùng @playtogetherth.official. Chỉ giữ video tiếng Thái nói về Play Together trong 30 ngày (mỗi video của creator là 1 phản hồi) và bình luận tiếng Thái của người xem; video kênh chính thức chỉ lấy bình luận; bỏ bình luận của người xem Việt Nam.
node scripts/import-tiktok.mjs .staging/tiktok-YYYY-MM-DD.json
npm run check
File staging có sẵn bản dịch theo docs/translation-guide.md và nhãn intent/keywords/summary.
node scripts/import-sensortower-ratings.mjs "/path/to/Rating TH Android.csv" "/path/to/Rating TH iOS.csv"
Rating được lưu thành snapshot riêng trong ratings, gồm cả app Global và VNG. Dashboard tính rating theo trọng số Total Rating Count; rating không làm tăng feedback volume và không tham gia phân loại cảm xúc.
Các biểu đồ theo ngày chỉ dùng mục có ngày đăng xác định. Mục Facebook chỉ biết ngày quan sát vẫn được giữ đầy đủ trong tổng lưu trữ và bảng khám phá, nhưng không được dùng để tạo spike volume theo ngày. Dashboard trình bày trực tiếp số feedback tích cực, tiêu cực và bình thường thay vì dùng chỉ số tổng hợp.
URL preview công khai qua CDN bên thứ ba, không cần cấu hình hosting:
https://raw.githack.com/TienNN3/PTGTHPlayerSentiment/main/public/index.html
URL preview này tiện để xem ngay nhưng không có cam kết vận hành. Nên dùng GitHub Pages bên dưới làm URL chính thức.
Để dùng URL GitHub Pages ổn định, chủ repository cần bật một lần tại Settings > Pages > Build and deployment > Source: GitHub Actions. Sau đó, mỗi commit mới trên nhánh main sẽ chạy validation và test rồi publish thư mục public.
URL công khai: https://tiennn3.github.io/PTGTHPlayerSentiment/
Có thể chạy lại workflow thủ công từ tab Actions sau khi bật Pages. GitHub Pages không cần Firebase project hay credential riêng trong repository.