oblecto 0.2.8 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Oblecto-Web/dist/web/index.html +24 -3
- package/Oblecto-Web/dist/web/static/index-C-JsqHHk.css +1 -0
- package/Oblecto-Web/dist/web/static/index-DSZgpOOu.js +576 -0
- package/README.md +43 -7
- package/dist/bin/oblecto.js +12468 -61
- package/dist/index.js +10676 -6
- package/package.json +68 -36
- package/res/AGENTS.md +8 -0
- package/res/config.json +34 -7
- package/Oblecto-Web/LICENSE +0 -674
- package/Oblecto-Web/README.md +0 -20
- package/Oblecto-Web/dist/web/static/css/app.921835f8c2878caee6d1085d9982fa86.css +0 -1
- package/Oblecto-Web/dist/web/static/css/app.921835f8c2878caee6d1085d9982fa86.css.map +0 -1
- package/Oblecto-Web/dist/web/static/js/app.758b833f6395444695b6.js +0 -6896
- package/Oblecto-Web/dist/web/static/js/app.758b833f6395444695b6.js.map +0 -1
- package/Oblecto-Web/dist/web/static/js/manifest.d327d604ee57c29a75d0.js +0 -154
- package/Oblecto-Web/dist/web/static/js/manifest.d327d604ee57c29a75d0.js.map +0 -1
- package/Oblecto-Web/dist/web/static/js/vendor.84f1e8002f100f63d6ef.js +0 -32455
- package/Oblecto-Web/dist/web/static/js/vendor.84f1e8002f100f63d6ef.js.map +0 -1
- package/Oblecto-Web/package.json +0 -118
- package/dist/bin/cliManager.js +0 -102
- package/dist/bin/scripts/adduser.js +0 -50
- package/dist/bin/scripts/changepassword.js +0 -48
- package/dist/bin/scripts/deluser.js +0 -34
- package/dist/bin/scripts/helpers/argumentError.js +0 -12
- package/dist/bin/scripts/helpers/generateAssetDirectories.js +0 -37
- package/dist/bin/scripts/init/assets.js +0 -24
- package/dist/bin/scripts/init/database.js +0 -21
- package/dist/bin/scripts/init/general.js +0 -54
- package/dist/bin/scripts/init/index.js +0 -26
- package/dist/bin/scripts/removepassword.js +0 -42
- package/dist/config.js +0 -45
- package/dist/core/graphical.js +0 -179
- package/dist/core/index.js +0 -24
- package/dist/lib/artwork/ArtworkScaler.js +0 -31
- package/dist/lib/artwork/ArtworkUtils.js +0 -35
- package/dist/lib/artwork/movies/AggregateMovieArtworkRetriever.js +0 -58
- package/dist/lib/artwork/movies/MovieArtworkCollector.js +0 -93
- package/dist/lib/artwork/movies/MovieArtworkDownloader.js +0 -65
- package/dist/lib/artwork/movies/artworkRetrievers/FanarttvMovieArtworkRetriever.js +0 -57
- package/dist/lib/artwork/movies/artworkRetrievers/TmdbMovieArtworkRetriever.js +0 -47
- package/dist/lib/artwork/series/AggregateSeriesArtworkRetriever.js +0 -58
- package/dist/lib/artwork/series/SeriesArtworkCollector.js +0 -95
- package/dist/lib/artwork/series/SeriesArtworkDownloader.js +0 -62
- package/dist/lib/artwork/series/artworkRetrievers/FanarttvSeriesArtworkRetriever.js +0 -44
- package/dist/lib/artwork/series/artworkRetrievers/TmdbSeriesArtworkRetriever.js +0 -64
- package/dist/lib/artwork/series/artworkRetrievers/TvdbSeriesArtworkRetriever.js +0 -51
- package/dist/lib/cleaners/FileCleaner.js +0 -56
- package/dist/lib/cleaners/MovieCleaner.js +0 -42
- package/dist/lib/cleaners/SeriesCleaner.js +0 -70
- package/dist/lib/common/AggregateIdentifier.js +0 -53
- package/dist/lib/common/AggregateUpdateRetriever.js +0 -43
- package/dist/lib/downloader/index.js +0 -59
- package/dist/lib/errors/DebugExtendableError.js +0 -20
- package/dist/lib/errors/ExtendableError.js +0 -22
- package/dist/lib/errors/FileExistsError.js +0 -14
- package/dist/lib/errors/IdentificationError.js +0 -14
- package/dist/lib/errors/InfoExtendableError.js +0 -20
- package/dist/lib/errors/VideoAnalysisError.js +0 -14
- package/dist/lib/errors/VideoIdentificationError.js +0 -14
- package/dist/lib/errors/WarnExtendableError.js +0 -20
- package/dist/lib/federation/client/FederationClient.js +0 -127
- package/dist/lib/federation/client/FederationClientController.js +0 -45
- package/dist/lib/federation/client/FederationDataClient.js +0 -56
- package/dist/lib/federation/client/FederationMediaClient.js +0 -70
- package/dist/lib/federation/server/FederationController.js +0 -32
- package/dist/lib/federation/server/FederationDataServer.js +0 -22
- package/dist/lib/federation/server/FederationDataServerConnection.js +0 -96
- package/dist/lib/federation/server/FederationMediaServer.js +0 -22
- package/dist/lib/federation/server/FederationMediaServerConnection.js +0 -83
- package/dist/lib/federation/server/FederationServer.js +0 -40
- package/dist/lib/federation/server/FederationServerConnection.js +0 -97
- package/dist/lib/federationindexer/FederationEpisodeIndexer.js +0 -65
- package/dist/lib/federationindexer/FederationMovieIndexer.js +0 -48
- package/dist/lib/indexers/MediaIdentifier.js +0 -15
- package/dist/lib/indexers/files/FileIndexer.js +0 -103
- package/dist/lib/indexers/files/cleaner.js +0 -43
- package/dist/lib/indexers/movies/AggregateMovieIdentifier.js +0 -45
- package/dist/lib/indexers/movies/MovieCollector.js +0 -65
- package/dist/lib/indexers/movies/MovieIdentifier.js +0 -22
- package/dist/lib/indexers/movies/MovieIndexer.js +0 -47
- package/dist/lib/indexers/movies/identifiers/TmdbMovieidentifier.js +0 -50
- package/dist/lib/indexers/series/AggregateEpisodeIdentifier.js +0 -46
- package/dist/lib/indexers/series/AggregateSeriesIdentifier.js +0 -46
- package/dist/lib/indexers/series/EpisodeIdentifier.js +0 -24
- package/dist/lib/indexers/series/SeriesCollector.js +0 -65
- package/dist/lib/indexers/series/SeriesIdentifer.js +0 -23
- package/dist/lib/indexers/series/SeriesIndexer.js +0 -134
- package/dist/lib/indexers/series/identifiers/TmdbEpisodeIdentifier.js +0 -38
- package/dist/lib/indexers/series/identifiers/TmdbSeriesIdentifier.js +0 -66
- package/dist/lib/indexers/series/identifiers/TvdbEpisodeIdentifier.js +0 -71
- package/dist/lib/indexers/series/identifiers/TvdbSeriesIdentifier.js +0 -82
- package/dist/lib/oblecto/index.js +0 -125
- package/dist/lib/queue/index.js +0 -82
- package/dist/lib/realtime/RealtimeClient.js +0 -137
- package/dist/lib/realtime/RealtimeController.js +0 -50
- package/dist/lib/sets/tv/MovieSetCollector.js +0 -49
- package/dist/lib/streamSessions/StreamSession.js +0 -148
- package/dist/lib/streamSessions/StreamSessionController.js +0 -78
- package/dist/lib/streamSessions/StreamSessionTypes/DirectHttpStreamSession.js +0 -105
- package/dist/lib/streamSessions/StreamSessionTypes/DirectStreamSession.js +0 -47
- package/dist/lib/streamSessions/StreamSessionTypes/HLSStreamer.js +0 -126
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeFederationStreamSession.js +0 -72
- package/dist/lib/streamSessions/StreamSessionTypes/RecodeStreamSession.js +0 -65
- package/dist/lib/updaters/files/FileUpdateCollector.js +0 -44
- package/dist/lib/updaters/files/FileUpdater.js +0 -194
- package/dist/lib/updaters/movies/AggregateMovieUpdateRetriever.js +0 -44
- package/dist/lib/updaters/movies/MovieUpdateCollector.js +0 -48
- package/dist/lib/updaters/movies/MovieUpdater.js +0 -38
- package/dist/lib/updaters/movies/informationRetrievers/TmdbMovieRetriever.js +0 -42
- package/dist/lib/updaters/series/AggregateEpisodeUpdateRetriever.js +0 -41
- package/dist/lib/updaters/series/AggregateSeriesUpdateRetriever.js +0 -44
- package/dist/lib/updaters/series/SeriesUpdateCollector.js +0 -79
- package/dist/lib/updaters/series/SeriesUpdater.js +0 -84
- package/dist/lib/updaters/series/informationRetrievers/TmdbEpisodeRetriever.js +0 -66
- package/dist/lib/updaters/series/informationRetrievers/TmdbSeriesRetriever.js +0 -63
- package/dist/lib/updaters/series/informationRetrievers/TvdbEpisodeRetriever.js +0 -38
- package/dist/lib/updaters/series/informationRetrievers/TvdbSeriesRetriever.js +0 -50
- package/dist/models/episode.js +0 -62
- package/dist/models/episodeFiles.js +0 -14
- package/dist/models/file.js +0 -32
- package/dist/models/movie.js +0 -35
- package/dist/models/movieFiles.js +0 -14
- package/dist/models/movieSet.js +0 -26
- package/dist/models/series.js +0 -55
- package/dist/models/seriesSet.js +0 -17
- package/dist/models/stream.js +0 -81
- package/dist/models/trackEpisode.js +0 -17
- package/dist/models/trackEpisodes.js +0 -8
- package/dist/models/trackMovie.js +0 -17
- package/dist/models/trackMovies.js +0 -8
- package/dist/models/tvshow.js +0 -46
- package/dist/models/tvshowSet.js +0 -8
- package/dist/models/user.js +0 -26
- package/dist/submodules/REST/index.js +0 -59
- package/dist/submodules/REST/middleware/auth.js +0 -28
- package/dist/submodules/REST/routes/auth.js +0 -48
- package/dist/submodules/REST/routes/clients.js +0 -54
- package/dist/submodules/REST/routes/episodes.js +0 -275
- package/dist/submodules/REST/routes/files.js +0 -92
- package/dist/submodules/REST/routes/index.js +0 -48
- package/dist/submodules/REST/routes/movies.js +0 -305
- package/dist/submodules/REST/routes/sets.js +0 -35
- package/dist/submodules/REST/routes/settings/index.js +0 -22
- package/dist/submodules/REST/routes/settings/maintenance.js +0 -87
- package/dist/submodules/REST/routes/settings/misc.js +0 -38
- package/dist/submodules/REST/routes/settings/sources.js +0 -61
- package/dist/submodules/REST/routes/tvshows.js +0 -140
- package/dist/submodules/REST/routes/users.js +0 -107
- package/dist/submodules/REST/routes/web.js +0 -43
- package/dist/submodules/axiosTimeout.js +0 -30
- package/dist/submodules/database.js +0 -180
- package/dist/submodules/ffmpeg.js +0 -23
- package/dist/submodules/ffprobe.js +0 -22
- package/dist/submodules/guessit.js +0 -48
- package/dist/submodules/handlers/DirectStreamer.js +0 -68
- package/dist/submodules/handlers/FFMPEGHandlers/DvdStreamer.js +0 -52
- package/dist/submodules/handlers/FFMPEGHandlers/RemuxStreamer.js +0 -33
- package/dist/submodules/handlers/FFMPEGHandlers/TranscodeStreamer.js +0 -33
- package/dist/submodules/handlers/FFMPEGStreamer.js +0 -56
- package/dist/submodules/handlers/FederationStreamer.js +0 -23
- package/dist/submodules/handlers/HLSSessionHandler.js +0 -141
- package/dist/submodules/logger/index.js +0 -43
- package/dist/submodules/promiseTimeout.js +0 -28
- package/dist/submodules/zeroconf.js +0 -19
- package/dist/transcoders/dvd.js +0 -26
- package/dist/transcoders/index.js +0 -42
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _DebugExtendableError = _interopRequireDefault(require("./DebugExtendableError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class FileExistsError extends _DebugExtendableError.default {}
|
|
13
|
-
|
|
14
|
-
exports.default = FileExistsError;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _InfoExtendableError = _interopRequireDefault(require("./InfoExtendableError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class IdentificationError extends _InfoExtendableError.default {}
|
|
13
|
-
|
|
14
|
-
exports.default = IdentificationError;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _ExtendableError = _interopRequireDefault(require("./ExtendableError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class InfoExtendableError extends _ExtendableError.default {
|
|
13
|
-
constructor(message) {
|
|
14
|
-
super(message);
|
|
15
|
-
this.level = 'INFO';
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
exports.default = InfoExtendableError;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _WarnExtendableError = _interopRequireDefault(require("./WarnExtendableError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class VideoAnalysisError extends _WarnExtendableError.default {}
|
|
13
|
-
|
|
14
|
-
exports.default = VideoAnalysisError;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _ExtendableError = _interopRequireDefault(require("./ExtendableError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class VideoIdentificationError extends _ExtendableError.default {}
|
|
13
|
-
|
|
14
|
-
exports.default = VideoIdentificationError;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _ExtendableError = _interopRequireDefault(require("./ExtendableError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class WarnExtendableError extends _ExtendableError.default {
|
|
13
|
-
constructor(message) {
|
|
14
|
-
super(message);
|
|
15
|
-
this.level = 'WARN';
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
exports.default = WarnExtendableError;
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _tls = _interopRequireDefault(require("tls"));
|
|
9
|
-
|
|
10
|
-
var _fs = require("fs");
|
|
11
|
-
|
|
12
|
-
var _nodeRsa = _interopRequireDefault(require("node-rsa"));
|
|
13
|
-
|
|
14
|
-
var _events = _interopRequireDefault(require("events"));
|
|
15
|
-
|
|
16
|
-
var _logger = _interopRequireDefault(require("../../../submodules/logger"));
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
class FederationClient {
|
|
21
|
-
/**
|
|
22
|
-
*
|
|
23
|
-
* @param {Oblecto} oblecto
|
|
24
|
-
* @param {string} server
|
|
25
|
-
*/
|
|
26
|
-
constructor(oblecto, server) {
|
|
27
|
-
this.oblecto = oblecto;
|
|
28
|
-
this.serverName = server;
|
|
29
|
-
this.host = oblecto.config.federation.servers[server].address;
|
|
30
|
-
this.port = 9131;
|
|
31
|
-
this.isSecure = false;
|
|
32
|
-
this.authenticated = false;
|
|
33
|
-
this.eventEmitter = new _events.default();
|
|
34
|
-
this.dataRead = '';
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async connect() {
|
|
38
|
-
_logger.default.log('INFO', 'Connecting to federation master:', this.serverName);
|
|
39
|
-
|
|
40
|
-
this.socket = _tls.default.connect({
|
|
41
|
-
host: this.host,
|
|
42
|
-
port: this.port,
|
|
43
|
-
ca: [(0, _fs.readFileSync)(this.oblecto.config.federation.servers[this.serverName].ca)]
|
|
44
|
-
});
|
|
45
|
-
this.socket.on('data', chunk => this.dataHandler(chunk));
|
|
46
|
-
this.socket.on('secureConnect', () => this.secureConnectHandler());
|
|
47
|
-
this.socket.on('error', error => this.errorHandler(error));
|
|
48
|
-
this.socket.on('close', () => this.closeHandler());
|
|
49
|
-
if (!this.isSecure) await this.waitForSecure();
|
|
50
|
-
this.socket.write(`IAM:${this.oblecto.config.federation.uuid}\n`);
|
|
51
|
-
await this.waitForAuth();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
write(header, content) {
|
|
55
|
-
this.socket.write(`${header}:${content}\n`);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
dataHandler(chunk) {
|
|
59
|
-
this.dataRead += chunk.toString();
|
|
60
|
-
let split = this.dataRead.split('\n');
|
|
61
|
-
if (split.length < 2) return;
|
|
62
|
-
|
|
63
|
-
for (let item of split) {
|
|
64
|
-
if (item === '') continue;
|
|
65
|
-
this.dataRead = this.dataRead.replace(item + '\n', '');
|
|
66
|
-
this.headerHandler(item);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
headerHandler(data) {
|
|
71
|
-
let split = data.split(':');
|
|
72
|
-
|
|
73
|
-
switch (split[0]) {
|
|
74
|
-
case 'CHALLENGE':
|
|
75
|
-
this.challengeHandler(split[1]);
|
|
76
|
-
break;
|
|
77
|
-
|
|
78
|
-
case 'AUTH':
|
|
79
|
-
this.authAcceptHandler(split[1]);
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async challengeHandler(data) {
|
|
85
|
-
const pemKey = await _fs.promises.readFile(this.oblecto.config.federation.key);
|
|
86
|
-
const key = (0, _nodeRsa.default)(pemKey);
|
|
87
|
-
const decrypted = key.decrypt(data, 'ascii');
|
|
88
|
-
this.write('CHALLENGE', decrypted);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async authAcceptHandler(data) {
|
|
92
|
-
if (data === 'ACCEPTED') {
|
|
93
|
-
this.authenticated = true;
|
|
94
|
-
this.eventEmitter.emit('auth');
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
delete this;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
secureConnectHandler() {
|
|
102
|
-
this.isSecure = true;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
errorHandler(error) {}
|
|
106
|
-
|
|
107
|
-
closeHandler() {}
|
|
108
|
-
|
|
109
|
-
waitForSecure() {
|
|
110
|
-
return new Promise((resolve, reject) => {
|
|
111
|
-
this.socket.once('secureConnect', resolve);
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
waitForAuth() {
|
|
116
|
-
return new Promise((resolve, reject) => {
|
|
117
|
-
this.eventEmitter.once('auth', resolve);
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
close() {
|
|
122
|
-
this.socket.destroy();
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
exports.default = FederationClient;
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationDataClient = _interopRequireDefault(require("./FederationDataClient"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class FederationClientController {
|
|
13
|
-
constructor(oblecto) {
|
|
14
|
-
this.oblecto = oblecto;
|
|
15
|
-
this.syncServers = [];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async addAllSyncMasters() {
|
|
19
|
-
for (let server in this.oblecto.config.federation.servers) {
|
|
20
|
-
await this.addSyncMaster(server);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async addSyncMaster(server) {
|
|
25
|
-
let client = new _FederationDataClient.default(this.oblecto, server);
|
|
26
|
-
await client.connect();
|
|
27
|
-
await client.requestFullSync();
|
|
28
|
-
this.syncServers.push(client);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
requestFullSync() {
|
|
32
|
-
for (let server of this.syncServers) {
|
|
33
|
-
server.requestFullSync();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
close() {
|
|
38
|
-
for (let server of this.syncServers) {
|
|
39
|
-
server.close();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
exports.default = FederationClientController;
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationClient = _interopRequireDefault(require("./FederationClient"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class FederationDataClient extends _FederationClient.default {
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
* @param {Oblecto} oblecto
|
|
16
|
-
* @param {string} server
|
|
17
|
-
*/
|
|
18
|
-
constructor(oblecto, server) {
|
|
19
|
-
super(oblecto, server);
|
|
20
|
-
this.port = oblecto.config.federation.servers[server].dataPort;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
headerHandler(data) {
|
|
24
|
-
super.headerHandler(data);
|
|
25
|
-
let split = data.split(':');
|
|
26
|
-
|
|
27
|
-
switch (split[0]) {
|
|
28
|
-
case 'FILE':
|
|
29
|
-
this.fileHandler(split[1]);
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
requestFullSync() {
|
|
35
|
-
this.write('SYNC', 'FULL');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async fileHandler(data) {
|
|
39
|
-
let input = Buffer.from(data, 'base64').toString();
|
|
40
|
-
let file = JSON.parse(input);
|
|
41
|
-
file.host = this.serverName;
|
|
42
|
-
|
|
43
|
-
switch (file.fileInfo.type) {
|
|
44
|
-
case 'episode':
|
|
45
|
-
this.oblecto.queue.queueJob('federationIndexEpisode', file);
|
|
46
|
-
break;
|
|
47
|
-
|
|
48
|
-
case 'movie':
|
|
49
|
-
this.oblecto.queue.queueJob('federationIndexMovie', file);
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
exports.default = FederationDataClient;
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationClient = _interopRequireDefault(require("./FederationClient"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class FederationMediaClient extends _FederationClient.default {
|
|
13
|
-
constructor(oblecto, server) {
|
|
14
|
-
super(oblecto, server);
|
|
15
|
-
this.port = oblecto.config.federation.servers[server].mediaPort;
|
|
16
|
-
this.fileId = null;
|
|
17
|
-
this.streamDestination = null;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
headerHandler(data) {
|
|
21
|
-
super.headerHandler(data);
|
|
22
|
-
let split = data.split(':');
|
|
23
|
-
|
|
24
|
-
switch (split[0]) {
|
|
25
|
-
case 'READY':
|
|
26
|
-
this.readyHandler(split[1]);
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async startStreamFile(fileId) {
|
|
32
|
-
this.fileId = fileId;
|
|
33
|
-
this.socket.write(`FILEID:${fileId}\n`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async setStreamDestination(dest) {
|
|
37
|
-
this.streamDestination = dest;
|
|
38
|
-
dest.on('close', () => {
|
|
39
|
-
this.socket.destroy();
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async readyHandler(data) {
|
|
44
|
-
if (data !== this.fileId) {
|
|
45
|
-
// The server didn't respect the file id
|
|
46
|
-
// This really shouldn't happen so we destroy the client
|
|
47
|
-
this.socket.destroy();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
this.socket.pipe(this.streamDestination);
|
|
51
|
-
this.startStream();
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async startStream() {
|
|
55
|
-
if (!this.streamDestination) throw new Error('No destination');
|
|
56
|
-
this.socket.write('START:START\n');
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async setStreamOffset(offset) {
|
|
60
|
-
this.socket.write(`OFFSET:${offset}\n`);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async closeConnection() {
|
|
64
|
-
this.socket.destroy();
|
|
65
|
-
delete this;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
exports.default = FederationMediaClient;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationMediaServer = _interopRequireDefault(require("./FederationMediaServer"));
|
|
9
|
-
|
|
10
|
-
var _FederationDataServer = _interopRequireDefault(require("./FederationDataServer"));
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
class FederationController {
|
|
15
|
-
constructor(oblecto) {
|
|
16
|
-
this.oblecto = oblecto;
|
|
17
|
-
this.initiateFederation();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
initiateFederation() {
|
|
21
|
-
this.federationMediaServer = new _FederationMediaServer.default(this.oblecto, this.oblecto.config.federation.mediaPort);
|
|
22
|
-
this.federationDataServer = new _FederationDataServer.default(this.oblecto, this.oblecto.config.federation.dataPort);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
close() {
|
|
26
|
-
this.federationDataServer.close();
|
|
27
|
-
this.federationMediaServer.close();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
exports.default = FederationController;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationServer = _interopRequireDefault(require("./FederationServer"));
|
|
9
|
-
|
|
10
|
-
var _FederationDataServerConnection = _interopRequireDefault(require("./FederationDataServerConnection"));
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
class FederationMediaServer extends _FederationServer.default {
|
|
15
|
-
secureConnectionHandler(socket) {
|
|
16
|
-
super.secureConnectionHandler(socket);
|
|
17
|
-
let connection = new _FederationDataServerConnection.default(this.oblecto, socket);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
exports.default = FederationMediaServer;
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationServerConnection = _interopRequireDefault(require("./FederationServerConnection"));
|
|
9
|
-
|
|
10
|
-
var _file = require("../../../models/file");
|
|
11
|
-
|
|
12
|
-
var _movie = require("../../../models/movie");
|
|
13
|
-
|
|
14
|
-
var _episode = require("../../../models/episode");
|
|
15
|
-
|
|
16
|
-
var _series = require("../../../models/series");
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
class FederationDataServerConnection extends _FederationServerConnection.default {
|
|
21
|
-
constructor(oblecto, socket) {
|
|
22
|
-
super(oblecto, socket);
|
|
23
|
-
this.fullSyncPermitted = true;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async headerHandler(data) {
|
|
27
|
-
super.headerHandler(data);
|
|
28
|
-
if (!this.authenticated) return;
|
|
29
|
-
let split = data.split(':');
|
|
30
|
-
|
|
31
|
-
switch (split[0]) {
|
|
32
|
-
case 'SYNC':
|
|
33
|
-
this.syncHandler(split[1]);
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
syncHandler(data) {
|
|
39
|
-
if (data === 'FULL') {
|
|
40
|
-
if (!this.fullSyncPermitted) return false;
|
|
41
|
-
return this.startFullSync();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async startFullSync() {
|
|
46
|
-
await this.syncFiles();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async syncFiles() {
|
|
50
|
-
let results = await _file.File.findAll({
|
|
51
|
-
include: [_movie.Movie, {
|
|
52
|
-
model: _episode.Episode,
|
|
53
|
-
include: [_series.Series]
|
|
54
|
-
}]
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
for (let result of results) {
|
|
58
|
-
if (this.socket.destroyed) return;
|
|
59
|
-
let file = result.toJSON();
|
|
60
|
-
let fileInfo = {};
|
|
61
|
-
|
|
62
|
-
if (file.Episodes[0]) {
|
|
63
|
-
fileInfo.type = 'episode';
|
|
64
|
-
fileInfo.episode = file.Episodes[0].airedEpisodeNumber;
|
|
65
|
-
fileInfo.season = file.Episodes[0].airedSeason;
|
|
66
|
-
if (file.Episodes[0].tvdbid) fileInfo.tvdbid = file.Episodes[0].tvdbid;
|
|
67
|
-
if (file.Episodes[0].tmdbid) fileInfo.tmdbid = file.Episodes[0].tmdbid;
|
|
68
|
-
if (file.Episodes[0].Series.tvdbid) fileInfo.seriesTvdbid = file.Episodes[0].Series.tvdbid;
|
|
69
|
-
if (file.Episodes[0].Series.tmdbid) fileInfo.seriesTmdbid = file.Episodes[0].Series.tmdbid;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (file.Movies[0]) {
|
|
73
|
-
fileInfo.type = 'movie';
|
|
74
|
-
fileInfo.tmdbid = file.Movies[0].tmdbid;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
let syncInfo = {
|
|
78
|
-
id: file.id,
|
|
79
|
-
duration: file.duration,
|
|
80
|
-
fileInfo
|
|
81
|
-
};
|
|
82
|
-
this.write('FILE', Buffer.from(JSON.stringify(syncInfo)).toString('base64')); // TODO: Negotiate a syncing speed
|
|
83
|
-
|
|
84
|
-
await sleep(100);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
exports.default = FederationDataServerConnection;
|
|
91
|
-
|
|
92
|
-
function sleep(ms) {
|
|
93
|
-
return new Promise(resolve => {
|
|
94
|
-
setTimeout(resolve, ms);
|
|
95
|
-
});
|
|
96
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationServer = _interopRequireDefault(require("./FederationServer"));
|
|
9
|
-
|
|
10
|
-
var _FederationMediaServerConnection = _interopRequireDefault(require("./FederationMediaServerConnection"));
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
class FederationMediaServer extends _FederationServer.default {
|
|
15
|
-
secureConnectionHandler(socket) {
|
|
16
|
-
super.secureConnectionHandler(socket);
|
|
17
|
-
let connection = new _FederationMediaServerConnection.default(this.oblecto, socket);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
exports.default = FederationMediaServer;
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _FederationServerConnection = _interopRequireDefault(require("./FederationServerConnection"));
|
|
9
|
-
|
|
10
|
-
var _file = require("../../../models/file");
|
|
11
|
-
|
|
12
|
-
var _logger = _interopRequireDefault(require("../../../submodules/logger"));
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
|
-
class FederationMediaServerConnection extends _FederationServerConnection.default {
|
|
17
|
-
constructor(oblecto, socket) {
|
|
18
|
-
super(oblecto, socket);
|
|
19
|
-
this.fileId = null;
|
|
20
|
-
this.fileInfo = null;
|
|
21
|
-
this.offset = 0;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async headerHandler(data) {
|
|
25
|
-
super.headerHandler(data);
|
|
26
|
-
if (!this.authenticated) return;
|
|
27
|
-
let split = data.split(':');
|
|
28
|
-
|
|
29
|
-
switch (split[0]) {
|
|
30
|
-
case 'FILEID':
|
|
31
|
-
await this.setFileId(split[1]);
|
|
32
|
-
break;
|
|
33
|
-
|
|
34
|
-
case 'OFFSET':
|
|
35
|
-
this.setOffset(split[1]);
|
|
36
|
-
break;
|
|
37
|
-
|
|
38
|
-
case 'START':
|
|
39
|
-
await this.startStream();
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
setOffset(offset) {
|
|
45
|
-
this.offset = offset;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async setFileId(data) {
|
|
49
|
-
this.fileId = data;
|
|
50
|
-
this.fileInfo = null;
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
this.fileInfo = await _file.File.findByPk(this.fileId);
|
|
54
|
-
this.socket.write(`READY:${this.fileId}\n`);
|
|
55
|
-
} catch (e) {
|
|
56
|
-
this.socket.write('ERROR:FILEID\n');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async startStream() {
|
|
61
|
-
if (!this.fileInfo) return;
|
|
62
|
-
let streamSession = this.oblecto.streamSessionController.newSession(this.fileInfo, {
|
|
63
|
-
streamType: 'recode',
|
|
64
|
-
target: {
|
|
65
|
-
formats: ['matroska'],
|
|
66
|
-
videoCodecs: ['copy'],
|
|
67
|
-
audioCodecs: ['copy']
|
|
68
|
-
},
|
|
69
|
-
offset: this.offset
|
|
70
|
-
});
|
|
71
|
-
await streamSession.addDestination({
|
|
72
|
-
stream: this.socket
|
|
73
|
-
});
|
|
74
|
-
await streamSession.startStream();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async closeHandler() {
|
|
78
|
-
_logger.default.log('INFO', 'Federation media stream has closed');
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
exports.default = FederationMediaServerConnection;
|