🔧 Added DC++ search and download actions
This commit is contained in:
@@ -8,6 +8,7 @@ import { pubClient, subClient } from "../config/redis.config";
|
||||
const { MoleculerError } = require("moleculer").Errors;
|
||||
const SocketIOService = require("moleculer-io");
|
||||
const { v4: uuidv4 } = require("uuid");
|
||||
import AirDCPPSocket from "../shared/airdcpp.socket";
|
||||
|
||||
export default class SocketService extends Service {
|
||||
// @ts-ignore
|
||||
@@ -114,8 +115,200 @@ export default class SocketService extends Service {
|
||||
// {}
|
||||
// );
|
||||
},
|
||||
// AirDCPP Socket actions
|
||||
|
||||
search: {
|
||||
params: {
|
||||
query: "object",
|
||||
config: "object",
|
||||
},
|
||||
async handler(ctx) {
|
||||
const { query, config } = ctx.params;
|
||||
const ADCPPSocket = new AirDCPPSocket(config);
|
||||
try {
|
||||
await ADCPPSocket.connect();
|
||||
const instance = await ADCPPSocket.post(
|
||||
"search",
|
||||
query
|
||||
);
|
||||
|
||||
// Send the instance to the client
|
||||
await this.io.emit("searchInitiated", {
|
||||
instance,
|
||||
});
|
||||
|
||||
// Setting up listeners
|
||||
await ADCPPSocket.addListener(
|
||||
`search`,
|
||||
`search_result_added`,
|
||||
(groupedResult) => {
|
||||
this.io.emit(
|
||||
"searchResultAdded",
|
||||
groupedResult
|
||||
);
|
||||
},
|
||||
instance.id
|
||||
);
|
||||
|
||||
await ADCPPSocket.addListener(
|
||||
`search`,
|
||||
`search_result_updated`,
|
||||
(updatedResult) => {
|
||||
console.log("hi", updatedResult);
|
||||
this.io.emit(
|
||||
"searchResultUpdated",
|
||||
updatedResult
|
||||
);
|
||||
},
|
||||
instance.id
|
||||
);
|
||||
|
||||
await ADCPPSocket.addListener(
|
||||
`search`,
|
||||
`search_hub_searches_sent`,
|
||||
async (searchInfo) => {
|
||||
await this.sleep(5000);
|
||||
const currentInstance =
|
||||
await ADCPPSocket.get(
|
||||
`search/${instance.id}`
|
||||
);
|
||||
// Send the instance to the client
|
||||
await this.io.emit("searchesSent", {
|
||||
searchInfo,
|
||||
});
|
||||
if (currentInstance.result_count === 0) {
|
||||
console.log("No more search results.");
|
||||
this.io.emit("searchComplete", {
|
||||
message: "No more search results.",
|
||||
});
|
||||
}
|
||||
},
|
||||
instance.id
|
||||
);
|
||||
|
||||
// Perform the actual search
|
||||
await ADCPPSocket.post(
|
||||
`search/${instance.id}/hub_search`,
|
||||
query
|
||||
);
|
||||
} catch (error) {
|
||||
await this.io.emit("searchError", error.message);
|
||||
throw new MoleculerError(
|
||||
"Search failed",
|
||||
500,
|
||||
"SEARCH_FAILED",
|
||||
{ error }
|
||||
);
|
||||
} finally {
|
||||
// await ADCPPSocket.disconnect();
|
||||
}
|
||||
},
|
||||
},
|
||||
download: {
|
||||
// params: {
|
||||
// searchInstanceId: "string",
|
||||
// resultId: "string",
|
||||
// comicObjectId: "string",
|
||||
// name: "string",
|
||||
// size: "number",
|
||||
// type: "any", // Define more specific type if possible
|
||||
// config: "object",
|
||||
// },
|
||||
async handler(ctx) {
|
||||
console.log(ctx.params);
|
||||
const {
|
||||
searchInstanceId,
|
||||
resultId,
|
||||
config,
|
||||
comicObjectId,
|
||||
name,
|
||||
size,
|
||||
type,
|
||||
} = ctx.params;
|
||||
const ADCPPSocket = new AirDCPPSocket(config);
|
||||
try {
|
||||
await ADCPPSocket.connect();
|
||||
const downloadResult = await ADCPPSocket.post(
|
||||
`search/${searchInstanceId}/results/${resultId}/download`
|
||||
);
|
||||
|
||||
if (downloadResult && downloadResult.bundle_info) {
|
||||
// Assume bundle_info is part of the response and contains the necessary details
|
||||
const bundleDBImportResult = await ctx.call(
|
||||
"library.applyAirDCPPDownloadMetadata",
|
||||
{
|
||||
bundleId: downloadResult.bundle_info.id,
|
||||
comicObjectId,
|
||||
name,
|
||||
size,
|
||||
type,
|
||||
}
|
||||
);
|
||||
|
||||
this.logger.info(
|
||||
"Download and metadata update successful",
|
||||
bundleDBImportResult
|
||||
);
|
||||
this.broker.emit(
|
||||
"downloadCompleted",
|
||||
bundleDBImportResult
|
||||
);
|
||||
return bundleDBImportResult;
|
||||
} else {
|
||||
throw new Error(
|
||||
"Failed to download or missing download result information"
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
this.broker.emit("downloadError", error.message);
|
||||
throw new MoleculerError(
|
||||
"Download failed",
|
||||
500,
|
||||
"DOWNLOAD_FAILED",
|
||||
{ error }
|
||||
);
|
||||
} finally {
|
||||
// await ADCPPSocket.disconnect();
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
listenBundleTick: {
|
||||
async handler(ctx) {
|
||||
const { config } = ctx.params;
|
||||
const ADCPPSocket = new AirDCPPSocket(config);
|
||||
|
||||
try {
|
||||
await ADCPPSocket.connect();
|
||||
console.log("Connected to AirDCPP successfully.");
|
||||
|
||||
ADCPPSocket.addListener(
|
||||
"queue",
|
||||
"queue_bundle_tick",
|
||||
(tickData) => {
|
||||
console.log(
|
||||
"Received tick data: ",
|
||||
tickData
|
||||
);
|
||||
this.io.emit("bundleTickUpdate", tickData);
|
||||
},
|
||||
null
|
||||
); // Assuming no specific ID is needed here
|
||||
} catch (error) {
|
||||
console.error(
|
||||
"Error connecting to AirDCPP or setting listener:",
|
||||
error
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
sleep: (ms: number): Promise<NodeJS.Timeout> => {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
},
|
||||
},
|
||||
methods: {},
|
||||
async started() {
|
||||
this.io.on("connection", async (socket) => {
|
||||
console.log(
|
||||
|
||||
Reference in New Issue
Block a user