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
JavaScript
;
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