@ankimcp/anki-mcp-server
Version:
Model Context Protocol server for Anki - enables AI assistants to interact with your Anki flashcards
55 lines • 2.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.storeMediaFile = storeMediaFile;
const common_1 = require("@nestjs/common");
const media_validation_utils_1 = require("../../../../../utils/media-validation.utils.js");
const logger = new common_1.Logger("storeMediaFile");
async function storeMediaFile(params, client) {
const { data, path, url, deleteExisting = true } = params;
if (!data && !path && !url) {
throw new Error("One of the data, path, or url parameters is required");
}
const sources = [data, path, url].filter(Boolean);
if (sources.length > 1) {
throw new Error("Multiple sources (data, path, url) were given; exactly one is accepted.");
}
if (!params.filename || params.filename.trim() === "") {
throw new Error("Filename cannot be empty");
}
const filename = (0, media_validation_utils_1.sanitizeMediaFilename)(params.filename);
let validatedPath;
if (path) {
const { resolvedPath, mimeType } = (0, media_validation_utils_1.validateMediaFilePath)(path, (0, media_validation_utils_1.getMediaFilePathConfigFromEnv)());
validatedPath = resolvedPath;
logger.warn(`storeMediaFile path validation: resolved="${resolvedPath}", mime="${mimeType}"`);
}
if (url) {
const { hostname, resolvedIp } = await (0, media_validation_utils_1.validateMediaUrl)(url, (0, media_validation_utils_1.getMediaUrlConfigFromEnv)());
logger.warn(`storeMediaFile URL validation: hostname="${hostname}", resolvedIp="${resolvedIp}"`);
}
const prefixedWithUnderscore = filename.startsWith("_");
const ankiParams = {
filename,
deleteExisting,
};
if (data) {
ankiParams.data = data;
}
else if (validatedPath) {
ankiParams.path = validatedPath;
}
else if (url) {
ankiParams.url = url;
}
const result = await client.invoke("storeMediaFile", ankiParams);
if (!result) {
throw new Error("Failed to store media file");
}
return {
success: true,
filename: result,
message: `Successfully stored media file: ${result}`,
prefixedWithUnderscore,
};
}
//# sourceMappingURL=storeMediaFile.action.js.map