Lịch phát sóng XMLTV
XMLTV là định dạng tệp XML phổ biến nhất cho lịch phát sóng điện tử (EPG): nó liệt kê các kênh và chương trình của từng kênh, với giờ bắt đầu, giờ kết thúc, tiêu đề và mô tả.
TS IPTV không có sẵn kênh hay lịch phát sóng nào. Ứng dụng chỉ đọc các danh sách phát và lịch do bạn thêm vào.
XMLTV là gì
XMLTV xuất phát từ một dự án mã nguồn mở gồm các công cụ thu thập lịch truyền hình; cấu trúc tệp được mô tả trong tệp DTD chính thức. Ngày nay hầu hết trình phát IPTV đều đọc XMLTV. Một danh sách phát cho biết có những kênh nào; tệp XMLTV cho biết kênh đó đang và sắp phát gì.
Cú pháp
Phần tử gốc là <tv>. Bên trong, mọi phần tử <channel> đứng trước, sau đó đến các phần tử <programme>:
<tv>
<channel id="…"> (không hoặc nhiều)
<display-name>…</display-name>
<icon src="…"/>
</channel>
<programme start="…" stop="…" channel="…"> (không hoặc nhiều)
<title>…</title>
<sub-title>…</sub-title>
<desc>…</desc>
<category>…</category>
<episode-num system="…">…</episode-num>
<rating system="…"><value>…</value></rating>
</programme>
</tv>
<tv>
Phần tử gốc. Thuộc tính tuỳ chọn: date, generator-info-name, generator-info-url, source-info-name, source-info-url, source-data-url.
<channel>
| Phần tử / thuộc tính | Bắt buộc | Nghĩa |
|---|---|---|
id | có | Mã kênh. Danh sách phát dùng đúng mã này trong tvg-id. |
<display-name lang="…"> | ít nhất 1 | Tên kênh. |
<icon src="…"/> | không | Logo kênh. |
<url> | không | Trang web của kênh. |
<programme>
| Phần tử / thuộc tính | Bắt buộc | Nghĩa |
|---|---|---|
channel | có | Phải trùng với một <channel id>. |
start | có | Giờ bắt đầu (xem định dạng thời gian bên dưới). |
stop | nên có | Giờ kết thúc. TS IPTV cần giá trị này, nên hãy luôn ghi stop. |
<title lang="…"> | ít nhất 1 | Tên chương trình. |
<sub-title> | không | Tên tập. |
<desc lang="…"> | không | Mô tả. Đây là phần tử duy nhất được phép xuống dòng. |
<category lang="…"> | không, lặp được | Thể loại. |
<icon src="…"/> | không | Ảnh của chương trình. |
<credits> | không | Đạo diễn (<director>), diễn viên (<actor>)… |
<episode-num system="…"> | không | Số mùa và số tập (xem bên dưới). |
<rating system="…"><value> | không | Phân loại độ tuổi, ví dụ system="MPAA", PG. |
<star-rating><value> | không | Điểm đánh giá, ví dụ 7 / 10. |
Định dạng thời gian
start và stop có dạng YYYYMMDDhhmmss, theo sau là độ lệch múi giờ: 20260927183000 +0700 là 18:30:00 ngày 27/09/2026 giờ Việt Nam. Theo DTD, thiếu độ lệch nghĩa là giờ UTC; nhưng hiện tại TS IPTV đọc những giờ như vậy theo múi giờ của thiết bị. Vì thế hãy luôn ghi rõ độ lệch. Khoảng thời gian là nửa mở: chương trình bắt đầu đúng lúc start và kết thúc ngay trước stop, nên stop của chương trình này nên bằng start của chương trình kế tiếp.
Số tập: episode-num
system="xmltv_ns":mùa.tập.phần, đếm từ 0.2.4.nghĩa là mùa 3, tập 5. Mỗi phần có thể ghiX/Y:0.11/12.0/2là mùa 1, tập 12 trên 12, phần 1 trên 2. Phần chưa biết để trống.system="onscreen": chữ tự do như trên màn hình, ví dụS03E05. Đây là giá trị mặc định khi không ghisystem.
Lịch liên kết với danh sách phát ra sao
- Đường dẫn: danh sách phát M3U trỏ tới lịch bằng
#EXTM3U x-tvg-url="https://…/guide.xml"(hoặc tên cũurl-tvg); danh sách JSON dùng trườngepgUrl. Có thể ghi nhiều lịch, cách nhau bằng dấu phẩy: TS IPTV tải tối đa 5 lịch và gộp chương trình lại, bỏ các mục trùng. - Mã kênh: kênh
tvg-id="ExampleNews.us"trong danh sách phát nhận chương trình của<channel id="ExampleNews.us">. Hãy chép mã y hệt, phân biệt hoa thường. - Lệch giờ: nếu lịch lệch với giờ thật, thêm
tvg-shift="+1"(tính bằng giờ) vào kênh, hoặc vào dòng#EXTM3Ucho mọi kênh.
Ví dụ đầy đủ
Đây là lịch ví dụ mà danh sách phát M3U ví dụ trỏ tới. Nó có hai kênh: HlsTest.example và ExampleNews.us.
<?xml version="1.0" encoding="UTF-8"?>
<tv generator-info-name="TS IPTV examples">
<channel id="HlsTest.example">
<display-name lang="en">HLS Test Channel</display-name>
</channel>
<channel id="ExampleNews.us">
<display-name lang="en">Example News</display-name>
<icon src="https://example.com/logos/news.png"/>
</channel>
<programme start="20251231220000 +0000" stop="20251231230000 +0000" channel="ExampleNews.us">
<title lang="en">Weekly Magazine</title>
<sub-title lang="en">Harvest Season</sub-title>
<desc lang="en">A dated example programme with an episode number and a rating.</desc>
<category lang="en">Documentary</category>
<episode-num system="xmltv_ns">2.4.</episode-num>
<episode-num system="onscreen">S03E05</episode-num>
<rating system="MPAA"><value>PG</value></rating>
</programme>
<programme start="20251231230000 +0000" stop="20260101000000 +0000" channel="ExampleNews.us">
<title lang="en">Year in Review</title>
<sub-title lang="en">Part One</sub-title>
<category lang="en">News</category>
<episode-num system="xmltv_ns">0.11/12.0/2</episode-num>
<episode-num system="onscreen">S01E12</episode-num>
<rating system="MPAA"><value>G</value></rating>
</programme>
<programme start="20260101000000 +0000" stop="20301231235959 +0000" channel="HlsTest.example">
<title lang="en">Test pattern</title>
<desc lang="en">One long programme, so the guide always shows something on now.</desc>
<category lang="en">Test</category>
</programme>
<programme start="20260101000000 +0000" stop="20301231235959 +0000" channel="ExampleNews.us">
<title lang="en">Test pattern</title>
<desc lang="en">One long programme, so the guide always shows something on now.</desc>
<category lang="en">Test</category>
</programme>
</tv>
- Hai phần tử
<channel>đứng trước mọi chương trình, mỗi kênh một<display-name>. - Hai chương trình có ngày giờ cụ thể (tối 31/12/2025, giờ UTC) cho thấy các phần tử tuỳ chọn:
sub-title,category,episode-numở cả hai hệ, vàrating. - “Test pattern”: mỗi kênh có một chương trình kéo dài từ 01/01/2026 tới hết năm 2030. Đó là mẹo cho tệp ví dụ: bất cứ lúc nào bạn mở, lịch vẫn có một chương trình “đang phát”. Lịch thật dùng các chương trình ngắn, nối tiếp nhau.
Tự viết một tệp
Phần lớn mọi người không viết XMLTV bằng tay: nhà cung cấp đưa sẵn đường dẫn lịch, hoặc lịch được tạo bằng công cụ thu thập. Với một danh sách nhỏ của riêng bạn, tự viết vẫn dễ:
- Chép ví dụ ở trên vào một trình soạn thảo văn bản thuần (Notepad, TextEdit ở chế độ văn bản thuần, VS Code).
- Mỗi kênh một
<channel id="…">, với mã trùngtvg-idtrong danh sách phát. - Thêm các
<programme>sau mọi<channel>, luôn cóstart,stopvà độ lệch múi giờ. - Viết
&thành&,<thành<trong tiêu đề và mô tả. - Lưu với mã hoá UTF-8, đuôi
.xml. - Lịch lớn nên được nén gzip thành
guide.xml.gz: dùng lệnhgzip -k guide.xml(macOS, Linux), hoặc 7-Zip › Add to archive › định dạng gzip (Windows). Không dùng.zip: đó là định dạng khác.
Đưa tệp lên mạng
Giống như danh sách phát M3U: mọi đường dẫn HTTPS trả về chính nội dung tệp đều dùng được, ví dụ https://raw.githubusercontent.com/<user>/<repo>/<branch>/guide.xml.gz, https://<user>.github.io/<repo>/guide.xml hoặc https://www.example.com/guide.xml.gz. Trang chia sẻ của Google Drive/OneDrive và đường dẫn blob/ của GitHub không dùng được. Chi tiết: đưa tệp M3U lên mạng.
- TS IPTV nhận ra tệp gzip qua nội dung, nên không phụ thuộc máy chủ gửi
Content-Type: application/gziphayContent-Encoding: gzip. - HTTPS được khuyến nghị; CORS không cần cho TS IPTV.
- Hãy cập nhật tệp đều đặn: lịch chỉ có các ngày đã qua thì không còn gì để hiển thị.
Thêm vào TS IPTV
- Thêm đường dẫn lịch vào dòng đầu tiên của danh sách phát M3U:
#EXTM3U x-tvg-url="https://www.example.com/guide.xml.gz"(với JSON: trườngepgUrl). - Thêm danh sách phát đó vào TS IPTV (hoặc làm mới nếu đã có). Lịch được tải cùng lúc.
- Mở danh sách chương trình của một kênh để xem chương trình đang và sắp phát. Dùng Cập nhật lịch phát sóng để tải lại lịch.
TS IPTV hiện chưa có ô riêng để nhập đường dẫn lịch; lịch luôn đi kèm danh sách phát. Nếu danh sách phát của bạn không có x-tvg-url và bạn không sửa được nó ở nơi lưu trữ, hãy tải tệp về, thêm dòng trên, rồi dùng Nhập từ tệp.
Lỗi thường gặp
| Lỗi | Biểu hiện | Cách sửa |
|---|---|---|
Không ghi độ lệch múi giờ ở start/stop | Lịch lệch vài giờ | Luôn thêm +hhmm. Theo DTD giờ thiếu độ lệch là UTC, nhưng TS IPTV hiện đọc nó theo múi giờ của thiết bị. |
channel không trùng <channel id> hoặc tvg-id | Lịch trống | Dùng cùng một chuỗi ở cả ba chỗ. |
Ký tự & chưa được viết thành & | Lỗi đọc XML, mất cả lịch | Viết &. |
<programme> đứng trước <channel> | Một số trình đọc bỏ qua kênh | Đặt mọi <channel> lên trước (đúng thứ tự trong DTD). |
| Chương trình chồng lên nhau hoặc trùng nhau | Hàng bị nhấp nháy hoặc lặp | Cho stop bằng start của chương trình sau. |
Tệp gzip bị nén hai lần, hoặc nén .zip | “Lịch không hợp lệ” | Nén gzip đúng một lần. |
| Lịch chỉ có các ngày đã qua | “Chưa có lịch phát sóng” | Tạo lại lịch mỗi ngày. |
TS IPTV hỗ trợ những gì
| Tính năng | Trạng thái |
|---|---|
XMLTV .xml và nén gzip .xml.gz | Hỗ trợ trên mọi nền tảng |
Nén XZ .xml.xz | Không hỗ trợ |
Mọi múi giờ trong start/stop | Hỗ trợ |
Nhiều lịch trong x-tvg-url (tối đa 5), gộp và bỏ trùng | Hỗ trợ |
tvg-shift theo kênh hoặc cho cả danh sách | Hỗ trợ |
| Hiển thị tiêu đề, mô tả, thể loại, ảnh, đạo diễn và diễn viên | Hỗ trợ |
sub-title, episode-num, rating, star-rating | Được chấp nhận, chưa hiển thị |
| Ô riêng để nhập đường dẫn lịch | Chưa có Dùng x-tvg-url. |