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.
Files changed (167) hide show
  1. package/Oblecto-Web/dist/web/index.html +24 -3
  2. package/Oblecto-Web/dist/web/static/index-C-JsqHHk.css +1 -0
  3. package/Oblecto-Web/dist/web/static/index-DSZgpOOu.js +576 -0
  4. package/README.md +43 -7
  5. package/dist/bin/oblecto.js +12468 -61
  6. package/dist/index.js +10676 -6
  7. package/package.json +68 -36
  8. package/res/AGENTS.md +8 -0
  9. package/res/config.json +34 -7
  10. package/Oblecto-Web/LICENSE +0 -674
  11. package/Oblecto-Web/README.md +0 -20
  12. package/Oblecto-Web/dist/web/static/css/app.921835f8c2878caee6d1085d9982fa86.css +0 -1
  13. package/Oblecto-Web/dist/web/static/css/app.921835f8c2878caee6d1085d9982fa86.css.map +0 -1
  14. package/Oblecto-Web/dist/web/static/js/app.758b833f6395444695b6.js +0 -6896
  15. package/Oblecto-Web/dist/web/static/js/app.758b833f6395444695b6.js.map +0 -1
  16. package/Oblecto-Web/dist/web/static/js/manifest.d327d604ee57c29a75d0.js +0 -154
  17. package/Oblecto-Web/dist/web/static/js/manifest.d327d604ee57c29a75d0.js.map +0 -1
  18. package/Oblecto-Web/dist/web/static/js/vendor.84f1e8002f100f63d6ef.js +0 -32455
  19. package/Oblecto-Web/dist/web/static/js/vendor.84f1e8002f100f63d6ef.js.map +0 -1
  20. package/Oblecto-Web/package.json +0 -118
  21. package/dist/bin/cliManager.js +0 -102
  22. package/dist/bin/scripts/adduser.js +0 -50
  23. package/dist/bin/scripts/changepassword.js +0 -48
  24. package/dist/bin/scripts/deluser.js +0 -34
  25. package/dist/bin/scripts/helpers/argumentError.js +0 -12
  26. package/dist/bin/scripts/helpers/generateAssetDirectories.js +0 -37
  27. package/dist/bin/scripts/init/assets.js +0 -24
  28. package/dist/bin/scripts/init/database.js +0 -21
  29. package/dist/bin/scripts/init/general.js +0 -54
  30. package/dist/bin/scripts/init/index.js +0 -26
  31. package/dist/bin/scripts/removepassword.js +0 -42
  32. package/dist/config.js +0 -45
  33. package/dist/core/graphical.js +0 -179
  34. package/dist/core/index.js +0 -24
  35. package/dist/lib/artwork/ArtworkScaler.js +0 -31
  36. package/dist/lib/artwork/ArtworkUtils.js +0 -35
  37. package/dist/lib/artwork/movies/AggregateMovieArtworkRetriever.js +0 -58
  38. package/dist/lib/artwork/movies/MovieArtworkCollector.js +0 -93
  39. package/dist/lib/artwork/movies/MovieArtworkDownloader.js +0 -65
  40. package/dist/lib/artwork/movies/artworkRetrievers/FanarttvMovieArtworkRetriever.js +0 -57
  41. package/dist/lib/artwork/movies/artworkRetrievers/TmdbMovieArtworkRetriever.js +0 -47
  42. package/dist/lib/artwork/series/AggregateSeriesArtworkRetriever.js +0 -58
  43. package/dist/lib/artwork/series/SeriesArtworkCollector.js +0 -95
  44. package/dist/lib/artwork/series/SeriesArtworkDownloader.js +0 -62
  45. package/dist/lib/artwork/series/artworkRetrievers/FanarttvSeriesArtworkRetriever.js +0 -44
  46. package/dist/lib/artwork/series/artworkRetrievers/TmdbSeriesArtworkRetriever.js +0 -64
  47. package/dist/lib/artwork/series/artworkRetrievers/TvdbSeriesArtworkRetriever.js +0 -51
  48. package/dist/lib/cleaners/FileCleaner.js +0 -56
  49. package/dist/lib/cleaners/MovieCleaner.js +0 -42
  50. package/dist/lib/cleaners/SeriesCleaner.js +0 -70
  51. package/dist/lib/common/AggregateIdentifier.js +0 -53
  52. package/dist/lib/common/AggregateUpdateRetriever.js +0 -43
  53. package/dist/lib/downloader/index.js +0 -59
  54. package/dist/lib/errors/DebugExtendableError.js +0 -20
  55. package/dist/lib/errors/ExtendableError.js +0 -22
  56. package/dist/lib/errors/FileExistsError.js +0 -14
  57. package/dist/lib/errors/IdentificationError.js +0 -14
  58. package/dist/lib/errors/InfoExtendableError.js +0 -20
  59. package/dist/lib/errors/VideoAnalysisError.js +0 -14
  60. package/dist/lib/errors/VideoIdentificationError.js +0 -14
  61. package/dist/lib/errors/WarnExtendableError.js +0 -20
  62. package/dist/lib/federation/client/FederationClient.js +0 -127
  63. package/dist/lib/federation/client/FederationClientController.js +0 -45
  64. package/dist/lib/federation/client/FederationDataClient.js +0 -56
  65. package/dist/lib/federation/client/FederationMediaClient.js +0 -70
  66. package/dist/lib/federation/server/FederationController.js +0 -32
  67. package/dist/lib/federation/server/FederationDataServer.js +0 -22
  68. package/dist/lib/federation/server/FederationDataServerConnection.js +0 -96
  69. package/dist/lib/federation/server/FederationMediaServer.js +0 -22
  70. package/dist/lib/federation/server/FederationMediaServerConnection.js +0 -83
  71. package/dist/lib/federation/server/FederationServer.js +0 -40
  72. package/dist/lib/federation/server/FederationServerConnection.js +0 -97
  73. package/dist/lib/federationindexer/FederationEpisodeIndexer.js +0 -65
  74. package/dist/lib/federationindexer/FederationMovieIndexer.js +0 -48
  75. package/dist/lib/indexers/MediaIdentifier.js +0 -15
  76. package/dist/lib/indexers/files/FileIndexer.js +0 -103
  77. package/dist/lib/indexers/files/cleaner.js +0 -43
  78. package/dist/lib/indexers/movies/AggregateMovieIdentifier.js +0 -45
  79. package/dist/lib/indexers/movies/MovieCollector.js +0 -65
  80. package/dist/lib/indexers/movies/MovieIdentifier.js +0 -22
  81. package/dist/lib/indexers/movies/MovieIndexer.js +0 -47
  82. package/dist/lib/indexers/movies/identifiers/TmdbMovieidentifier.js +0 -50
  83. package/dist/lib/indexers/series/AggregateEpisodeIdentifier.js +0 -46
  84. package/dist/lib/indexers/series/AggregateSeriesIdentifier.js +0 -46
  85. package/dist/lib/indexers/series/EpisodeIdentifier.js +0 -24
  86. package/dist/lib/indexers/series/SeriesCollector.js +0 -65
  87. package/dist/lib/indexers/series/SeriesIdentifer.js +0 -23
  88. package/dist/lib/indexers/series/SeriesIndexer.js +0 -134
  89. package/dist/lib/indexers/series/identifiers/TmdbEpisodeIdentifier.js +0 -38
  90. package/dist/lib/indexers/series/identifiers/TmdbSeriesIdentifier.js +0 -66
  91. package/dist/lib/indexers/series/identifiers/TvdbEpisodeIdentifier.js +0 -71
  92. package/dist/lib/indexers/series/identifiers/TvdbSeriesIdentifier.js +0 -82
  93. package/dist/lib/oblecto/index.js +0 -125
  94. package/dist/lib/queue/index.js +0 -82
  95. package/dist/lib/realtime/RealtimeClient.js +0 -137
  96. package/dist/lib/realtime/RealtimeController.js +0 -50
  97. package/dist/lib/sets/tv/MovieSetCollector.js +0 -49
  98. package/dist/lib/streamSessions/StreamSession.js +0 -148
  99. package/dist/lib/streamSessions/StreamSessionController.js +0 -78
  100. package/dist/lib/streamSessions/StreamSessionTypes/DirectHttpStreamSession.js +0 -105
  101. package/dist/lib/streamSessions/StreamSessionTypes/DirectStreamSession.js +0 -47
  102. package/dist/lib/streamSessions/StreamSessionTypes/HLSStreamer.js +0 -126
  103. package/dist/lib/streamSessions/StreamSessionTypes/RecodeFederationStreamSession.js +0 -72
  104. package/dist/lib/streamSessions/StreamSessionTypes/RecodeStreamSession.js +0 -65
  105. package/dist/lib/updaters/files/FileUpdateCollector.js +0 -44
  106. package/dist/lib/updaters/files/FileUpdater.js +0 -194
  107. package/dist/lib/updaters/movies/AggregateMovieUpdateRetriever.js +0 -44
  108. package/dist/lib/updaters/movies/MovieUpdateCollector.js +0 -48
  109. package/dist/lib/updaters/movies/MovieUpdater.js +0 -38
  110. package/dist/lib/updaters/movies/informationRetrievers/TmdbMovieRetriever.js +0 -42
  111. package/dist/lib/updaters/series/AggregateEpisodeUpdateRetriever.js +0 -41
  112. package/dist/lib/updaters/series/AggregateSeriesUpdateRetriever.js +0 -44
  113. package/dist/lib/updaters/series/SeriesUpdateCollector.js +0 -79
  114. package/dist/lib/updaters/series/SeriesUpdater.js +0 -84
  115. package/dist/lib/updaters/series/informationRetrievers/TmdbEpisodeRetriever.js +0 -66
  116. package/dist/lib/updaters/series/informationRetrievers/TmdbSeriesRetriever.js +0 -63
  117. package/dist/lib/updaters/series/informationRetrievers/TvdbEpisodeRetriever.js +0 -38
  118. package/dist/lib/updaters/series/informationRetrievers/TvdbSeriesRetriever.js +0 -50
  119. package/dist/models/episode.js +0 -62
  120. package/dist/models/episodeFiles.js +0 -14
  121. package/dist/models/file.js +0 -32
  122. package/dist/models/movie.js +0 -35
  123. package/dist/models/movieFiles.js +0 -14
  124. package/dist/models/movieSet.js +0 -26
  125. package/dist/models/series.js +0 -55
  126. package/dist/models/seriesSet.js +0 -17
  127. package/dist/models/stream.js +0 -81
  128. package/dist/models/trackEpisode.js +0 -17
  129. package/dist/models/trackEpisodes.js +0 -8
  130. package/dist/models/trackMovie.js +0 -17
  131. package/dist/models/trackMovies.js +0 -8
  132. package/dist/models/tvshow.js +0 -46
  133. package/dist/models/tvshowSet.js +0 -8
  134. package/dist/models/user.js +0 -26
  135. package/dist/submodules/REST/index.js +0 -59
  136. package/dist/submodules/REST/middleware/auth.js +0 -28
  137. package/dist/submodules/REST/routes/auth.js +0 -48
  138. package/dist/submodules/REST/routes/clients.js +0 -54
  139. package/dist/submodules/REST/routes/episodes.js +0 -275
  140. package/dist/submodules/REST/routes/files.js +0 -92
  141. package/dist/submodules/REST/routes/index.js +0 -48
  142. package/dist/submodules/REST/routes/movies.js +0 -305
  143. package/dist/submodules/REST/routes/sets.js +0 -35
  144. package/dist/submodules/REST/routes/settings/index.js +0 -22
  145. package/dist/submodules/REST/routes/settings/maintenance.js +0 -87
  146. package/dist/submodules/REST/routes/settings/misc.js +0 -38
  147. package/dist/submodules/REST/routes/settings/sources.js +0 -61
  148. package/dist/submodules/REST/routes/tvshows.js +0 -140
  149. package/dist/submodules/REST/routes/users.js +0 -107
  150. package/dist/submodules/REST/routes/web.js +0 -43
  151. package/dist/submodules/axiosTimeout.js +0 -30
  152. package/dist/submodules/database.js +0 -180
  153. package/dist/submodules/ffmpeg.js +0 -23
  154. package/dist/submodules/ffprobe.js +0 -22
  155. package/dist/submodules/guessit.js +0 -48
  156. package/dist/submodules/handlers/DirectStreamer.js +0 -68
  157. package/dist/submodules/handlers/FFMPEGHandlers/DvdStreamer.js +0 -52
  158. package/dist/submodules/handlers/FFMPEGHandlers/RemuxStreamer.js +0 -33
  159. package/dist/submodules/handlers/FFMPEGHandlers/TranscodeStreamer.js +0 -33
  160. package/dist/submodules/handlers/FFMPEGStreamer.js +0 -56
  161. package/dist/submodules/handlers/FederationStreamer.js +0 -23
  162. package/dist/submodules/handlers/HLSSessionHandler.js +0 -141
  163. package/dist/submodules/logger/index.js +0 -43
  164. package/dist/submodules/promiseTimeout.js +0 -28
  165. package/dist/submodules/zeroconf.js +0 -19
  166. package/dist/transcoders/dvd.js +0 -26
  167. package/dist/transcoders/index.js +0 -42
