dmirakurun
Version:
Fork of Mirakurun modified to work with dantto4k
349 lines • 14.3 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const Program_1 = require("./Program");
const common_1 = require("./common");
const _1 = __importDefault(require("./_"));
const aribts_1 = require("@chinachu/aribts");
const STREAM_CONTENT = {
1: "mpeg2",
5: "h.264",
9: "h.265"
};
const COMPONENT_TYPE = {
0x01: "480i",
0x02: "480i",
0x03: "480i",
0x04: "480i",
0x83: "4320p",
0x91: "2160p",
0x92: "2160p",
0x93: "2160p",
0x94: "2160p",
0xA1: "480p",
0xA2: "480p",
0xA3: "480p",
0xA4: "480p",
0xB1: "1080i",
0xB2: "1080i",
0xB3: "1080i",
0xB4: "1080i",
0xC1: "720p",
0xC2: "720p",
0xC3: "720p",
0xC4: "720p",
0xD1: "240p",
0xD2: "240p",
0xD3: "240p",
0xD4: "240p",
0xE1: "1080p",
0xE2: "1080p",
0xE3: "1080p",
0xE4: "1080p",
0xF1: "180p",
0xF2: "180p",
0xF3: "180p",
0xF4: "180p"
};
const SAMPLING_RATE = {
0: -1,
1: 16000,
2: 22050,
3: 24000,
4: -1,
5: 32000,
6: 44100,
7: 48000
};
const UNKNOWN_START_TIME = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const UNKNOWN_DURATION = Buffer.from([0xFF, 0xFF, 0xFF]);
const ISO_639_LANG_CODE = {
jpn: Buffer.from("6A706E", "hex"),
eng: Buffer.from("656E67", "hex"),
deu: Buffer.from("646575", "hex"),
fra: Buffer.from("667261", "hex"),
ita: Buffer.from("697461", "hex"),
rus: Buffer.from("727573", "hex"),
zho: Buffer.from("7A686F", "hex"),
kor: Buffer.from("6B6F72", "hex"),
spa: Buffer.from("737061", "hex"),
etc: Buffer.from("657463", "hex")
};
class EPG {
_epg = {};
write(eit) {
if (!this._epg) {
return;
}
const isPF = (eit.table_id === 0x4E || eit.table_id === 0x4F);
if (isPF && eit.section_number > 1) {
return;
}
const isP = isPF && eit.section_number === 0;
const isF = isPF && eit.section_number === 1;
const networkId = eit.original_network_id;
if (!this._epg[networkId]) {
this._epg[networkId] = {};
}
if (!this._epg[networkId][eit.service_id]) {
this._epg[networkId][eit.service_id] = {};
}
const service = this._epg[networkId][eit.service_id];
for (const e of eit.events) {
let state;
if (!service[e.event_id]) {
const id = (0, Program_1.getProgramItemId)(networkId, eit.service_id, e.event_id);
if (!_1.default.program.exists(id)) {
if (UNKNOWN_START_TIME.compare(e.start_time) === 0) {
continue;
}
const programItem = {
id,
eventId: e.event_id,
serviceId: eit.service_id,
networkId: networkId,
startAt: (0, common_1.getTimeFromMJD)(e.start_time),
duration: UNKNOWN_DURATION.compare(e.duration) === 0 ? 1 : (0, common_1.getTimeFromBCD24)(e.duration),
isFree: e.free_CA_mode === 0,
_pf: isPF || undefined,
_isPresent: isP || undefined,
_isFollowing: isF || undefined
};
_1.default.program.add(programItem);
}
state = {
version: {},
programId: id,
short: {
version: {}
},
extended: {
version: {}
},
component: {
version: {}
},
content: {
version: {}
},
audio: {
version: {},
_audios: {}
},
series: {
version: {}
},
group: {
version: {},
_groups: []
},
present: isP || undefined,
following: isF || undefined
};
state.version[eit.table_id] = eit.version_number;
service[e.event_id] = state;
}
else {
state = service[e.event_id];
if ((!state.present && isP) || (!state.following && isF) || isOutOfDate(eit, state.version)) {
state.version[eit.table_id] = eit.version_number;
if (UNKNOWN_START_TIME.compare(e.start_time) !== 0) {
_1.default.program.set(state.programId, {
startAt: (0, common_1.getTimeFromMJD)(e.start_time),
duration: UNKNOWN_DURATION.compare(e.duration) === 0 ? 1 : (0, common_1.getTimeFromBCD24)(e.duration),
isFree: e.free_CA_mode === 0,
_pf: isPF || undefined,
_isPresent: isP || undefined,
_isFollowing: isF || undefined
});
}
state.present = isP || undefined;
state.following = isF || undefined;
}
}
for (const d of e.descriptors) {
switch (d.descriptor_tag) {
case 0x4D:
if (!isOutOfDate(eit, state.short.version)) {
break;
}
state.short.version[eit.table_id] = eit.version_number;
_1.default.program.set(state.programId, {
name: new aribts_1.TsChar(d.event_name_char).decode(),
description: new aribts_1.TsChar(d.text_char).decode()
});
break;
case 0x4E:
if (isOutOfDate(eit, state.extended.version)) {
state.extended.version[eit.table_id] = eit.version_number;
state.extended._descs = new Array(d.last_descriptor_number + 1);
state.extended._done = false;
}
else if (state.extended._done) {
break;
}
if (!state.extended._descs[d.descriptor_number]) {
state.extended._descs[d.descriptor_number] = d.items;
let comp = true;
for (const descs of state.extended._descs) {
if (typeof descs === "undefined") {
comp = false;
break;
}
}
if (comp === false) {
break;
}
const extended = {};
let current = "";
for (const descs of state.extended._descs) {
for (const desc of descs) {
const key = desc.item_description_length === 0
? current
: new aribts_1.TsChar(desc.item_description_char).decode();
current = key;
extended[key] = extended[key] ?
Buffer.concat([extended[key], desc.item_char]) :
desc.item_char;
}
}
for (const key of Object.keys(extended)) {
extended[key] = new aribts_1.TsChar(extended[key]).decode();
}
_1.default.program.set(state.programId, {
extended: extended
});
delete state.extended._descs;
state.extended._done = true;
}
break;
case 0x50:
if (!isOutOfDate(eit, state.component.version)) {
break;
}
state.component.version[eit.table_id] = eit.version_number;
_1.default.program.set(state.programId, {
video: {
type: STREAM_CONTENT[d.stream_content] || null,
resolution: COMPONENT_TYPE[d.component_type] || null,
streamContent: d.stream_content,
componentType: d.component_type
}
});
break;
case 0x54:
if (!isOutOfDate(eit, state.content.version)) {
break;
}
state.content.version[eit.table_id] = eit.version_number;
_1.default.program.set(state.programId, {
genres: d.contents.map(getGenre)
});
break;
case 0xC4:
if (!isOutOfDateLv2(eit, state.audio.version, d.component_tag)) {
break;
}
state.audio.version[eit.table_id][d.component_tag] = eit.version_number;
const langs = [getLangCode(d.ISO_639_language_code)];
if (d.ISO_639_language_code_2) {
langs.push(getLangCode(d.ISO_639_language_code_2));
}
state.audio._audios[d.component_tag] = {
componentType: d.component_type,
componentTag: d.component_tag,
isMain: d.main_component_flag === 1,
samplingRate: SAMPLING_RATE[d.sampling_rate],
langs
};
_1.default.program.set(state.programId, {
audios: Object.values(state.audio._audios)
});
break;
case 0xD5:
if (!isOutOfDate(eit, state.series.version)) {
break;
}
state.series.version[eit.table_id] = eit.version_number;
_1.default.program.set(state.programId, {
series: {
id: d.series_id,
repeat: d.repeat_label,
pattern: d.program_pattern,
expiresAt: d.expire_date_valid_flag === 1 ?
(0, common_1.getTimeFromMJD)(Buffer.from(d.expire_date.toString(16), "hex")) :
-1,
episode: d.episode_number,
lastEpisode: d.last_episode_number,
name: new aribts_1.TsChar(d.series_name_char).decode()
}
});
break;
case 0xD6:
if (!isOutOfDateLv2(eit, state.group.version, d.group_type)) {
break;
}
state.group.version[eit.table_id][d.group_type] = eit.version_number;
state.group._groups[d.group_type] = d.group_type < 4 ?
d.events.map(getRelatedProgramItem.bind(d)) :
d.other_network_events.map(getRelatedProgramItem.bind(d));
_1.default.program.set(state.programId, {
relatedItems: state.group._groups.flat()
});
break;
}
}
}
}
end() {
if (this._epg) {
delete this._epg;
}
}
}
exports.default = EPG;
function isOutOfDate(eit, versionRecord) {
if ((versionRecord[0x4E] !== undefined && eit.table_id !== 0x4E) ||
(versionRecord[0x4F] !== undefined && eit.table_id !== 0x4E && eit.table_id !== 0x4F)) {
return false;
}
return versionRecord[eit.table_id] !== eit.version_number;
}
function isOutOfDateLv2(eit, versionRecord, lv2) {
if ((versionRecord[0x4E] !== undefined && eit.table_id !== 0x4E) ||
(versionRecord[0x4F] !== undefined && eit.table_id !== 0x4E && eit.table_id !== 0x4F)) {
return false;
}
if (versionRecord[eit.table_id] === undefined) {
versionRecord[eit.table_id] = {};
}
return versionRecord[eit.table_id][lv2] !== eit.version_number;
}
function getGenre(content) {
return {
lv1: content.content_nibble_level_1,
lv2: content.content_nibble_level_2,
un1: content.user_nibble_1,
un2: content.user_nibble_2
};
}
function getLangCode(buffer) {
for (const code in ISO_639_LANG_CODE) {
if (ISO_639_LANG_CODE[code].compare(buffer) === 0) {
return code;
}
}
return "etc";
}
function getRelatedProgramItem(event) {
return {
type: (this.group_type === 1 ? "shared" :
(this.group_type === 2 || this.group_type === 4) ? "relay" : "movement"),
networkId: event.original_network_id,
serviceId: event.service_id,
eventId: event.event_id
};
}
//# sourceMappingURL=EPG.js.map