14 typedef struct _ContentTYPE{
20 static CONTENT_TYPE ContentCatList[CAT_COUNT] = {
21 { "¥Ë¥å¡¼¥¹¡¦ÊóÆ»", "news" },
22 { "¥¹¥Ý¡¼¥Ä", "sports" },
23 { "¾ðÊó", "information" },
24 { "¥É¥é¥Þ", "drama" },
26 { "¥Ð¥é¥¨¥Æ¥£", "variety" },
28 { "¥¢¥Ë¥á¡¦Æû£", "anime" },
29 { "¥É¥¥å¥á¥ó¥¿¥ê¡¼¡¦¶µÍÜ", "documentary" },
31 { "¼ñÌ£¡¦¼ÂÍÑ", "hobby" },
32 { "Ê¡»ã", "etc" }, //Ê¡»ã
33 { "ͽÈ÷", "etc" }, //ͽÈ÷
34 { "ͽÈ÷", "etc" }, //ͽÈ÷
35 { "ͽÈ÷", "etc" }, //ͽÈ÷
36 { "¤½¤Î¾", "etc" } //¤½¤Î¾
38 typedef struct _TAG_STATION
42 int tsId; // OriginalNetworkID
43 int onId; // TransportStreamID
44 int svId; // ServiceID
47 static STATION bsSta[] = {
48 { "NHK BS1", "3001.ontvjapan.com", 16625, 4, 101},
49 { "NHK BS2", "3002.ontvjapan.com", 16625, 4, 102},
50 { "NHK BSh", "3003.ontvjapan.com", 16626, 4, 103},
51 { "BSÆü¥Æ¥ì", "3004.ontvjapan.com", 16592, 4, 141},
52 { "BSÄ«Æü", "3005.ontvjapan.com", 16400, 4, 151},
53 { "BS-i", "3006.ontvjapan.com", 16401, 4, 161},
54 { "BS¥¸¥ã¥Ñ¥ó", "3007.ontvjapan.com", 16433, 4, 171},
55 { "BS¥Õ¥¸", "3008.ontvjapan.com", 16593, 4, 181},
56 { "WOWOW", "3009.ontvjapan.com", 16432, 4, 191},
57 { "WOWOW2", "3010.ontvjapan.com", 16432, 4, 192},
58 { "WOWOW3", "3011.ontvjapan.com", 16432, 4, 193},
59 { "BS11", "3013.ontvjapan.com", 16528, 4, 211},
60 { "TwellV", "3014.ontvjapan.com", 16530, 4, 222},
63 static int bsStaCount = sizeof(bsSta) / sizeof (STATION);
67 static STATION csSta[] = {
68 { "¥¹¥¿¡¼£ã£è¥×¥é¥¹", "1002.ontvjapan.com", 24608, 6, 237},
69 { "ÆüËܱDzèÀìÌç£ã£è£È£Ä", "1086.ontvjapan.com", 24608, 6, 239},
70 { "¥Õ¥¸¥Æ¥ì¥Ó£Ã£Ó£È£Ä", "306ch.epgdata.ontvjapan", 24608, 6, 306},
71 { "¥·¥ç¥Ã¥×¥Á¥ã¥ó¥Í¥ë", "1059.ontvjapan.com", 24704, 6, 55},
72 { "¥¥Ã¥º¥¹¥Æ¡¼¥·¥ç¥ó£È£Ä", "335ch.ontvjapan.com", 24704, 6, 335},
73 { "¥¶¡¦¥·¥Í¥Þ", "1217.ontvjapan.com", 24736, 6, 228},
74 { "¥¹¥«¥Á¥ã¥ó£È£Ä£¸£°£°", "800ch.epgdata.ontvjapan", 24736, 6, 800},
75 { "¥¹¥«¥Á¥ã¥ó£¸£°£±", "801ch.epgdata.ontvjapan", 24736, 6, 801},
76 { "¥¹¥«¥Á¥ã¥ó£¸£°£²", "802ch.epgdata.ontvjapan", 24736, 6, 802},
77 { "£å£²¥×¥í¥â", "100ch.epgdata.ontvjapan", 28736, 7, 100},
78 { "¥¤¥ó¥¿¡¼¥í¡¼¥«¥ë£Ô£Ö", "194ch.epgdata.ontvjapan", 28736, 7, 194},
79 { "£Ê¥¹¥Ý¡¼¥Ä¡¡£Å£Ó£Ð£Î", "1025.ontvjapan.com", 28736, 7, 256},
80 { "£Æ£Ï£Ø", "1016.ontvjapan.com", 28736, 7, 312},
81 { "¥¹¥Ú¡¼¥¹¥·¥ã¥ï¡¼£Ô£Ö", "1018.ontvjapan.com", 28736, 7, 322},
82 { "¥«¡¼¥È¥¥¡¼¥ó¡¡¥Í¥Ã¥È", "1046.ontvjapan.com", 28736, 7, 331},
83 { "¥È¥¥¡¼¥ó¡¦¥Ç¥£¥º¥Ë¡¼", "1213.ontvjapan.com", 28736, 7, 334},
84 { "Åì±Ç¥Á¥ã¥ó¥Í¥ë", "1010.ontvjapan.com", 28768, 7, 221},
85 { "±ÒÀ±·à¾ì", "1005.ontvjapan.com", 28768, 7, 222},
86 { "¥Á¥ã¥ó¥Í¥ë£Î£Å£Ã£Ï", "1008.ontvjapan.com", 28768, 7, 223},
87 { "Íβè¡ú¥·¥Í¥Õ¥£¥ë", "1009.ontvjapan.com", 28768, 7, 224},
88 { "¥¹¥¿¡¼¡¦¥¯¥é¥·¥Ã¥¯", "1003.ontvjapan.com", 28768, 7, 238},
89 { "»þÂå·àÀìÌç¥Á¥ã¥ó¥Í¥ë", "1133.ontvjapan.com", 28768, 7, 292},
90 { "¥¹¡¼¥Ñ¡¼¥É¥é¥Þ", "1006.ontvjapan.com", 28768, 7, 310},
91 { "£Á£Ø£Î", "1014.ontvjapan.com", 28768, 7, 311},
92 { "¥Ê¥·¥ç¥¸¥ª¥Á¥ã¥ó¥Í¥ë", "1204.ontvjapan.com", 28768, 7, 343},
93 { "¥ï¥ó¥Æ¥ó¥Ý¡¼¥¿¥ë", "110ch.epgdata.ontvjapan", 28864, 7, 110},
94 { "¥´¥ë¥Õ¥Á¥ã¥ó¥Í¥ë", "1028.ontvjapan.com", 28864, 7, 260},
95 { "¥Æ¥ìÄ«¥Á¥ã¥ó¥Í¥ë", "1092.ontvjapan.com", 28864, 7, 303},
96 { "£Í£Ô£Ö", "1019.ontvjapan.com", 28864, 7, 323},
97 { "¥ß¥å¡¼¥¸¥Ã¥¯¡¦¥¨¥¢", "1024.ontvjapan.com", 28864, 7, 324},
98 { "Ä«Æü¥Ë¥å¡¼¥¹¥¿¡¼", "1067.ontvjapan.com", 28864, 7, 352},
99 { "£Â£Â£Ã¥ï¡¼¥ë¥É", "1070.ontvjapan.com", 28864, 7, 353},
100 { "£Ã£Î£Î£ê", "1069.ontvjapan.com", 28864, 7, 354},
101 { "¥¸¥ã¥¹¥È¡¦¥¢¥¤", "361ch.epgdata.ontvjapan", 28864, 7, 361},
102 { "£Ê¥¹¥Ý¡¼¥Ä¡¡£±", "1041.ontvjapan.com", 28896, 7, 251},
103 { "£Ê¥¹¥Ý¡¼¥Ä¡¡£²", "1042.ontvjapan.com", 28896, 7, 252},
104 { "£Ê¥¹¥Ý¡¼¥Ä£Ð£ì£õ£ó£È", "1043.ontvjapan.com", 28896, 7, 253},
105 { "£Ç£Á£Ï£Ò£Á", "1026.ontvjapan.com", 28896, 7, 254},
106 { "£ó£ë£ù¡¦£Á¥¹¥Ý¡¼¥Ä¡Ü", "1040.ontvjapan.com", 28896, 7, 255},
107 { "ÊõÄÍ¥×¥í¥â¥Á¥ã¥ó¥Í¥ë", "101ch.epgdata.ontvjapan", 28928, 7, 101},
108 { "£Ó£Ë£Ù¡¦£Ó£Ô£Á£Ç£Å", "1207.ontvjapan.com", 28928, 7, 290},
109 { "¥Á¥ã¥ó¥Í¥ë¶ä²Ï", "305ch.epgdata.ontvjapan", 28928, 7, 305},
110 { "£Á£Ô-£Ø", "1201.ontvjapan.com", 28928, 7, 333},
111 { "¥Ò¥¹¥È¥ê¡¼¥Á¥ã¥ó¥Í¥ë", "1050.ontvjapan.com", 28928, 7, 342},
112 { "¥¹¥«¥Á¥ã¥ó£¸£°£³", "803ch.epgdata.ontvjapan", 28928, 7, 803},
113 { "¥¹¥«¥Á¥ã¥ó£¸£°£´", "804ch.epgdata.ontvjapan", 28928, 7, 804},
114 { "¥à¡¼¥Ó¡¼¥×¥é¥¹£È£Ä", "1007.ontvjapan.com", 28960, 7, 240},
115 { "¥´¥ë¥Õ¥Í¥Ã¥È¥ï¡¼¥¯", "1027.ontvjapan.com", 28960, 7, 262},
116 { "£Ì£á£Ì£á¡¡£È£Ä", "1074.ontvjapan.com", 28960, 7, 314},
117 { "¥Õ¥¸¥Æ¥ì¥Ó£Ï£Î£Å", "1073.ontvjapan.com", 28992, 7, 307},
118 { "¥Õ¥¸¥Æ¥ì¥Ó£Ô£×£Ï", "1072.ontvjapan.com", 28992, 7, 308},
119 { "¥¢¥Ë¥Þ¥Ã¥¯¥¹", "1047.ontvjapan.com", 28992, 7, 332},
120 { "¥Ç¥£¥¹¥«¥Ð¥ê¡¼", "1062.ontvjapan.com", 28992, 7, 340},
121 { "¥¢¥Ë¥Þ¥ë¥×¥é¥Í¥Ã¥È", "1193.ontvjapan.com", 28992, 7, 341},
122 { "£Ã-£Ô£Â£Ó¥¦¥¨¥ë¥«¥à", "160ch.epgdata.ontvjapan", 29024, 7, 160},
123 { "£Ñ£Ö£Ã", "1120.ontvjapan.com", 29024, 7, 161},
124 { "¥×¥é¥¤¥à£³£¶£µ¡¥£Ô£Ö", "185ch.epgdata.ontvjapan", 29024, 7, 185},
125 { "¥Õ¥¡¥ß¥ê¡¼·à¾ì", "1015.ontvjapan.com", 29024, 7, 293},
126 { "£Ô£Â£Ó¥Á¥ã¥ó¥Í¥ë", "3201.ontvjapan.com", 29024, 7, 301},
127 { "¥Ç¥£¥º¥Ë¡¼¥Á¥ã¥ó¥Í¥ë", "1090.ontvjapan.com", 29024, 7, 304},
128 { "MUSIC ON! TV", "1022.ontvjapan.com", 29024, 7, 325},
129 { "¥¥Ã¥º¥¹¥Æ¡¼¥·¥ç¥ó", "1045.ontvjapan.com", 29024, 7, 330},
130 { "£Ô£Â£Ó¥Ë¥å¡¼¥¹¥Ð¡¼¥É", "1076.ontvjapan.com", 29024, 7, 351},
131 { "£Ã£ÓÆüËÜÈÖÁÈ¥¬¥¤¥É", "147ch.epgdata.ontvjapan", 29056, 7, 147},
132 { "Æü¥Æ¥ì£Ç¡Ü", "1068.ontvjapan.com", 29056, 7, 257},
133 { "fashion TV", "5004.ontvjapan.com", 29056, 7, 291},
134 { "Æü¥Æ¥ì¥×¥é¥¹", "300ch.epgdata.ontvjapan", 29056, 7, 300},
135 { "¥¨¥³¥ß¥å¡¼¥¸¥Ã¥¯£Ô£Ö", "1023.ontvjapan.com", 29056, 7, 320},
136 { "Music Japan TV", "1208.ontvjapan.com", 29056, 7, 321},
137 { "Æü¥Æ¥ì£Î£Å£×£Ó£²£´", "2002.ontvjapan.com", 29056, 7, 350},
140 static int csStaCount = sizeof(csSta) / sizeof (STATION);
141 SVT_CONTROL *svttop = NULL;
145 char desc[102400] = {0};
147 char ServiceName[1024];
150 void xmlspecialchars(char *str)
152 strrep(str, "&", "&");
153 strrep(str, "'", "'");
154 strrep(str, "\"", """);
155 strrep(str, "<", "<");
156 strrep(str, ">", ">");
161 void GetSDT(FILE *infile, SVT_CONTROL *svttop, SECcache *secs, int count)
165 while((bsecs = readTS(infile, secs, count)) != NULL) {
167 if((bsecs->pid & 0xFF) == 0x11) {
168 dumpSDT(bsecs->buf, svttop);
172 void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs, int count)
175 EIT_CONTROL *eitcur ;
176 EIT_CONTROL *eitnext ;
177 EIT_CONTROL *eittop = NULL;
189 eittop = calloc(1, sizeof(EIT_CONTROL));
191 fseek(infile, 0, SEEK_SET);
192 while((bsecs = readTS(infile, secs, SECCOUNT)) != NULL) {
194 if((bsecs->pid & 0xFF) == 0x12) {
195 dumpEIT(bsecs->buf, psta->svId, psta->onId, psta->tsId, eittop);
196 }else if((bsecs->pid & 0xFF) == 0x26) {
197 dumpEIT(bsecs->buf, psta->svId, psta->onId, psta->tsId, eittop);
198 }else if((bsecs->pid & 0xFF) == 0x27) {
199 dumpEIT(bsecs->buf, psta->svId, psta->onId, psta->tsId, eittop);
203 while(eitcur != NULL){
205 eitcur = eitcur->next ;
208 if(eitcur->content_type > CAT_COUNT){
209 eitcur->content_type = CAT_COUNT -1 ;
212 memset(title, '\0', sizeof(title));
213 ilen = strlen(eitcur->title);
214 olen = sizeof(title);
215 inptr = eitcur->title;
216 iconv(cd, &inptr, &ilen, &outptr, &olen);
217 xmlspecialchars(title);
219 memset(subtitle, '\0', sizeof(subtitle));
220 ilen = strlen(eitcur->subtitle);
221 olen = sizeof(subtitle);
223 inptr = eitcur->subtitle;
224 iconv(cd, &inptr, &ilen, &outptr, &olen);
225 xmlspecialchars(subtitle);
227 memset(desc, '\0', sizeof(desc));
228 if ( eitcur->desc ) {
229 ilen = strlen(eitcur->desc);
232 inptr = eitcur->desc;
233 iconv(cd, &inptr, &ilen, &outptr, &olen);
234 xmlspecialchars(desc);
237 memset(Category, '\0', sizeof(Category));
238 ilen = strlen(ContentCatList[eitcur->content_type].japanese);
239 olen = sizeof(Category);
241 inptr = ContentCatList[eitcur->content_type].japanese;
242 iconv(cd, &inptr, &ilen, &outptr, &olen);
243 xmlspecialchars(Category);
245 tl.tm_sec = eitcur->ss ;
246 tl.tm_min = eitcur->hm ;
247 tl.tm_hour = eitcur->hh ;
248 tl.tm_mday = eitcur->dd ;
249 tl.tm_mon = (eitcur->mm - 1);
250 tl.tm_year = (eitcur->yy - 1900);
254 l_time = mktime(&tl);
255 if((eitcur->ehh == 0) && (eitcur->emm == 0) && (eitcur->ess == 0)){
257 end_time = l_time + (60 * 5); // £µÊ¬¸å¤ËÀßÄê
258 endtl = localtime(&end_time);
260 end_time = l_time + eitcur->ehh * 3600 + eitcur->emm * 60 + eitcur->ess;
261 endtl = localtime(&end_time);
263 memset(cendtime, '\0', sizeof(cendtime));
264 memset(cstarttime, '\0', sizeof(cstarttime));
265 strftime(cendtime, (sizeof(cendtime) - 1), "%Y%m%d%H%M%S", endtl);
266 strftime(cstarttime, (sizeof(cstarttime) - 1), "%Y%m%d%H%M%S", &tl);
268 fprintf(outfile, " <programme start=\"%s +0900\" stop=\"%s +0900\" channel=\"%s\">\n",
269 cstarttime, cendtime, psta->ontv);
270 fprintf(outfile, " <title lang=\"ja_JP\">%s</title>\n", title);
271 fprintf(outfile, " <desc lang=\"ja_JP\">%s</desc>\n", subtitle);
272 fprintf(outfile, " <longdesc lang=\"ja_JP\">%s</longdesc>\n", desc);
273 fprintf(outfile, " <category lang=\"ja_JP\">%s</category>\n", Category);
274 // fprintf(outfile, " <category lang=\"en\">%s</category>\n", ContentCatList[eitcur->content_type].english);
275 fprintf(outfile, " </programme>\n");
277 fprintf(outfile, "(%x:%x:%x)%s,%s,%s,%s,%s,%s\n",
278 eitcur->servid, eitcur->table_id, eitcur->event_id,
279 cstarttime, cendtime,
282 ContentCatList[eitcur->content_type].english);
285 fprintf(outfile, "(%x:%x)%04d/%02d/%02d,%02d:%02d:%02d,%02d:%02d:%02d,%s,%s,%s,%s\n",
286 eitcur->table_id, eitcur->event_id,
287 eitcur->yy, eitcur->mm, eitcur->dd,
288 eitcur->hh, eitcur->hm, eitcur->ss,
289 eitcur->ehh, eitcur->emm, eitcur->ess,
290 eitcur->title, eitcur->subtitle,
291 ContentCatList[eitcur->content_type].japanese,
292 ContentCatList[eitcur->content_type].english);
294 eitnext = eitcur->next ;
296 free(eitcur->subtitle);
303 int main(int argc, char *argv[])
306 FILE *infile = stdin;
307 FILE *outfile = stdout;
308 int arg_maxcount = 1 ;
317 SVT_CONTROL *svtcur ;
318 SVT_CONTROL *svtsave ;
323 SECcache secs[SECCOUNT];
329 /* ¶½Ì£¤Î¤¢¤ëpid¤ò»ØÄê */
330 memset(secs, 0, sizeof(SECcache) * SECCOUNT);
339 if(strcmp(file, "-")) {
340 infile = fopen(file, "r");
343 if(strcmp(argv[3], "-")) {
344 outfile = fopen(argv[3], "w+");
348 fprintf(stdout, "Usage : %s /BS <tsFile> <outfile>\n", argv[0]);
349 fprintf(stdout, "Usage : %s <ontvcode> <tsFile> <outfile>\n", argv[0]);
350 fprintf(stdout, "ontvcode ¥Á¥ã¥ó¥Í¥ë¼±Ê̻ҡ£****.ontvjapan.com ¤Ê¤É\n");
351 fprintf(stdout, "/BS BS¥â¡¼¥É¡£°ì¤Ä¤ÎTS¤«¤éBSÁ´¶É¤Î¥Ç¡¼¥¿¤òÆɤ߹þ¤ß¤Þ¤¹¡£\n");
352 fprintf(stdout, "/CS CS¥â¡¼¥É¡£°ì¤Ä¤ÎTS¤«¤éÊ£¿ô¶É¤Î¥Ç¡¼¥¿¤òÆɤ߹þ¤ß¤Þ¤¹¡£\n");
356 if(strcmp(arg_onTV, "/BS") == 0){
358 staCount = bsStaCount;
360 }else if(strcmp(arg_onTV, "/CS") == 0){
362 staCount = csStaCount;
366 svttop = calloc(1, sizeof(SVT_CONTROL));
367 GetSDT(infile, svttop, secs, SECCOUNT);
368 svtcur = svttop->next ; //ÀèƬ
374 pStas = calloc(1, sizeof(STATION));
375 pStas->tsId = svtcur->transport_stream_id ;
376 pStas->onId = svtcur->original_network_id ;
377 pStas->svId = svtcur->event_id ;
378 pStas->ontv = arg_onTV ;
379 pStas->name = svtcur->servicename ;
383 fprintf(outfile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
384 fprintf(outfile, "<!DOCTYPE tv SYSTEM \"xmltv.dtd\">\n\n");
385 fprintf(outfile, "<tv generator-info-name=\"tsEPG2xml\" generator-info-url=\"http://localhost/\">\n");
387 cd = iconv_open("UTF-8", "EUC-JP");
388 for(lp = 0 ; lp < staCount ; lp++){
389 memset(ServiceName, '\0', sizeof(ServiceName));
390 ilen = strlen(pStas[lp].name);
391 olen = sizeof(ServiceName);
392 outptr = ServiceName ;
393 inptr = pStas[lp].name ;
394 iconv(cd, &inptr, &ilen, &outptr, &olen);
395 xmlspecialchars(ServiceName);
397 fprintf(outfile, " <channel id=\"%s\">\n", pStas[lp].ontv);
398 fprintf(outfile, " <display-name lang=\"ja_JP\">%s</display-name>\n", ServiceName);
399 fprintf(outfile, " </channel>\n");
401 for(lp = 0 ; lp < staCount ; lp++){
402 GetEIT(infile, outfile, &pStas[lp], secs, SECCOUNT);
404 fprintf(outfile, "</tv>\n");
415 svtcur = svttop ; //ÀèƬ
416 while(svtcur != NULL){
417 svtsave = svtcur->next ;