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,40 +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 = _interopRequireDefault(require("fs"));
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
class FederationServer {
|
|
15
|
-
constructor(oblecto, port) {
|
|
16
|
-
this.oblecto = oblecto;
|
|
17
|
-
let options = {
|
|
18
|
-
key: _fs.default.readFileSync(this.oblecto.config.federation.key),
|
|
19
|
-
cert: _fs.default.readFileSync('/etc/oblecto/keys/public-cert.pem')
|
|
20
|
-
};
|
|
21
|
-
this.server = _tls.default.createServer(options, socket => {});
|
|
22
|
-
this.server.listen(port);
|
|
23
|
-
this.server.on('error', err => this.errorHandler(err));
|
|
24
|
-
this.server.on('connection', socket => this.connectionHandler(socket));
|
|
25
|
-
this.server.on('secureConnection', socket => this.secureConnectionHandler(socket));
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
errorHandler(error) {}
|
|
29
|
-
|
|
30
|
-
connectionHandler(socket) {}
|
|
31
|
-
|
|
32
|
-
secureConnectionHandler(socket) {}
|
|
33
|
-
|
|
34
|
-
close() {
|
|
35
|
-
this.server.close();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
exports.default = FederationServer;
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _nodeRsa = _interopRequireDefault(require("node-rsa"));
|
|
9
|
-
|
|
10
|
-
var _fs = require("fs");
|
|
11
|
-
|
|
12
|
-
var _uuid = require("uuid");
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
|
-
class FederationServerConnection {
|
|
17
|
-
constructor(oblecto, socket) {
|
|
18
|
-
this.oblecto = oblecto;
|
|
19
|
-
this.socket = socket;
|
|
20
|
-
this.socket.on('data', chunk => this.dataHandler(chunk));
|
|
21
|
-
this.socket.on('close', () => this.closeHandler());
|
|
22
|
-
this.socket.on('error', error => this.errorHandler(error));
|
|
23
|
-
this.dataRead = '';
|
|
24
|
-
this.clientId = '';
|
|
25
|
-
this.authenticated = false;
|
|
26
|
-
this.challenge = (0, _uuid.v4)();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
dataHandler(chunk) {
|
|
30
|
-
this.dataRead += chunk.toString();
|
|
31
|
-
let split = this.dataRead.split('\n');
|
|
32
|
-
if (split.length < 2) return;
|
|
33
|
-
|
|
34
|
-
for (let item of split) {
|
|
35
|
-
if (item === '') continue;
|
|
36
|
-
this.dataRead = this.dataRead.replace(item + '\n', '');
|
|
37
|
-
this.headerHandler(item);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
headerHandler(data) {
|
|
42
|
-
let split = data.split(':');
|
|
43
|
-
|
|
44
|
-
switch (split[0]) {
|
|
45
|
-
case 'IAM':
|
|
46
|
-
this.clientIdHandler(split[1]);
|
|
47
|
-
break;
|
|
48
|
-
|
|
49
|
-
case 'CHALLENGE':
|
|
50
|
-
this.authHandler(split[1]);
|
|
51
|
-
break;
|
|
52
|
-
|
|
53
|
-
default:
|
|
54
|
-
if (!this.authenticated) {
|
|
55
|
-
this.socket.destroy();
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async clientIdHandler(clientId) {
|
|
63
|
-
this.clientId = clientId; // Check if the client server is known
|
|
64
|
-
// If an unknown client is trying to connect, we should just ignore it
|
|
65
|
-
|
|
66
|
-
if (!this.oblecto.config.federation.clients[clientId]) return;
|
|
67
|
-
let key = await _fs.promises.readFile(this.oblecto.config.federation.clients[clientId].key);
|
|
68
|
-
this.key = (0, _nodeRsa.default)(key);
|
|
69
|
-
this.write('CHALLENGE', this.key.encrypt(this.challenge, 'base64'));
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
authHandler(data) {
|
|
73
|
-
if (data === this.challenge) {
|
|
74
|
-
this.authenticated = true;
|
|
75
|
-
this.write('AUTH', 'ACCEPTED');
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
this.write('AUTH', 'DENIED');
|
|
80
|
-
this.socket.destroy();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
closeHandler() {}
|
|
84
|
-
|
|
85
|
-
errorHandler(error) {}
|
|
86
|
-
|
|
87
|
-
write(header, content) {
|
|
88
|
-
this.socket.write(`${header}:${content}\n`);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
close() {
|
|
92
|
-
this.socket.close();
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
exports.default = FederationServerConnection;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _series = require("../../models/series");
|
|
9
|
-
|
|
10
|
-
var _episode = require("../../models/episode");
|
|
11
|
-
|
|
12
|
-
var _file = require("../../models/file");
|
|
13
|
-
|
|
14
|
-
class FederationEpisodeIndexer {
|
|
15
|
-
constructor(oblecto) {
|
|
16
|
-
this.oblecto = oblecto; // Register task availability to Oblecto queue
|
|
17
|
-
|
|
18
|
-
this.oblecto.queue.addJob('federationIndexEpisode', async job => {
|
|
19
|
-
await this.indexEpisode(job);
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async indexEpisode(file) {
|
|
24
|
-
let [fileEntity, fileInserted] = await _file.File.findOrCreate({
|
|
25
|
-
where: {
|
|
26
|
-
host: file.host,
|
|
27
|
-
path: file.id
|
|
28
|
-
},
|
|
29
|
-
defaults: {
|
|
30
|
-
name: '',
|
|
31
|
-
directory: '',
|
|
32
|
-
extension: '',
|
|
33
|
-
duration: file.duration
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
let seriesQuery = {};
|
|
37
|
-
if (file.fileInfo.seriesTvdbid) seriesQuery.tvdbid = file.fileInfo.seriesTvdbid;
|
|
38
|
-
if (file.fileInfo.seriesTmdbid) seriesQuery.tmdbid = file.fileInfo.seriesTmdbid;
|
|
39
|
-
let [series, seriesInserted] = await _series.Series.findOrCreate({
|
|
40
|
-
where: seriesQuery
|
|
41
|
-
});
|
|
42
|
-
let episodeQuery = {
|
|
43
|
-
SeriesId: series.id
|
|
44
|
-
};
|
|
45
|
-
if (file.fileInfo.tvdbid) episodeQuery.tvdbid = file.fileInfo.tvdbid;
|
|
46
|
-
if (file.fileInfo.tmdbid) episodeQuery.tmdbid = file.fileInfo.tmdbid;
|
|
47
|
-
let [episode, episodeInserted] = await _episode.Episode.findOrCreate({
|
|
48
|
-
where: episodeQuery,
|
|
49
|
-
defaults: {
|
|
50
|
-
airedEpisodeNumber: file.fileInfo.episode,
|
|
51
|
-
airedSeason: file.fileInfo.season
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
if (!episodeInserted) return;
|
|
55
|
-
await episode.addFile(fileEntity);
|
|
56
|
-
await this.oblecto.seriesUpdateCollector.collectEpisode(episode);
|
|
57
|
-
await this.oblecto.seriesArtworkCollector.collectArtworkEpisodeBanner(episode);
|
|
58
|
-
if (!seriesInserted) return;
|
|
59
|
-
await this.oblecto.seriesUpdateCollector.collectSeries(series);
|
|
60
|
-
await this.oblecto.seriesArtworkCollector.collectArtworkSeriesPoster(series);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
exports.default = FederationEpisodeIndexer;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _file = require("../../models/file");
|
|
9
|
-
|
|
10
|
-
var _movie = require("../../models/movie");
|
|
11
|
-
|
|
12
|
-
class FederationMovieIndexer {
|
|
13
|
-
constructor(oblecto) {
|
|
14
|
-
this.oblecto = oblecto; // Register task availability to Oblecto queue
|
|
15
|
-
|
|
16
|
-
this.oblecto.queue.addJob('federationIndexMovie', async job => {
|
|
17
|
-
await this.indexMovie(job);
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async indexMovie(file) {
|
|
22
|
-
let [fileEntity, fileInserted] = await _file.File.findOrCreate({
|
|
23
|
-
where: {
|
|
24
|
-
host: file.host,
|
|
25
|
-
path: file.id
|
|
26
|
-
},
|
|
27
|
-
defaults: {
|
|
28
|
-
name: '',
|
|
29
|
-
directory: '',
|
|
30
|
-
extension: '',
|
|
31
|
-
duration: file.duration
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
let [movie, movieInserted] = await _movie.Movie.findOrCreate({
|
|
35
|
-
where: {
|
|
36
|
-
tmdbid: file.fileInfo.tmdbid
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
await movie.addFile(fileEntity);
|
|
40
|
-
if (!movieInserted) return;
|
|
41
|
-
await this.oblecto.movieUpdateCollector.collectMovie(movie);
|
|
42
|
-
await this.oblecto.movieArtworkCollector.collectArtworkMovieFanart(movie);
|
|
43
|
-
await this.oblecto.movieArtworkCollector.collectArtworkMoviePoster(movie);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
exports.default = FederationMovieIndexer;
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _file = require("../../../models/file");
|
|
9
|
-
|
|
10
|
-
var _path = _interopRequireDefault(require("path"));
|
|
11
|
-
|
|
12
|
-
var _FileExistsError = _interopRequireDefault(require("../../errors/FileExistsError"));
|
|
13
|
-
|
|
14
|
-
var _ffprobe = _interopRequireDefault(require("../../../submodules/ffprobe"));
|
|
15
|
-
|
|
16
|
-
var _stream = require("../../../models/stream");
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
class FileIndexer {
|
|
21
|
-
/**
|
|
22
|
-
* @param {Oblecto} oblecto
|
|
23
|
-
*/
|
|
24
|
-
constructor(oblecto) {
|
|
25
|
-
this.oblecto = oblecto;
|
|
26
|
-
this.oblecto.queue.addJob('indexFileStreams', this.indexVideoFileStreams);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async indexVideoFile(videoPath) {
|
|
30
|
-
let parsedPath = _path.default.parse(videoPath);
|
|
31
|
-
|
|
32
|
-
let [file, fileInserted] = await _file.File.findOrCreate({
|
|
33
|
-
where: {
|
|
34
|
-
path: videoPath
|
|
35
|
-
},
|
|
36
|
-
defaults: {
|
|
37
|
-
host: 'local',
|
|
38
|
-
name: parsedPath.name,
|
|
39
|
-
directory: parsedPath.dir,
|
|
40
|
-
extension: parsedPath.ext.replace('.', '')
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
if (!fileInserted) {
|
|
45
|
-
throw new _FileExistsError.default(`${videoPath} is already in the file database`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
await this.oblecto.fileUpdateCollector.collectFile(file);
|
|
49
|
-
return file;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async indexVideoFileStreams(file) {
|
|
53
|
-
let metadata = await (0, _ffprobe.default)(file.path);
|
|
54
|
-
|
|
55
|
-
for (let stream_base of metadata.streams) {
|
|
56
|
-
for (let i in stream_base) {
|
|
57
|
-
if (stream_base[i] === 'N/A' || stream_base[i] === 'unknown') {
|
|
58
|
-
stream_base[i] = null;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
let stream = {
|
|
63
|
-
FileId: file.id,
|
|
64
|
-
stream_id: stream_base.id,
|
|
65
|
-
disposition_default: stream_base.disposition.default,
|
|
66
|
-
disposition_dub: stream_base.disposition.dub,
|
|
67
|
-
disposition_original: stream_base.disposition.original,
|
|
68
|
-
disposition_comment: stream_base.disposition.comment,
|
|
69
|
-
disposition_lyrics: stream_base.disposition.lyrics,
|
|
70
|
-
disposition_karaoke: stream_base.disposition.karaoke,
|
|
71
|
-
disposition_forced: stream_base.disposition.forced,
|
|
72
|
-
disposition_hearing_impaired: stream_base.disposition.hearing_impaired,
|
|
73
|
-
disposition_clean_effects: stream_base.disposition.clean_effects,
|
|
74
|
-
disposition_attached_pic: stream_base.disposition.attached_pic,
|
|
75
|
-
disposition_timed_thumbnails: stream_base.disposition.timed_thumbnails,
|
|
76
|
-
...stream_base
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
if (stream_base.tags) {
|
|
80
|
-
stream['tags_language'] = stream_base.tags.language;
|
|
81
|
-
stream['tags_title'] = stream_base.tags.title;
|
|
82
|
-
delete stream.tags;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
delete stream.id;
|
|
86
|
-
delete stream.disposition;
|
|
87
|
-
delete stream.codec_long_name;
|
|
88
|
-
delete stream.codec_tag;
|
|
89
|
-
await _stream.Stream.findOrCreate({
|
|
90
|
-
where: {
|
|
91
|
-
FileId: stream.FileId,
|
|
92
|
-
stream_id: stream.stream_id,
|
|
93
|
-
index: stream.index,
|
|
94
|
-
codec_name: stream.codec_name
|
|
95
|
-
},
|
|
96
|
-
defaults: stream
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
exports.default = FileIndexer;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _fs = require("fs");
|
|
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
|
-
async removedDeletedFiled() {
|
|
16
|
-
console.log('Scanning for deleted files');
|
|
17
|
-
let results = await _database.default.file.findAll();
|
|
18
|
-
|
|
19
|
-
for (let i in results) {
|
|
20
|
-
let item = results[i];
|
|
21
|
-
|
|
22
|
-
if (!(await _fs.promises.exists(item.path))) {
|
|
23
|
-
console.log('Deleting', item.path, 'because the file doesn\'t exist anymore');
|
|
24
|
-
await item.destroy();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
|
|
29
|
-
async removeAssoclessFiles() {
|
|
30
|
-
console.log('Scanning for files without associated media entities');
|
|
31
|
-
let results = await _database.default.file.findAll({
|
|
32
|
-
include: [_database.default.movie, _database.default.episode]
|
|
33
|
-
});
|
|
34
|
-
results.forEach(item => {
|
|
35
|
-
if (item.movies.length === 0 && item.episodes.length === 0) {
|
|
36
|
-
console.log('Deleting', item.path, 'because the file doesn\'t have any media entities associated');
|
|
37
|
-
item.destroy();
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
};
|
|
43
|
-
exports.default = _default;
|
|
@@ -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 _IdentificationError = _interopRequireDefault(require("../../errors/IdentificationError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class AggregateMovieIdentifier {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.identifiers = [];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
loadIdentifier(identifier) {
|
|
18
|
-
this.identifiers.push(identifier);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async identify(moviePath) {
|
|
22
|
-
let identification = {};
|
|
23
|
-
|
|
24
|
-
for (let identifier of this.identifiers) {
|
|
25
|
-
let currentIdentification;
|
|
26
|
-
|
|
27
|
-
try {
|
|
28
|
-
currentIdentification = await identifier.identify(moviePath);
|
|
29
|
-
} catch (e) {
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
identification = { ...identification,
|
|
34
|
-
...currentIdentification
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (Object.keys(identification).length === 0) throw new _IdentificationError.default();
|
|
39
|
-
return identification;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
exports.default = AggregateMovieIdentifier;
|
|
45
|
-
;
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _recursiveReaddir = _interopRequireDefault(require("recursive-readdir"));
|
|
9
|
-
|
|
10
|
-
var _path = _interopRequireDefault(require("path"));
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
class MovieCollector {
|
|
15
|
-
/**
|
|
16
|
-
*
|
|
17
|
-
* @param {Oblecto} oblecto
|
|
18
|
-
*/
|
|
19
|
-
constructor(oblecto) {
|
|
20
|
-
this.oblecto = oblecto;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
*
|
|
24
|
-
* @param {String} directory - Which directory to add to the index queue
|
|
25
|
-
* @returns {Promise<void>}
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
async collectDirectory(directory) {
|
|
30
|
-
let files = await (0, _recursiveReaddir.default)(directory);
|
|
31
|
-
files.forEach(file => {
|
|
32
|
-
this.collectFile(file);
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
*
|
|
37
|
-
* @param {String} file - File path to add to the index queue
|
|
38
|
-
* @returns {Promise<void>}
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
async collectFile(file) {
|
|
43
|
-
let extension = _path.default.parse(file).ext.toLowerCase();
|
|
44
|
-
|
|
45
|
-
if (this.oblecto.config.fileExtensions.video.indexOf(extension) !== -1) {
|
|
46
|
-
this.oblecto.queue.queueJob('indexMovie', {
|
|
47
|
-
path: file
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
*
|
|
53
|
-
* @returns {Promise<void>}
|
|
54
|
-
*/
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
async collectAll() {
|
|
58
|
-
this.oblecto.config.movies.directories.forEach(directory => {
|
|
59
|
-
this.collectDirectory(directory.path);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
exports.default = MovieCollector;
|
|
@@ -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 _MediaIdentifier = _interopRequireDefault(require("../MediaIdentifier"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class MovieIdentifier extends _MediaIdentifier.default {
|
|
13
|
-
/**
|
|
14
|
-
* Identify a Movie based a file path
|
|
15
|
-
* @param {String} path File path to the Movie
|
|
16
|
-
* @returns {Promise<JSON>}
|
|
17
|
-
*/
|
|
18
|
-
async identify(path) {}
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
exports.default = MovieIdentifier;
|
|
@@ -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 _AggregateIdentifier = _interopRequireDefault(require("../../common/AggregateIdentifier"));
|
|
9
|
-
|
|
10
|
-
var _TmdbMovieidentifier = _interopRequireDefault(require("./identifiers/TmdbMovieidentifier"));
|
|
11
|
-
|
|
12
|
-
var _movie = require("../../../models/movie");
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
|
-
class MovieIndexer {
|
|
17
|
-
/**
|
|
18
|
-
*
|
|
19
|
-
* @param {Oblecto} oblecto
|
|
20
|
-
*/
|
|
21
|
-
constructor(oblecto) {
|
|
22
|
-
this.oblecto = oblecto;
|
|
23
|
-
this.movieIdentifer = new _AggregateIdentifier.default();
|
|
24
|
-
this.movieIdentifer.loadIdentifier(new _TmdbMovieidentifier.default(this.oblecto)); // Register task availability to Oblecto queue
|
|
25
|
-
|
|
26
|
-
this.oblecto.queue.addJob('indexMovie', async job => await this.indexFile(job.path, job.doReIndex));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async indexFile(moviePath) {
|
|
30
|
-
let file = await this.oblecto.fileIndexer.indexVideoFile(moviePath);
|
|
31
|
-
let movieIdentification = await this.movieIdentifer.identify(moviePath);
|
|
32
|
-
let [movie, movieCreated] = await _movie.Movie.findOrCreate({
|
|
33
|
-
where: {
|
|
34
|
-
tmdbid: movieIdentification.tmdbid
|
|
35
|
-
},
|
|
36
|
-
defaults: movieIdentification
|
|
37
|
-
});
|
|
38
|
-
movie.addFile(file);
|
|
39
|
-
if (!movieCreated) return;
|
|
40
|
-
this.oblecto.queue.queueJob('updateMovie', movie);
|
|
41
|
-
this.oblecto.queue.queueJob('downloadMovieFanart', movie);
|
|
42
|
-
this.oblecto.queue.pushJob('downloadMoviePoster', movie);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
exports.default = MovieIndexer;
|
|
@@ -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 _MovieIdentifier = _interopRequireDefault(require("../MovieIdentifier"));
|
|
9
|
-
|
|
10
|
-
var _guessit = _interopRequireDefault(require("../../../../submodules/guessit"));
|
|
11
|
-
|
|
12
|
-
var _IdentificationError = _interopRequireDefault(require("../../../errors/IdentificationError"));
|
|
13
|
-
|
|
14
|
-
var _promiseTimeout = _interopRequireDefault(require("../../../../submodules/promiseTimeout"));
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
class TmdbMovieIdentifier extends _MovieIdentifier.default {
|
|
19
|
-
async identify(path) {
|
|
20
|
-
let identification = await _guessit.default.identify(path);
|
|
21
|
-
|
|
22
|
-
if (!identification.title) {
|
|
23
|
-
throw new _IdentificationError.default('Title extraction was unsuccessful');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
let query = {
|
|
27
|
-
query: identification.title
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
if (identification.year) {
|
|
31
|
-
query.primary_release_year = identification.year;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
let res = await (0, _promiseTimeout.default)(this.oblecto.tmdb.searchMovie(query));
|
|
35
|
-
let identifiedMovie = res.results[0];
|
|
36
|
-
|
|
37
|
-
if (!identifiedMovie) {
|
|
38
|
-
throw new _IdentificationError.default();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
tmdbid: identifiedMovie.id,
|
|
43
|
-
movieName: identifiedMovie.title,
|
|
44
|
-
overview: identifiedMovie.overview
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
exports.default = TmdbMovieIdentifier;
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _IdentificationError = _interopRequireDefault(require("../../errors/IdentificationError"));
|
|
9
|
-
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
|
-
class AggregateEpisodeIdentifier {
|
|
13
|
-
constructor(oblecto) {
|
|
14
|
-
this.oblecto = oblecto;
|
|
15
|
-
this.identifiers = [];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
loadIdentifier(identifier) {
|
|
19
|
-
this.identifiers.push(identifier);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async identify(episodePath, series) {
|
|
23
|
-
let identification = {};
|
|
24
|
-
|
|
25
|
-
for (let identifier of this.identifiers) {
|
|
26
|
-
let currentIdentification;
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
currentIdentification = await identifier.identify(episodePath, series);
|
|
30
|
-
} catch (e) {
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
identification = { ...identification,
|
|
35
|
-
...currentIdentification
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (Object.keys(identification).length === 0) throw new _IdentificationError.default();
|
|
40
|
-
return identification;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
exports.default = AggregateEpisodeIdentifier;
|
|
46
|
-
;
|