From 1fa35ac0e368d3ad6a760e0da4db2053c2671e36 Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Thu, 9 May 2024 13:49:26 -0400 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F=20Automatic=20downloa?= =?UTF-8?q?ds=20endpoint=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/comic.model.ts | 2 ++ package-lock.json | 6 ++-- services/airdcpp.service.ts | 60 +++++++++++++++++++++++++++++++++++-- services/socket.service.ts | 43 +++++++++++++++++--------- 4 files changed, 92 insertions(+), 19 deletions(-) diff --git a/models/comic.model.ts b/models/comic.model.ts index 0897268..0a8a0b3 100644 --- a/models/comic.model.ts +++ b/models/comic.model.ts @@ -67,6 +67,8 @@ const wantedSchema = mongoose.Schema( id: Number, url: String, image: { type: Array, default: [] }, + coverDate: String, + issueNumber: String, }, ], default: null, diff --git a/package-lock.json b/package-lock.json index 53719f3..671a70b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13921,9 +13921,9 @@ } }, "node_modules/r2-shared-js": { - "version": "1.0.72", - "resolved": "https://registry.npmjs.org/r2-shared-js/-/r2-shared-js-1.0.72.tgz", - "integrity": "sha512-aP0M8uqnyLtJ5TZkNx+q4fgVZbjmuhFQPL/N5Qd6W6ybCozZgiQc+FYZOqu1vdsNaYw0FaMzYlp0/DH6m3TdYA==", + "version": "1.0.74", + "resolved": "https://registry.npmjs.org/r2-shared-js/-/r2-shared-js-1.0.74.tgz", + "integrity": "sha512-aNk8kkb4W9nMKKXrzTC76AXOVSLUx78V73hk4DJ7g81M3gfX2FZQD63Tohgt7VSAbVBdKy/7wo6KOBNFN8Kvow==", "hasInstallScript": true, "dependencies": { "@xmldom/xmldom": "^0.8.10", diff --git a/services/airdcpp.service.ts b/services/airdcpp.service.ts index 2776d5c..f3cf043 100644 --- a/services/airdcpp.service.ts +++ b/services/airdcpp.service.ts @@ -58,6 +58,7 @@ export default class AirDCPPService extends Service { }, getHubs: { rest: "POST /getHubs", + timeout: 70000, handler: async ( ctx: Context<{ host: { @@ -69,7 +70,6 @@ export default class AirDCPPService extends Service { }; }> ) => { - console.log(ctx.params); const { host: { hostname, @@ -93,8 +93,64 @@ export default class AirDCPPService extends Service { } }, }, + search: { + rest: "POST /search", + timeout: 20000, + handler: async ( + ctx: Context<{ + host: { + hostname; + port; + protocol; + username; + password; + }; + dcppSearchQuery; + }> + ) => { + try { + const { + host: { + hostname, + port, + protocol, + username, + password, + }, + dcppSearchQuery, + } = ctx.params; + const airDCPPSocket = new AirDCPPSocket({ + protocol, + hostname: `${hostname}:${port}`, + username, + password, + }); + await airDCPPSocket.connect(); + const searchInstance = await airDCPPSocket.post( + `search` + ); + + // Post the search + const searchInfo = await airDCPPSocket.post( + `search/${searchInstance.id}/hub_search`, + dcppSearchQuery + ); + await this.sleep(10000); + const results = await airDCPPSocket.get( + `search/${searchInstance.id}/results/0/5` + ); + return results; + } catch (err) { + throw err; + } + }, + }, + }, + methods: { + sleep: (ms: number) => { + return new Promise((resolve) => setTimeout(resolve, ms)); + }, }, - methods: {}, }); } } diff --git a/services/socket.service.ts b/services/socket.service.ts index 6bdd6bd..6871b11 100644 --- a/services/socket.service.ts +++ b/services/socket.service.ts @@ -24,10 +24,12 @@ export default class SocketService extends Service { port: process.env.PORT || 3001, io: { namespaces: { - "/": { + "/automated": { events: { call: { - whitelist: ["socket.*"], + whitelist: [ + "socket.*", // Allow 'search' in the automated namespace + ], }, }, }, @@ -123,8 +125,12 @@ export default class SocketService extends Service { config: "object", }, async handler(ctx) { - const { query, config } = ctx.params; + console.log("a, a kanha kanha..."); + + const { query, config, namespace } = ctx.params; + const namespacedInstance = this.io.of(namespace || "/"); const ADCPPSocket = new AirDCPPSocket(config); + console.log("asdas", ADCPPSocket); try { await ADCPPSocket.connect(); const instance = await ADCPPSocket.post( @@ -133,7 +139,7 @@ export default class SocketService extends Service { ); // Send the instance to the client - await this.io.emit("searchInitiated", { + await namespacedInstance.emit("searchInitiated", { instance, }); @@ -142,7 +148,7 @@ export default class SocketService extends Service { `search`, `search_result_added`, (groupedResult) => { - this.io.emit( + namespacedInstance.emit( "searchResultAdded", groupedResult ); @@ -154,8 +160,7 @@ export default class SocketService extends Service { `search`, `search_result_updated`, (updatedResult) => { - console.log("hi", updatedResult); - this.io.emit( + namespacedInstance.emit( "searchResultUpdated", updatedResult ); @@ -173,14 +178,21 @@ export default class SocketService extends Service { `search/${instance.id}` ); // Send the instance to the client - await this.io.emit("searchesSent", { - searchInfo, - }); + await namespacedInstance.emit( + "searchesSent", + { + searchInfo, + } + ); if (currentInstance.result_count === 0) { console.log("No more search results."); - this.io.emit("searchComplete", { - message: "No more search results.", - }); + namespacedInstance.emit( + "searchComplete", + { + message: + "No more search results.", + } + ); } }, instance.id @@ -192,7 +204,10 @@ export default class SocketService extends Service { query ); } catch (error) { - await this.io.emit("searchError", error.message); + await namespacedInstance.emit( + "searchError", + error.message + ); throw new MoleculerError( "Search failed", 500, From 402ee4d81bc6e1f3d41add05161e3865d68c8327 Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Fri, 10 May 2024 22:55:57 -0400 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=8F=97=EF=B8=8F=20Updated=20Dockerfil?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 63 ++++++++++++++++++++++----------- services/torrentjobs.service.ts | 4 +-- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index 299c00b..4c2f202 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,40 +1,61 @@ -FROM alpine:3.14 +# Use a base image with Node.js 22.1.0 +FROM node:22.1.0 + +# Set metadata for contact LABEL maintainer="Rishi Ghan " -# Show all node logs +# Set environment variables ENV NPM_CONFIG_LOGLEVEL warn ENV NODE_ENV=production + +# Set the working directory WORKDIR /core-services +# Install required packages +RUN apt-get update && apt-get install -y \ + libvips-tools \ + wget \ + imagemagick \ + python3 \ + xvfb \ + xz-utils \ + curl \ + bash \ + software-properties-common -RUN apk add --update \ - --repository http://nl.alpinelinux.org/alpine/v3.14/main \ - vips-tools \ - wget \ - imagemagick \ - python3 \ - unrar \ - p7zip \ - nodejs \ - npm \ - xvfb \ - xz +# Install p7zip +RUN apt-get update && apt-get install -y p7zip +# Install unrar directly from RARLAB +RUN wget https://www.rarlab.com/rar/rarlinux-x64-621.tar.gz \ + && tar -zxvf rarlinux-x64-621.tar.gz \ + && cp rar/unrar /usr/bin/ \ + && rm -rf rarlinux-x64-621.tar.gz rar + +# Clean up package lists +RUN rm -rf /var/lib/apt/lists/* + +# Verify Node.js installation +RUN node -v && npm -v + +# Copy application configuration files COPY package.json package-lock.json ./ COPY moleculer.config.ts ./ COPY tsconfig.json ./ -RUN npm i -# Install Dependncies +# Install application dependencies +RUN npm install RUN npm install -g typescript ts-node +# Copy the rest of the application files COPY . . -# Build and cleanup +# Build and clean up RUN npm run build \ - && npm prune - + && npm prune +# Expose the application's port EXPOSE 3000 -# Start server -CMD ["npm", "start"] \ No newline at end of file + +# Command to run the application +CMD ["npm", "start"] diff --git a/services/torrentjobs.service.ts b/services/torrentjobs.service.ts index 5cfc5da..c9cdf73 100644 --- a/services/torrentjobs.service.ts +++ b/services/torrentjobs.service.ts @@ -15,7 +15,7 @@ export default class ImageTransformation extends Service { // @ts-ignore public constructor( public broker: ServiceBroker, - schema: ServiceSchema<{}> = { name: "imagetransformation" } + schema: ServiceSchema<{}> = { name: "torrentjobs" } ) { super(broker); this.parseServiceSchema({ @@ -77,7 +77,7 @@ export default class ImageTransformation extends Service { "qbittorrent.getTorrentRealTimeStats", { infoHashes } ); - // 4. Emit the LS_COVER_EXTRACTION_FAILED event with the necessary details + // 4. await this.broker.call("socket.broadcast", { namespace: "/", event: "AS_TORRENT_DATA",