#include #include #include #include "lint.h" char * ctimenl(uint32_t *tm) { static char buf[25]; char *p; strcpy(buf, ctime((time_t *)tm)); if ((p = strpbrk(buf, "\r\n"))) *p = '\0'; return buf; } void display_bookmarks(struct hmt *hmt) { int i; for (i = 0; i < hmt->num_bookmarks && i < 32; i++) printf("%d ", hmt->bookmarks[i]); printf("\n"); } void display_hmt(struct hmt *hmt) { int g; g = guidance(hmt); if (sysopts & SYSOPT_PARSABLE) { printf("%s\t", hmt->mediatitle); printf("%s\t", hmt->synopsis); printf("%s\t", hmt->definition == DEF_HD ? "HD" : "SD"); printf("%lu\t%s\t", hmt->lcn, hmt->channel); printf("%lu\t", hmt->start); printf("%lu\t", hmt->end); printf("%s\t", hmt_flags(hmt)); if (g) printf("%s\t", hmt->guidance); else printf("\t"); printf("%d\t", hmt->num_bookmarks); printf("%lu\t", hmt->schedstart); printf("%lu\t", hmt->scheddur); printf("%d\t", hmt->genre); printf("%lu\t", hmt->resume); printf("%s/%s\t", recordingstatus(hmt), failurereason(hmt)); printf("%u\t%u\t%u\t", hmt->series, hmt->episode, hmt->episodetot); printf("\n"); return; } printf("Format:%s\n", hmt->definition == DEF_HD ? "HD" : "SD"); printf("Title:%s\n", hmt->mediatitle); printf("ITitle:%s\n", hmt->title); printf("Channel:%lu (%s)\n", hmt->lcn, hmt->channel); printf("Episode:%u,%u/%u\n", hmt->series, hmt->episode, hmt->episodetot); printf("Folder:%s\n", hmt->directory); if (*hmt->filename == '\0' && hmt->filename[1] != '\0') printf("Filename:%s\n", hmt->filename + 1); else printf("Filename:%s\n", hmt->filename); printf("Genre:%s (%d)\n", genredescr(hmt->genre), hmt->genre); printf("EPG:%s\n", hmt->synopsis); if (g) printf("Guidance:%s\n", hmt->guidance); if (hmt_is(hmt, HMTA_ENCRYPTED)) printf("Raw file is encrypted on disk.\n"); printf("\n"); printf("Recording Status: %s (%s)\n", recordingstatus(hmt), failurereason(hmt)); printf("Flags: %s\n", hmt_flags(hmt)); printf("Copy count:%d\n", hmt->copycount); printf("\n"); printf("Scheduled start:%lu (%s)\n", hmt->schedstart, ctimenl(&hmt->schedstart)); printf("Scheduled duration:%lu\n", hmt->scheddur); printf("Recording start:%lu (%s)\n", hmt->start, ctimenl(&hmt->start)); printf("Recording end:%lu (%s)\n", hmt->end, ctimenl(&hmt->end)); printf("Duration:%lu\n", hmt->end - hmt->start); printf("Stored duration:%lu\n", hmt->duration); printf("Play resumes at:%lu second%s in.\n", hmt->resume, hmt->resume == 1 ? "" : "s"); printf("Timezone offset:%d\n", hmt->tzoffset); printf("\n"); printf("Service ID (SID):%u\n", hmt->service_id); printf("Event ID:%u\n", hmt->event_id); printf("Transport Stream ID (TSID):%u\n", hmt->tsid); printf("Originating Network ID (ONID):%u\n", hmt->onid); printf("Programme Map Table PID (PMTPID):%u\n", hmt->pmt_pid); printf("Video PID:%u\n", hmt->video_pid); printf("Audio PID:%u\n", hmt->audio_pid); printf("Bookmarks:%d = ", hmt->num_bookmarks); display_bookmarks(hmt); /* Display basic information EPG blocks... TBC */ if (hmt->binsize > 0x1001) { uint16_t j, k; int n; printf("\n"); j = read_uint16(hmt->bin + 0x1000, 1); printf("EPG Blocks:%u\n", j); for (n = 1; n <= j; n++) { uint32_t off = 0x1004 + n * 32; if (hmt->binsize < off) break; printf(" Block:%d", n); k = read_uint32(hmt->bin + off + 4, 1); printf(" Time:%lu", k); k = read_uint32(hmt->bin + off + 8, 1); printf(" Offset:%#x\n", k); if (k < off) continue; if (hmt->binsize >= k + 704) { /* Offset to EPG block. */ off = k; printf(" Block%d_Title:%s\n", n, strip_string(hmt->bin + off + 0x3e)); } /* Synopsis is off + 0x141 */ } } }