Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
VN Phim — Stremio addon (KKPhim + Nguồn C + HH3D) Addon stream-only: bạn vẫn duyệt phim bằng danh mục chính thức của Stremio (Cinemeta), addon chỉ cung cấp nguồn phát. Nhờ vậy tên phim, poster, danh sách phần/tập luôn là bản chuẩn — và việc còn lại là map cho đúng tập. Mở http://localhost:7000 rồi bấm Cài vào Stremio, hoặc dán thẳng URL này vào Stremio → Addons → Add addon: Đổi cổng khi cần (mặc định 7000): Repo đã có sẵn api/index.js và vercel.json, không cần cấu hình gì thêm:README 전문 보기 ↗
Addon stream-only: bạn vẫn duyệt phim bằng danh mục chính thức của Stremio (Cinemeta), addon chỉ cung cấp nguồn phát. Nhờ vậy tên phim, poster, danh sách phần/tập luôn là bản chuẩn — và việc còn lại là map cho đúng tập.
npm start
Mở http://localhost:7000 rồi bấm Cài vào Stremio, hoặc dán thẳng URL này
vào Stremio → Addons → Add addon:
http://localhost:7000/manifest.json
Đổi cổng khi cần (mặc định 7000):
PORT=7010 npm start
Repo đã có sẵn api/index.js và vercel.json, không cần cấu hình gì thêm:
npx vercel --prod
Hoặc vào vercel.com → Add New Project → import repo này → Deploy. Không cần khai biến môi trường nào; địa chỉ addon tự suy ra từ domain Vercel cấp.
Xong thì mở https://<tên-app>.vercel.app và bấm Cài vào Stremio.
Cache trong RAM mất mỗi lần cold start. Bù lại, mọi phản hồi đều gắn
s-maxage=600, nên CDN của Vercel trả thẳng cho lần bấm thứ hai mà không
gọi lại hàm. Lần đầu một tập mất khoảng 3–4 giây, sau đó gần như tức thì.
HH3D chạy được ở mọi nơi. Phần dò phim từng cần curl (site trả 403 cho
fetch của Node) nên tắt trên serverless; hoathinh3d.de giờ trả 200 cho fetch
thường, kể cả từ Worker. Slug ghim trong overrides.json vẫn là đường chắc nhất
cho phim mà tìm kiếm của họ không ra.
Nguồn C bị chặn theo IP, và có cách đi vòng. Cloudflare của nguonc trả
403 cho IP datacenter ở mọi path, nên addon tự tắt nguồn này khi phát hiện
đang chạy serverless. Kiểm bằng /probe/nguonc — chạy từ chính deployment
và báo path nào bị chặn.
Chỉ mỗi API bị chặn. Trang embed *.streamc.xyz và CDN segment vẫn trả
lời IP datacenter bình thường (đã đo trên Vercel), nên chỉ cần đưa đúng phần
API đi vòng:
NGUONC_UPSTREAM=https://<addon chạy ở nhà>
Bản trên Vercel sẽ gửi lệnh gọi nguonc tới /upstream/nguonc/... của bản
chạy ở nhà, bản đó gọi nguonc bằng IP dân cư rồi trả kết quả về nguyên văn.
Đặt biến này cũng tự bật lại Nguồn C trên serverless. Route /upstream/nguonc
chỉ chuyển tiếp GET /api/... của nguonc — không phải proxy mở.
Chỉ có dữ liệu API đi đường này; video vẫn đi thẳng từ máy người xem tới CDN của Nguồn C, không qua nhà bạn và cũng không qua Vercel.
Máy ở nhà tắt thì còn một đường lùi nữa, NGUONC_PROXY — một mẫu URL chứa
{url}, thử sau upstream:
NGUONC_PROXY=https://<fetcher>/?url={url}
Tên miền sc.k-20.xyz đã chết (không phân giải được, đo 21/09/2026). Ví dụ
cũ dùng nó nên nay không còn dùng được — cần một fetcher khác, hoặc bỏ hẳn
đường này.
Thứ tự đầy đủ là upstream → proxy → gọi thẳng, đường nào trả về dữ liệu đúng hình dạng thì dừng ở đó. Một proxy bị chặn vẫn có thể trả 200 kèm trang chặn của Cloudflare, nên addon soi hình dạng dữ liệu chứ không tin status code.
Đây là hạ tầng của người khác, dùng cho việc không phải của nó — họ chặn hoặc đổi tham số lúc nào cũng được. Nên coi là tạm bợ: mất nó thì Nguồn C biến mất, các nguồn khác không ảnh hưởng. Cả hai biến để rỗng thì Nguồn C tự tắt trên serverless như trước.
Đo được (28/08/2026): sc.k-20.xyz trả 200 cho máy ở nhà nhưng 403
cho Vercel ở cùng một URL — họ cho proxy video, không cho mượn IP gọi API.
Trong khi đó proxy.cors.sh lại gọi được nguonc, nên nguonc chặn theo dải chứ
không chặn mọi IP datacenter. Đừng tin một relay chỉ vì nó chạy từ máy bạn:
thử từ chính deployment bằng /probe/nguonc rồi hãy kết luận.
Cách gọn nhất để có Nguồn C mà không cần thiết bị nào ở nhà — và nó đến từ chính cơ chế đã làm hỏng mọi đường vòng phía trên.
Worker gọi sang một site cũng nằm sau Cloudflare thì request không rời mạng Cloudflare, và bên nhận xét tường lửa theo IP của người dùng gốc. Worker chuyển tiếp IP chứ không giấu nó — nên relay đặt trên Cloudflare vô dụng khi người gọi là Vercel.
Nhưng đặt luôn addon ở đó thì người gọi là Stremio trên máy người xem, tức một
IP dân cư, và nguonc cho qua. Đã kiểm chứng: IP nhà → Worker → nguonc trả
200, trong khi Vercel → Worker → nguonc trả 403, cùng một Worker.
npm run deploy:worker # npx wrangler deploy
Lần đầu wrangler sẽ mở trình duyệt để đăng nhập Cloudflare. Xong thì lấy URL nó
in ra, thêm /manifest.json, dán vào Stremio.
Ở đây không đặt NGUONC_PROXY hay NGUONC_UPSTREAM — đặt vào chỉ thêm một
chặng hỏng, vì đường gọi thẳng đã đi được. Khác biệt so với Vercel:
curl nữa)overrides.json không đọc được vì không có hệ thống tệp — nạp qua biến
OVERRIDES chứa chuỗi JSON, xem wrangler.tomlRouter dùng chung: src/lib/fetchAdapter.js chuyển
Request thành cặp (req, res) mà app.js vốn nói, nên cùng một bộ định
tuyến chạy cả trên node:http, Vercel lẫn Workers.
worker/nguonc-relay.js là bản relay 40 dòng, chỉ
chuyển tiếp GET tới phim.nguonc.com (bỏ dòng chặn đó đi thì nó thành open
proxy). Giữ lại vì nó hữu ích khi người gọi có IP dân cư, và vì nó là bằng
chứng cho kết luận ở trên.
Nó KHÔNG cứu được bản chạy trên Vercel. Đã đo, cùng một Worker cùng một URL:
| Người gọi | Kết quả |
|---|---|
| Máy nhà | 200, JSON đầy đủ |
| Vercel | 403, kèm nguyên trang chặn của nguonc |
Worker có chạy — nó gọi nguonc, nguonc từ chối, nó trả nguyên văn về (thân
phản hồi là HTML của Cloudflare chứ không phải dòng chặn của chính relay). Lý
do: request từ Worker sang một site Cloudflare khác được xét theo IP người gọi
gốc. Nên relay đặt trên Cloudflare chuyển tiếp IP của Vercel chứ không giấu
nó, và sc.k-20.xyz cũng hỏng y hệt vì cùng lẽ đó.
Muốn Nguồn C mà không có thiết bị ở nhà thì chuyển hẳn addon lên Workers, xem mục trên.
Bản chạy ở nhà cần một địa chỉ công khai. Nhanh nhất:
cloudflared tunnel --url http://localhost:7000
URL trycloudflare đổi mỗi lần khởi động lại, nên nếu định để lâu thì dùng
named tunnel gắn domain của bạn để NGUONC_UPSTREAM khỏi phải sửa liên tục.
Đây là phần khó nhất. Các trang phim Việt đánh số tập theo hai kiểu khác nhau, và đoán sai là phát nhầm tập:
| Kiểu | Nguồn trông như thế nào | Ví dụ thật |
|---|---|---|
| Theo phần | mỗi phần là một mục riêng, đếm lại từ 1 | Đại Chiến Người Khổng Lồ (Phần 2) → S2E1 là Tập 01 |
| Tuyệt đối | một mục gộp toàn bộ, đếm 1..N liên tục | Đảo Hải Tặc giữ 1174 tập → S21E1 là Tập 891 |
Addon quyết định theo thứ tự:
overrides.json — cao nhất, xem bên dưới.season 1 cho One Piece dù nó chứa cả 1174 tập; tin cái nhãn đó thì
S21E1 sẽ phát tập 1.tmdb.season hoặc chữ "Phần N" trong
tên) → đếm theo tập trong phần.Mỗi stream đều hiện thẳng cách map, ví dụ:
▶ Tập 891 · Nguồn gộp toàn bộ 1174 tập — S21E1 = tập 891.
Khớp bằng tên là không đủ: donghua trên IMDb/TMDB thường mang tên tiếng Anh khác
hẳn tên trên trang Việt (Battle Through the Heavens vs Fights Break Sphere —
độ giống nhau bằng 0). Nên addon xếp hạng theo: IMDb id → TMDB id → tên (có bổ
sung tên gọi khác lấy từ Kitsu) → năm phát hành.
Và khớp phần không bao giờ được lấn khớp ID: KKPhim có Đảo Hải Tặc (Live Action) (Phần 2) — đúng số phần nhưng sai phim.
Sửa overrides.json (tự nạp lại sau ~5 giây, không cần restart):
{
"tt1234567": {
"titles": ["tên phụ để tìm kiếm"],
"seasons": {
"3": { "kkphim": "slug-tren-kkphim-phan-3", "mode": "season", "offset": 0 }
}
}
}
mode: season (đếm trong phần) hoặc absoluteoffset: cộng bù khi phim chia cour lệch sốBộ giải link embed — chạy offline, không cần mạng, không cần server:
node test/embed.mjs
Khớp tập — cần addon đang chạy (PORT=7010 npm start):
node test/regression.mjs
Xem addon đã quyết định thế nào cho một tập bất kỳ:
http://localhost:7000/debug/series/tt0388629:21:1
Trả về nguồn đã chọn, điểm khớp, lý do khớp và chế độ đánh số.
| Nguồn | Phát trong Stremio | Ghi chú |
|---|---|---|
| KKPhim (phimapi.com) | Có, m3u8 trực tiếp | Nhiều server: Vietsub / Thuyết Minh / Lồng Tiếng. Tập chỉ có link_embed cũng phát được — xem phần link embed bên dưới |
| Ophim (ophim1.com) | Đang hỏng, tắt mặc định trên Workers | API trả 404 ở mọi path (đo 28/08/2026), không mirror nào còn sống. Bật lại bằng ENABLE_OPHIM=1 khi nó hồi phục |
| Nguồn C (phim.nguonc.com) | Có, qua /hls.m3u8 + STREMIO_PROXY | API mở, không cần key. Trang embed không công bố link phát và segment đòi Referer — xem giải thích bên dưới |
| HH3D (hoathinh3d) | Có, 1080p — không cần STREMIO_PROXY | Link phát nằm sau một gói mã hoá AES-GCM và một khoá dùng một lần; một số phim còn bọc PNG ở đầu segment. Xem giải thích bên dưới |
Cả KKPhim và Ophim đều là API JSON công khai, trả link_m3u8 cho request ẩn
danh, không cần token. Mỗi server của mỗi nguồn là một lựa chọn riêng trong
Stremio.
Trình phát của Stremio chỉ nhận link media (m3u8/mp4), không nhận trang
HTML. Đưa thẳng một link embed vào ô url thì Stremio sẽ cố phát mã nguồn
trang — nên mọi link embed đều phải đổi thành link phát trước.
Addon thử hai đường, rẻ trước:
| Đường | Cách làm | Ví dụ |
|---|---|---|
| Query | link phát nằm sẵn trong chính query string của trang player, chỉ cần đọc — không tốn request nào | player.phimapi.com/player/?url=<m3u8> → lấy thẳng <m3u8> |
| Trang | trang tự khai link phát trong HTML (file:, sources: [...], <video src>, thuộc tính data- dạng base64) | tải trang một lần qua /resolve, đúng lúc bấm phát |
Đường Query chạy đồng bộ khi dựng danh sách stream, nên KKPhim/Ophim có
tập chỉ có link_embed mà không có link_m3u8 vẫn phát được ngay, không chậm
thêm mili-giây nào. Đường Trang hoãn tới /resolve?u=<embed> — addon tải
trang lúc người dùng bấm phát rồi 302 sang link thật, tức là một request mỗi
lần bấm thay vì một request cho mỗi server trong danh sách, và token ngắn hạn
được lấy khi còn hạn.
/resolve chỉ tải trang của những host trong EMBED_HOSTS. Endpoint này nhận
URL từ query string, không có allowlist thì nó sẽ tải bất cứ địa chỉ nào người
gọi đưa vào — kể cả mạng nội bộ của chính deployment.
Xem một link embed có phát được trong Stremio hay không:
http://localhost:7000/probe/embed?u=<link embed đã encode>
Trả về: query string có mang link phát không, trang có tự khai không, và link lấy ra có phải manifest Stremio đọc được không.
Trang embed của Nguồn C (*.streamc.xyz) không viết link phát ra markup, nên
bộ giải embed thông thường chạy qua nó không lấy được gì. Từ bản r25 của
trang, #player là một thẻ rỗng và tất cả nằm sau API của chính trang đó:
POST embed.php?hash=… {"action":"bootstrap"} -> { bootstrap, turnstileEnabled }
POST embed.php?hash=… {"action":"issue", bootstrap, playlist_format}
-> { playlist, issuedAt, expiresAt }
Hai chi tiết quyết định link lấy về có dùng được hay không:
playlist_format. Player của họ xin aesgcm-v2 ở mọi nơi trừ máy Apple,
và định dạng đó về ở dạng mã hoá AES-GCM để JS của họ tự giải — Stremio đọc
không ra. Xin đúng hls, định dạng họ phục vụ Safari, thì nhận được media
playlist thường..png, nằm trên host xoay vòng (cyin1.sbs,
seouls11.amass11.top…) và trả 403 cho mọi request không có Referer, mà
Stremio thì không gửi Referer nào.Nên lib/streamc.js tự xin playlist, rồi addon phục vụ lại nó ở
/hls.m3u8?u=<embed> với từng dòng segment được viết qua STREMIO_PROXY
(127.0.0.1:11470) — server nội bộ của Stremio, chạy trên máy đang xem chứ
không phải máy chạy addon. Nó nhận đích và header ngay trong URL rồi gọi lại
đúng như vậy:
http://127.0.0.1:11470/proxy/d=<origin>&h=<Tên:Giá trị>&h=…/<path>?<query>
Luồng video vì thế đi thẳng từ máy người xem tới CDN của họ, không qua deployment của addon; addon chỉ phục vụ đúng file playlist vài chục dòng.
Việc đó chạy lúc bấm phát chứ không phải lúc dựng danh sách stream: grant chỉ sống vài giờ, dựng sớm thì tới lúc xem có thể đã hết hạn.
Trên Cloudflare Workers không gọi được streamc — và không phải vì header. Đo ngày 22/09/2026, cùng một URL embed:
| Gọi từ | Header | Kết quả |
|---|---|---|
| Máy thường | không header / UA curl | 403 |
| Máy thường | UA trình duyệt | 200 |
| Worker | UA trình duyệt | 403 sau 3ms |
| Worker | đủ bộ sec-ch-ua, sec-fetch, accept-language… | 403 sau 3ms |
| Worker | file .js tĩnh, cả trang gốc của site | 403 sau 3ms |
Hai kiểu chặn khác nhau. Với máy thường, streamc lọc theo hình dạng request —
đúng UA trình duyệt là qua. Với Worker thì chặn sạch cả zone, kể cả file tĩnh:
request từ Worker sang zone Cloudflare khác không rời mạng đó và bị loại ngay ở
biên. Giả header không cứu được. Lớp này streamc mới bật (cùng đợt r25) —
trước đó bản trên Workers phát Nguồn C bình thường.
Nhưng CDN chứa segment là tên miền khác (cyin1.sbs, seouls11.amass11.top…)
và Worker gọi được bình thường — 206, đúng bytes MPEG-TS. Nên playlist dựng
lại được mà không cần đụng tới streamc. Ba mảnh, ba cách lấy:
https://<host>/<hash>/streamaaa0000.png, đánh
số liên tục, và hash chính là tham số hash trong URL embed — thứ API nguonc
đã trả về rồi.lib/streamc.js, đo trên 10 server). Một video chỉ nằm trên một host, các
host không dùng chung dữ liệu — nên host trong bảng sai thì dò cả danh sách.
Họ đổi CDN thì ghi đè bằng STREAMC_SEGMENT_HOSTS="embed12=host,…".Đo lại bằng ffprobe (đúng bản ffmpeg Stremio dùng), qua đúng đường Stremio đi — Worker trả playlist, segment vòng qua server nội bộ của Stremio để có Referer:
| Phim | Số đoạn dựng ra / thật | Tổng thời lượng dựng ra / thật |
|---|---|---|
| Đại Chúa Tể (embed12) | 123 / 123 | 1219.3s / 1224.2s |
| Thôn Phệ Tinh Không (embed13) | 312 / 312 | 925.7s / 933.7s |
| embed11 | 268 / 268 | 2669.3s / 2680s |
Số đoạn đúng tuyệt đối; thời lượng lệch dưới 1%, vì độ dài mỗi đoạn là số đo
trung bình của mấy đoạn mẫu chứ không phải số thật của từng đoạn. Hệ quả: phim
phát liền mạch và đúng nội dung, nhưng thanh thời gian lệch được vài giây và tua
tới thì lệch trong khoảng một đoạn. Muốn đúng từng đoạn thì phải lấy playlist
thật từ streamc — /hls.m3u8 vẫn thử đường đó trước, và nó chạy ở máy nhà hoặc
bất cứ đâu Cloudflare không đứng chặn giữa.
Playlist dựng từ CDN không mang token nào nên cache được lâu; bản do streamc cấp thì hết hạn sau 4 giờ.
turnstileEnabled là công tắc Cloudflare Turnstile của chính trang đó. Lúc
viết dòng này nó đang tắt; khi bật thì grant đòi một challenge đã giải, addon
không làm việc đó — nó trả null và tập Nguồn C quay về dạng link mở trang
phát của họ. Đặt STREMIO_PROXY= rỗng cũng cho kết quả tương tự, vì không còn
ai gắn Referer hộ segment nữa.
Kiểm tra một tập bất kỳ bằng /probe/embed — với embed streamc nó báo grant có
về không, playlist có bao nhiêu segment, và segment đầu tiên tải được hay không.
Họ đổi tên miền liên tục — hoathinh3d.so rồi .de rồi .you chỉ trong khoảng
một tháng. Đóng cứng địa chỉ (vào code hay vào HH3D_BASE) là hẹn trước một lần
hỏng: DNS mất, mọi request timeout, HH3D biến mất khỏi Stremio mà không có dòng
log nào nói vì sao.
Nên mặc định HH3D_BASE để rỗng và addon đi theo link rút gọn họ công bố.
Chuỗi chuyển hướng có chặng trung gian nên phải lấy URL cuối:
bit.ly/hh3d -> 301 googie.top -> hoathinh3d.you
Ba điều kèm theo:
HH3D_HOST_HINT (mặc
định hoathinh3d), nên chặng googie.top bị loại. Họ đổi hẳn tên thương hiệu
thì sửa một biến môi trường, không phải sửa code.HH3D_BASE_TTL), nhưng
request tới HH3D chết ở tầng mạng thì addon quên luôn và dò lại ở lần gọi sau —
đó đúng là dấu hiệu họ vừa đổi tên miền. Còn 403/404 thì để nguyên: tên miền vẫn
sống, chỉ là trang đó không có.HH3D_BASE đặt tay vẫn thắng, để ghim khi cần và để test khỏi phụ thuộc
mạng ngoài.CDN chứa segment cũng đổi theo tên miền (m.ckjdsib32rkjvsd.xyz ->
scontent-sin11-1.xx.cdnfb.net), nên /hh3d-seg không nhận URL của CDN nữa
mà nhận trang tập kèm số thứ tự đoạn (?p=<trang tập>&i=<số>): nó tự dựng lại
playlist rồi lấy đúng đoạn thứ i. Nhờ vậy không cần danh sách host nào — địa chỉ
đi ra luôn do chính addon dựng, nên đây cũng không phải proxy mở. Dựng lại gần như
luôn chỉ là đọc cache vì Stremio vừa gọi /hh3d.m3u8 ngay trước đó.
Kiểm tên miền đang dùng bằng /probe/hh3d?u=<trang tập> — nó báo base.
Trang tập HH3D không đặt link phát trong HTML — chỉ có player_key_url trỏ
tới /wp-json/halim/v1/player-key. Trước đây README này kết luận từ đó là không
lấy được. Đọc bundle player thì ra cả ba lớp đều mở được bằng HTTP thường:
player.php?episode_slug=&server_id=&post_id= -> { _encrypted, kid, iv, payload }
POST /wp-json/halim/v1/player-key { key_id } -> { key }
AES-GCM(payload, key, iv) -> { file: <m3u8>, label, skip_time }
Ba chi tiết quyết định, đo ngày 22/09/2026:
player.php đòi đúng ba header: Referer là trang tập (thiếu thì 404),
X-Requested-With: XMLHttpRequest, và X-Halim-Client — một chuỗi ngẫu nhiên
player tự sinh rồi giữ trong sessionStorage; giá trị nào cũng được.player-key mà không mang cookie
của chính request lấy gói mã hoá thì nhận player_key_expired ("phiên khác").
Nên cả luồng phải đi chung một giỏ cookie, thứ fetch() không tự giữ.Còn một lớp ở segment, và chỗ này ban đầu tôi kết luận sai. Có phim bị bọc một ảnh PNG 1x1 ở đầu (IEND ở byte 62, gói TS 188 byte lặp đúng từ byte 70), nhưng phần lớn phim không bọc gì cả — TS bắt đầu ngay byte 0. Đo 27/09/2026 trên bốn phim, mỗi phim ba segment rải khắp:
| Phim | TS bắt đầu ở |
|---|---|
| Thế Giới Hoàn Mỹ tập 288 | byte 70 (có bọc) |
| Đại Chúa Tể tập 1 | byte 0 |
| Tiên Nghịch tập 1 | byte 0 |
| Thôn Phệ Tinh Không tập 141 | byte 0 |
Bản đầu tiên cắt cứng 70 byte cho mọi phim, tức là cắt mất 70 byte giữa gói TS đầu tiên của ba phần tư số phim. ffmpeg tự dò lại nên trên PC không thấy gì, còn player chặt chẽ hơn phải dò lại ở từng segment — ra đúng triệu chứng "PC thì mượt, điện thoại thì lag", trong khi web của họ vẫn mượt vì họ không cắt gì khi không có gì để cắt.
Nên độ lệch được đo cho từng phim (một segment là đủ, trong cùng phim chúng giống nhau), rồi playlist dựng theo hai cách:
/hh3d-seg của addon, chỗ đó bỏ đúng số byte đã đo rồi
giao phần còn lại — vẫn là HLS thường. Kèm hai thứ được thêm: CDN của họ chỉ gửi
access-control-allow-origin: https://hoathinh3d.de nên Stremio Web không gọi
trực tiếp được, qua đây thì mở cho mọi origin; và segment là bất biến nên cache
được ở biên Cloudflare.Cách cũ (#EXT-X-BYTERANGE với độ dài lấy trần) còn giữ sau HH3D_DIRECT_SEGMENTS=1
để so sánh, nhưng không nên dùng: RFC 8216 đòi độ dài phải đúng, mà độ dài thật
chỉ biết được bằng một HEAD cho mỗi segment (649 request một tập).
Cả hai cách đều không cần STREMIO_PROXY như Nguồn C, và độ dài từng đoạn là
số thật của họ nên thanh thời gian với tua tới đều đúng.
Phần dò phim cũng không cần curl nữa — hoathinh3d.de trả 200 cho fetch
thường, kể cả từ Cloudflare Workers, và sáu trang gọi song song đều 200 trong
650ms nên không còn giãn cách 1.5 giây. Nhưng tìm kiếm của họ kén một cách cụ
thể:
| Truy vấn | Kết quả |
|---|---|
Đại Chúa Tể 3D | 3 kết quả, không cái nào đúng |
Đại Chúa Tể | 20 kết quả, có dai-chua-te |
Đấu La Đại Lục 2 (Tuyệt Thế Đường Môn) | 0 kết quả |
Đấu La Đại Lục 2 | đúng phim ở hạng 1 |
dai chua te 3d | 1 kết quả, sai phim |
Nên tên đưa vào phải là tiếng Việt, còn dấu, đã cắt phần trong ngoặc và phần
sau dấu hai chấm. Trang HH3D không ghi tên gốc, nên tên tiếng Việt lấy từ mục đã
khớp ở KKPhim/Nguồn C — vì thế HH3D chạy SAU hai nguồn kia chứ không song song.
Tên đó cũng được đưa vào danh sách tên để khớp, không chỉ vào truy vấn: nếu
không thì Đại Chúa Tể của HH3D đọ với The Great Ruler của Cinemeta chỉ được
34 điểm, dưới ngưỡng 45, và một phim có thật bị loại đúng ở bước cuối.
Kiểm một tập bất kỳ bằng /probe/hh3d?u=<trang tập>. Hai kiểu trượt đã đo đều tự
khỏi ở lần thử thứ hai nên addon thử lại một lần: tập trả về sources rỗng
(~1/3 lần), và request treo tới hết hạn chờ vì tiến trình sống lâu tái dùng một
socket keep-alive đã chết. Phim nào rỗng nguồn ở mọi tập thì là bên họ thiếu, ghi
hh3d slug trong overrides.json cũng không cứu được.
Xem .env.example: PORT, ADDON_BASE_URL, KKPHIM_API, OPHIM_API,
NGUONC_API, HH3D_BASE (rỗng = tự dò), HH3D_SHORTLINK, HH3D_BASE_TTL,
HH3D_HOST_HINT, ENABLE_KKPHIM, ENABLE_OPHIM, ENABLE_NGUONC,
ENABLE_HH3D, RESOLVE_EMBEDS, EMBED_HOSTS, EMBED_TTL, CACHE_TTL.
npm install.