Пришлось тут столкнуться с популярным форматом телепрограмм – JTV. В отличие от простого и логичного XMLTV, творение Beholder кажется жутко непонятным. К моему удивлению, в интернете нет вменяемого описания формата, поэтому решил написать свое. Для работы нам пригодится любой хексовый редактор, например HxD
Итак, телепрограмма в формате JTV представляет собой кучу файлов, где каждому каналу соответствует два файла с расширениями .pdt и .ndx и соответствующими названию канала именами.
PDT
Файл всегда начинается с записи JTV 3.x TV Program Data, за которым всегда следует три символа 0Ah.
После этого последовательно перечисляются названия телепрограмм в следующем формате:
Длина названия программы, записанная в 2 байта. Название программы.
Например, программа называется Your Style.. В шестнадцатеричной системе выглядит как 59 6F 75 72 20 53 74 79 6C 65 2E. В названии 11 (0Bh) символов. Конечная запись выглядит как 0B 00 59 6F 75 72 20 53 74 79 6C 65 2E
Например, PDT файл может выглядеть так:
4A 54 56 20 33 2E 78 20 54 56 20 50 72 6F 67 72 JTV 3.x TV Progr
61 6D 20 44 61 74 61 0A 0A 0A 0B 00 59 6F 75 72 am Data.....Your
20 53 74 79 6C 65 2E 0B 00 59 6F 75 72 20 53 74 Style...Your St
79 6C 65 2E 0A 00 59 6F 75 72 20 4C 69 66 65 2E yle...Your Life.
0F 00 50 72 69 6D 65 20 53 68 6F 77 63 61 73 65 ..Prime Showcase
2E .
NDX
Файл начинается с 2 байт, обозначающих общее количество записей. Например, если всего имеется 20 (32h) записей, то эти 2 байта будут выглядеть как 32 00 Если в файле больше 255 записей, например 300 (012Сh), то байты инвертируются, то есть фактически записываются как 2С 01
После этого записываются данные для каждой программы, по 12 байт каждая. Структура у них следующая: в начале идут два нулевых байта (00 00), за ними следует 8 байт, обозначающие дату и время начала телепрограммы, в виде FILETIME. FILETIME это 64-х разрядное значение, обозначающее количество интервалов по 100 наносекунд каждый, прошедших с первого января 1601 года. Например, 00 C8 A6 64 03 B6 CB 01 обозначает 56477943831382785 таких интервалов, что соответствует 5 утра 17 января 2011 года. В конце записываются 2 байта, обозначающие смещение в файле PDT для соответствующей программы
Рассмотрим пример файла NDX в связке с вышеуказанным файлом PDT
04 00 00 00 00 C8 A6 64 03 B6 CB 01 1A 00 00 00
00 98 2F 28 14 B6 CB 01 27 00 00 00 00 68 B8 EB
24 B6 CB 01 34 00 00 00 00 38 41 AF 35 B6 CB 01
40 00
Смещения выделены курсивом. Например, первое смещение, 1А 00 соответствует смещению, где начинается 0B 00 (вторая строчка файла PDT)
Как-то так =)

1 comment so far
Огромное спасибо за тему, данная инфа сильно помогла в сборке самодельной смотрелки расписания ТВ-программ на Делфи! Нужно только немного уточнить: при считывании из файла “ручками” восьмибайтная структура FILETIME инвертируется – младший байт идёт первым, получается так: FILETIME.dwLowDateTime – (00 C8 A6 64) > 64 А6 С8 00 и FILETIME.dwHighDateTime – (03 B6 CB 01) > 01 СВ В6 03
March 28th, 2012Add a comment