oblecto 0.2.9 → 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 +67 -39
- package/res/AGENTS.md +8 -0
- package/res/config.json +29 -7
- package/Oblecto-Web/dist/web/static/css/app.ef5965dbd50e69a7544e200a3f21fbaf.css +0 -1
- package/Oblecto-Web/dist/web/static/css/app.ef5965dbd50e69a7544e200a3f21fbaf.css.map +0 -1
- package/Oblecto-Web/dist/web/static/js/app.1352bf3c311f0e7ab716.js +0 -7150
- package/Oblecto-Web/dist/web/static/js/app.1352bf3c311f0e7ab716.js.map +0 -1
- package/Oblecto-Web/dist/web/static/js/manifest.b8404c3e329d75bb51fd.js +0 -154
- package/Oblecto-Web/dist/web/static/js/manifest.b8404c3e329d75bb51fd.js.map +0 -1
- package/Oblecto-Web/dist/web/static/js/vendor.521641a02e42750ba5a7.js +0 -32455
- package/Oblecto-Web/dist/web/static/js/vendor.521641a02e42750ba5a7.js.map +0 -1
- package/dist/bin/oblecto.d.ts +0 -2
- package/dist/bin/scripts/adduser.d.ts +0 -2
- package/dist/bin/scripts/adduser.js +0 -50
- package/dist/bin/scripts/changepassword.d.ts +0 -2
- package/dist/bin/scripts/changepassword.js +0 -48
- package/dist/bin/scripts/deluser.d.ts +0 -2
- package/dist/bin/scripts/deluser.js +0 -34
- package/dist/bin/scripts/helpers/argumentError.d.ts +0 -2
- package/dist/bin/scripts/helpers/argumentError.js +0 -12
- package/dist/bin/scripts/helpers/generateAssetDirectories.d.ts +0 -1
- package/dist/bin/scripts/helpers/generateAssetDirectories.js +0 -37
- package/dist/bin/scripts/init/assets.d.ts +0 -2
- package/dist/bin/scripts/init/assets.js +0 -24
- package/dist/bin/scripts/init/database.d.ts +0 -2
- package/dist/bin/scripts/init/database.js +0 -21
- package/dist/bin/scripts/init/general.d.ts +0 -2
- package/dist/bin/scripts/init/general.js +0 -54
- package/dist/bin/scripts/init/index.d.ts +0 -2
- package/dist/bin/scripts/init/index.js +0 -26
- package/dist/bin/scripts/removepassword.d.ts +0 -2
- package/dist/bin/scripts/removepassword.js +0 -42
- package/dist/config.d.ts +0 -7
- package/dist/config.js +0 -45
- package/dist/core/graphical.d.ts +0 -17
- package/dist/core/graphical.js +0 -179
- package/dist/core/index.d.ts +0 -9
- package/dist/core/index.js +0 -24
- package/dist/index.d.ts +0 -1
- package/dist/lib/artwork/ArtworkScaler.d.ts +0 -5
- package/dist/lib/artwork/ArtworkScaler.js +0 -31
- package/dist/lib/artwork/ArtworkUtils.d.ts +0 -8
- package/dist/lib/artwork/ArtworkUtils.js +0 -35
- package/dist/lib/artwork/movies/AggregateMovieArtworkRetriever.d.ts +0 -8
- package/dist/lib/artwork/movies/AggregateMovieArtworkRetriever.js +0 -58
- package/dist/lib/artwork/movies/MovieArtworkCollector.d.ts +0 -35
- package/dist/lib/artwork/movies/MovieArtworkCollector.js +0 -93
- package/dist/lib/artwork/movies/MovieArtworkDownloader.d.ts +0 -8
- package/dist/lib/artwork/movies/MovieArtworkDownloader.js +0 -65
- package/dist/lib/artwork/movies/artworkRetrievers/FanarttvMovieArtworkRetriever.d.ts +0 -6
- package/dist/lib/artwork/movies/artworkRetrievers/FanarttvMovieArtworkRetriever.js +0 -57
- package/dist/lib/artwork/movies/artworkRetrievers/TmdbMovieArtworkRetriever.d.ts +0 -6
- package/dist/lib/artwork/movies/artworkRetrievers/TmdbMovieArtworkRetriever.js +0 -47
- package/dist/lib/artwork/series/AggregateSeriesArtworkRetriever.d.ts +0 -8
- package/dist/lib/artwork/series/AggregateSeriesArtworkRetriever.js +0 -58
- package/dist/lib/artwork/series/SeriesArtworkCollector.d.ts +0 -37
- package/dist/lib/artwork/series/SeriesArtworkCollector.js +0 -95
- package/dist/lib/artwork/series/SeriesArtworkDownloader.d.ts +0 -8
- package/dist/lib/artwork/series/SeriesArtworkDownloader.js +0 -62
- package/dist/lib/artwork/series/artworkRetrievers/FanarttvSeriesArtworkRetriever.d.ts +0 -6
- package/dist/lib/artwork/series/artworkRetrievers/FanarttvSeriesArtworkRetriever.js +0 -44
- package/dist/lib/artwork/series/artworkRetrievers/TmdbSeriesArtworkRetriever.d.ts +0 -16
- package/dist/lib/artwork/series/artworkRetrievers/TmdbSeriesArtworkRetriever.js +0 -64
- package/dist/lib/artwork/series/artworkRetrievers/TvdbSeriesArtworkRetriever.d.ts +0 -16
- package/dist/lib/artwork/series/artworkRetrievers/TvdbSeriesArtworkRetriever.js +0 -51
- package/dist/lib/cleaners/FileCleaner.d.ts +0 -6
- package/dist/lib/cleaners/FileCleaner.js +0 -68
- package/dist/lib/cleaners/MovieCleaner.d.ts +0 -8
- package/dist/lib/cleaners/MovieCleaner.js +0 -48
- package/dist/lib/cleaners/SeriesCleaner.d.ts +0 -10
- package/dist/lib/cleaners/SeriesCleaner.js +0 -88
- package/dist/lib/common/AggregateIdentifier.d.ts +0 -9
- package/dist/lib/common/AggregateIdentifier.js +0 -57
- package/dist/lib/common/AggregateUpdateRetriever.d.ts +0 -5
- package/dist/lib/common/AggregateUpdateRetriever.js +0 -46
- package/dist/lib/downloader/index.d.ts +0 -6
- package/dist/lib/downloader/index.js +0 -83
- package/dist/lib/errors/DebugExtendableError.d.ts +0 -5
- package/dist/lib/errors/DebugExtendableError.js +0 -20
- package/dist/lib/errors/ExtendableError.d.ts +0 -3
- package/dist/lib/errors/ExtendableError.js +0 -22
- package/dist/lib/errors/FileExistsError.d.ts +0 -4
- package/dist/lib/errors/FileExistsError.js +0 -14
- package/dist/lib/errors/IdentificationError.d.ts +0 -4
- package/dist/lib/errors/IdentificationError.js +0 -14
- package/dist/lib/errors/InfoExtendableError.d.ts +0 -5
- package/dist/lib/errors/InfoExtendableError.js +0 -20
- package/dist/lib/errors/VideoAnalysisError.d.ts +0 -4
- package/dist/lib/errors/VideoAnalysisError.js +0 -14
- package/dist/lib/errors/VideoIdentificationError.d.ts +0 -4
- package/dist/lib/errors/VideoIdentificationError.js +0 -9
- package/dist/lib/errors/WarnExtendableError.d.ts +0 -5
- package/dist/lib/errors/WarnExtendableError.js +0 -20
- package/dist/lib/federation/client/FederationClient.d.ts +0 -31
- package/dist/lib/federation/client/FederationClient.js +0 -127
- package/dist/lib/federation/client/FederationClientController.d.ts +0 -9
- package/dist/lib/federation/client/FederationClientController.js +0 -45
- package/dist/lib/federation/client/FederationDataClient.d.ts +0 -11
- package/dist/lib/federation/client/FederationDataClient.js +0 -56
- package/dist/lib/federation/client/FederationMediaClient.d.ts +0 -12
- package/dist/lib/federation/client/FederationMediaClient.js +0 -70
- package/dist/lib/federation/server/FederationController.d.ts +0 -10
- package/dist/lib/federation/server/FederationController.js +0 -32
- package/dist/lib/federation/server/FederationDataServer.d.ts +0 -4
- package/dist/lib/federation/server/FederationDataServer.js +0 -22
- package/dist/lib/federation/server/FederationDataServerConnection.d.ts +0 -8
- package/dist/lib/federation/server/FederationDataServerConnection.js +0 -96
- package/dist/lib/federation/server/FederationMediaServer.d.ts +0 -4
- package/dist/lib/federation/server/FederationMediaServer.js +0 -22
- package/dist/lib/federation/server/FederationMediaServerConnection.d.ts +0 -11
- package/dist/lib/federation/server/FederationMediaServerConnection.js +0 -83
- package/dist/lib/federation/server/FederationServer.d.ts +0 -11
- package/dist/lib/federation/server/FederationServer.js +0 -40
- package/dist/lib/federation/server/FederationServerConnection.d.ts +0 -18
- package/dist/lib/federation/server/FederationServerConnection.js +0 -97
- package/dist/lib/federationindexer/FederationEpisodeIndexer.d.ts +0 -5
- package/dist/lib/federationindexer/FederationEpisodeIndexer.js +0 -65
- package/dist/lib/federationindexer/FederationMovieIndexer.d.ts +0 -5
- package/dist/lib/federationindexer/FederationMovieIndexer.js +0 -48
- package/dist/lib/federationv2/federationController/index.js +0 -13
- package/dist/lib/indexers/MediaIdentifier.d.ts +0 -5
- package/dist/lib/indexers/MediaIdentifier.js +0 -15
- package/dist/lib/indexers/files/FileIndexer.d.ts +0 -10
- package/dist/lib/indexers/files/FileIndexer.js +0 -103
- package/dist/lib/indexers/movies/MovieCollector.d.ts +0 -25
- package/dist/lib/indexers/movies/MovieCollector.js +0 -65
- package/dist/lib/indexers/movies/MovieIdentifier.d.ts +0 -10
- package/dist/lib/indexers/movies/MovieIdentifier.js +0 -22
- package/dist/lib/indexers/movies/MovieIndexer.d.ts +0 -11
- package/dist/lib/indexers/movies/MovieIndexer.js +0 -64
- package/dist/lib/indexers/movies/identifiers/TmdbMovieidentifier.d.ts +0 -4
- package/dist/lib/indexers/movies/identifiers/TmdbMovieidentifier.js +0 -52
- package/dist/lib/indexers/series/EpisodeIdentifier.d.ts +0 -12
- package/dist/lib/indexers/series/EpisodeIdentifier.js +0 -25
- package/dist/lib/indexers/series/SeriesCollector.d.ts +0 -25
- package/dist/lib/indexers/series/SeriesCollector.js +0 -69
- package/dist/lib/indexers/series/SeriesIdentifer.d.ts +0 -11
- package/dist/lib/indexers/series/SeriesIdentifer.js +0 -24
- package/dist/lib/indexers/series/SeriesIndexer.d.ts +0 -11
- package/dist/lib/indexers/series/SeriesIndexer.js +0 -140
- package/dist/lib/indexers/series/identifiers/TmdbEpisodeIdentifier.d.ts +0 -4
- package/dist/lib/indexers/series/identifiers/TmdbEpisodeIdentifier.js +0 -48
- package/dist/lib/indexers/series/identifiers/TmdbSeriesIdentifier.d.ts +0 -6
- package/dist/lib/indexers/series/identifiers/TmdbSeriesIdentifier.js +0 -90
- package/dist/lib/indexers/series/identifiers/TvdbEpisodeIdentifier.d.ts +0 -7
- package/dist/lib/indexers/series/identifiers/TvdbEpisodeIdentifier.js +0 -87
- package/dist/lib/indexers/series/identifiers/TvdbSeriesIdentifier.d.ts +0 -10
- package/dist/lib/indexers/series/identifiers/TvdbSeriesIdentifier.js +0 -82
- package/dist/lib/oblecto/index.d.ts +0 -68
- package/dist/lib/oblecto/index.js +0 -125
- package/dist/lib/queue/index.d.ts +0 -32
- package/dist/lib/queue/index.js +0 -96
- package/dist/lib/realtime/RealtimeClient.d.ts +0 -27
- package/dist/lib/realtime/RealtimeClient.js +0 -137
- package/dist/lib/realtime/RealtimeController.d.ts +0 -12
- package/dist/lib/realtime/RealtimeController.js +0 -50
- package/dist/lib/redisQueue/index.js +0 -109
- package/dist/lib/sets/tv/MovieSetCollector.d.ts +0 -6
- package/dist/lib/sets/tv/MovieSetCollector.js +0 -49
- package/dist/lib/streamSessions/StreamSession.d.ts +0 -41
- package/dist/lib/streamSessions/StreamSession.js +0 -146
- package/dist/lib/streamSessions/StreamSessionController.d.ts +0 -19
- package/dist/lib/streamSessions/StreamSessionController.js +0 -78
- package/dist/lib/streamSessions/StreamSessionTypes/DirectHttpStreamSession.d.ts +0 -5
- package/dist/lib/streamSessions/StreamSessionTypes/DirectHttpStreamSession.js +0 -116
- package/dist/lib/streamSessions/StreamSessionTypes/DirectStreamSession.d.ts +0 -5
- package/dist/lib/streamSessions/StreamSessionTypes/DirectStreamSession.js +0 -41
- package/dist/lib/streamSessions/StreamSessionTypes/HLSStreamer.d.ts +0 -15
- package/dist/lib/streamSessions/StreamSessionTypes/HLSStreamer.js +0 -148
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeFederationStreamSession.d.ts +0 -9
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeFederationStreamSession.js +0 -72
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeStreamSession.d.ts +0 -6
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeStreamSession.js +0 -96
- package/dist/lib/updaters/files/FileUpdateCollector.d.ts +0 -20
- package/dist/lib/updaters/files/FileUpdateCollector.js +0 -44
- package/dist/lib/updaters/files/FileUpdater.d.ts +0 -49
- package/dist/lib/updaters/files/FileUpdater.js +0 -194
- package/dist/lib/updaters/movies/MovieUpdateCollector.d.ts +0 -20
- package/dist/lib/updaters/movies/MovieUpdateCollector.js +0 -48
- package/dist/lib/updaters/movies/MovieUpdater.d.ts +0 -12
- package/dist/lib/updaters/movies/MovieUpdater.js +0 -49
- package/dist/lib/updaters/movies/informationRetrievers/TmdbMovieRetriever.d.ts +0 -20
- package/dist/lib/updaters/movies/informationRetrievers/TmdbMovieRetriever.js +0 -45
- package/dist/lib/updaters/series/SeriesUpdateCollector.d.ts +0 -37
- package/dist/lib/updaters/series/SeriesUpdateCollector.js +0 -79
- package/dist/lib/updaters/series/SeriesUpdater.d.ts +0 -22
- package/dist/lib/updaters/series/SeriesUpdater.js +0 -84
- package/dist/lib/updaters/series/informationRetrievers/TmdbEpisodeRetriever.d.ts +0 -11
- package/dist/lib/updaters/series/informationRetrievers/TmdbEpisodeRetriever.js +0 -70
- package/dist/lib/updaters/series/informationRetrievers/TmdbSeriesRetriever.d.ts +0 -21
- package/dist/lib/updaters/series/informationRetrievers/TmdbSeriesRetriever.js +0 -68
- package/dist/lib/updaters/series/informationRetrievers/TvdbEpisodeRetriever.d.ts +0 -5
- package/dist/lib/updaters/series/informationRetrievers/TvdbEpisodeRetriever.js +0 -38
- package/dist/lib/updaters/series/informationRetrievers/TvdbSeriesRetriever.d.ts +0 -21
- package/dist/lib/updaters/series/informationRetrievers/TvdbSeriesRetriever.js +0 -50
- package/dist/models/episode.d.ts +0 -76
- package/dist/models/episode.js +0 -62
- package/dist/models/episodeFiles.d.ts +0 -5
- package/dist/models/episodeFiles.js +0 -14
- package/dist/models/file.d.ts +0 -26
- package/dist/models/file.js +0 -32
- package/dist/models/movie.d.ts +0 -30
- package/dist/models/movie.js +0 -36
- package/dist/models/movieFiles.d.ts +0 -5
- package/dist/models/movieFiles.js +0 -14
- package/dist/models/movieSet.d.ts +0 -20
- package/dist/models/movieSet.js +0 -26
- package/dist/models/series.d.ts +0 -59
- package/dist/models/series.js +0 -50
- package/dist/models/seriesSet.d.ts +0 -9
- package/dist/models/seriesSet.js +0 -17
- package/dist/models/stream.d.ts +0 -73
- package/dist/models/stream.js +0 -81
- package/dist/models/trackEpisode.d.ts +0 -9
- package/dist/models/trackEpisode.js +0 -17
- package/dist/models/trackMovie.d.ts +0 -9
- package/dist/models/trackMovie.js +0 -17
- package/dist/models/user.d.ts +0 -19
- package/dist/models/user.js +0 -26
- package/dist/submodules/REST/index.d.ts +0 -9
- package/dist/submodules/REST/index.js +0 -59
- package/dist/submodules/REST/middleware/auth.d.ts +0 -5
- package/dist/submodules/REST/middleware/auth.js +0 -28
- package/dist/submodules/REST/routes/auth.d.ts +0 -2
- package/dist/submodules/REST/routes/auth.js +0 -48
- package/dist/submodules/REST/routes/clients.d.ts +0 -2
- package/dist/submodules/REST/routes/clients.js +0 -54
- package/dist/submodules/REST/routes/episodes.d.ts +0 -2
- package/dist/submodules/REST/routes/episodes.js +0 -275
- package/dist/submodules/REST/routes/files.d.ts +0 -2
- package/dist/submodules/REST/routes/files.js +0 -53
- package/dist/submodules/REST/routes/index.d.ts +0 -2
- package/dist/submodules/REST/routes/index.js +0 -49
- package/dist/submodules/REST/routes/movies.d.ts +0 -2
- package/dist/submodules/REST/routes/movies.js +0 -303
- package/dist/submodules/REST/routes/sets.d.ts +0 -2
- package/dist/submodules/REST/routes/sets.js +0 -35
- package/dist/submodules/REST/routes/settings/index.d.ts +0 -2
- package/dist/submodules/REST/routes/settings/index.js +0 -22
- package/dist/submodules/REST/routes/settings/maintenance.d.ts +0 -2
- package/dist/submodules/REST/routes/settings/maintenance.js +0 -87
- package/dist/submodules/REST/routes/settings/misc.d.ts +0 -2
- package/dist/submodules/REST/routes/settings/misc.js +0 -38
- package/dist/submodules/REST/routes/settings/sources.d.ts +0 -2
- package/dist/submodules/REST/routes/settings/sources.js +0 -61
- package/dist/submodules/REST/routes/streaming.js +0 -91
- package/dist/submodules/REST/routes/tvshows.d.ts +0 -2
- package/dist/submodules/REST/routes/tvshows.js +0 -137
- package/dist/submodules/REST/routes/users.d.ts +0 -2
- package/dist/submodules/REST/routes/users.js +0 -107
- package/dist/submodules/REST/routes/web.d.ts +0 -2
- package/dist/submodules/REST/routes/web.js +0 -43
- package/dist/submodules/axiosTimeout.d.ts +0 -1
- package/dist/submodules/axiosTimeout.js +0 -31
- package/dist/submodules/database.d.ts +0 -1
- package/dist/submodules/database.js +0 -180
- package/dist/submodules/ffmpeg.d.ts +0 -1
- package/dist/submodules/ffmpeg.js +0 -23
- package/dist/submodules/ffprobe.d.ts +0 -1
- package/dist/submodules/ffprobe.js +0 -22
- package/dist/submodules/guessit.d.ts +0 -5
- package/dist/submodules/guessit.js +0 -48
- package/dist/submodules/logger/index.d.ts +0 -7
- package/dist/submodules/logger/index.js +0 -43
- package/dist/submodules/promiseTimeout.d.ts +0 -1
- package/dist/submodules/promiseTimeout.js +0 -28
- package/dist/submodules/zeroconf.js +0 -19
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _events = require("events");
|
|
9
|
-
|
|
10
|
-
var _uuid = require("uuid");
|
|
11
|
-
|
|
12
|
-
var _logger = _interopRequireDefault(require("../../submodules/logger"));
|
|
13
|
-
|
|
14
|
-
var _stream = _interopRequireDefault(require("stream"));
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
class StreamSession extends _events.EventEmitter {
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
21
|
-
* @param {File} file
|
|
22
|
-
* @param options
|
|
23
|
-
* @param {Oblecto} oblecto
|
|
24
|
-
*/
|
|
25
|
-
constructor(file, options, oblecto) {
|
|
26
|
-
super();
|
|
27
|
-
|
|
28
|
-
_logger.default.log('INFO', 'New StreamSession initiating');
|
|
29
|
-
|
|
30
|
-
this.oblecto = oblecto;
|
|
31
|
-
this.file = file;
|
|
32
|
-
this.sessionId = (0, _uuid.v4)();
|
|
33
|
-
this.destinations = [];
|
|
34
|
-
this.targetFormats = options.target.formats;
|
|
35
|
-
this.targetVideoCodecs = options.target.videoCodecs;
|
|
36
|
-
this.targetAudioCodecs = options.target.audioCodecs;
|
|
37
|
-
this.format = this.targetFormats[0] || 'mp4';
|
|
38
|
-
this.videoCodec = this.targetVideoCodecs[0] || 'h264';
|
|
39
|
-
this.audioCodec = this.targetAudioCodecs[0] || 'aac';
|
|
40
|
-
this.offset = options.offset || 0;
|
|
41
|
-
this.inputStream = new _stream.default.PassThrough();
|
|
42
|
-
this.outputStream = new _stream.default.PassThrough();
|
|
43
|
-
this.outputStream.on('pause', () => this.outputPause());
|
|
44
|
-
this.outputStream.on('resume', () => this.outputResume());
|
|
45
|
-
this.outputStream.on('close', () => {
|
|
46
|
-
_logger.default.log('INFO', this.sessionId, 'output stream has closed');
|
|
47
|
-
|
|
48
|
-
this.endSession();
|
|
49
|
-
});
|
|
50
|
-
this.httpHeaders = {
|
|
51
|
-
'Content-Type': this.getOutputMimetype(),
|
|
52
|
-
'Accept-Ranges': 'none'
|
|
53
|
-
};
|
|
54
|
-
this.httpStatusCode = 200;
|
|
55
|
-
this.timeoutTime = 10000;
|
|
56
|
-
this.startTimeout();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
outputPause() {}
|
|
60
|
-
|
|
61
|
-
outputResume() {}
|
|
62
|
-
|
|
63
|
-
endSession() {
|
|
64
|
-
if (this.process) {
|
|
65
|
-
this.process.kill();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
this.emit('close');
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
startTimeout() {
|
|
72
|
-
if (this.timeout) this.clearTimeout();
|
|
73
|
-
this.timeout = setTimeout(() => {
|
|
74
|
-
_logger.default.log('INFO', 'StreamSession', this.sessionId, 'has timed out. Destroying output stream');
|
|
75
|
-
|
|
76
|
-
this.outputStream.destroy();
|
|
77
|
-
}, this.timeoutTime);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async addDestination(destination) {
|
|
81
|
-
this.destinations.push(destination);
|
|
82
|
-
this.outputStream.pipe(destination.stream);
|
|
83
|
-
|
|
84
|
-
if (destination.type === 'http') {
|
|
85
|
-
destination.stream.writeHead(this.httpStatusCode, this.httpHeaders);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
let _this = this;
|
|
89
|
-
|
|
90
|
-
destination.stream.on('error', err => {
|
|
91
|
-
_logger.default.log('ERROR', this.sessionId, err);
|
|
92
|
-
}).on('close', function () {
|
|
93
|
-
for (let i in _this.destinations) {
|
|
94
|
-
if (_this.destinations[i].stream === this) {
|
|
95
|
-
_this.destinations.splice(i, 1);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (_this.destinations.length === 0) {
|
|
100
|
-
_logger.default.log('INFO', _this.sessionId, 'last client has disconnected. Setting timeout output stream');
|
|
101
|
-
|
|
102
|
-
_this.startTimeout();
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
clearTimeout() {
|
|
108
|
-
clearTimeout(this.timeout);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
async startStream() {
|
|
112
|
-
this.clearTimeout();
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
getOutputMimetype() {
|
|
116
|
-
if (this.format === 'mp4') return 'video/mp4';
|
|
117
|
-
if (this.format === 'mpegts') return 'video/mp2t';
|
|
118
|
-
if (this.format === 'matroska') return 'video/x-matroska';
|
|
119
|
-
return 'video';
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
getFfmpegVideoCodec() {
|
|
123
|
-
if (this.oblecto.config.transcoding.hardwareAcceleration) {
|
|
124
|
-
if (this.oblecto.config.transcoding.hardwareAccelerator === 'cuda') {
|
|
125
|
-
if (this.videoCodec === 'h264') {
|
|
126
|
-
return 'h264_nvenc';
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (this.oblecto.config.transcoding.hardwareAccelerator === 'vaapi') {
|
|
131
|
-
if (this.videoCodec === 'h264') {
|
|
132
|
-
return 'h264_vaapi';
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
let codecs = {
|
|
138
|
-
'h264': 'libx264'
|
|
139
|
-
};
|
|
140
|
-
if (codecs[this.videoCodec]) return codecs[this.videoCodec];
|
|
141
|
-
return this.videoCodec;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
exports.default = StreamSession;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export default class StreamSessionController {
|
|
2
|
-
constructor(oblecto: any);
|
|
3
|
-
oblecto: any;
|
|
4
|
-
sessions: {};
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
7
|
-
* @param {File} file
|
|
8
|
-
* @param options
|
|
9
|
-
* @returns {StreamSession}
|
|
10
|
-
*/
|
|
11
|
-
newSession(file: any, options: any): any;
|
|
12
|
-
createSession(file: any, options: any): DirectHttpStreamSession | HLSStreamer | DirectStreamSession | RecodeStreamSession | RecodeFederationStreamSession | undefined;
|
|
13
|
-
sessionExists(sessionId: any): boolean;
|
|
14
|
-
}
|
|
15
|
-
import DirectHttpStreamSession from "./StreamSessionTypes/DirectHttpStreamSession";
|
|
16
|
-
import HLSStreamer from "./StreamSessionTypes/HLSStreamer";
|
|
17
|
-
import DirectStreamSession from "./StreamSessionTypes/DirectStreamSession";
|
|
18
|
-
import RecodeStreamSession from "./StreamSessionTypes/RecodeStreamSession";
|
|
19
|
-
import RecodeFederationStreamSession from "./StreamSessionTypes/RecodeFederationStreamSession";
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _DirectStreamSession = _interopRequireDefault(require("./StreamSessionTypes/DirectStreamSession"));
|
|
9
|
-
|
|
10
|
-
var _DirectHttpStreamSession = _interopRequireDefault(require("./StreamSessionTypes/DirectHttpStreamSession"));
|
|
11
|
-
|
|
12
|
-
var _RecodeStreamSession = _interopRequireDefault(require("./StreamSessionTypes/RecodeStreamSession"));
|
|
13
|
-
|
|
14
|
-
var _RecodeFederationStreamSession = _interopRequireDefault(require("./StreamSessionTypes/RecodeFederationStreamSession"));
|
|
15
|
-
|
|
16
|
-
var _logger = _interopRequireDefault(require("../../submodules/logger"));
|
|
17
|
-
|
|
18
|
-
var _HLSStreamer = _interopRequireDefault(require("./StreamSessionTypes/HLSStreamer"));
|
|
19
|
-
|
|
20
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
22
|
-
class StreamSessionController {
|
|
23
|
-
constructor(oblecto) {
|
|
24
|
-
this.oblecto = oblecto;
|
|
25
|
-
this.sessions = {};
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
* @param {File} file
|
|
30
|
-
* @param options
|
|
31
|
-
* @returns {StreamSession}
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
newSession(file, options) {
|
|
36
|
-
const streamSession = this.createSession(file, options);
|
|
37
|
-
this.sessions[streamSession.sessionId] = streamSession;
|
|
38
|
-
streamSession.on('close', () => {
|
|
39
|
-
_logger.default.log('INFO', streamSession.sessionId, 'has ended');
|
|
40
|
-
|
|
41
|
-
delete this.sessions[streamSession.sessionId];
|
|
42
|
-
});
|
|
43
|
-
return streamSession;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
createSession(file, options) {
|
|
47
|
-
if (file.host !== 'local') {
|
|
48
|
-
return new _RecodeFederationStreamSession.default(file, options, this.oblecto);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (options.streamType === 'hls') {
|
|
52
|
-
return new _HLSStreamer.default(file, options, this.oblecto);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (this.oblecto.config.transcoding.transcodeEverything) {
|
|
56
|
-
return new _RecodeStreamSession.default(file, options, this.oblecto);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (options.streamType === 'direct') {
|
|
60
|
-
return new _DirectStreamSession.default(file, options, this.oblecto);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (options.streamType === 'directhttp') {
|
|
64
|
-
return new _DirectHttpStreamSession.default(file, options, this.oblecto);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (options.streamType === 'recode') {
|
|
68
|
-
return new _RecodeStreamSession.default(file, options, this.oblecto);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
sessionExists(sessionId) {
|
|
73
|
-
return this.sessions[sessionId] !== undefined;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
exports.default = StreamSessionController;
|
|
@@ -1,116 +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 _mimeTypes = _interopRequireDefault(require("mime-types"));
|
|
11
|
-
|
|
12
|
-
var _fs = require("fs");
|
|
13
|
-
|
|
14
|
-
var _logger = _interopRequireDefault(require("../../../submodules/logger"));
|
|
15
|
-
|
|
16
|
-
var _file = require("../../../models/file");
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
class DirectHttpStreamSession extends _StreamSession.default {
|
|
21
|
-
/**
|
|
22
|
-
* @param { File } file
|
|
23
|
-
* @param { * } options
|
|
24
|
-
* @param { Oblecto } oblecto
|
|
25
|
-
*/
|
|
26
|
-
constructor(file, options, oblecto) {
|
|
27
|
-
super(file, options, oblecto);
|
|
28
|
-
this.format = this.file.extension;
|
|
29
|
-
this.videoCodec = this.file.videoCodec;
|
|
30
|
-
this.audioCodec = this.file.audioCodec;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async addDestination(destination) {
|
|
34
|
-
// Logically we only support http destinations
|
|
35
|
-
// Therefore, throw an error if the type is not http
|
|
36
|
-
if (destination.type !== 'http') {
|
|
37
|
-
_logger.default.log('ERROR', 'DirectHttpStreamer only supports http stream types');
|
|
38
|
-
|
|
39
|
-
throw new Error('HTTP Streamer only supports HTTP stream types');
|
|
40
|
-
} // This streamer only supports a single stream destination,
|
|
41
|
-
// so if another destination was found, destroy the output stream and remove it
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (this.destinations[0]) {
|
|
45
|
-
this.destinations[0].stream.destroy();
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
this.destinations[0] = destination;
|
|
49
|
-
destination.stream.on('close', () => {
|
|
50
|
-
this.startTimeout();
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async startStream() {
|
|
55
|
-
await super.startStream();
|
|
56
|
-
let req = this.destinations[0].request;
|
|
57
|
-
let res = this.destinations[0].stream;
|
|
58
|
-
await DirectHttpStreamSession.httpStreamHandler(req, res, this.file);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* @param { Request } req
|
|
62
|
-
* @param { Response } res
|
|
63
|
-
* @param { File|string } file
|
|
64
|
-
*/
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
static async httpStreamHandler(req, res, file) {
|
|
68
|
-
let path = file;
|
|
69
|
-
let size;
|
|
70
|
-
|
|
71
|
-
if (file instanceof _file.File) {
|
|
72
|
-
path = file.path;
|
|
73
|
-
size = file.size;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (!size) {
|
|
77
|
-
size = (await _fs.promises.stat(path)).size;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const mimeType = _mimeTypes.default.lookup(path);
|
|
81
|
-
|
|
82
|
-
if (req.headers.range) {
|
|
83
|
-
// meaning client (browser) has moved the forward/back slider
|
|
84
|
-
// which has sent this request back to this server logic ... cool
|
|
85
|
-
const range = req.headers.range;
|
|
86
|
-
const parts = range.replace(/bytes=/, '').split('-');
|
|
87
|
-
const partialStart = parts[0];
|
|
88
|
-
const partialEnd = parts[1];
|
|
89
|
-
const start = parseInt(partialStart, 10);
|
|
90
|
-
const end = partialEnd ? parseInt(partialEnd, 10) : size - 1;
|
|
91
|
-
const chunkSize = end - start + 1;
|
|
92
|
-
let stream = (0, _fs.createReadStream)(path, {
|
|
93
|
-
start: start,
|
|
94
|
-
end: end
|
|
95
|
-
});
|
|
96
|
-
res.writeHead(206, {
|
|
97
|
-
'Content-Range': 'bytes ' + start + '-' + end + '/' + size,
|
|
98
|
-
'Accept-Ranges': 'bytes',
|
|
99
|
-
'Content-Length': chunkSize,
|
|
100
|
-
'Content-Type': mimeType
|
|
101
|
-
});
|
|
102
|
-
stream.pipe(res);
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
res.writeHead(200, {
|
|
107
|
-
'Content-Length': size,
|
|
108
|
-
'Accept-Ranges': 'bytes',
|
|
109
|
-
'Content-Type': mimeType
|
|
110
|
-
});
|
|
111
|
-
(0, _fs.createReadStream)(path).pipe(res);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
exports.default = DirectHttpStreamSession;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _mimeTypes = _interopRequireDefault(require("mime-types"));
|
|
9
|
-
|
|
10
|
-
var _StreamSession = _interopRequireDefault(require("../StreamSession"));
|
|
11
|
-
|
|
12
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
13
|
-
|
|
14
|
-
var _logger = _interopRequireDefault(require("../../../submodules/logger"));
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
class DirectStreamSession extends _StreamSession.default {
|
|
19
|
-
constructor(file, options, oblecto) {
|
|
20
|
-
super(file, options, oblecto);
|
|
21
|
-
this.mimeType = _mimeTypes.default.lookup(file.path);
|
|
22
|
-
this.httpHeaders = {
|
|
23
|
-
'Accept-Ranges': 'none',
|
|
24
|
-
'Content-Length': this.file.size,
|
|
25
|
-
'Content-Type': this.mimeType
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async startStream() {
|
|
30
|
-
await super.startStream();
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
_fs.default.createReadStream(this.file.path).pipe(this.outputStream);
|
|
34
|
-
} catch (e) {
|
|
35
|
-
_logger.default.log(e);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
exports.default = DirectStreamSession;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export default class HLSStreamer extends StreamSession {
|
|
2
|
-
constructor(file: any, options: any, oblecto: any);
|
|
3
|
-
paused: boolean;
|
|
4
|
-
maxGenCount: number;
|
|
5
|
-
process: any;
|
|
6
|
-
segmentCheckerInterval: NodeJS.Timeout;
|
|
7
|
-
segmenterStart(cmd: any): void;
|
|
8
|
-
startSegmenter(): void;
|
|
9
|
-
segmentChecker(): Promise<void>;
|
|
10
|
-
pauseSegmenting(): void;
|
|
11
|
-
resumeSegmenting(): void;
|
|
12
|
-
sendPlaylistFile(res: any): void;
|
|
13
|
-
streamSegment(req: any, res: any, segmentId: any): Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
import StreamSession from "../StreamSession";
|
|
@@ -1,148 +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.clearTimeout();
|
|
109
|
-
res.on('close', () => {
|
|
110
|
-
this.startTimeout();
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
_DirectHttpStreamSession.default.httpStreamHandler(req, res, `${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/${('000' + segmentId).substr(-3)}.ts`);
|
|
114
|
-
|
|
115
|
-
let files = await _fs.promises.readdir(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/`);
|
|
116
|
-
|
|
117
|
-
for (let file of files) {
|
|
118
|
-
let sequenceId = file.replace('index', '').replace('.vtt', '').replace('.ts', '');
|
|
119
|
-
sequenceId = parseInt(sequenceId);
|
|
120
|
-
|
|
121
|
-
if (segmentId > sequenceId) {
|
|
122
|
-
await _fs.promises.unlink(`${_os.default.tmpdir()}/oblecto/sessions/${this.sessionId}/${file}`);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async addDestination(destination) {
|
|
128
|
-
this.destinations.push(destination);
|
|
129
|
-
destination.stream.on('close', () => {
|
|
130
|
-
for (let i in this.destinations) {
|
|
131
|
-
if (this.destinations[i].stream === destination.stream) {
|
|
132
|
-
this.destinations.splice(i, 1);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async startStream() {
|
|
139
|
-
for (let {
|
|
140
|
-
stream
|
|
141
|
-
} of this.destinations) {
|
|
142
|
-
this.sendPlaylistFile(stream);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
exports.default = HLSStreamer;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export default class RecodeFederationStreamSession extends StreamSession {
|
|
2
|
-
constructor(file: any, options: any, oblecto: any);
|
|
3
|
-
started: boolean | undefined;
|
|
4
|
-
process: any;
|
|
5
|
-
initFederationStream(): Promise<void>;
|
|
6
|
-
federationClient: FederationMediaClient | undefined;
|
|
7
|
-
}
|
|
8
|
-
import StreamSession from "../StreamSession";
|
|
9
|
-
import FederationMediaClient from "../../federation/client/FederationMediaClient";
|
|
@@ -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;
|