UNPKG

motionlink-cli

Version:

Making it easy to use Notion as a Content Management system for personal websites, portfolios, blogs, business homepages, and other kinds of static websites.

113 lines 4.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MediaDestinationController = void 0; const pathUtils = __importStar(require("path")); const urlUtils = __importStar(require("url")); const request_1 = __importDefault(require("request")); const fs = __importStar(require("fs")); const media_types_1 = __importDefault(require("../constants/media_types")); const file_system_service_1 = __importDefault(require("./file_system_service")); const file_name_service_1 = __importDefault(require("./file_name_service")); /** * A service for fetching media assets from given Notion URLs. * * Uses Collect-Commit pattern. */ class MediaService { constructor() { this.requests = new Map(); } stageFetchRequest(url, templateRule) { const destinationController = new MediaDestinationController({ forRule: templateRule, }); const relativeDestination = destinationController.makeFileDestinationForAssetWithUrl(url); const absPath = MediaDestinationController.getAbsoluteDestinationPath(templateRule.outDir, templateRule.writeMediaTo, relativeDestination); this.requests.set(url, { relativePath: relativeDestination, absolutePath: absPath, }); return relativeDestination; } async commit() { const promises = new Array(); for (const [url, destinationPath] of this.requests) { promises.push(new Promise((resolve, reject) => { const destination = fs.createWriteStream(destinationPath.absolutePath); (0, request_1.default)(url).pipe(destination).on('error', reject).on('finish', resolve); })); } await Promise.all(promises); } static get instance() { var _a; return (_a = this._instance) !== null && _a !== void 0 ? _a : (this._instance = new MediaService()); } static setMockedInstance(instance) { this._instance = instance; } } exports.default = MediaService; class MediaDestinationController { constructor(args) { this.templateRule = args.forRule; } makeFileDestinationForAssetWithUrl(url) { const subfolderName = this.getSubfolderNameForUrl(url); const filename = this.genUniqueBasename(url); const parentFolder = MediaDestinationController.getAbsoluteDestinationPath(this.templateRule.outDir, this.templateRule.writeMediaTo, subfolderName); if (!file_system_service_1.default.instance.doesFolderExist(parentFolder)) file_system_service_1.default.instance.createFolder(parentFolder); return `${subfolderName}/${filename}`; } static getAbsoluteDestinationPath(outDir, writeMediaTo, subfolderName) { return Boolean(writeMediaTo) ? `${writeMediaTo}/${subfolderName}` : `${outDir}/${subfolderName}`; } getSubfolderNameForUrl(url) { const fileExtension = pathUtils.extname(new urlUtils.URL(url).pathname); for (const [folderName, acceptedExtensions] of Object.entries(media_types_1.default)) { const acceptsExtension = acceptedExtensions.indexOf(fileExtension) >= 0; if (acceptsExtension) return folderName; } return 'other_media'; } genUniqueBasename(url) { const basename = this.getUrlBasename(url); const fileExtensionStartIndex = basename.lastIndexOf('.'); const uniqueName = file_name_service_1.default.instance.genUnique(); if (fileExtensionStartIndex < 0) { return uniqueName; } else { return `${uniqueName}${basename.substring(fileExtensionStartIndex)}`; } } getUrlBasename(url) { return pathUtils.basename(new urlUtils.URL(url).pathname); } } exports.MediaDestinationController = MediaDestinationController; //# sourceMappingURL=media_service.js.map