const r2 = require('r2') const path = require('path') const fs = require('fs') const getPost = require('mediumexporter').getPost /** * function [fetchFromMedium] * @returns [string] status */ const fetchFromMedium = async (mediumUrl) => { console.info(`Fetching: ${mediumUrl}`); output = path.join(process.env.PWD, 'content') // use mediumexporter's getPost function to fetch a Medium post const post = await getPost(mediumUrl, { returnObject: true, output: output, }).catch((err) => { return { error: err, } }) // set output folder path // this is based on what mediumexporter chooses as the output folder outputFolder = path.join(output, post.slug) console.info(`Saving to: ${outputFolder}`) if (!fs.existsSync(path.join(outputFolder, post.slug))) { fs.mkdirSync(outputFolder, { recursive: true }) } // mediumexporter writes a plain .md file if the post has no media // if that is the case, we should create the subfolder manually // and copy the data there. if (fs.existsSync(path.join(output, post.slug + '.md'))) { fs.renameSync( path.join(output, post.slug + '.md'), path.join(outputFolder, 'index.md') ) } // generate metadata const metadata = JSON.stringify({ title: post.title, subtitle: post.subtitle, date: new Date(post.date), tags: post.tags, url: post.url, slug: post.slug, images: post.images, featuredImage: post.featuredImage, }) // write metadata to output folder fs.writeFileSync(path.join(outputFolder, 'metadata.json')) return post }; /** * function [pushToGhost] * @returns [string] status */ const pushToGhost = (postSlug) => { console.info('Pushing: ' + postSlug); }; /** * function [mediumToGhost] * @returns [string] status */ const mediumToGhost = (mediumUrl) => { console.info('Copying: ' + mediumUrl); }; async function fetchMediumJSON(mediumUrl) { console.debug(`Fetching: ${mediumUrl}`) const response = await fetch(mediumUrl) const text = await response.text() const json = await JSON.parse(text.substr(text.indexOf('{'))) return json; } /** * function [createUser] * @returns [string] status */ const generateUserData = async (mediumUsername, email) => { console.debug('Creating: @' + mediumUsername + '(email: ' + email + ')'); const mediumUrl = `https://medium.com/@${mediumUsername}/?format=json`; const json = await fetchMediumJSON(mediumUrl); if (!json.success) { console.error(`Error: ${json.error}`) return false } console.debug(`Name: ${json.payload.user.name}`) console.debug(`Bio: ${json.payload.user.bio}`) // Generate Ghost JSON const ghostData = { data: { users: [ { id: 1, slug: json.payload.user.username, bio: json.payload.user.bio, email: email, name: json.payload.user.name, } ] }, meta: { exported_on: new Date, version: '2.14.0' } } return(JSON.stringify(ghostData)) }; module.exports = { fetchFromMedium, pushToGhost, mediumToGhost, generateUserData, }