Streaming API
Lấy danh sách tập phim và URL nguồn stream từ các provider streaming anime Việt Nam.
Endpoints
Lấy danh sách tập
GET /api/v1/stream/episodes
Lấy danh sách server
GET /api/v1/stream/episodes/servers
Lấy nguồn stream
GET /api/v1/stream/source
Lấy M3U8 đã cache
GET /api/v1/stream/source/m3u8/{cacheKey}
Lấy danh sách tập
Lấy danh sách các tập phim có sẵn cho một media item từ một provider cụ thể.
Tham số
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id | integer | Có | Media ID (AniList media ID) |
provider | string | Có | Tên provider (ví dụ: ANIMEVIETSUB, ANIMETVN) |
limit | integer | Không | Số lượng tập tối đa trả về (mặc định: 0 = tất cả) |
offset | integer | Không | Vị trí bắt đầu cho phân trang (mặc định: 0) |
server | string | Không | Lọc tập theo tên server |
Ví dụ Request
GET /api/v1/stream/episodes?id=16498&provider=ANIMEVIETSUB&limit=10&offset=0
GET /api/v1/stream/episodes?id=16498&provider=ANIMEVIETSUB&server=DU
Response thành công (200 OK)
{
"provider": "ANIMEVIETSUB",
"limit": 10,
"offset": 0,
"total": 25,
"hasNextPage": true,
"episodes": [
{
"episodeNumber": "1",
"episodeId": "shingeki-no-kyojin$12345",
"server": "DU"
},
{
"episodeNumber": "2",
"episodeId": "shingeki-no-kyojin$12346",
"server": "DU"
},
{
"episodeNumber": "3",
"episodeId": "shingeki-no-kyojin$12347",
"server": "DU"
}
]
}
Response lỗi
404 Not Found - Không tìm thấy Mapping:
{
"success": false,
"message": "No mapping found for media ID 16498 and provider ANIMEVIETSUB",
"code": "MAPPING_NOT_FOUND"
}
404 Not Found - Không có tập:
{
"success": false,
"message": "No episodes found for media ID: 16498",
"code": "EPISODES_NOT_FOUND"
}
Các trường Response
| Trường | Kiểu | Mô tả |
|---|---|---|
provider | string | Tên provider |
limit | integer | Số lượng tập được trả về |
offset | integer | Offset đã sử dụng |
total | integer | Tổng số tập |
hasNextPage | boolean | Còn tập khác không |
episodes | array | Danh sách tập |
Đối tượng Episode
| Trường | Kiểu | Mô tả |
|---|---|---|
episodeNumber | string | Số tập (có thể bao gồm hậu tố cho các tập trùng lặp) |
episodeId | string | ID tập ở định dạng {mediaId}${episodeId} (sử dụng làm episodeData cho endpoint source) |
server | string | Tên server |
Lấy danh sách server
Lấy danh sách các server có sẵn cho một media item từ một provider.
Tham số
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id | integer | Có | Media ID (AniList media ID) |
provider | string | Có | Tên provider |
Ví dụ Request
GET /api/v1/stream/episodes/servers?id=16498&provider=ANIMEVIETSUB
Response thành công (200 OK)
{
"provider": "ANIMEVIETSUB",
"servers": ["DU", "HDX"]
}
Lấy nguồn stream
Lấy URL nguồn stream cho một tập phim cụ thể.
Tham số
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
episodeData | string | Có | Chuỗi dữ liệu tập (từ episodeId trong response episodes) |
provider | string | Có | Tên provider |
server | string | Không | Tên server ưu tiên (sử dụng mặc định nếu không chỉ định) |
Ví dụ Request
GET /api/v1/stream/source?episodeData=shingeki-no-kyojin$12345&provider=ANIMEVIETSUB&server=DU
GET /api/v1/stream/source?episodeData=shingeki-no-kyojin$12345&provider=ANIMEVIETSUB
Response thành công (200 OK)
Stream HLS (server DU):
{
"server": "DU",
"type": "HLS",
"corsProxyRequired": true,
"proxyHeaders": {
"Referer": "https://animevietsub.page"
},
"url": "https://api.animapper.net/api/v1/stream/source/m3u8/abc123def456"
}
Embed Player (server HDX):
{
"server": "HDX",
"type": "EMBED",
"corsProxyRequired": false,
"proxyHeaders": null,
"url": "https://embed.example.com/player?id=12345"
}
Response lỗi (400 Bad Request)
{
"success": false,
"message": "Provider INVALID is not supported for streaming",
"code": "UNSUPPORTED_PROVIDER"
}
Các trường Response
| Trường | Kiểu | Mô tả |
|---|---|---|
server | string | Tên server đã sử dụng |
type | string | Loại stream: HLS, EMBED, hoặc DIRECT |
corsProxyRequired | boolean | Có cần CORS proxy không |
proxyHeaders | object | Headers để sử dụng với proxy (nếu cần) |
url | string | URL stream hoặc endpoint cache M3U8 |
Lấy M3U8 đã cache
Lấy nội dung playlist M3U8 đã cache bằng cache key.
Tham số
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
cacheKey | string | Có | Cache key (từ URL M3U8 trong response source) |
Ví dụ Request
GET /api/v1/stream/source/m3u8/abc123def456
Response thành công (200 OK)
- Content-Type:
application/vnd.apple.mpegurl - Body: Nội dung playlist M3U8 thô
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:10.0,
https://example.com/segment1.ts
#EXTINF:10.0,
https://example.com/segment2.ts
#EXT-X-ENDLIST
Response lỗi (404 Not Found)
{
"success": false,
"message": "M3U8 content not found for cache key: abc123def456",
"code": "RESOURCE_NOT_FOUND"
}
Thông tin chi tiết về Providers
Để biết thông tin chi tiết về từng provider, cách sử dụng, và các lưu ý đặc biệt, vui lòng xem:
- AnimeVietSub - Thông tin chi tiết về provider AnimeVietSub
- AnimeTVN - Thông tin chi tiết về provider AnimeTVN
Ví dụ Workflow
-
Lấy Metadata Media:
GET /api/v1/metadata?id=16498Kiểm tra trường
streamingProvidersđể xem các provider có sẵn. -
Lấy danh sách tập:
GET /api/v1/stream/episodes?id=16498&provider=ANIMEVIETSUBLấy danh sách các tập có sẵn.
-
Lấy nguồn stream:
GET /api/v1/stream/source?episodeData=shingeki-no-kyojin$12345&provider=ANIMEVIETSUB&server=DULấy URL stream cho một tập cụ thể.
-
Lấy nội dung M3U8 (nếu HLS):
GET /api/v1/stream/source/m3u8/abc123def456Lấy playlist M3U8 thực tế.
Lưu ý
- ⚠️ Lưu ý về Mapping: Do đa số mapping được thực hiện tự động, có thể xảy ra trường hợp mapping sai hoặc thiếu provider. Nếu bạn phát hiện mapping không chính xác hoặc thiếu provider cho một media, vui lòng tham gia Discord của chúng tôi để góp ý và yêu cầu chỉnh sửa.
- Tập phim được tự động làm mới trong nền nếu dữ liệu cũ hơn 7 ngày
- Số tập trùng lặp được xử lý với hậu tố (ví dụ:
"1163_1","1163_2") - Lựa chọn server: Nếu server ưu tiên không khả dụng, sẽ chuyển sang server có sẵn đầu tiên
- Tất cả endpoints hỗ trợ phân trang cho danh sách tập lớn
- Định dạng dữ liệu tập có thể khác nhau theo provider