From a797cd4e9f1e76503b302231f594c148f0d98f49 Mon Sep 17 00:00:00 2001 From: Ashish Raj Date: Sun, 10 Nov 2024 19:24:40 +1300 Subject: [PATCH 1/7] Add support for external db --- index.js | 102 ++++++++++++++- mongo-db.service.js | 119 +++++++++++++++++ package-lock.json | 306 +++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 4 files changed, 524 insertions(+), 4 deletions(-) create mode 100644 mongo-db.service.js diff --git a/index.js b/index.js index 01e12b9..96f3787 100644 --- a/index.js +++ b/index.js @@ -5,22 +5,39 @@ const epgParser = require("epg-parser"); const axios = require("axios"); const cors = require("cors"); const zlib = require("zlib"); +const MongoDBService = require('./mongo-db.service'); const isDev = process.env.NODE_ENV === "dev"; const originUrl = process.env.CLIENT_URL ? process.env.CLIENT_URL : isDev ? "http://localhost:4200" - : "https://iptvnator.vercel.app"; + : "http://localhost:4200"; + +const mongoUri = isDev || !process.env.MONGO_URI ? "mongodb://192.168.0.89:27017/iptvnator" : process.env.MONGO_URI; +const dbName = isDev || !process.env.MONGO_DB_NAME ? "iptvnator" : process.env.MONGO_DB_NAME; +const collectionName = isDev || !process.env.MONGO_COLLECTION_NAME ? "playlists" : process.env.MONGO_COLLECTION_NAME; + +console.log(`dbName: ${dbName}`); +console.log(`mongoUri: ${mongoUri}`); +console.log(`collectionName: ${collectionName}`); + +const mongoDBService = new MongoDBService(mongoUri, dbName, collectionName); -console.log(`Development mode: ${isDev}`); -console.log(`Origin URL: ${originUrl}`); const corsOptions = { origin: originUrl, optionsSuccessStatus: 200, }; +app.use(express.json()); +app.use((req, res, next) => { + res.header("Access-Control-Allow-Origin", originUrl); + res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); + next(); +}); + const https = require("https"); const agent = new https.Agent({ rejectUnauthorized: false, @@ -70,6 +87,85 @@ app.get("/xtream", cors(corsOptions), async (req, res) => { }); }); +// New route to add multiple playlists +app.post("/addManyPlaylists", cors(corsOptions), async (req, res) => { + try { + const playlists = req.body; + const result = await mongoDBService.insertMany(playlists); + res.status(200).send(result); + } catch (error) { + res.status(500).send({ error: 'Error adding multiple playlists to MongoDB' }); + } +}); + +// New route to insert data into MongoDB +app.post("/addPlaylist", cors(corsOptions), express.json(), async (req, res) => { + const data = req.body; + try { + const result = await mongoDBService.insertData(data); + let insertedData; + insertedData = await mongoDBService.readData({ _id: result.insertedId }); + res.status(200).send(insertedData); + } catch (error) { + console.error('Error inserting data into MongoDB:', error); + res.status(500).send({ error: 'Error inserting data into MongoDB' }); + } +}); + +app.get("/getPlaylist/:id", cors(corsOptions), async (req, res) => { + try { + const { id } = req.params; + const result = await mongoDBService.readData({ _id: id }); + res.status(200).send(result); + } catch (error) { + res.status(500).send({ error: 'Error reading data from MongoDB' }); + } +}); + +// Updated route to read all data from MongoDB +app.get("/getAllPlaylists", cors(corsOptions), async (req, res) => { + try { + const result = await mongoDBService.readDataAll(); // No query parameters passed + res.status(200).send(result); + } catch (error) { + res.status(500).send({ error: 'Error reading data from MongoDB' }); + } +}); + +// New route to delete a playlist by ID +app.delete("/deletePlaylist/:id", cors(corsOptions), async (req, res) => { + try { + const { id } = req.params; + const result = await mongoDBService.deleteData({ _id: id}); + res.status(200).send(result); + } catch (error) { + res.status(500).send({ error: 'Error deleting playlist from MongoDB' }); + } +}); + +// New route to remove all playlists +app.delete("/removeAllPlaylists", cors(corsOptions), async (req, res) => { + try { + const result = await mongoDBService.removeAllPlaylists(); + res.status(200).send(result); + } catch (error) { + res.status(500).send({ error: 'Error removing all playlists from MongoDB' }); + } +}); + +// New route to update a playlist by ID +app.put("/updatePlaylist/:id", cors(corsOptions), async (req, res) => { + try { + const { id } = req.params; + const updatedPlaylist = req.body; + const result = await mongoDBService.updateData({ _id: id }, updatedPlaylist); + const updatedData = await mongoDBService.readData({ _id: id }); + res.status(200).send(updatedData); + } catch (error) { + res.status(500).send({ error: 'Error updating playlist in MongoDB' }); + } +}); + app.get("/stalker", cors(corsOptions), async (req, res) => { axios .get(req.query.url, { diff --git a/mongo-db.service.js b/mongo-db.service.js new file mode 100644 index 0000000..e075663 --- /dev/null +++ b/mongo-db.service.js @@ -0,0 +1,119 @@ +const { MongoClient } = require('mongodb'); + +class MongoDBService { + constructor(uri, dbName, collectionName) { + this.uri = uri; + this.dbName = dbName; + this.collectionName = collectionName; + this.client = new MongoClient(this.uri, { useNewUrlParser: true, useUnifiedTopology: true }); + this.isConnected = false; + } + + async connect() { + if (!this.isConnected) { + try { + await this.client.connect(); + this.database = this.client.db(this.dbName); + this.collection = this.database.collection(this.collectionName); + this.isConnected = true; + console.log(`[${new Date().toISOString()}] Connected to MongoDB`); + console.log(`URI: ${this.uri}`); + console.log(`Database: ${this.dbName}`); + console.log(`Collection: ${this.collectionName}`); + } catch (error) { + console.error(`[${new Date().toISOString()}] Error connecting to MongoDB:`, error); + } + } + } + + async insertData(data) { + try { + await this.connect(); + const result = await this.collection.insertOne(data); + console.log(`[${new Date().toISOString()}] Data inserted with _id: ${result.insertedId}`); + return result; + } catch (error) { + console.error(`[${new Date().toISOString()}] Error inserting data into MongoDB:`, error); + } + } + + async insertMany(data) { + try { + await this.connect(); + const result = await this.collection.insertMany(data); + console.log(`[${new Date().toISOString()}] Data inserted:`, result.insertedIds); + return result; + } catch (error) { + console.error(`[${new Date().toISOString()}] Error inserting data into MongoDB:`, error); + } + } + + async readDataAll(query = {}) { + try { + await this.connect(); + const foundData = await this.collection.find(query).toArray(); + console.log(`[${new Date().toISOString()}] Found data:`, foundData); + return foundData; + } catch (error) { + console.error(`[${new Date().toISOString()}] Error reading data from MongoDB:`, error); + } + } + + async readData(query) { + try { + await this.connect(); + const foundData = await this.collection.findOne(query); + console.log(`[${new Date().toISOString()}] Found data:`, foundData); + return foundData; + } catch (error) { + console.error(`[${new Date().toISOString()}] Error reading data from MongoDB:`, error); + } + } + + async deleteData(query) { + try { + await this.connect(); + const result = await this.collection.deleteOne(query); + console.log(`[${new Date().toISOString()}] Data deleted with query:`, query); + return result; + } catch (error) { + console.error(`[${new Date().toISOString()}] Error deleting data from MongoDB:`, error); + } + } + + async removeAllPlaylists() { + try { + await this.connect(); + const result = await this.collection.deleteMany({}); + console.log(`[${new Date().toISOString()}] All playlists removed`); + return result; + } catch (error) { + console.error(`[${new Date().toISOString()}] Error removing all playlists from MongoDB:`, error); + } + } + + async updateData(query, update) { + try { + await this.connect(); + const result = await this.collection.updateOne(query, { $set: update }); + console.log(`[${new Date().toISOString()}] Data updated with query:`, query, 'and update:', update); + return result; + } catch (error) { + console.error(`[${new Date().toISOString()}] Error updating data in MongoDB:`, error); + } + } + + async close() { + if (this.isConnected) { + try { + await this.client.close(); + this.isConnected = false; + console.log(`[${new Date().toISOString()}] MongoDB connection closed`); + } catch (error) { + console.error(`[${new Date().toISOString()}] Error closing MongoDB connection:`, error); + } + } + } +} + +module.exports = MongoDBService; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c452d59..2f34ae5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "cors": "^2.8.5", "epg-parser": "^0.1.6", "express": "^4.18.2", - "iptv-playlist-parser": "github:4gray/iptv-playlist-parser" + "iptv-playlist-parser": "github:4gray/iptv-playlist-parser", + "mongodb": "^3.6.3" } }, "node_modules/accepts": { @@ -48,6 +49,16 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -71,6 +82,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -134,6 +154,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -162,6 +188,15 @@ "node": ">=0.4.0" } }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -448,6 +483,12 @@ "node": ">=0.10.0" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -456,6 +497,13 @@ "node": ">= 0.6" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT", + "optional": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -499,6 +547,45 @@ "node": ">= 0.6" } }, + "node_modules/mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "license": "Apache-2.0", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -539,6 +626,18 @@ "node": ">= 0.8" } }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "license": "Apache-2.0", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -552,6 +651,12 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -605,6 +710,36 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -629,6 +764,19 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "license": "MIT", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -694,6 +842,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -702,6 +860,21 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -730,6 +903,12 @@ "node": ">= 0.8" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -796,6 +975,15 @@ "proxy-from-env": "^1.1.0" } }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -815,6 +1003,11 @@ "unpipe": "1.0.0" } }, + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -860,6 +1053,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -882,6 +1080,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1092,11 +1295,22 @@ "is-invalid-path": "^0.1.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -1125,6 +1339,19 @@ "mime-db": "1.52.0" } }, + "mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1153,6 +1380,14 @@ "ee-first": "1.1.1" } }, + "optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "requires": { + "require-at": "^1.0.6" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1163,6 +1398,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1201,6 +1441,32 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1211,6 +1477,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -1269,11 +1544,35 @@ "object-inspect": "^1.9.0" } }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1293,6 +1592,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index 21b139e..abd4598 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "license": "ISC", "dependencies": { "axios": "^1.2.6", + "mongodb": "^3.6.3", "cors": "^2.8.5", "epg-parser": "^0.1.6", "express": "^4.18.2", From d03c66317aa5e795d4009061829ccdd1a3eb51fb Mon Sep 17 00:00:00 2001 From: Ashish Raj Date: Sun, 10 Nov 2024 20:00:58 +1300 Subject: [PATCH 2/7] Update url --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 96f3787..c9572ac 100644 --- a/index.js +++ b/index.js @@ -12,7 +12,7 @@ const originUrl = process.env.CLIENT_URL ? process.env.CLIENT_URL : isDev ? "http://localhost:4200" - : "http://localhost:4200"; + : "https://iptvnator.vercel.app"; const mongoUri = isDev || !process.env.MONGO_URI ? "mongodb://192.168.0.89:27017/iptvnator" : process.env.MONGO_URI; const dbName = isDev || !process.env.MONGO_DB_NAME ? "iptvnator" : process.env.MONGO_DB_NAME; From b83f1268027fcd6198acfadc09633d643b17d4d2 Mon Sep 17 00:00:00 2001 From: Ashish Raj Date: Sun, 10 Nov 2024 20:11:55 +1300 Subject: [PATCH 3/7] Remove cors change --- index.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/index.js b/index.js index c9572ac..438f34e 100644 --- a/index.js +++ b/index.js @@ -31,12 +31,6 @@ const corsOptions = { }; app.use(express.json()); -app.use((req, res, next) => { - res.header("Access-Control-Allow-Origin", originUrl); - res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); - res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); - next(); -}); const https = require("https"); const agent = new https.Agent({ From f0e2bbcbe5a014b96f150c681fe3c3a5a82b06a3 Mon Sep 17 00:00:00 2001 From: Ashish Raj Date: Sun, 10 Nov 2024 20:13:20 +1300 Subject: [PATCH 4/7] add debug statements --- index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/index.js b/index.js index 438f34e..b3d1bfc 100644 --- a/index.js +++ b/index.js @@ -14,6 +14,9 @@ const originUrl = process.env.CLIENT_URL ? "http://localhost:4200" : "https://iptvnator.vercel.app"; +console.log(`Development mode: ${isDev}`); +console.log(`Origin URL: ${originUrl}`); + const mongoUri = isDev || !process.env.MONGO_URI ? "mongodb://192.168.0.89:27017/iptvnator" : process.env.MONGO_URI; const dbName = isDev || !process.env.MONGO_DB_NAME ? "iptvnator" : process.env.MONGO_DB_NAME; const collectionName = isDev || !process.env.MONGO_COLLECTION_NAME ? "playlists" : process.env.MONGO_COLLECTION_NAME; From c6135c46271e1fcfd6372ff75030b4a1d0cda8e0 Mon Sep 17 00:00:00 2001 From: Ashish Raj Date: Sun, 10 Nov 2024 21:22:44 +1300 Subject: [PATCH 5/7] Allow manual run --- .github/workflows/docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 3f401e3..2d8b129 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -4,6 +4,7 @@ on: push: branches: - "master" + workflow_dispatch: jobs: build: From 51c80bbb7282aa01ecfe01e5cb75c2d6b5e48864 Mon Sep 17 00:00:00 2001 From: Ashish Raj Date: Sun, 10 Nov 2024 22:24:25 +1300 Subject: [PATCH 6/7] Add db check service --- index.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index b3d1bfc..dcbbd8e 100644 --- a/index.js +++ b/index.js @@ -17,9 +17,9 @@ const originUrl = process.env.CLIENT_URL console.log(`Development mode: ${isDev}`); console.log(`Origin URL: ${originUrl}`); -const mongoUri = isDev || !process.env.MONGO_URI ? "mongodb://192.168.0.89:27017/iptvnator" : process.env.MONGO_URI; -const dbName = isDev || !process.env.MONGO_DB_NAME ? "iptvnator" : process.env.MONGO_DB_NAME; -const collectionName = isDev || !process.env.MONGO_COLLECTION_NAME ? "playlists" : process.env.MONGO_COLLECTION_NAME; +const mongoUri = isDev ? "mongodb://localhost/iptvnator" : process.env.MONGO_URI || ""; +const dbName = isDev ? "iptvnator" : process.env.MONGO_DB_NAME || ""; +const collectionName = isDev ? "playlists" : process.env.MONGO_COLLECTION_NAME || ""; console.log(`dbName: ${dbName}`); console.log(`mongoUri: ${mongoUri}`); @@ -84,6 +84,22 @@ app.get("/xtream", cors(corsOptions), async (req, res) => { }); }); +// New route to check the database connection status +app.get("/check-db-connection", cors(corsOptions), async (req, res) => { + + if (!mongoUri || !dbName || !collectionName) { + return res.status(200).send({ status: "error", message: "Database is not enabled" }); + } + + try { + await dbService.connect(); + res.status(200).send({ status: "success", message: "Database is enabled" }); + } catch (error) { + console.error('Error connecting to MongoDB:', error); + res.status(200).send({ status: "error", message: "Database is not enabled", error: error.message }); + } +}); + // New route to add multiple playlists app.post("/addManyPlaylists", cors(corsOptions), async (req, res) => { try { From fb4075a0891a1a2c9d6fe6bdbb3975295ccd4658 Mon Sep 17 00:00:00 2001 From: Ashish Raj Date: Sun, 10 Nov 2024 22:26:25 +1300 Subject: [PATCH 7/7] Update db uri --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index dcbbd8e..813eec5 100644 --- a/index.js +++ b/index.js @@ -17,7 +17,7 @@ const originUrl = process.env.CLIENT_URL console.log(`Development mode: ${isDev}`); console.log(`Origin URL: ${originUrl}`); -const mongoUri = isDev ? "mongodb://localhost/iptvnator" : process.env.MONGO_URI || ""; +const mongoUri = isDev ? "mongodb://localhost:27017/iptvnator" : process.env.MONGO_URI || ""; const dbName = isDev ? "iptvnator" : process.env.MONGO_DB_NAME || ""; const collectionName = isDev ? "playlists" : process.env.MONGO_COLLECTION_NAME || "";