mirakurun 4.0.0-beta.13 → 4.0.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -2
- package/api.d.ts +34 -3
- package/api.yml +84 -4
- package/doc/Configuration.ja.md +4 -2
- package/doc/Configuration.md +4 -2
- package/doc/Platforms.ja.md +5 -3
- package/doc/Platforms.md +2 -0
- package/lib/Mirakurun/Channel.d.ts +1 -1
- package/lib/Mirakurun/Channel.js +61 -44
- package/lib/Mirakurun/Channel.js.map +1 -1
- package/lib/Mirakurun/ChannelItem.d.ts +0 -2
- package/lib/Mirakurun/ChannelItem.js +0 -108
- package/lib/Mirakurun/ChannelItem.js.map +1 -1
- package/lib/Mirakurun/Job.d.ts +67 -0
- package/lib/Mirakurun/Job.js +449 -0
- package/lib/Mirakurun/Job.js.map +1 -0
- package/lib/Mirakurun/Program.d.ts +0 -1
- package/lib/Mirakurun/Program.js +36 -25
- package/lib/Mirakurun/Program.js.map +1 -1
- package/lib/Mirakurun/Service.d.ts +6 -0
- package/lib/Mirakurun/Service.js +139 -0
- package/lib/Mirakurun/Service.js.map +1 -1
- package/lib/Mirakurun/Tuner.d.ts +4 -0
- package/lib/Mirakurun/Tuner.js +111 -99
- package/lib/Mirakurun/Tuner.js.map +1 -1
- package/lib/Mirakurun/_.d.ts +2 -0
- package/lib/Mirakurun/_.js.map +1 -1
- package/lib/Mirakurun/api/job-schedules/{key}/run.d.ts +8 -0
- package/lib/Mirakurun/api/job-schedules/{key}/run.js +93 -0
- package/lib/Mirakurun/api/job-schedules/{key}/run.js.map +1 -0
- package/lib/Mirakurun/api/job-schedules.d.ts +2 -0
- package/lib/Mirakurun/api/job-schedules.js +68 -0
- package/lib/Mirakurun/api/job-schedules.js.map +1 -0
- package/lib/Mirakurun/api/jobs/{id}/abort.d.ts +8 -0
- package/lib/Mirakurun/api/jobs/{id}/abort.js +85 -0
- package/lib/Mirakurun/api/jobs/{id}/abort.js.map +1 -0
- package/lib/Mirakurun/api/jobs.d.ts +2 -0
- package/lib/Mirakurun/api/jobs.js +68 -0
- package/lib/Mirakurun/api/jobs.js.map +1 -0
- package/lib/Mirakurun/config.js +6 -5
- package/lib/Mirakurun/config.js.map +1 -1
- package/lib/Mirakurun/rpc.js +3 -1
- package/lib/Mirakurun/rpc.js.map +1 -1
- package/lib/server.js +2 -0
- package/lib/server.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/ui/index.bundle.js +462 -57
- package/lib/ui/index.bundle.js.map +1 -1
- package/package.json +1 -1
- package/lib/Mirakurun/queue.d.ts +0 -3
- package/lib/Mirakurun/queue.js +0 -5
- package/lib/Mirakurun/queue.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,13 +6,42 @@ see [Commit Logs](https://github.com/Chinachu/Mirakurun/commits/master) to check
|
|
|
6
6
|
|
|
7
7
|
**Important Notice**: Mirakurun 4.0.0 includes significant performance improvements, enhanced EPG processing, asynchronous file I/O operations, and new features. As announced in 3.9.0, the experimental Win32 support has been completely removed.
|
|
8
8
|
|
|
9
|
+
## 4.0.0-beta.15 (2025-03-30)
|
|
10
|
+
|
|
11
|
+
Bugfix of `@4.0.0-beta.14`.
|
|
12
|
+
|
|
13
|
+
## 4.0.0-beta.14 (2025-03-30)
|
|
14
|
+
|
|
15
|
+
### Key Changes
|
|
16
|
+
|
|
17
|
+
- **Job/Queue**: Improved background job mechanism for like EPG updates.
|
|
18
|
+
- **Users can now request EPG updates at any time.**
|
|
19
|
+
- Job execution schedules can now be set in a **cron-like format**.
|
|
20
|
+
- <u>Jobs are now executed in parallel</u> according to the number of CPU cores and resource availability.
|
|
21
|
+
- At the moment, the number of parallel executions is `Math.max(1, Math.floor(os.cpus().length / 2))`, but it will be made configurable in the future.
|
|
22
|
+
|
|
23
|
+
### Server Changes
|
|
24
|
+
|
|
25
|
+
- **Config**:
|
|
26
|
+
- Added: `programGCJobSchedule`, `epgGatheringJobSchedule` server configs.
|
|
27
|
+
- Removed: `programGCInterval`, `epgGatheringInterval` server configs. (*breaking change*)
|
|
28
|
+
- Settings are not migrated. If you have customized, you must re-configure them in cron-like format, which can be changed from the Web UI.
|
|
29
|
+
- see: [Configuration](doc/Configuration.md) ([日本語](doc/Configuration.ja.md))
|
|
30
|
+
- **API**:
|
|
31
|
+
- Added: `runJobSchedule`, `abortJob` operations.
|
|
32
|
+
- **UI**:
|
|
33
|
+
- Added: **Jobs** view.
|
|
34
|
+
- Update: **Config** view.
|
|
35
|
+
|
|
9
36
|
## 4.0.0-beta.13 (2025-03-29)
|
|
10
37
|
|
|
11
38
|
### Docker Changes
|
|
12
39
|
|
|
13
|
-
- Added `DISABLE_PCSCD` environment variable to disable pcscd service
|
|
14
|
-
- Added `DISABLE_B25_TEST` environment variable to disable B25 test decoder installation
|
|
40
|
+
- Added `DISABLE_PCSCD` environment variable to disable pcscd service.
|
|
41
|
+
- Added `DISABLE_B25_TEST` environment variable to disable B25 test decoder installation.
|
|
15
42
|
- Updated `docker-compose.yml` - For testing purposes, all devices can be accessed without setting "devices" by default.
|
|
43
|
+
- **The previous default setting required a restart of the container when the card reader's USB was unplugged and plugged in, but the new default setting restores it automatically.** please check the [docker-compose.yml](docker/docker-compose.yml).
|
|
44
|
+
- **以前のデフォルト設定では、カードリーダーの USB を抜き差しすると、コンテナの再起動が必要でしたが、今回のデフォルト設定では、自動的に復旧するようになりました。** 設定例は [docker-compose.yml](docker/docker-compose.yml) をご確認ください。
|
|
16
45
|
|
|
17
46
|
## 4.0.0-beta.12 (2025-03-21)
|
|
18
47
|
|
package/api.d.ts
CHANGED
|
@@ -216,6 +216,37 @@ export interface TunerProcess {
|
|
|
216
216
|
pid: number;
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
+
export interface JobScheduleItem {
|
|
220
|
+
key: string;
|
|
221
|
+
schedule: string;
|
|
222
|
+
job: Pick<JobItem, "key" | "name">;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export interface JobItem {
|
|
226
|
+
key: string;
|
|
227
|
+
name: string;
|
|
228
|
+
id: string;
|
|
229
|
+
status: "queued" | "standby" | "running" | "finished";
|
|
230
|
+
retryCount: number;
|
|
231
|
+
|
|
232
|
+
retryOnAbort?: boolean;
|
|
233
|
+
retryOnFail?: boolean;
|
|
234
|
+
retryMax?: number;
|
|
235
|
+
retryDelay?: number;
|
|
236
|
+
|
|
237
|
+
isAborting: boolean;
|
|
238
|
+
hasAborted?: boolean;
|
|
239
|
+
hasSkipped?: boolean;
|
|
240
|
+
hasFailed?: boolean;
|
|
241
|
+
error?: string;
|
|
242
|
+
|
|
243
|
+
createdAt: number;
|
|
244
|
+
updatedAt: number;
|
|
245
|
+
startedAt?: number;
|
|
246
|
+
finishedAt?: number;
|
|
247
|
+
duration?: number;
|
|
248
|
+
}
|
|
249
|
+
|
|
219
250
|
export interface Event<T = any> {
|
|
220
251
|
resource: EventResource;
|
|
221
252
|
type: EventType;
|
|
@@ -223,7 +254,7 @@ export interface Event<T = any> {
|
|
|
223
254
|
time: UnixtimeMS;
|
|
224
255
|
}
|
|
225
256
|
|
|
226
|
-
export type EventResource = "program" | "service" | "tuner";
|
|
257
|
+
export type EventResource = "program" | "service" | "tuner" | "job" | "job_schedule";
|
|
227
258
|
|
|
228
259
|
export type EventType = "create" | "update" | "remove";
|
|
229
260
|
|
|
@@ -236,8 +267,8 @@ export interface ConfigServer {
|
|
|
236
267
|
maxLogHistory?: number;
|
|
237
268
|
maxBufferBytesBeforeReady?: number;
|
|
238
269
|
eventEndTimeout?: number;
|
|
239
|
-
|
|
240
|
-
|
|
270
|
+
programGCJobSchedule?: string;
|
|
271
|
+
epgGatheringJobSchedule?: string;
|
|
241
272
|
epgRetrievalTime?: number;
|
|
242
273
|
logoDataInterval?: number;
|
|
243
274
|
disableEITParsing?: boolean;
|
package/api.yml
CHANGED
|
@@ -406,6 +406,86 @@ definitions:
|
|
|
406
406
|
pid:
|
|
407
407
|
type: integer
|
|
408
408
|
|
|
409
|
+
# job -----------------------------------------------------------------------
|
|
410
|
+
|
|
411
|
+
JobScheduleItem:
|
|
412
|
+
type: object
|
|
413
|
+
required:
|
|
414
|
+
- key
|
|
415
|
+
- schedule
|
|
416
|
+
- job
|
|
417
|
+
properties:
|
|
418
|
+
key:
|
|
419
|
+
type: string
|
|
420
|
+
schedule:
|
|
421
|
+
type: string
|
|
422
|
+
job:
|
|
423
|
+
type: object
|
|
424
|
+
required:
|
|
425
|
+
- key
|
|
426
|
+
- name
|
|
427
|
+
properties:
|
|
428
|
+
key:
|
|
429
|
+
type: string
|
|
430
|
+
name:
|
|
431
|
+
type: string
|
|
432
|
+
|
|
433
|
+
JobItem:
|
|
434
|
+
type: object
|
|
435
|
+
required:
|
|
436
|
+
- key
|
|
437
|
+
- name
|
|
438
|
+
- id
|
|
439
|
+
- status
|
|
440
|
+
- retryCount
|
|
441
|
+
- isAborting
|
|
442
|
+
- createdAt
|
|
443
|
+
- updatedAt
|
|
444
|
+
properties:
|
|
445
|
+
key:
|
|
446
|
+
type: string
|
|
447
|
+
name:
|
|
448
|
+
type: string
|
|
449
|
+
id:
|
|
450
|
+
type: string
|
|
451
|
+
status:
|
|
452
|
+
type: string
|
|
453
|
+
enum:
|
|
454
|
+
- queued
|
|
455
|
+
- standby
|
|
456
|
+
- running
|
|
457
|
+
- finished
|
|
458
|
+
retryCount:
|
|
459
|
+
type: integer
|
|
460
|
+
retryOnAbort:
|
|
461
|
+
type: boolean
|
|
462
|
+
retryOnFail:
|
|
463
|
+
type: boolean
|
|
464
|
+
retryMax:
|
|
465
|
+
type: integer
|
|
466
|
+
retryDelay:
|
|
467
|
+
type: integer
|
|
468
|
+
isAborting:
|
|
469
|
+
type: boolean
|
|
470
|
+
hasAborted:
|
|
471
|
+
type: boolean
|
|
472
|
+
hasSkipped:
|
|
473
|
+
type: boolean
|
|
474
|
+
hasFailed:
|
|
475
|
+
type: boolean
|
|
476
|
+
error:
|
|
477
|
+
type: string
|
|
478
|
+
createdAt:
|
|
479
|
+
$ref: '#/definitions/UnixtimeMS'
|
|
480
|
+
updatedAt:
|
|
481
|
+
$ref: '#/definitions/UnixtimeMS'
|
|
482
|
+
startedAt:
|
|
483
|
+
$ref: '#/definitions/UnixtimeMS'
|
|
484
|
+
finishedAt:
|
|
485
|
+
$ref: '#/definitions/UnixtimeMS'
|
|
486
|
+
duration:
|
|
487
|
+
type: integer
|
|
488
|
+
|
|
409
489
|
# event ---------------------------------------------------------------------
|
|
410
490
|
|
|
411
491
|
Event:
|
|
@@ -466,10 +546,10 @@ definitions:
|
|
|
466
546
|
eventEndTimeout:
|
|
467
547
|
type: integer
|
|
468
548
|
minimum: 0
|
|
469
|
-
|
|
470
|
-
type:
|
|
471
|
-
|
|
472
|
-
type:
|
|
549
|
+
programGCJobSchedule:
|
|
550
|
+
type: string
|
|
551
|
+
epgGatheringJobSchedule:
|
|
552
|
+
type: string
|
|
473
553
|
epgRetrievalTime:
|
|
474
554
|
type: integer
|
|
475
555
|
logoDataInterval:
|
package/doc/Configuration.ja.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
[**English**](Configuration.md) | [**日本語**](Configuration.ja.md)
|
|
2
|
+
|
|
1
3
|
# 設定
|
|
2
4
|
|
|
3
5
|
- 🗒️[server.yml](#serveryml) - サーバー設定
|
|
@@ -26,8 +28,8 @@
|
|
|
26
28
|
| `disableIPv6` | - | Boolean | `false` | IPv6の無効化 **※Docker では常に無効** |
|
|
27
29
|
| `maxBufferBytesBeforeReady` | `MAX_BUFFER_BYTES_BEFORE_READY` | Integer | `8388608` | 準備完了前の最大バッファサイズ (バイト)<br>**※番組開始の頭が欠ける場合は増やす** |
|
|
28
30
|
| `eventEndTimeout` | `EVENT_END_TIMEOUT` | Integer | `1000` | イベント終了タイムアウト (ミリ秒)<br>**※番組終了が誤判定される場合は長くする** |
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
+
| `programGCJobSchedule` | `PROGRAM_GC_JOB_SCHEDULE` | String | `45 * * * *` | 番組一覧の GC スケジュール (cron 風形式) |
|
|
32
|
+
| `epgGatheringJobSchedule` | `EPG_GATHERING_JOB_SCHEDULE` | String | `20,50 * * * *` | EPG 収集スケジュール (cron 風形式) |
|
|
31
33
|
| `epgRetrievalTime` | `EPG_RETRIEVAL_TIME` | Integer | `600000` | EPG 取得時間 (ミリ秒) |
|
|
32
34
|
| `logoDataInterval` | `LOGO_DATA_INTERVAL` | Integer | `604800000` | ロゴデータ更新間隔 (ミリ秒) |
|
|
33
35
|
| `disableEITParsing` | `DISABLE_EIT_PARSING` | Boolean | `false` | ⚠️EIT パースの無効化 |
|
package/doc/Configuration.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
[**English**](Configuration.md) | [**日本語**](Configuration.ja.md)
|
|
2
|
+
|
|
1
3
|
# Configuration
|
|
2
4
|
|
|
3
5
|
- 🗒️[server.yml](#serveryml) - Server Configuration
|
|
@@ -26,8 +28,8 @@
|
|
|
26
28
|
| `disableIPv6` | - | Boolean | `false` | Disable IPv6 **※Always disabled in Docker** |
|
|
27
29
|
| `maxBufferBytesBeforeReady` | `MAX_BUFFER_BYTES_BEFORE_READY` | Integer | `8388608` | Maximum buffer size before ready (bytes)<br>**※Increase if the beginning of the program is missing** |
|
|
28
30
|
| `eventEndTimeout` | `EVENT_END_TIMEOUT` | Integer | `1000` | Event end timeout (milliseconds)<br>**※Increase if program end is incorrectly detected** |
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
+
| `programGCJobSchedule` | `PROGRAM_GC_JOB_SCHEDULE` | String | `45 * * * *` | Program list GC schedule (cron-like format) |
|
|
32
|
+
| `epgGatheringJobSchedule` | `EPG_GATHERING_JOB_SCHEDULE` | String | `20,50 * * * *` | EPG gathering schedule (cron-like format) |
|
|
31
33
|
| `epgRetrievalTime` | `EPG_RETRIEVAL_TIME` | Integer | `600000` | EPG retrieval time (milliseconds) |
|
|
32
34
|
| `logoDataInterval` | `LOGO_DATA_INTERVAL` | Integer | `604800000` | Logo data update interval (milliseconds) |
|
|
33
35
|
| `disableEITParsing` | `DISABLE_EIT_PARSING` | Boolean | `false` | ⚠️Disable EIT parsing |
|
package/doc/Platforms.ja.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
[**English**](Platforms.md) | [**日本語**](Platforms.ja.md)
|
|
2
|
+
|
|
1
3
|
# プラットフォーム / 環境構築手順
|
|
2
4
|
|
|
3
5
|
## 概要
|
|
@@ -10,7 +12,7 @@
|
|
|
10
12
|
- **Ubuntu Server 24.10** / 他
|
|
11
13
|
- ⚠️注意: デスクトップ環境 / VM (仮想マシン) はサポートせず、不安定です!
|
|
12
14
|
|
|
13
|
-
- [Linux + PM2 (レガシー)](#linux
|
|
15
|
+
- [Linux + PM2 (レガシー)](#linux--pm2-レガシー)
|
|
14
16
|
- [Node.js](https://nodejs.org/en/download) `^18 || ^20 || ^22`
|
|
15
17
|
- [PM2](https://pm2.keymetrics.io/)
|
|
16
18
|
|
|
@@ -140,7 +142,7 @@ docker compose logs [-f]
|
|
|
140
142
|
### ⚡設定
|
|
141
143
|
|
|
142
144
|
- 主要な設定は Web UI から変更できます
|
|
143
|
-
- 全ての設定は [Configuration.md](Configuration.md) を参照してください
|
|
145
|
+
- 全ての設定は [Configuration.md](Configuration.ja.md) を参照してください
|
|
144
146
|
|
|
145
147
|
```
|
|
146
148
|
vim /opt/mirakurun/config/server.yml
|
|
@@ -176,7 +178,7 @@ vim /opt/mirakurun/config/channels.yml
|
|
|
176
178
|
- `bin/`
|
|
177
179
|
- `bin/startup` - カスタム起動スクリプト (オプション)
|
|
178
180
|
|
|
179
|
-
##
|
|
181
|
+
## Linux + PM2 (レガシー)
|
|
180
182
|
|
|
181
183
|
この方法は推奨されませんが、一部の古いユースケースの為に残されています。
|
|
182
184
|
PM2 に特別対応するコードはすでに削除されており、エクスペリエンスは低下します。
|
package/doc/Platforms.md
CHANGED
package/lib/Mirakurun/Channel.js
CHANGED
|
@@ -37,18 +37,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.Channel = void 0;
|
|
40
|
+
const common = __importStar(require("./common"));
|
|
40
41
|
const log = __importStar(require("./log"));
|
|
41
42
|
const _1 = __importDefault(require("./_"));
|
|
42
43
|
const status_1 = __importDefault(require("./status"));
|
|
43
|
-
const queue_1 = __importDefault(require("./queue"));
|
|
44
44
|
const ChannelItem_1 = __importDefault(require("./ChannelItem"));
|
|
45
45
|
class Channel {
|
|
46
46
|
_items = [];
|
|
47
|
-
|
|
47
|
+
_startup = true;
|
|
48
48
|
constructor() {
|
|
49
49
|
this._load();
|
|
50
50
|
if (_1.default.config.server.disableEITParsing !== true) {
|
|
51
|
-
|
|
51
|
+
const epgJob = {
|
|
52
|
+
key: "EPG.Gatherer",
|
|
53
|
+
name: "EPG Gatherer",
|
|
54
|
+
fn: () => this._epgGatherer()
|
|
55
|
+
};
|
|
56
|
+
_1.default.job.add({
|
|
57
|
+
...epgJob,
|
|
58
|
+
readyFn: async () => {
|
|
59
|
+
await common.sleep(1000 * 60);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
_1.default.job.addSchedule({
|
|
64
|
+
key: epgJob.key,
|
|
65
|
+
schedule: _1.default.config.server.epgGatheringJobSchedule || "20,50 * * * *",
|
|
66
|
+
job: epgJob
|
|
67
|
+
});
|
|
52
68
|
}
|
|
53
69
|
}
|
|
54
70
|
get items() {
|
|
@@ -145,38 +161,54 @@ class Channel {
|
|
|
145
161
|
if (_1.default.tuner.typeExists(channel.type) === false) {
|
|
146
162
|
return;
|
|
147
163
|
}
|
|
148
|
-
|
|
149
|
-
if (pre) {
|
|
164
|
+
if (!this.get(channel.type, channel.channel)) {
|
|
150
165
|
if (channel.serviceId) {
|
|
151
|
-
pre.addService(channel.serviceId);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
if (channel.type !== "GR") {
|
|
156
166
|
channel.name = `${channel.type}:${channel.channel}`;
|
|
157
167
|
}
|
|
158
168
|
this.add(new ChannelItem_1.default(channel));
|
|
159
169
|
}
|
|
160
170
|
});
|
|
161
171
|
}
|
|
162
|
-
_epgGatherer() {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
+
async _epgGatherer() {
|
|
173
|
+
const startup = this._startup;
|
|
174
|
+
if (this._startup === true) {
|
|
175
|
+
this._startup = false;
|
|
176
|
+
}
|
|
177
|
+
const networkIds = [...new Set(_1.default.service.items.map(item => item.networkId))];
|
|
178
|
+
for (const networkId of networkIds) {
|
|
179
|
+
const services = _1.default.service.findByNetworkId(networkId);
|
|
180
|
+
if (services.length === 0) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const service = services[0];
|
|
184
|
+
_1.default.job.add({
|
|
185
|
+
key: `EPG.Gather.NID.${networkId}`,
|
|
186
|
+
name: `EPG Gather Network#${networkId}`,
|
|
187
|
+
fn: async () => {
|
|
188
|
+
log.info("Network#%d EPG gathering has started", networkId);
|
|
189
|
+
try {
|
|
190
|
+
await _1.default.tuner.getEPG(service.channel);
|
|
191
|
+
log.info("Network#%d EPG gathering has finished", networkId);
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
log.warn("Network#%d EPG gathering has failed [%s]", networkId, e);
|
|
195
|
+
throw new Error("EPG gathering failed");
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
readyFn: async () => {
|
|
199
|
+
await common.sleep(100);
|
|
200
|
+
if (status_1.default.epg[networkId] === true) {
|
|
201
|
+
log.info("Network#%d EPG gathering is already in progress on another stream", networkId);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
172
204
|
if (service.epgReady === true) {
|
|
173
205
|
const now = Date.now();
|
|
174
|
-
if (now - service.epgUpdatedAt <
|
|
175
|
-
log.info("Network#%d EPG gathering has skipped
|
|
176
|
-
return;
|
|
206
|
+
if (startup && now - service.epgUpdatedAt < 1000 * 60 * 10) {
|
|
207
|
+
log.info("Network#%d EPG gathering has skipped because EPG is already up to date (in 10 mins)", networkId);
|
|
208
|
+
return false;
|
|
177
209
|
}
|
|
178
|
-
if (now - service.epgUpdatedAt > 1000 * 60 * 60 *
|
|
179
|
-
log.info("Network#%d EPG gathering is resuming forcibly because reached maximum pause time", networkId);
|
|
210
|
+
if (now - service.epgUpdatedAt > 1000 * 60 * 60 * 12) {
|
|
211
|
+
log.info("Network#%d EPG gathering is resuming forcibly because reached maximum pause time (12 hours)", networkId);
|
|
180
212
|
service.epgReady = false;
|
|
181
213
|
}
|
|
182
214
|
else {
|
|
@@ -186,31 +218,16 @@ class Channel {
|
|
|
186
218
|
const networkPrograms = _1.default.program.findByNetworkId(networkId);
|
|
187
219
|
if (networkPrograms.length > 0) {
|
|
188
220
|
log.info("Network#%d EPG gathering has skipped because broadcast is off", networkId);
|
|
189
|
-
return;
|
|
221
|
+
return false;
|
|
190
222
|
}
|
|
191
223
|
service.epgReady = false;
|
|
192
224
|
}
|
|
193
225
|
}
|
|
226
|
+
return _1.default.tuner.readyForJob(service.channel);
|
|
194
227
|
}
|
|
195
|
-
|
|
196
|
-
log.info("Network#%d EPG gathering is already in progress on another stream", networkId);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
log.info("Network#%d EPG gathering has started", networkId);
|
|
200
|
-
try {
|
|
201
|
-
await _1.default.tuner.getEPG(service.channel);
|
|
202
|
-
log.info("Network#%d EPG gathering has finished", networkId);
|
|
203
|
-
}
|
|
204
|
-
catch (e) {
|
|
205
|
-
log.warn("Network#%d EPG gathering has failed [%s]", networkId, e);
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
log.debug("Network#%d EPG gathering has queued", networkId);
|
|
209
|
-
});
|
|
210
|
-
queue_1.default.add(async () => {
|
|
211
|
-
setTimeout(this._epgGatherer.bind(this), this._epgGatheringInterval);
|
|
228
|
+
}
|
|
212
229
|
});
|
|
213
|
-
}
|
|
230
|
+
}
|
|
214
231
|
}
|
|
215
232
|
}
|
|
216
233
|
exports.Channel = Channel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../src/Mirakurun/Channel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,2CAA6B;AAE7B,2CAAoB;AACpB,sDAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"Channel.js","sourceRoot":"","sources":["../../src/Mirakurun/Channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,6 @@ export default class ChannelItem {
|
|
|
10
10
|
readonly tsmfRelTs: number;
|
|
11
11
|
readonly commandVars: apid.ConfigChannelsItem["commandVars"];
|
|
12
12
|
constructor(config: apid.ConfigChannelsItem);
|
|
13
|
-
addService(serviceId: number): void;
|
|
14
13
|
getServices(): ServiceItem[];
|
|
15
14
|
getStream(user: common.User, output: stream.Writable): Promise<TSFilter>;
|
|
16
|
-
serviceScan(add: boolean): void;
|
|
17
15
|
}
|
|
@@ -1,45 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
6
|
const _1 = __importDefault(require("./_"));
|
|
40
|
-
const queue_1 = __importDefault(require("./queue"));
|
|
41
|
-
const log = __importStar(require("./log"));
|
|
42
|
-
const ServiceItem_1 = __importDefault(require("./ServiceItem"));
|
|
43
7
|
class ChannelItem {
|
|
44
8
|
name;
|
|
45
9
|
type;
|
|
@@ -52,47 +16,6 @@ class ChannelItem {
|
|
|
52
16
|
this.channel = config.channel;
|
|
53
17
|
this.tsmfRelTs = config.tsmfRelTs;
|
|
54
18
|
this.commandVars = config.commandVars;
|
|
55
|
-
if (config.serviceId) {
|
|
56
|
-
this.addService(config.serviceId);
|
|
57
|
-
}
|
|
58
|
-
setTimeout(() => {
|
|
59
|
-
if (!config.serviceId && this.getServices().length === 0) {
|
|
60
|
-
this.serviceScan(true);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
setTimeout(() => this.serviceScan(false), 180000);
|
|
64
|
-
}
|
|
65
|
-
}, 3000);
|
|
66
|
-
}
|
|
67
|
-
addService(serviceId) {
|
|
68
|
-
if (!_1.default.service) {
|
|
69
|
-
process.nextTick(() => this.addService(serviceId));
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
if (_1.default.service.findByChannel(this).some(service => service.serviceId === serviceId) === true) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
log.debug("ChannelItem#'%s' serviceId=%d check has queued", this.name, serviceId);
|
|
76
|
-
queue_1.default.add(async () => {
|
|
77
|
-
log.info("ChannelItem#'%s' serviceId=%d check has started", this.name, serviceId);
|
|
78
|
-
let services;
|
|
79
|
-
try {
|
|
80
|
-
services = await _1.default.tuner.getServices(this);
|
|
81
|
-
}
|
|
82
|
-
catch (e) {
|
|
83
|
-
log.warn("ChannelItem#'%s' serviceId=%d check has failed [%s]", this.name, serviceId, e);
|
|
84
|
-
setTimeout(() => this.addService(serviceId), 180000);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const service = services.find(service => service.serviceId === serviceId);
|
|
88
|
-
if (!service) {
|
|
89
|
-
log.warn("ChannelItem#'%s' serviceId=%d check has failed [no service]", this.name, serviceId);
|
|
90
|
-
setTimeout(() => this.addService(serviceId), 3600000);
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
log.debug("ChannelItem#'%s' serviceId=%d: %s", this.name, serviceId, JSON.stringify(service, null, " "));
|
|
94
|
-
_1.default.service.add(new ServiceItem_1.default(this, service.networkId, service.serviceId, service.name, service.type, service.logoId));
|
|
95
|
-
});
|
|
96
19
|
}
|
|
97
20
|
getServices() {
|
|
98
21
|
return _1.default.service.findByChannel(this);
|
|
@@ -100,37 +23,6 @@ class ChannelItem {
|
|
|
100
23
|
getStream(user, output) {
|
|
101
24
|
return _1.default.tuner.initChannelStream(this, user, output);
|
|
102
25
|
}
|
|
103
|
-
serviceScan(add) {
|
|
104
|
-
log.debug("ChannelItem#'%s' service scan has queued", this.name);
|
|
105
|
-
queue_1.default.add(async () => {
|
|
106
|
-
log.info("ChannelItem#'%s' service scan has started", this.name);
|
|
107
|
-
let services;
|
|
108
|
-
try {
|
|
109
|
-
services = await _1.default.tuner.getServices(this);
|
|
110
|
-
}
|
|
111
|
-
catch (e) {
|
|
112
|
-
log.warn("ChannelItem#'%s' service scan has failed [%s]", this.name, e);
|
|
113
|
-
setTimeout(() => this.serviceScan(add), add ? 180000 : 3600000);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
log.debug("ChannelItem#'%s' services: %s", this.name, JSON.stringify(services, null, " "));
|
|
117
|
-
services.forEach(service => {
|
|
118
|
-
const item = _1.default.service.get(service.networkId, service.serviceId);
|
|
119
|
-
if (item !== null) {
|
|
120
|
-
item.name = service.name;
|
|
121
|
-
item.type = service.type;
|
|
122
|
-
if (service.logoId > -1) {
|
|
123
|
-
item.logoId = service.logoId;
|
|
124
|
-
}
|
|
125
|
-
item.remoteControlKeyId = service.remoteControlKeyId;
|
|
126
|
-
}
|
|
127
|
-
else if (add === true) {
|
|
128
|
-
_1.default.service.add(new ServiceItem_1.default(this, service.networkId, service.serviceId, service.name, service.type, service.logoId, service.remoteControlKeyId));
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
log.info("ChannelItem#'%s' service scan has finished", this.name);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
26
|
}
|
|
135
27
|
exports.default = ChannelItem;
|
|
136
28
|
//# sourceMappingURL=ChannelItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelItem.js","sourceRoot":"","sources":["../../src/Mirakurun/ChannelItem.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChannelItem.js","sourceRoot":"","sources":["../../src/Mirakurun/ChannelItem.ts"],"names":[],"mappings":";;;;;AAgBA,2CAAoB;AAMpB,MAAqB,WAAW;IACnB,IAAI,CAAS;IACb,IAAI,CAAmB;IACvB,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,WAAW,CAAyC;IAE7D,YAAY,MAA+B;QACvC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC1C,CAAC;IAED,WAAW;QACP,OAAO,UAAC,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,IAAiB,EAAE,MAAuB;QAChD,OAAO,UAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;CACJ;AAtBD,8BAsBC"}
|