@@ -1,82 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _async = _interopRequireDefault(require("async"));
9
-
10
- var _logger = _interopRequireDefault(require("../../submodules/logger"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- class Queue {
15
- constructor(concurrency) {
16
- this.jobs = {};
17
- this.queue = _async.default.priorityQueue((job, callback) => {
18
- if (!this.jobs[job.id]) return callback();
19
- let jobTimeout = setTimeout(() => {
20
- _logger.default.log('WARN', `Job ${job.id} is taking a long time. Maybe something is wrong?`, JSON.stringify(job));
21
- }, 20000);
22
- this.jobs[job.id](job.attr).then(() => {
23
- clearTimeout(jobTimeout);
24
- callback();
25
- }).catch(err => {
26
- clearTimeout(jobTimeout);
27
-
28
- _logger.default.log(err);
29
-
30
- callback();
31
- });
32
- }, concurrency);
33
- }
34
- /**
35
- * Define a new job
36
- * @param {string} id
37
- * @param {function} job
38
- */
39
-
40
-
41
- addJob(id, job) {
42
- _logger.default.log('INFO', 'New queue item has been registered:', id);
43
-
44
- this.jobs[id] = job;
45
- }
46
- /**
47
- * Add a job to the end of the queue
48
- * @param {string} id
49
- * @param {object} job
50
- */
51
-
52
-
53
- queueJob(id, job) {
54
- this.queue.push({
55
- id,
56
- attr: job
57
- }, 5);
58
- }
59
-
60
- lowPriorityJob(id, job) {
61
- this.queue.push({
62
- id,
63
- attr: job
64
- }, 20);
65
- }
66
- /**
67
- * Add a job to the front of the queue
68
- * @param {string} id
69
- * @param {object} job
70
- */
71
-
72
-
73
- pushJob(id, job) {
74
- this.queue.push({
75
- id,
76
- attr: job
77
- }, 0);
78
- }
79
-
80
- }
81
-
82
- exports.default = Queue;
@@ -1,137 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken"));
9
-
10
- var _events = _interopRequireDefault(require("events"));
11
-
12
- var _trackEpisode = require("../../models/trackEpisode");
13
-
14
- var _trackMovie = require("../../models/trackMovie");
15
-
16
- var _logger = _interopRequireDefault(require("../../submodules/logger"));
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- class RealtimeClient extends _events.default.EventEmitter {
21
- /**
22
- * @param {Oblecto} oblecto
23
- * @param {*} socket
24
- */
25
- constructor(oblecto, socket) {
26
- super();
27
- this.clientName = 'default';
28
- this.oblecto = oblecto;
29
- this.socket = socket;
30
- this.user = null;
31
- this.storage = {
32
- series: {},
33
- movie: {}
34
- };
35
- this.socket.on('authenticate', data => this.authenticationHandler(data));
36
- this.socket.on('playing', data => this.playingHandler(data));
37
- this.socket.on('disconnect', () => this.disconnectHandler());
38
- setInterval(() => {
39
- this.saveAllTracks();
40
- }, 10000);
41
- }
42
-
43
- authenticationHandler(data) {
44
- try {
45
- this.user = _jsonwebtoken.default.verify(data.token, this.oblecto.config.authentication.secret);
46
- } catch (e) {
47
- _logger.default.log('WARN', 'An unauthorized user attempted connection to realtime server');
48
-
49
- _logger.default.log('WARN', 'Disconnecting client...');
50
-
51
- this.socket.disconnect();
52
- }
53
- }
54
-
55
- playingHandler(data) {
56
- if (this.user == null) return;
57
- if (data.type === 'tv') return this.playingEpisodeHandler(data);
58
- if (data.type === 'movie') return this.playingMovieHandler(data);
59
- }
60
-
61
- playingEpisodeHandler(data) {
62
- this.storage.series[data.episodeId] = data;
63
- }
64
-
65
- playingMovieHandler(data) {
66
- this.storage.movie[data.movieId] = data;
67
- }
68
-
69
- disconnectHandler() {
70
- this.emit('disconnect');
71
- }
72
-
73
- async saveEpisodeTrack(id) {
74
- if (this.user === null) return;
75
- let [item, created] = await _trackEpisode.TrackEpisode.findOrCreate({
76
- where: {
77
- UserId: this.user.id,
78
- EpisodeId: id
79
- },
80
- defaults: {
81
- time: this.storage.series[id].time,
82
- progress: this.storage.series[id].progress
83
- }
84
- });
85
- if (created) return;
86
- await item.update({
87
- time: this.storage.series[id].time,
88
- progress: this.storage.series[id].progress
89
- });
90
- delete this.storage.series[id];
91
- }
92
-
93
- async saveMovieTrack(id) {
94
- if (this.user == null) return;
95
- let [item, created] = await _trackMovie.TrackMovie.findOrCreate({
96
- where: {
97
- UserId: this.user.id,
98
- MovieId: id
99
- },
100
- defaults: {
101
- time: this.storage.movie[id].time,
102
- progress: this.storage.movie[id].progress
103
- }
104
- });
105
- if (created) return;
106
- await item.update({
107
- time: this.storage.movie[id].time,
108
- progress: this.storage.movie[id].progress
109
- });
110
- delete this.storage.movie[id];
111
- }
112
-
113
- async saveAllTracks() {
114
- for (let i in this.storage.series) {
115
- await this.saveEpisodeTrack(i);
116
- }
117
-
118
- for (let i in this.storage.movie) {
119
- await this.saveMovieTrack(i);
120
- }
121
- }
122
-
123
- async playEpisode(episodeId) {
124
- this.socket.emit('play', {
125
- episodeId
126
- });
127
- }
128
-
129
- async playMovie(movieId) {
130
- this.socket.emit('play', {
131
- movieId
132
- });
133
- }
134
-
135
- }
136
-
137
- exports.default = RealtimeClient;
@@ -1,50 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _socket = _interopRequireDefault(require("socket.io"));
9
-
10
- var _RealtimeClient = _interopRequireDefault(require("./RealtimeClient"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- class RealtimeController {
15
- /**
16
- *
17
- * @param {Oblecto} oblecto
18
- */
19
- constructor(oblecto) {
20
- this.oblecto = oblecto;
21
- this.clients = {};
22
- this.server = _socket.default.listen(oblecto.oblectoAPI.server.server, {
23
- log: false,
24
- agent: false,
25
- origins: '*:*',
26
- transports: ['websocket', 'polling']
27
- });
28
- this.server.on('connection', socket => {
29
- this.connectionHandler(socket);
30
- });
31
- }
32
-
33
- connectionHandler(socket) {
34
- this.clients[socket.id] = new _RealtimeClient.default(this.oblecto, socket);
35
- this.clients[socket.id].on('disconnect', () => {
36
- delete this.clients[socket.id];
37
- });
38
- }
39
-
40
- close() {
41
- for (let client of Object.keys(this.clients)) {
42
- this.clients[client].disconnect();
43
- }
44
-
45
- this.server.close();
46
- }
47
-
48
- }
49
-
50
- exports.default = RealtimeController;
@@ -1,49 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _tmdb = _interopRequireDefault(require("../../../submodules/tmdb"));
9
-
10
- var _database = _interopRequireDefault(require("../../../submodules/database"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- var _default = {
15
- GetTmdbLists: async function (movie) {
16
- let response = await _tmdb.default.movieLists({
17
- id: movie.tmdbid
18
- });
19
- },
20
-
21
- /**
22
- * @return {boolean}
23
- */
24
- GetTmdbCollection: async function (movie) {
25
- let response = await _tmdb.default.movieInfo({
26
- id: movie.tmdbid
27
- });
28
- if (!response.belongs_to_collection) return false;
29
- let collectionResponse = await _tmdb.default.collectionInfo({
30
- id: response.belongs_to_collection.id
31
- });
32
- let [Collection, Inserted] = await _database.default.movieSet.findOrCreate({
33
- where: {
34
- tmdbid: collectionResponse.id
35
- },
36
- defaults: {
37
- setName: collectionResponse.name,
38
- overview: collectionResponse.overview
39
- }
40
- });
41
- Collection.addMovie(movie);
42
- return true;
43
- },
44
- GetSetsForMovie: function (movie) {
45
- this.GetTmdbLists(movie);
46
- this.GetTmdbCollection(movie);
47
- }
48
- };
49
- exports.default = _default;
@@ -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 _events = _interopRequireDefault(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.default.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
- let codec = this.videoCodec;
124
-
125
- if (this.oblecto.config.transcoding.hardwareAcceleration) {
126
- if (this.oblecto.config.transcoding.hardwareAccelerator === 'cuda') {
127
- if (codec === 'h264') {
128
- return 'h264_nvenc';
129
- }
130
- }
131
-
132
- if (this.oblecto.config.transcoding.hardwareAccelerator === 'vaapi') {
133
- if (codec === 'h264') {
134
- return 'h264_vaapi';
135
- }
136
- }
137
- }
138
-
139
- let codecs = {
140
- 'h264': 'libx264'
141
- };
142
- if (codecs[codec]) codec = codecs[codec];
143
- return codec;
144
- }
145
-
146
- }
147
-
148
- exports.default = StreamSession;
@@ -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,105 +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
- constructor(file, options, oblecto) {
22
- super(file, options, oblecto);
23
- this.format = this.file.extension;
24
- this.videoCodec = this.file.videoCodec;
25
- this.audioCodec = this.file.audioCodec;
26
- }
27
-
28
- async addDestination(destination) {
29
- // Logically we only support http destinations
30
- // Therefore, throw an error if the type is not http
31
- if (destination.type !== 'http') {
32
- _logger.default.log('ERROR', 'DirectHttpStreamer only supports http stream types');
33
-
34
- throw new Error('HTTP Streamer only supports HTTP stream types');
35
- } // This streamer only supports a single stream destination,
36
- // so if another destination was found, destroy the output stream and remove it
37
-
38
-
39
- if (this.destinations[0]) {
40
- this.destinations[0].stream.destroy();
41
- }
42
-
43
- this.destinations[0] = destination;
44
- destination.stream.on('close', () => {
45
- this.startTimeout();
46
- });
47
- }
48
-
49
- async startStream() {
50
- await super.startStream();
51
- let req = this.destinations[0].request;
52
- let res = this.destinations[0].stream;
53
- DirectHttpStreamSession.httpStreamHandler(req, res, this.file.path);
54
- }
55
-
56
- static async httpStreamHandler(req, res, file) {
57
- let path = file;
58
- let size;
59
-
60
- if (file instanceof _file.File) {
61
- path = file.path;
62
- size = file.size;
63
- }
64
-
65
- if (!size) {
66
- size = (await _fs.promises.stat(path)).size;
67
- }
68
-
69
- let mimeType = _mimeTypes.default.lookup(path);
70
-
71
- if (req.headers.range) {
72
- // meaning client (browser) has moved the forward/back slider
73
- // which has sent this request back to this server logic ... cool
74
- let range = req.headers.range;
75
- let parts = range.replace(/bytes=/, '').split('-');
76
- let partialstart = parts[0];
77
- let partialend = parts[1];
78
- let start = parseInt(partialstart, 10);
79
- let end = partialend ? parseInt(partialend, 10) : size - 1;
80
- let chunksize = end - start + 1;
81
- let stream = (0, _fs.createReadStream)(path, {
82
- start: start,
83
- end: end
84
- });
85
- res.writeHead(206, {
86
- 'Content-Range': 'bytes ' + start + '-' + end + '/' + size,
87
- 'Accept-Ranges': 'bytes',
88
- 'Content-Length': chunksize,
89
- 'Content-Type': mimeType
90
- });
91
- stream.pipe(res);
92
- return;
93
- }
94
-
95
- res.writeHead(200, {
96
- 'Content-Length': size,
97
- 'Accept-Ranges': 'bytes',
98
- 'Content-Type': mimeType
99
- });
100
- (0, _fs.createReadStream)(path).pipe(res);
101
- }
102
-
103
- }
104
-
105
- exports.default = DirectHttpStreamSession;
@@ -1,47 +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
- }
23
-
24
- async addDestination(destination) {
25
- await super.addDestination(destination);
26
-
27
- if (destination.type === 'http') {
28
- this.destinations[0].request.writeHead(200, {
29
- 'Content-Length': this.file.size,
30
- 'Content-Type': this.mimeType
31
- });
32
- }
33
- }
34
-
35
- async startStream() {
36
- await super.startStream();
37
-
38
- try {
39
- _fs.default.createReadStream(this.file.path).pipe(this.outputStream);
40
- } catch (e) {
41
- _logger.default.log(e);
42
- }
43
- }
44
-
45
- }
46
-
47
- exports.default = DirectStreamSession;