@omss/framework 1.1.0
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/LICENSE +21 -0
- package/README.md +516 -0
- package/dist/controllers/content.controller.d.ts +37 -0
- package/dist/controllers/content.controller.d.ts.map +1 -0
- package/dist/controllers/content.controller.js +37 -0
- package/dist/controllers/content.controller.js.map +1 -0
- package/dist/controllers/health.controller.d.ts +11 -0
- package/dist/controllers/health.controller.d.ts.map +1 -0
- package/dist/controllers/health.controller.js +18 -0
- package/dist/controllers/health.controller.js.map +1 -0
- package/dist/controllers/proxy.controller.d.ts +17 -0
- package/dist/controllers/proxy.controller.d.ts.map +1 -0
- package/dist/controllers/proxy.controller.js +32 -0
- package/dist/controllers/proxy.controller.js.map +1 -0
- package/dist/core/cache.d.ts +29 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +95 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +27 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +42 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/server.d.ts +46 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +210 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/types.d.ts +123 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +4 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +57 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/logger.d.ts +3 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +34 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/validation.d.ts +33 -0
- package/dist/middleware/validation.d.ts.map +1 -0
- package/dist/middleware/validation.js +93 -0
- package/dist/middleware/validation.js.map +1 -0
- package/dist/providers/base-provider.d.ts +91 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +170 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/provider-registry.d.ts +56 -0
- package/dist/providers/provider-registry.d.ts.map +1 -0
- package/dist/providers/provider-registry.js +182 -0
- package/dist/providers/provider-registry.js.map +1 -0
- package/dist/services/health.service.d.ts +16 -0
- package/dist/services/health.service.d.ts.map +1 -0
- package/dist/services/health.service.js +44 -0
- package/dist/services/health.service.js.map +1 -0
- package/dist/services/proxy.service.d.ts +56 -0
- package/dist/services/proxy.service.d.ts.map +1 -0
- package/dist/services/proxy.service.js +224 -0
- package/dist/services/proxy.service.js.map +1 -0
- package/dist/services/source.service.d.ts +57 -0
- package/dist/services/source.service.d.ts.map +1 -0
- package/dist/services/source.service.js +226 -0
- package/dist/services/source.service.js.map +1 -0
- package/dist/services/tmdb.service.d.ts +67 -0
- package/dist/services/tmdb.service.d.ts.map +1 -0
- package/dist/services/tmdb.service.js +237 -0
- package/dist/services/tmdb.service.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA,oDAAoD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @omss/framework
|
|
3
|
+
*
|
|
4
|
+
* Official OMSS backend framework for multi-provider streaming media aggregation
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { OMSSServer } from './core/server';
|
|
9
|
+
export { OMSSConfig, SourceResponse, Source, Subtitle, HealthResponse } from './core/types';
|
|
10
|
+
export { OMSSError, OMSSErrors } from './core/errors';
|
|
11
|
+
export { CacheService, MemoryCacheService, RedisCacheService } from './core/cache';
|
|
12
|
+
export * from './providers/base-provider';
|
|
13
|
+
export { ProviderRegistry, ProviderRegistryConfig } from './providers/provider-registry';
|
|
14
|
+
export { SourceService } from './services/source.service';
|
|
15
|
+
export { ProxyService } from './services/proxy.service';
|
|
16
|
+
export { HealthService } from './services/health.service';
|
|
17
|
+
export { ProxyService as ProxyUtils } from './services/proxy.service';
|
|
18
|
+
export type * from './core/types';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGnF,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGzF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtE,mBAAmB,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @omss/framework
|
|
4
|
+
*
|
|
5
|
+
* Official OMSS backend framework for multi-provider streaming media aggregation
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.ProxyUtils = exports.HealthService = exports.ProxyService = exports.SourceService = exports.ProviderRegistry = exports.RedisCacheService = exports.MemoryCacheService = exports.OMSSErrors = exports.OMSSError = exports.OMSSServer = void 0;
|
|
25
|
+
// Core exports
|
|
26
|
+
var server_1 = require("./core/server");
|
|
27
|
+
Object.defineProperty(exports, "OMSSServer", { enumerable: true, get: function () { return server_1.OMSSServer; } });
|
|
28
|
+
var errors_1 = require("./core/errors");
|
|
29
|
+
Object.defineProperty(exports, "OMSSError", { enumerable: true, get: function () { return errors_1.OMSSError; } });
|
|
30
|
+
Object.defineProperty(exports, "OMSSErrors", { enumerable: true, get: function () { return errors_1.OMSSErrors; } });
|
|
31
|
+
var cache_1 = require("./core/cache");
|
|
32
|
+
Object.defineProperty(exports, "MemoryCacheService", { enumerable: true, get: function () { return cache_1.MemoryCacheService; } });
|
|
33
|
+
Object.defineProperty(exports, "RedisCacheService", { enumerable: true, get: function () { return cache_1.RedisCacheService; } });
|
|
34
|
+
// Provider exports
|
|
35
|
+
__exportStar(require("./providers/base-provider"), exports);
|
|
36
|
+
var provider_registry_1 = require("./providers/provider-registry");
|
|
37
|
+
Object.defineProperty(exports, "ProviderRegistry", { enumerable: true, get: function () { return provider_registry_1.ProviderRegistry; } });
|
|
38
|
+
// Service exports
|
|
39
|
+
var source_service_1 = require("./services/source.service");
|
|
40
|
+
Object.defineProperty(exports, "SourceService", { enumerable: true, get: function () { return source_service_1.SourceService; } });
|
|
41
|
+
var proxy_service_1 = require("./services/proxy.service");
|
|
42
|
+
Object.defineProperty(exports, "ProxyService", { enumerable: true, get: function () { return proxy_service_1.ProxyService; } });
|
|
43
|
+
var health_service_1 = require("./services/health.service");
|
|
44
|
+
Object.defineProperty(exports, "HealthService", { enumerable: true, get: function () { return health_service_1.HealthService; } });
|
|
45
|
+
// Utility exports
|
|
46
|
+
var proxy_service_2 = require("./services/proxy.service");
|
|
47
|
+
Object.defineProperty(exports, "ProxyUtils", { enumerable: true, get: function () { return proxy_service_2.ProxyService; } });
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,wCAA2C;AAAlC,oGAAA,UAAU,OAAA;AAEnB,wCAAsD;AAA7C,mGAAA,SAAS,OAAA;AAAE,oGAAA,UAAU,OAAA;AAC9B,sCAAmF;AAA5D,2GAAA,kBAAkB,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AAE5D,mBAAmB;AACnB,4DAA0C;AAC1C,mEAAyF;AAAhF,qHAAA,gBAAgB,OAAA;AAEzB,kBAAkB;AAClB,4DAA0D;AAAjD,+GAAA,aAAa,OAAA;AACtB,0DAAwD;AAA/C,6GAAA,YAAY,OAAA;AACrB,4DAA0D;AAAjD,+GAAA,aAAa,OAAA;AAEtB,kBAAkB;AAClB,0DAAsE;AAA7D,2GAAA,YAAY,OAAc"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { FastifyError, FastifyRequest, FastifyReply } from 'fastify';
|
|
2
|
+
import { OMSSError } from '../core/errors';
|
|
3
|
+
export declare function errorHandler(error: FastifyError | OMSSError, request: FastifyRequest, reply: FastifyReply): Promise<never>;
|
|
4
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,wBAAsB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAwD/G"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.errorHandler = errorHandler;
|
|
4
|
+
const errors_1 = require("../core/errors");
|
|
5
|
+
async function errorHandler(error, request, reply) {
|
|
6
|
+
// Log error for debugging
|
|
7
|
+
console.error('[ErrorHandler]', {
|
|
8
|
+
url: request.url,
|
|
9
|
+
method: request.method,
|
|
10
|
+
error: error.message,
|
|
11
|
+
stack: error.stack,
|
|
12
|
+
});
|
|
13
|
+
// Handle OMSS-specific errors
|
|
14
|
+
if (error instanceof errors_1.OMSSError) {
|
|
15
|
+
return reply.code(error.statusCode).send(error.toJSON());
|
|
16
|
+
}
|
|
17
|
+
// Handle Fastify validation errors
|
|
18
|
+
if (error.validation) {
|
|
19
|
+
return reply.code(400).send({
|
|
20
|
+
error: {
|
|
21
|
+
code: 'INVALID_PARAMETER',
|
|
22
|
+
message: 'Request validation failed',
|
|
23
|
+
details: error.validation,
|
|
24
|
+
},
|
|
25
|
+
traceId: request.id,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Handle 404 errors
|
|
29
|
+
if (error.statusCode === 404) {
|
|
30
|
+
return reply.code(404).send({
|
|
31
|
+
error: {
|
|
32
|
+
code: 'ENDPOINT_NOT_FOUND',
|
|
33
|
+
message: 'The requested endpoint does not exist',
|
|
34
|
+
details: {
|
|
35
|
+
path: request.url,
|
|
36
|
+
method: request.method,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
traceId: request.id,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Handle generic errors
|
|
43
|
+
const statusCode = error.statusCode || 500;
|
|
44
|
+
return reply.code(statusCode).send({
|
|
45
|
+
error: {
|
|
46
|
+
code: 'INTERNAL_ERROR',
|
|
47
|
+
message: process.env.NODE_ENV === 'production' ? 'An unexpected error occurred' : error.message,
|
|
48
|
+
details: process.env.NODE_ENV === 'production'
|
|
49
|
+
? undefined
|
|
50
|
+
: {
|
|
51
|
+
stack: error.stack,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
traceId: request.id,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/middleware/error-handler.ts"],"names":[],"mappings":";;AAGA,oCAwDC;AA1DD,0CAA0C;AAEnC,KAAK,UAAU,YAAY,CAAC,KAA+B,EAAE,OAAuB,EAAE,KAAmB;IAC5G,0BAA0B;IAC1B,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE;QAC5B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,8BAA8B;IAC9B,IAAI,KAAK,YAAY,kBAAS,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,mCAAmC;IACnC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxB,KAAK,EAAE;gBACH,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,2BAA2B;gBACpC,OAAO,EAAE,KAAK,CAAC,UAAU;aAC5B;YACD,OAAO,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC,CAAC;IACP,CAAC;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxB,KAAK,EAAE;gBACH,IAAI,EAAE,oBAAoB;gBAC1B,OAAO,EAAE,uCAAuC;gBAChD,OAAO,EAAE;oBACL,IAAI,EAAE,OAAO,CAAC,GAAG;oBACjB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACzB;aACJ;YACD,OAAO,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC,CAAC;IACP,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAC/B,KAAK,EAAE;YACH,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;YAC/F,OAAO,EACH,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;gBACjC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACI,KAAK,EAAE,KAAK,CAAC,KAAK;iBACrB;SACd;QACD,OAAO,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAoBhF,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,uBAAuB,QAYxG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requestLogger = requestLogger;
|
|
4
|
+
// Color codes for console output
|
|
5
|
+
const colors = {
|
|
6
|
+
reset: '\x1b[0m',
|
|
7
|
+
green: '\x1b[32m',
|
|
8
|
+
yellow: '\x1b[33m',
|
|
9
|
+
red: '\x1b[31m',
|
|
10
|
+
blue: '\x1b[34m',
|
|
11
|
+
gray: '\x1b[90m',
|
|
12
|
+
};
|
|
13
|
+
function getStatusColor(statusCode) {
|
|
14
|
+
if (statusCode >= 500)
|
|
15
|
+
return colors.red;
|
|
16
|
+
if (statusCode >= 400)
|
|
17
|
+
return colors.yellow;
|
|
18
|
+
if (statusCode >= 300)
|
|
19
|
+
return colors.blue;
|
|
20
|
+
if (statusCode >= 200)
|
|
21
|
+
return colors.green;
|
|
22
|
+
return colors.reset;
|
|
23
|
+
}
|
|
24
|
+
function requestLogger(request, reply, done) {
|
|
25
|
+
const startTime = Date.now();
|
|
26
|
+
reply.raw.on('finish', () => {
|
|
27
|
+
const duration = Date.now() - startTime;
|
|
28
|
+
const timestamp = new Date().toISOString();
|
|
29
|
+
const statusColor = getStatusColor(reply.statusCode);
|
|
30
|
+
console.log(`${colors.gray}[${timestamp}]${colors.reset} ` + `${request.method} ${request.url} ` + `${statusColor}${reply.statusCode}${colors.reset} ` + `${colors.gray}- ${duration}ms${colors.reset}`);
|
|
31
|
+
});
|
|
32
|
+
done();
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":";;AAoBA,sCAYC;AA9BD,iCAAiC;AACjC,MAAM,MAAM,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACnB,CAAC;AAEF,SAAS,cAAc,CAAC,UAAkB;IACtC,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACzC,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAC5C,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAC1C,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC;AACxB,CAAC;AAED,SAAgB,aAAa,CAAC,OAAuB,EAAE,KAAmB,EAAE,IAA6B;IACrG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,WAAW,GAAG,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7M,CAAC,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FastifyRequest, FastifyReply } from 'fastify';
|
|
2
|
+
import { TMDBService } from '../services/tmdb.service';
|
|
3
|
+
/**
|
|
4
|
+
* Basic TMDB ID format validation
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateTmdbIdFormat(id: string): void;
|
|
7
|
+
/**
|
|
8
|
+
* Validate season number format
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateSeasonFormat(season: number): void;
|
|
11
|
+
/**
|
|
12
|
+
* Validate episode number format
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateEpisodeFormat(episode: number, season: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* Content-Type validation middleware
|
|
17
|
+
* Note: This is an async hook handler that doesn't use the 'done' callback
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateContentType(request: FastifyRequest, reply: FastifyReply): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Create TMDB validation middleware
|
|
22
|
+
*/
|
|
23
|
+
export declare function createTMDBValidator(tmdbService: TMDBService): {
|
|
24
|
+
/**
|
|
25
|
+
* Validate movie exists and has been released
|
|
26
|
+
*/
|
|
27
|
+
validateMovie(tmdbId: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Validate TV episode exists and has aired
|
|
30
|
+
*/
|
|
31
|
+
validateTVEpisode(tmdbId: string, season: number, episode: number): Promise<void>;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/middleware/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI3E;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW;IAEpD;;OAEG;0BACyB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlD;;OAEG;8BAC6B,MAAM,UAAU,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAkB9F"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateTmdbIdFormat = validateTmdbIdFormat;
|
|
4
|
+
exports.validateSeasonFormat = validateSeasonFormat;
|
|
5
|
+
exports.validateEpisodeFormat = validateEpisodeFormat;
|
|
6
|
+
exports.validateContentType = validateContentType;
|
|
7
|
+
exports.createTMDBValidator = createTMDBValidator;
|
|
8
|
+
const errors_1 = require("../core/errors");
|
|
9
|
+
/**
|
|
10
|
+
* Basic TMDB ID format validation
|
|
11
|
+
*/
|
|
12
|
+
function validateTmdbIdFormat(id) {
|
|
13
|
+
if (!/^\d{1,20}$/.test(id)) {
|
|
14
|
+
throw errors_1.OMSSErrors.invalidTmdbId(id);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate season number format
|
|
19
|
+
*/
|
|
20
|
+
function validateSeasonFormat(season) {
|
|
21
|
+
if (season < 0 || season > 99) {
|
|
22
|
+
throw errors_1.OMSSErrors.invalidSeason(season, 99);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate episode number format
|
|
27
|
+
*/
|
|
28
|
+
function validateEpisodeFormat(episode, season) {
|
|
29
|
+
if (episode < 1 || episode > 9999) {
|
|
30
|
+
throw errors_1.OMSSErrors.invalidEpisode(episode, season, 9999);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Content-Type validation middleware
|
|
35
|
+
* Note: This is an async hook handler that doesn't use the 'done' callback
|
|
36
|
+
*/
|
|
37
|
+
async function validateContentType(request, reply) {
|
|
38
|
+
const accept = request.headers['accept'];
|
|
39
|
+
// Check Accept header
|
|
40
|
+
if (accept && !accept.includes('application/json') && !accept.includes('*/*')) {
|
|
41
|
+
reply.code(406).send({
|
|
42
|
+
error: {
|
|
43
|
+
code: 'UNSUPPORTED_MEDIA_TYPE',
|
|
44
|
+
message: 'Server only supports application/json responses',
|
|
45
|
+
details: {
|
|
46
|
+
accept: accept,
|
|
47
|
+
supported: ['application/json'],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
traceId: request.id,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create TMDB validation middleware
|
|
56
|
+
*/
|
|
57
|
+
function createTMDBValidator(tmdbService) {
|
|
58
|
+
return {
|
|
59
|
+
/**
|
|
60
|
+
* Validate movie exists and has been released
|
|
61
|
+
*/
|
|
62
|
+
async validateMovie(tmdbId) {
|
|
63
|
+
// First check format
|
|
64
|
+
validateTmdbIdFormat(tmdbId);
|
|
65
|
+
// Then validate with TMDB
|
|
66
|
+
const result = await tmdbService.validateMovie(tmdbId);
|
|
67
|
+
if (!result.exists) {
|
|
68
|
+
throw errors_1.OMSSErrors.invalidTmdbId(tmdbId);
|
|
69
|
+
}
|
|
70
|
+
if (!result.released) {
|
|
71
|
+
throw errors_1.OMSSErrors.invalidTmdbId(tmdbId);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
/**
|
|
75
|
+
* Validate TV episode exists and has aired
|
|
76
|
+
*/
|
|
77
|
+
async validateTVEpisode(tmdbId, season, episode) {
|
|
78
|
+
// First check formats
|
|
79
|
+
validateTmdbIdFormat(tmdbId);
|
|
80
|
+
validateSeasonFormat(season);
|
|
81
|
+
validateEpisodeFormat(episode, season);
|
|
82
|
+
// Then validate with TMDB
|
|
83
|
+
const result = await tmdbService.validateTVEpisode(tmdbId, season, episode);
|
|
84
|
+
if (!result.exists) {
|
|
85
|
+
throw errors_1.OMSSErrors.invalidEpisode(episode, season, -1);
|
|
86
|
+
}
|
|
87
|
+
if (!result.released) {
|
|
88
|
+
throw errors_1.OMSSErrors.invalidEpisode(episode, season, -1);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/middleware/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ProviderCapabilities, ProviderMediaObject, ProviderResult } from '../core/types';
|
|
2
|
+
/**
|
|
3
|
+
* Console wrapper for provider logging
|
|
4
|
+
*/
|
|
5
|
+
declare class ProviderLogger {
|
|
6
|
+
private providerId;
|
|
7
|
+
private providerName;
|
|
8
|
+
private isProduction;
|
|
9
|
+
constructor(providerId: string, providerName: string, isProduction?: boolean);
|
|
10
|
+
/**
|
|
11
|
+
* Format log prefix with context
|
|
12
|
+
*/
|
|
13
|
+
private formatPrefix;
|
|
14
|
+
log(message: string, media?: ProviderMediaObject): void;
|
|
15
|
+
info(message: string, media?: ProviderMediaObject): void;
|
|
16
|
+
warn(message: string, media?: ProviderMediaObject): void;
|
|
17
|
+
error(message: string, error?: any, media?: ProviderMediaObject): void;
|
|
18
|
+
debug(message: string, data?: any, media?: ProviderMediaObject): void;
|
|
19
|
+
success(message: string, media?: ProviderMediaObject): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Proxy URL configuration
|
|
23
|
+
*/
|
|
24
|
+
interface ProxyConfig {
|
|
25
|
+
baseUrl?: string;
|
|
26
|
+
host?: string;
|
|
27
|
+
port?: number;
|
|
28
|
+
protocol?: 'http' | 'https';
|
|
29
|
+
}
|
|
30
|
+
export declare abstract class BaseProvider {
|
|
31
|
+
abstract readonly id: string;
|
|
32
|
+
abstract readonly name: string;
|
|
33
|
+
abstract readonly enabled: boolean;
|
|
34
|
+
abstract readonly BASE_URL: string;
|
|
35
|
+
abstract readonly HEADERS: Record<string, string>;
|
|
36
|
+
abstract readonly capabilities: ProviderCapabilities;
|
|
37
|
+
/**
|
|
38
|
+
* Protected console logger instance (lazy initialized)
|
|
39
|
+
*/
|
|
40
|
+
private _console?;
|
|
41
|
+
/**
|
|
42
|
+
* Proxy configuration (set by ProviderRegistry)
|
|
43
|
+
*/
|
|
44
|
+
private static proxyConfig;
|
|
45
|
+
/**
|
|
46
|
+
* Get console logger (lazy initialization)
|
|
47
|
+
*/
|
|
48
|
+
protected get console(): ProviderLogger;
|
|
49
|
+
/**
|
|
50
|
+
* Set global proxy configuration
|
|
51
|
+
*/
|
|
52
|
+
static setProxyConfig(config: ProxyConfig): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get proxy base URL
|
|
55
|
+
*/
|
|
56
|
+
private static getProxyBaseUrl;
|
|
57
|
+
/**
|
|
58
|
+
* Fetch sources for a movie
|
|
59
|
+
*/
|
|
60
|
+
abstract getMovieSources(media: ProviderMediaObject): Promise<ProviderResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Fetch sources for a TV episode
|
|
63
|
+
*/
|
|
64
|
+
abstract getTVSources(media: ProviderMediaObject): Promise<ProviderResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Health check for provider availability
|
|
67
|
+
*/
|
|
68
|
+
healthCheck(): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Helper: Create proxy URL with full server address
|
|
71
|
+
*/
|
|
72
|
+
protected createProxyUrl(url: string, headers?: Record<string, string>): string;
|
|
73
|
+
/**
|
|
74
|
+
* Helper: Create relative proxy URL (for same-origin requests)
|
|
75
|
+
*/
|
|
76
|
+
protected createRelativeProxyUrl(url: string, headers?: Record<string, string>): string;
|
|
77
|
+
/**
|
|
78
|
+
* Helper: Infer quality from URL or filename
|
|
79
|
+
*/
|
|
80
|
+
protected inferQuality(filename: string): string;
|
|
81
|
+
/**
|
|
82
|
+
* Helper: Infer type from URL extension
|
|
83
|
+
*/
|
|
84
|
+
protected inferType(url: string): string;
|
|
85
|
+
/**
|
|
86
|
+
* Check if provider supports given content type
|
|
87
|
+
*/
|
|
88
|
+
protected supportsContentType(type: 'movies' | 'tv' | 'sub'): boolean;
|
|
89
|
+
}
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=base-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Console wrapper for provider logging
|
|
6
|
+
*/
|
|
7
|
+
class ProviderLogger {
|
|
8
|
+
providerId;
|
|
9
|
+
providerName;
|
|
10
|
+
isProduction;
|
|
11
|
+
constructor(providerId, providerName, isProduction = process.env.NODE_ENV === 'production') {
|
|
12
|
+
this.providerId = providerId;
|
|
13
|
+
this.providerName = providerName;
|
|
14
|
+
this.isProduction = isProduction;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Format log prefix with context
|
|
18
|
+
*/
|
|
19
|
+
formatPrefix(media) {
|
|
20
|
+
if (this.isProduction) {
|
|
21
|
+
return `[${this.providerName}]`;
|
|
22
|
+
}
|
|
23
|
+
const parts = [`[${this.providerName}]`, `[${this.providerId}]`];
|
|
24
|
+
if (media) {
|
|
25
|
+
if (media.type === 'movie') {
|
|
26
|
+
parts.push(`[Movie: ${media.tmdbId}]`);
|
|
27
|
+
if (media.title)
|
|
28
|
+
parts.push(`[${media.title}]`);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
parts.push(`[TV: ${media.tmdbId}]`, `[S${media.s}E${media.e}]`);
|
|
32
|
+
if (media.title)
|
|
33
|
+
parts.push(`[${media.title}]`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return parts.join(' ');
|
|
37
|
+
}
|
|
38
|
+
log(message, media) {
|
|
39
|
+
if (this.isProduction)
|
|
40
|
+
return;
|
|
41
|
+
console.log(`${this.formatPrefix(media)} ${message}`);
|
|
42
|
+
}
|
|
43
|
+
info(message, media) {
|
|
44
|
+
console.info(`${this.formatPrefix(media)} ${message}`);
|
|
45
|
+
}
|
|
46
|
+
warn(message, media) {
|
|
47
|
+
console.warn(`${this.formatPrefix(media)} ⚠️ ${message}`);
|
|
48
|
+
}
|
|
49
|
+
error(message, error, media) {
|
|
50
|
+
console.error(`${this.formatPrefix(media)} ❌ ${message}`, error || '');
|
|
51
|
+
}
|
|
52
|
+
debug(message, data, media) {
|
|
53
|
+
if (this.isProduction)
|
|
54
|
+
return;
|
|
55
|
+
console.debug(`${this.formatPrefix(media)} 🔍 ${message}`, data || '');
|
|
56
|
+
}
|
|
57
|
+
success(message, media) {
|
|
58
|
+
if (this.isProduction)
|
|
59
|
+
return;
|
|
60
|
+
console.log(`${this.formatPrefix(media)} ✅ ${message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
class BaseProvider {
|
|
64
|
+
/**
|
|
65
|
+
* Protected console logger instance (lazy initialized)
|
|
66
|
+
*/
|
|
67
|
+
_console;
|
|
68
|
+
/**
|
|
69
|
+
* Proxy configuration (set by ProviderRegistry)
|
|
70
|
+
*/
|
|
71
|
+
static proxyConfig = {};
|
|
72
|
+
/**
|
|
73
|
+
* Get console logger (lazy initialization)
|
|
74
|
+
*/
|
|
75
|
+
get console() {
|
|
76
|
+
if (!this._console) {
|
|
77
|
+
this._console = new ProviderLogger(this.id, this.name);
|
|
78
|
+
}
|
|
79
|
+
return this._console;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Set global proxy configuration
|
|
83
|
+
*/
|
|
84
|
+
static setProxyConfig(config) {
|
|
85
|
+
BaseProvider.proxyConfig = config;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get proxy base URL
|
|
89
|
+
*/
|
|
90
|
+
static getProxyBaseUrl() {
|
|
91
|
+
const config = BaseProvider.proxyConfig;
|
|
92
|
+
// If baseUrl is explicitly set, use it
|
|
93
|
+
if (config.baseUrl) {
|
|
94
|
+
return config.baseUrl;
|
|
95
|
+
}
|
|
96
|
+
// Build from host, port, protocol
|
|
97
|
+
const protocol = config.protocol || 'http';
|
|
98
|
+
const host = config.host || 'localhost';
|
|
99
|
+
const port = config.port;
|
|
100
|
+
// Only add port if it's not default for the protocol
|
|
101
|
+
const needsPort = (protocol === 'http' && port && port !== 80) || (protocol === 'https' && port && port !== 443);
|
|
102
|
+
if (needsPort) {
|
|
103
|
+
return `${protocol}://${host}:${port}`;
|
|
104
|
+
}
|
|
105
|
+
return `${protocol}://${host}`;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Health check for provider availability
|
|
109
|
+
*/
|
|
110
|
+
async healthCheck() {
|
|
111
|
+
return this.enabled;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Helper: Create proxy URL with full server address
|
|
115
|
+
*/
|
|
116
|
+
createProxyUrl(url, headers) {
|
|
117
|
+
const data = JSON.stringify({ url, headers });
|
|
118
|
+
const encodedData = encodeURIComponent(data);
|
|
119
|
+
const baseUrl = BaseProvider.getProxyBaseUrl();
|
|
120
|
+
return `${baseUrl}/v1/proxy?data=${encodedData}`;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Helper: Create relative proxy URL (for same-origin requests)
|
|
124
|
+
*/
|
|
125
|
+
createRelativeProxyUrl(url, headers) {
|
|
126
|
+
const data = JSON.stringify({ url, headers });
|
|
127
|
+
return `/v1/proxy?data=${encodeURIComponent(data)}`;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Helper: Infer quality from URL or filename
|
|
131
|
+
*/
|
|
132
|
+
inferQuality(filename) {
|
|
133
|
+
const patterns = [
|
|
134
|
+
{ regex: /2160p|4k/i, quality: '2160p' },
|
|
135
|
+
{ regex: /1080p/i, quality: '1080p' },
|
|
136
|
+
{ regex: /720p/i, quality: '720p' },
|
|
137
|
+
{ regex: /480p/i, quality: '480p' },
|
|
138
|
+
{ regex: /360p/i, quality: '360p' },
|
|
139
|
+
];
|
|
140
|
+
for (const { regex, quality } of patterns) {
|
|
141
|
+
if (regex.test(filename))
|
|
142
|
+
return quality;
|
|
143
|
+
}
|
|
144
|
+
return 'unknown';
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Helper: Infer type from URL extension
|
|
148
|
+
*/
|
|
149
|
+
inferType(url) {
|
|
150
|
+
if (url.includes('.m3u8'))
|
|
151
|
+
return 'hls';
|
|
152
|
+
if (url.includes('.mpd'))
|
|
153
|
+
return 'dash';
|
|
154
|
+
if (url.includes('.mp4'))
|
|
155
|
+
return 'mp4';
|
|
156
|
+
if (url.includes('.mkv'))
|
|
157
|
+
return 'mkv';
|
|
158
|
+
if (url.includes('.webm'))
|
|
159
|
+
return 'webm';
|
|
160
|
+
return 'embed';
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if provider supports given content type
|
|
164
|
+
*/
|
|
165
|
+
supportsContentType(type) {
|
|
166
|
+
return this.capabilities.supportedContentTypes.includes(type);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.BaseProvider = BaseProvider;
|
|
170
|
+
//# sourceMappingURL=base-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.js","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"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"}
|