TS IPTV

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ínhBắt buộcNghĩa
idcóMã kênh. Danh sách phát dùng đúng mã này trong tvg-id.
<display-name lang="…">ít nhất 1Tên kênh.
<icon src="…"/>khôngLogo kênh.
<url>khôngTrang web của kênh.

<programme>

Phần tử / thuộc tínhBắt buộcNghĩa
channelcóPhải trùng với một <channel id>.
startcóGiờ bắt đầu (xem định dạng thời gian bên dưới).
stopnê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 1Tên chương trình.
<sub-title>khôngTên tập.
<desc lang="…">khôngMô tả. Đây là phần tử duy nhất được phép xuống dòng.
<category lang="…">không, lặp đượcThể 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ôngSố mùa và số tập (xem bên dưới).
<rating system="…"><value>khôngPhâ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

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>
  1. Hai phần tử <channel> đứng trước mọi chương trình, mỗi kênh một <display-name>.
  2. 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.
  3. “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ễ:

  1. 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).
  2. Mỗi kênh một <channel id="…">, với mã trùng tvg-id trong danh sách phát.
  3. Thêm các <programme> sau mọi <channel>, luôn có start, stop và độ lệch múi giờ.
  4. Viết & thành &amp;, < thành &lt; trong tiêu đề và mô tả.
  5. Lưu với mã hoá UTF-8, đuôi .xml.
  6. Lịch lớn nên được nén gzip thành guide.xml.gz: dùng lệnh gzip -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.

Thêm vào TS IPTV

  1. 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ường epgUrl).
  2. 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.
  3. 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ỗiBiểu hiệnCách sửa
Không ghi độ lệch múi giờ ở start/stopLị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-idLịch trốngDùng cùng một chuỗi ở cả ba chỗ.
Ký tự & chưa được viết thành &amp;Lỗi đọc XML, mất cả lịchViết &amp;.
<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 nhauHàng bị nhấp nháy hoặc lặpCho 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ăngTrạng thái
XMLTV .xml và nén gzip .xml.gzHỗ trợ trên mọi nền tảng
Nén XZ .xml.xzKhông hỗ trợ
Mọi múi giờ trong start/stopHỗ trợ
Nhiều lịch trong x-tvg-url (tối đa 5), gộp và bỏ trùngHỗ trợ
tvg-shift theo kênh hoặc cho cả danh sáchHỗ trợ
Hiển thị tiêu đề, mô tả, thể loại, ảnh, đạo diễn và diễn viênHỗ 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ịchChưa có Dùng x-tvg-url.