oblecto 0.2.8 → 0.3.1
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/Oblecto-Web/dist/web/index.html +24 -3
- package/Oblecto-Web/dist/web/static/index-C-JsqHHk.css +1 -0
- package/Oblecto-Web/dist/web/static/index-DSZgpOOu.js +576 -0
- package/README.md +43 -7
- package/dist/bin/oblecto.js +12468 -61
- package/dist/index.js +10676 -6
- package/package.json +68 -36
- package/res/AGENTS.md +8 -0
- package/res/config.json +34 -7
- package/Oblecto-Web/LICENSE +0 -674
- package/Oblecto-Web/README.md +0 -20
- package/Oblecto-Web/dist/web/static/css/app.921835f8c2878caee6d1085d9982fa86.css +0 -1
- package/Oblecto-Web/dist/web/static/css/app.921835f8c2878caee6d1085d9982fa86.css.map +0 -1
- package/Oblecto-Web/dist/web/static/js/app.758b833f6395444695b6.js +0 -6896
- package/Oblecto-Web/dist/web/static/js/app.758b833f6395444695b6.js.map +0 -1
- package/Oblecto-Web/dist/web/static/js/manifest.d327d604ee57c29a75d0.js +0 -154
- package/Oblecto-Web/dist/web/static/js/manifest.d327d604ee57c29a75d0.js.map +0 -1
- package/Oblecto-Web/dist/web/static/js/vendor.84f1e8002f100f63d6ef.js +0 -32455
- package/Oblecto-Web/dist/web/static/js/vendor.84f1e8002f100f63d6ef.js.map +0 -1
- package/Oblecto-Web/package.json +0 -118
- package/dist/bin/cliManager.js +0 -102
- package/dist/bin/scripts/adduser.js +0 -50
- package/dist/bin/scripts/changepassword.js +0 -48
- package/dist/bin/scripts/deluser.js +0 -34
- package/dist/bin/scripts/helpers/argumentError.js +0 -12
- package/dist/bin/scripts/helpers/generateAssetDirectories.js +0 -37
- package/dist/bin/scripts/init/assets.js +0 -24
- package/dist/bin/scripts/init/database.js +0 -21
- package/dist/bin/scripts/init/general.js +0 -54
- package/dist/bin/scripts/init/index.js +0 -26
- package/dist/bin/scripts/removepassword.js +0 -42
- package/dist/config.js +0 -45
- package/dist/core/graphical.js +0 -179
- package/dist/core/index.js +0 -24
- package/dist/lib/artwork/ArtworkScaler.js +0 -31
- package/dist/lib/artwork/ArtworkUtils.js +0 -35
- package/dist/lib/artwork/movies/AggregateMovieArtworkRetriever.js +0 -58
- package/dist/lib/artwork/movies/MovieArtworkCollector.js +0 -93
- package/dist/lib/artwork/movies/MovieArtworkDownloader.js +0 -65
- package/dist/lib/artwork/movies/artworkRetrievers/FanarttvMovieArtworkRetriever.js +0 -57
- package/dist/lib/artwork/movies/artworkRetrievers/TmdbMovieArtworkRetriever.js +0 -47
- package/dist/lib/artwork/series/AggregateSeriesArtworkRetriever.js +0 -58
- package/dist/lib/artwork/series/SeriesArtworkCollector.js +0 -95
- package/dist/lib/artwork/series/SeriesArtworkDownloader.js +0 -62
- package/dist/lib/artwork/series/artworkRetrievers/FanarttvSeriesArtworkRetriever.js +0 -44
- package/dist/lib/artwork/series/artworkRetrievers/TmdbSeriesArtworkRetriever.js +0 -64
- package/dist/lib/artwork/series/artworkRetrievers/TvdbSeriesArtworkRetriever.js +0 -51
- package/dist/lib/cleaners/FileCleaner.js +0 -56
- package/dist/lib/cleaners/MovieCleaner.js +0 -42
- package/dist/lib/cleaners/SeriesCleaner.js +0 -70
- package/dist/lib/common/AggregateIdentifier.js +0 -53
- package/dist/lib/common/AggregateUpdateRetriever.js +0 -43
- package/dist/lib/downloader/index.js +0 -59
- package/dist/lib/errors/DebugExtendableError.js +0 -20
- package/dist/lib/errors/ExtendableError.js +0 -22
- package/dist/lib/errors/FileExistsError.js +0 -14
- package/dist/lib/errors/IdentificationError.js +0 -14
- package/dist/lib/errors/InfoExtendableError.js +0 -20
- package/dist/lib/errors/VideoAnalysisError.js +0 -14
- package/dist/lib/errors/VideoIdentificationError.js +0 -14
- package/dist/lib/errors/WarnExtendableError.js +0 -20
- package/dist/lib/federation/client/FederationClient.js +0 -127
- package/dist/lib/federation/client/FederationClientController.js +0 -45
- package/dist/lib/federation/client/FederationDataClient.js +0 -56
- package/dist/lib/federation/client/FederationMediaClient.js +0 -70
- package/dist/lib/federation/server/FederationController.js +0 -32
- package/dist/lib/federation/server/FederationDataServer.js +0 -22
- package/dist/lib/federation/server/FederationDataServerConnection.js +0 -96
- package/dist/lib/federation/server/FederationMediaServer.js +0 -22
- package/dist/lib/federation/server/FederationMediaServerConnection.js +0 -83
- package/dist/lib/federation/server/FederationServer.js +0 -40
- package/dist/lib/federation/server/FederationServerConnection.js +0 -97
- package/dist/lib/federationindexer/FederationEpisodeIndexer.js +0 -65
- package/dist/lib/federationindexer/FederationMovieIndexer.js +0 -48
- package/dist/lib/indexers/MediaIdentifier.js +0 -15
- package/dist/lib/indexers/files/FileIndexer.js +0 -103
- package/dist/lib/indexers/files/cleaner.js +0 -43
- package/dist/lib/indexers/movies/AggregateMovieIdentifier.js +0 -45
- package/dist/lib/indexers/movies/MovieCollector.js +0 -65
- package/dist/lib/indexers/movies/MovieIdentifier.js +0 -22
- package/dist/lib/indexers/movies/MovieIndexer.js +0 -47
- package/dist/lib/indexers/movies/identifiers/TmdbMovieidentifier.js +0 -50
- package/dist/lib/indexers/series/AggregateEpisodeIdentifier.js +0 -46
- package/dist/lib/indexers/series/AggregateSeriesIdentifier.js +0 -46
- package/dist/lib/indexers/series/EpisodeIdentifier.js +0 -24
- package/dist/lib/indexers/series/SeriesCollector.js +0 -65
- package/dist/lib/indexers/series/SeriesIdentifer.js +0 -23
- package/dist/lib/indexers/series/SeriesIndexer.js +0 -134
- package/dist/lib/indexers/series/identifiers/TmdbEpisodeIdentifier.js +0 -38
- package/dist/lib/indexers/series/identifiers/TmdbSeriesIdentifier.js +0 -66
- package/dist/lib/indexers/series/identifiers/TvdbEpisodeIdentifier.js +0 -71
- package/dist/lib/indexers/series/identifiers/TvdbSeriesIdentifier.js +0 -82
- package/dist/lib/oblecto/index.js +0 -125
- package/dist/lib/queue/index.js +0 -82
- package/dist/lib/realtime/RealtimeClient.js +0 -137
- package/dist/lib/realtime/RealtimeController.js +0 -50
- package/dist/lib/sets/tv/MovieSetCollector.js +0 -49
- package/dist/lib/streamSessions/StreamSession.js +0 -148
- package/dist/lib/streamSessions/StreamSessionController.js +0 -78
- package/dist/lib/streamSessions/StreamSessionTypes/DirectHttpStreamSession.js +0 -105
- package/dist/lib/streamSessions/StreamSessionTypes/DirectStreamSession.js +0 -47
- package/dist/lib/streamSessions/StreamSessionTypes/HLSStreamer.js +0 -126
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeFederationStreamSession.js +0 -72
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeStreamSession.js +0 -65
- package/dist/lib/updaters/files/FileUpdateCollector.js +0 -44
- package/dist/lib/updaters/files/FileUpdater.js +0 -194
- package/dist/lib/updaters/movies/AggregateMovieUpdateRetriever.js +0 -44
- package/dist/lib/updaters/movies/MovieUpdateCollector.js +0 -48
- package/dist/lib/updaters/movies/MovieUpdater.js +0 -38
- package/dist/lib/updaters/movies/informationRetrievers/TmdbMovieRetriever.js +0 -42
- package/dist/lib/updaters/series/AggregateEpisodeUpdateRetriever.js +0 -41
- package/dist/lib/updaters/series/AggregateSeriesUpdateRetriever.js +0 -44
- package/dist/lib/updaters/series/SeriesUpdateCollector.js +0 -79
- package/dist/lib/updaters/series/SeriesUpdater.js +0 -84
- package/dist/lib/updaters/series/informationRetrievers/TmdbEpisodeRetriever.js +0 -66
- package/dist/lib/updaters/series/informationRetrievers/TmdbSeriesRetriever.js +0 -63
- package/dist/lib/updaters/series/informationRetrievers/TvdbEpisodeRetriever.js +0 -38
- package/dist/lib/updaters/series/informationRetrievers/TvdbSeriesRetriever.js +0 -50
- package/dist/models/episode.js +0 -62
- package/dist/models/episodeFiles.js +0 -14
- package/dist/models/file.js +0 -32
- package/dist/models/movie.js +0 -35
- package/dist/models/movieFiles.js +0 -14
- package/dist/models/movieSet.js +0 -26
- package/dist/models/series.js +0 -55
- package/dist/models/seriesSet.js +0 -17
- package/dist/models/stream.js +0 -81
- package/dist/models/trackEpisode.js +0 -17
- package/dist/models/trackEpisodes.js +0 -8
- package/dist/models/trackMovie.js +0 -17
- package/dist/models/trackMovies.js +0 -8
- package/dist/models/tvshow.js +0 -46
- package/dist/models/tvshowSet.js +0 -8
- package/dist/models/user.js +0 -26
- package/dist/submodules/REST/index.js +0 -59
- package/dist/submodules/REST/middleware/auth.js +0 -28
- package/dist/submodules/REST/routes/auth.js +0 -48
- package/dist/submodules/REST/routes/clients.js +0 -54
- package/dist/submodules/REST/routes/episodes.js +0 -275
- package/dist/submodules/REST/routes/files.js +0 -92
- package/dist/submodules/REST/routes/index.js +0 -48
- package/dist/submodules/REST/routes/movies.js +0 -305
- package/dist/submodules/REST/routes/sets.js +0 -35
- package/dist/submodules/REST/routes/settings/index.js +0 -22
- package/dist/submodules/REST/routes/settings/maintenance.js +0 -87
- package/dist/submodules/REST/routes/settings/misc.js +0 -38
- package/dist/submodules/REST/routes/settings/sources.js +0 -61
- package/dist/submodules/REST/routes/tvshows.js +0 -140
- package/dist/submodules/REST/routes/users.js +0 -107
- package/dist/submodules/REST/routes/web.js +0 -43
- package/dist/submodules/axiosTimeout.js +0 -30
- package/dist/submodules/database.js +0 -180
- package/dist/submodules/ffmpeg.js +0 -23
- package/dist/submodules/ffprobe.js +0 -22
- package/dist/submodules/guessit.js +0 -48
- package/dist/submodules/handlers/DirectStreamer.js +0 -68
- package/dist/submodules/handlers/FFMPEGHandlers/DvdStreamer.js +0 -52
- package/dist/submodules/handlers/FFMPEGHandlers/RemuxStreamer.js +0 -33
- package/dist/submodules/handlers/FFMPEGHandlers/TranscodeStreamer.js +0 -33
- package/dist/submodules/handlers/FFMPEGStreamer.js +0 -56
- package/dist/submodules/handlers/FederationStreamer.js +0 -23
- package/dist/submodules/handlers/HLSSessionHandler.js +0 -141
- package/dist/submodules/logger/index.js +0 -43
- package/dist/submodules/promiseTimeout.js +0 -28
- package/dist/submodules/zeroconf.js +0 -19
- package/dist/transcoders/dvd.js +0 -26
- package/dist/transcoders/index.js +0 -42
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _StreamSession = _interopRequireDefault(require("../StreamSession"));
|
|
9
|
-
|
|
10
|
-
var _mkdirp = _interopRequireDefault(require("mkdirp"));
|
|
11
|
-
|
|
12
|
-
var _os = _interopRequireDefault(require("os"));
|
|
13
|
-
|
|
14
|
-
var _ffmpeg = _interopRequireDefault(require("../../../submodules/ffmpeg"));
|
|
15
|
-
|
|
16
|
-
var _fs = _interopRequireWildcard(require("fs"));
|
|
17
|
-
|
|
18
|
-
var _DirectHttpStreamSession = _interopRequireDefault(require("./DirectHttpStreamSession"));
|
|
19
|
-
|
|
20
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
|
21
|
-
|
|
22
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
23
|
-
|
|
24
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
-
|
|
26
|
-
class HLSStreamer extends _StreamSession.default {
|
|
27
|
-
constructor(file, options, oblecto) {
|
|
28
|
-
super(file, options, oblecto);
|
|
29
|
-
this.timeoutTime = 10000;
|
|
30
|
-
this.paused = true;
|
|
31
|
-
this.maxGenCount = 10;
|
|
32
|
-
|
|
33
|
-
if (this.videoCodec === this.file.videoCodec || this.file.videoCodec in this.targetVideoCodecs) {
|
|
34
|
-
this.videoCodec = 'copy';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (this.audioCodec === this.file.audioCodec || this.file.audioCodec in this.targetAudioCodecs) {
|
|
38
|
-
this.audioCodec = 'copy';
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
this.startTimeout(); // Create temporary directory to store HLS segments
|
|
42
|
-
|
|
43
|
-
_mkdirp.default.sync(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}`);
|
|
44
|
-
|
|
45
|
-
this.process = (0, _ffmpeg.default)(this.file.path) //.native()
|
|
46
|
-
.videoCodec(this.getFfmpegVideoCodec()).audioCodec(this.audioCodec).seekInput(this.offset).outputOptions([//'-hls_time 10',
|
|
47
|
-
//'-hls_list_size 10',
|
|
48
|
-
//'-hls_init_time 2',
|
|
49
|
-
'-hls_playlist_type event', '-hls_base_url', `/HLS/${this.sessionId}/segment/`, '-hls_segment_filename', `${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/%03d.ts`]);
|
|
50
|
-
this.process.on('start', cmd => this.segmenterStart(cmd));
|
|
51
|
-
this.process.on('error', err => {});
|
|
52
|
-
this.segmentCheckerInterval = setInterval(() => this.segmentChecker(), 100);
|
|
53
|
-
this.startSegmenter();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async endSession() {
|
|
57
|
-
super.endSession();
|
|
58
|
-
clearInterval(this.segmentCheckerInterval);
|
|
59
|
-
await _fs.promises.rmdir(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/`, {
|
|
60
|
-
recursive: true
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
segmenterStart(cmd) {
|
|
65
|
-
this.paused = false;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
startSegmenter() {
|
|
69
|
-
this.process.save(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/index.m3u8`);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async segmentChecker() {
|
|
73
|
-
if (!this.process) return;
|
|
74
|
-
let files = await _fs.promises.readdir(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/`);
|
|
75
|
-
const segments = files.filter(s => s.includes('.ts'));
|
|
76
|
-
|
|
77
|
-
if (segments.length > this.maxGenCount) {
|
|
78
|
-
this.pauseSegmenting();
|
|
79
|
-
} else {
|
|
80
|
-
this.resumeSegmenting();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
pauseSegmenting() {
|
|
85
|
-
if (!this.process) return;
|
|
86
|
-
if (this.paused) return;
|
|
87
|
-
this.paused = true;
|
|
88
|
-
this.process.kill('SIGSTOP');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
resumeSegmenting() {
|
|
92
|
-
if (!this.process) return;
|
|
93
|
-
if (!this.paused) return;
|
|
94
|
-
this.paused = false;
|
|
95
|
-
this.process.kill('SIGCONT');
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
sendPlaylistFile(res) {
|
|
99
|
-
this.startTimeout();
|
|
100
|
-
res.writeHead(200, {
|
|
101
|
-
'Content-Type': 'application/x-mpegURL'
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
_fs.default.createReadStream(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/index.m3u8`).pipe(res);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async streamSegment(req, res, segmentId) {
|
|
108
|
-
this.startTimeout();
|
|
109
|
-
|
|
110
|
-
_DirectHttpStreamSession.default.httpStreamHandler(req, res, `${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/${('000' + segmentId).substr(-3)}.ts`);
|
|
111
|
-
|
|
112
|
-
let files = await _fs.promises.readdir(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/`);
|
|
113
|
-
|
|
114
|
-
for (let file of files) {
|
|
115
|
-
let sequenceId = file.replace('index', '').replace('.vtt', '').replace('.ts', '');
|
|
116
|
-
sequenceId = parseInt(sequenceId);
|
|
117
|
-
|
|
118
|
-
if (segmentId > sequenceId) {
|
|
119
|
-
await _fs.promises.unlink(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/${file}`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
exports.default = HLSStreamer;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _StreamSession = _interopRequireDefault(require("../StreamSession"));
|
|
9
|
-
|
|
10
|
-
var _ffmpeg = _interopRequireDefault(require("../../../submodules/ffmpeg"));
|
|
11
|
-
|
|
12
|
-
var _stream = _interopRequireDefault(require("stream"));
|
|
13
|
-
|
|
14
|
-
var _FederationMediaClient = _interopRequireDefault(require("../../federation/client/FederationMediaClient"));
|
|
15
|
-
|
|
16
|
-
var _logger = _interopRequireDefault(require("../../../submodules/logger"));
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
class RecodeFederationStreamSession extends _StreamSession.default {
|
|
21
|
-
constructor(file, options, oblecto) {
|
|
22
|
-
super(file, options, oblecto);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async addDestination(destination) {
|
|
26
|
-
await super.addDestination(destination);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
endSession() {
|
|
30
|
-
super.endSession();
|
|
31
|
-
this.federationClient.closeConnection();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async startStream() {
|
|
35
|
-
await super.startStream();
|
|
36
|
-
if (this.started) return;
|
|
37
|
-
this.started = true;
|
|
38
|
-
await this.initFederationStream();
|
|
39
|
-
let inputOptions = ['-noaccurate_seek'];
|
|
40
|
-
let outputOptions = ['-movflags', 'empty_moov', '-copyts'];
|
|
41
|
-
|
|
42
|
-
if (this.oblecto.config.transcoding.hardwareAcceleration) {
|
|
43
|
-
inputOptions.push('-hwaccel ' + this.oblecto.config.transcoding.hardwareAccelerator); // The Nvidia NVENC encoder doesn't support 10 bit encoding, so we need to force 8 bit
|
|
44
|
-
// if the cuda accelerator has been selected
|
|
45
|
-
|
|
46
|
-
if (this.oblecto.config.transcoding.hardwareAccelerator === 'cuda') {
|
|
47
|
-
outputOptions.push('-pix_fmt yuv420p');
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
this.process = (0, _ffmpeg.default)(this.inputStream).format(this.format).videoCodec(this.getFfmpegVideoCodec()).audioCodec(this.audioCodec).inputOptions(inputOptions).outputOptions(outputOptions).on('start', cmd => {
|
|
52
|
-
_logger.default.log('INFO', this.sessionId, cmd);
|
|
53
|
-
});
|
|
54
|
-
this.process.on('error', err => {
|
|
55
|
-
if (err.message !== 'ffmpeg was killed with signal SIGKILL') _logger.default.log('ERROR', this.sessionId, err);
|
|
56
|
-
});
|
|
57
|
-
this.process.pipe(this.outputStream, {
|
|
58
|
-
end: true
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async initFederationStream() {
|
|
63
|
-
this.federationClient = new _FederationMediaClient.default(this.oblecto, this.file.host);
|
|
64
|
-
await this.federationClient.connect();
|
|
65
|
-
await this.federationClient.setStreamDestination(this.inputStream);
|
|
66
|
-
await this.federationClient.setStreamOffset(this.offset);
|
|
67
|
-
await this.federationClient.startStreamFile(this.file.path);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
exports.default = RecodeFederationStreamSession;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _StreamSession = _interopRequireDefault(require("../StreamSession"));
|
|
9
|
-
|
|
10
|
-
var _ffmpeg = _interopRequireDefault(require("../../../submodules/ffmpeg"));
|
|
11
|
-
|
|
12
|
-
var _logger = _interopRequireDefault(require("../../../submodules/logger"));
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
|
-
class RecodeStreamSession extends _StreamSession.default {
|
|
17
|
-
constructor(file, options, oblecto) {
|
|
18
|
-
super(file, options, oblecto);
|
|
19
|
-
|
|
20
|
-
if (this.videoCodec === this.file.videoCodec || this.file.videoCodec in this.targetVideoCodecs) {
|
|
21
|
-
this.videoCodec = 'copy';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
if (this.audioCodec === this.file.audioCodec || this.file.audioCodec in this.targetAudioCodecs) {
|
|
25
|
-
this.audioCodec = 'copy';
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async addDestination(destination) {
|
|
30
|
-
await super.addDestination(destination);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async startStream() {
|
|
34
|
-
await super.startStream();
|
|
35
|
-
if (this.started) return;
|
|
36
|
-
this.started = true;
|
|
37
|
-
let inputOptions = ['-noaccurate_seek'];
|
|
38
|
-
let outputOptions = ['-movflags empty_moov', '-copyts'];
|
|
39
|
-
|
|
40
|
-
if (this.oblecto.config.transcoding.hardwareAcceleration) {
|
|
41
|
-
inputOptions.push('-hwaccel ' + this.oblecto.config.transcoding.hardwareAccelerator); // The Nvidia NVENC encoder doesn't support 10 bit encoding, so we need to force 8 bit
|
|
42
|
-
// if the cuda accelerator has been selected
|
|
43
|
-
// TODO: Fix washed out colors for some 10 bit video streams when using the NVENC encoder
|
|
44
|
-
// Depending on the input color range, this may result in washed out colors since the color range is kept
|
|
45
|
-
// but considered to be a full range color space even if the input range is limited.
|
|
46
|
-
|
|
47
|
-
if (this.oblecto.config.transcoding.hardwareAccelerator === 'cuda') {
|
|
48
|
-
outputOptions.push('-pix_fmt yuv420p');
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
this.process = (0, _ffmpeg.default)(this.file.path).format(this.format).videoCodec(this.getFfmpegVideoCodec()).audioCodec(this.audioCodec).seekInput(this.offset).inputOptions(inputOptions).outputOptions(outputOptions).on('start', cmd => {
|
|
53
|
-
_logger.default.log('INFO', this.sessionId, cmd);
|
|
54
|
-
});
|
|
55
|
-
this.process.on('error', err => {
|
|
56
|
-
if (err.message !== 'ffmpeg was killed with signal SIGKILL') _logger.default.log('ERROR', this.sessionId, err);
|
|
57
|
-
});
|
|
58
|
-
this.process.pipe(this.outputStream, {
|
|
59
|
-
end: true
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
exports.default = RecodeStreamSession;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _file = require("../../../models/file");
|
|
9
|
-
|
|
10
|
-
class FileUpdateCollector {
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
* @param {Oblecto} oblecto
|
|
14
|
-
*/
|
|
15
|
-
constructor(oblecto) {
|
|
16
|
-
this.oblecto = oblecto;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
*
|
|
20
|
-
* @param {File} file - File entity to update
|
|
21
|
-
* @returns {Promise<void>}
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
async collectFile(file) {
|
|
26
|
-
this.oblecto.queue.queueJob('updateFile', file);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
* @returns {Promise<void>}
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
async collectAllFiles() {
|
|
35
|
-
let files = await _file.File.findAll();
|
|
36
|
-
|
|
37
|
-
for (let file of files) {
|
|
38
|
-
this.collectFile(file);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
exports.default = FileUpdateCollector;
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _crypto = _interopRequireDefault(require("crypto"));
|
|
9
|
-
|
|
10
|
-
var _fs = require("fs");
|
|
11
|
-
|
|
12
|
-
var _ffprobe = _interopRequireDefault(require("../../../submodules/ffprobe"));
|
|
13
|
-
|
|
14
|
-
var _VideoAnalysisError = _interopRequireDefault(require("../../errors/VideoAnalysisError"));
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
class FileUpdater {
|
|
19
|
-
/**
|
|
20
|
-
* @param {Oblecto} oblecto
|
|
21
|
-
*/
|
|
22
|
-
constructor(oblecto) {
|
|
23
|
-
this.oblecto = oblecto;
|
|
24
|
-
this.oblecto.queue.addJob('updateFile', async file => {
|
|
25
|
-
await this.updateFile(file);
|
|
26
|
-
});
|
|
27
|
-
this.oblecto.queue.addJob('updateFileHash', async file => {
|
|
28
|
-
await this.updateFileHash(file);
|
|
29
|
-
});
|
|
30
|
-
this.oblecto.queue.addJob('updateFileSize', async file => {
|
|
31
|
-
await this.updateFileSize(file);
|
|
32
|
-
});
|
|
33
|
-
this.oblecto.queue.addJob('updateFileExtension', async file => {
|
|
34
|
-
await this.updateFileExtension(file);
|
|
35
|
-
});
|
|
36
|
-
this.oblecto.queue.addJob('updateFileFFProbe', async file => {
|
|
37
|
-
await this.updateFileFFProbe(file);
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
static async getPrimaryVideoStream(metadata) {
|
|
42
|
-
let streams = metadata.streams;
|
|
43
|
-
let primaryStream = {
|
|
44
|
-
duration: 0
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
for (const stream of streams) {
|
|
48
|
-
if (stream.duration || 1 >= primaryStream.duration) {
|
|
49
|
-
if (stream['codec_type'] !== 'video') continue;
|
|
50
|
-
primaryStream = stream;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return primaryStream;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
static async getPrimaryAudioStream(metadata) {
|
|
58
|
-
let streams = metadata.streams;
|
|
59
|
-
let primaryStream = {
|
|
60
|
-
duration: 0
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
for (const stream of streams) {
|
|
64
|
-
if (stream.duration || 1 >= primaryStream.duration) {
|
|
65
|
-
if (stream['codec_type'] !== 'audio') continue;
|
|
66
|
-
primaryStream = stream;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return primaryStream;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
*
|
|
74
|
-
* @param {File} file
|
|
75
|
-
* @returns {Promise<void>}
|
|
76
|
-
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
async updateFile(file) {
|
|
80
|
-
if (this.oblecto.config.files.doHash && !file.hash) {
|
|
81
|
-
this.oblecto.queue.lowPriorityJob('updateFileHash', file);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (!file.size || file.size === 0) {
|
|
85
|
-
this.oblecto.queue.queueJob('updateFileSize', file);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (file.extension.includes('.')) {
|
|
89
|
-
this.oblecto.queue.queueJob('updateFileExtension', file);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if (!file.duration || file.duration === 0) {
|
|
93
|
-
this.oblecto.queue.queueJob('updateFileFFProbe', file);
|
|
94
|
-
this.oblecto.queue.queueJob('indexFileStreams', file);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
*
|
|
99
|
-
* @param {File} file
|
|
100
|
-
* @returns {Promise<string>}
|
|
101
|
-
*/
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
getHashFromFile(file) {
|
|
105
|
-
return new Promise((resolve, reject) => {
|
|
106
|
-
let fd = (0, _fs.createReadStream)(file.path);
|
|
107
|
-
|
|
108
|
-
let hash = _crypto.default.createHash('sha1');
|
|
109
|
-
|
|
110
|
-
hash.setEncoding('hex');
|
|
111
|
-
fd.on('end', function () {
|
|
112
|
-
hash.end();
|
|
113
|
-
resolve(hash.read());
|
|
114
|
-
});
|
|
115
|
-
fd.on('error', () => {
|
|
116
|
-
reject(new _VideoAnalysisError.default(`Failed to calculate hash for ${file.path}`));
|
|
117
|
-
});
|
|
118
|
-
fd.pipe(hash);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
*
|
|
123
|
-
* @param {File} file
|
|
124
|
-
* @returns {Promise<void>}
|
|
125
|
-
*/
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
async updateFileHash(file) {
|
|
129
|
-
let hash = await this.getHashFromFile(file);
|
|
130
|
-
await file.update({
|
|
131
|
-
hash
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
*
|
|
136
|
-
* @param {File} file
|
|
137
|
-
* @returns {Promise<void>}
|
|
138
|
-
*/
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
async updateFileSize(file) {
|
|
142
|
-
let size = (await _fs.promises.stat(file.path)).size;
|
|
143
|
-
await file.update({
|
|
144
|
-
size
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
*
|
|
149
|
-
* @param {File} file
|
|
150
|
-
* @returns {Promise<void>}
|
|
151
|
-
*/
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
async updateFileExtension(file) {
|
|
155
|
-
let extension = file.extension.replace('.', '');
|
|
156
|
-
await file.update({
|
|
157
|
-
extension
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
*
|
|
162
|
-
* @param {File} file
|
|
163
|
-
* @returns {Promise<void>}
|
|
164
|
-
*/
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
async updateFileFFProbe(file) {
|
|
168
|
-
let metadata;
|
|
169
|
-
|
|
170
|
-
try {
|
|
171
|
-
metadata = await (0, _ffprobe.default)(file.path);
|
|
172
|
-
} catch (e) {
|
|
173
|
-
throw new _VideoAnalysisError.default(`Failed to ffprobe ${file.path}`);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
let primaryVideoStream = await FileUpdater.getPrimaryVideoStream(metadata);
|
|
177
|
-
let primaryAudioStream = await FileUpdater.getPrimaryAudioStream(metadata);
|
|
178
|
-
let duration = metadata.format.duration;
|
|
179
|
-
|
|
180
|
-
if (isNaN(duration)) {
|
|
181
|
-
throw new _VideoAnalysisError.default(`Could not extract duration from ${file.path}`);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
await file.update({
|
|
185
|
-
duration,
|
|
186
|
-
container: metadata.format['format_name'],
|
|
187
|
-
videoCodec: primaryVideoStream['codec_name'],
|
|
188
|
-
audioCodec: primaryAudioStream['codec_name']
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
exports.default = FileUpdater;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _IdentificationError = _interopRequireDefault(require("../../errors/IdentificationError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class AggregateMovieUpdateRetriever {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.retrievers = [];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
loadRetriever(retriever) {
|
|
18
|
-
this.retrievers.push(retriever);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async retrieveMovieInformation(movie) {
|
|
22
|
-
let information = {};
|
|
23
|
-
|
|
24
|
-
for (let retriever of this.retrievers) {
|
|
25
|
-
let currentInformation;
|
|
26
|
-
|
|
27
|
-
try {
|
|
28
|
-
currentInformation = await retriever.retrieveMovieInformation(movie);
|
|
29
|
-
} catch (e) {
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
information = { ...information,
|
|
34
|
-
...currentInformation
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (Object.keys(information).length === 0) throw new Error();
|
|
39
|
-
return information;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
exports.default = AggregateMovieUpdateRetriever;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _database = _interopRequireDefault(require("../../../submodules/database"));
|
|
9
|
-
|
|
10
|
-
var _movie = require("../../../models/movie");
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
class MovieUpdateCollector {
|
|
15
|
-
/**
|
|
16
|
-
*
|
|
17
|
-
* @param {Oblecto} oblecto
|
|
18
|
-
*/
|
|
19
|
-
constructor(oblecto) {
|
|
20
|
-
this.oblecto = oblecto;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
*
|
|
24
|
-
* @param {Movie} movie - Which movie entity to update;
|
|
25
|
-
* @returns {Promise<void>}
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
async collectMovie(movie) {
|
|
30
|
-
this.oblecto.queue.queueJob('updateMovie', movie);
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
*
|
|
34
|
-
* @returns {Promise<void>}
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
async collectAllMovies() {
|
|
39
|
-
let movies = await _movie.Movie.findAll();
|
|
40
|
-
|
|
41
|
-
for (let movie of movies) {
|
|
42
|
-
this.collectMovie(movie);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
exports.default = MovieUpdateCollector;
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _AggregateUpdateRetriever = _interopRequireDefault(require("../../common/AggregateUpdateRetriever"));
|
|
9
|
-
|
|
10
|
-
var _TmdbMovieRetriever = _interopRequireDefault(require("./informationRetrievers/TmdbMovieRetriever"));
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
class MovieUpdater {
|
|
15
|
-
constructor(oblecto) {
|
|
16
|
-
this.oblecto = oblecto;
|
|
17
|
-
this.aggregateMovieUpdateRetriever = new _AggregateUpdateRetriever.default();
|
|
18
|
-
this.aggregateMovieUpdateRetriever.loadRetriever(new _TmdbMovieRetriever.default(this.oblecto)); // Register task availability to Oblecto queue
|
|
19
|
-
|
|
20
|
-
this.oblecto.queue.addJob('updateMovie', async job => {
|
|
21
|
-
await this.updateMovie(job);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
*
|
|
26
|
-
* @param {Movie} movie
|
|
27
|
-
* @returns {Promise<void>}
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
async updateMovie(movie) {
|
|
32
|
-
let data = await this.aggregateMovieUpdateRetriever.retrieveInformation(movie);
|
|
33
|
-
await movie.update(data);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
exports.default = MovieUpdater;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _promiseTimeout = _interopRequireDefault(require("../../../../submodules/promiseTimeout"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class TmdbMovieRetriever {
|
|
13
|
-
/**
|
|
14
|
-
* @param {Oblecto} oblecto
|
|
15
|
-
*/
|
|
16
|
-
constructor(oblecto) {
|
|
17
|
-
this.oblecto = oblecto;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async retrieveInformation(movie) {
|
|
21
|
-
let movieInfo = await (0, _promiseTimeout.default)(this.oblecto.tmdb.movieInfo({
|
|
22
|
-
id: movie.tmdbid
|
|
23
|
-
}));
|
|
24
|
-
let data = {
|
|
25
|
-
imdbid: movieInfo.imdb_id,
|
|
26
|
-
movieName: movieInfo.title,
|
|
27
|
-
originalName: movieInfo.original_title,
|
|
28
|
-
tagline: movieInfo.tagline,
|
|
29
|
-
originalLanguage: movieInfo.original_language,
|
|
30
|
-
budget: movieInfo.budget,
|
|
31
|
-
revenue: movieInfo.revenue,
|
|
32
|
-
runtime: movieInfo.runtime,
|
|
33
|
-
overview: movieInfo.overview,
|
|
34
|
-
popularity: movieInfo.popularity,
|
|
35
|
-
releaseDate: movieInfo.release_date
|
|
36
|
-
};
|
|
37
|
-
return data;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
exports.default = TmdbMovieRetriever;
|