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
package/dist/lib/queue/index.js
DELETED
|
@@ -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;
|