diff --git a/.gitignore b/.gitignore index 439ac59..c148fce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # Feed feed .DS_Store -package-lock.json # Logs logs diff --git a/README.md b/README.md index b96bc70..c16cfae 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ next post automatically. ``` fairpost.js help -fairpost.js get-feed [--config=xxx] +fairpost.js get-feed fairpost.js get-folders [--folders=xxx,xxx] fairpost.js prepare-posts [--platforms=xxx,xxx] [--folders=xxx,xxx] fairpost.js get-posts [--status=xxx] [--platforms=xxx,xxx] [--folders=xxx,xxx] @@ -83,6 +83,18 @@ fairpost.js schedule-next-post [--date=xxxx-xx-xx] [--platforms=xxx,xxx] [--fold fairpost.js publish-due-posts [--platforms=xxx,xxx] [--folders=xxx,xxx] [--dry-run] ``` +### Common arguments + +``` +# Select which config file to use +fairpost.js [command] [arguments] --config=.env-test + +# Set the cli output format to pure json +fairpost.js [command] [arguments] --report=json + +``` + + ## Add a new platform To add support for a new platform, add a class to `src/platforms` diff --git a/index.ts b/index.ts index 030d167..0b36ee7 100644 --- a/index.ts +++ b/index.ts @@ -3,8 +3,8 @@ Fairpost cli handler */ -import Feed from './src/classes/Feed'; -import { PostStatus } from './src/classes/Post'; +import Feed from './src/Feed'; +import { PostStatus } from './src/Post'; import { PlatformSlug } from './src/platforms'; // arguments @@ -13,6 +13,7 @@ const COMMAND = process.argv[2] ?? 'help' // options const DRY_RUN = !!getOption('dry-run') ?? false; const CONFIG = (getOption('config') as string ) ?? '.env'; +const REPORT = (getOption('report') as string ) ?? 'text'; const PLATFORMS = (getOption('platforms') as string)?.split(',') as PlatformSlug[] ?? undefined; const FOLDERS = (getOption('folders') as string)?.split(',') ?? undefined; const DATE = (getOption('date') as string) ?? undefined; @@ -32,61 +33,100 @@ function getOption(key:string):boolean|string|null { /* main */ async function main() { + let result: any = ''; + let report = ''; + const feed = new Feed(CONFIG); - console.log('Fairpost '+feed.path+' starting .. ',DRY_RUN?'dry-run':''); - console.log(); + report += 'Fairpost '+feed.path+' starting .. ',DRY_RUN?'dry-run':''; + report += '\n'; - let result: any = ''; - switch(COMMAND) { - case 'get-feed': - result = feed; - break; - case 'get-platforms': - result = feed.getPlatforms(PLATFORMS); - break; - case 'get-folders': - result = feed.getFolders(FOLDERS); - break; - case 'get-posts': - result = feed.getPosts({ - paths:FOLDERS, - platforms:PLATFORMS, - status: STATUS - }); - break; - case 'prepare-posts': - result = await feed.preparePosts({ - paths:FOLDERS, - platforms:PLATFORMS - }); - break; - case 'schedule-next-posts': - result = feed.scheduleNextPosts(DATE ? new Date(DATE): undefined,{ - paths:FOLDERS, - platforms:PLATFORMS - }); - break; - case 'publish-due-posts': - result = await feed.publishDuePosts({ - paths:FOLDERS, - platforms:PLATFORMS - }, DRY_RUN); - break; - default: - const cmd = process.argv[1]; - console.log(` -${cmd} help -${cmd} get-feed [--config=xxx] -${cmd} get-platforms [--platforms=xxx,xxx] -${cmd} get-folders [--folders=xxx,xxx] -${cmd} prepare-posts [--platforms=xxx,xxx] [--folders=xxx,xxx] -${cmd} get-posts [--status=xxx] [--platforms=xxx,xxx] [--folders=xxx,xxx] -${cmd} schedule-next-post [--date=xxxx-xx-xx] [--platforms=xxx,xxx] [--folders=xxx,xxx] -${cmd} publish-due-posts [--platforms=xxx,xxx] [--folders=xxx,xxx] [--dry-run] - `); + try { + switch(COMMAND) { + case 'get-feed': + result = feed; + report = 'Feed: '+feed.path; + break; + case 'get-platforms': + const platforms = feed.getPlatforms(PLATFORMS); + platforms.forEach(platform => { + report += 'Platform: '+platform.slug+'\n'; + }); + result = platforms; + break; + case 'get-folders': + const folders = feed.getFolders(FOLDERS); + folders.forEach(folder => { + report += 'Folder: '+folder.path+'\n'; + }); + result = folders; + break; + case 'get-posts': + const allposts = feed.getPosts({ + paths:FOLDERS, + platforms:PLATFORMS, + status: STATUS + }); + allposts.forEach(post => { + report += post.report(); + }); + result = allposts; + break; + case 'prepare-posts': + const prepposts = await feed.preparePosts({ + paths:FOLDERS, + platforms:PLATFORMS + }); + prepposts.forEach(post => { + report += post.report(); + }); + result = prepposts; + break; + case 'schedule-next-posts': + const nextposts = feed.scheduleNextPosts(DATE ? new Date(DATE): undefined,{ + paths:FOLDERS, + platforms:PLATFORMS + }); + nextposts.forEach(post => { + report += post.report(); + }); + result = nextposts; + break; + case 'publish-due-posts': + const pubposts = await feed.publishDuePosts({ + paths:FOLDERS, + platforms:PLATFORMS + }, DRY_RUN); + pubposts.forEach(post => { + report += post.report(); + }); + result = nextposts; + break; + default: + const cmd = process.argv[1]; + result = [ + `${cmd} help`, + `${cmd} get-feed [--config=xxx]`, + `${cmd} get-platforms [--platforms=xxx,xxx]`, + `${cmd} get-folders [--folders=xxx,xxx]`, + `${cmd} prepare-posts [--platforms=xxx,xxx] [--folders=xxx,xxx]`, + `${cmd} get-posts [--status=xxx] [--platforms=xxx,xxx] [--folders=xxx,xxx]`, + `${cmd} schedule-next-post [--date=xxxx-xx-xx] [--platforms=xxx,xxx] [--folders=xxx,xxx]`, + `${cmd} publish-due-posts [--platforms=xxx,xxx] [--folders=xxx,xxx] [--dry-run]` + ]; + result.forEach(line => report += '\n'+line); + } + } catch (e) { + console.error(e.getMessage()); + } + + switch(REPORT) { + case 'json': + console.log(JSON.stringify(result,null,'\t')); + break; + default: + console.log(report); } - console.log(JSON.stringify(result,null,'\t')); } diff --git a/package-lock.json b/package-lock.json index 7f174dd..26bb308 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "dotenv": "^16.0.3", "node-fetch": "^2.6.7", - "sharp": "^0.31.1" + "sharp": "0.31.1" }, "devDependencies": { "ts-node": "^10.9.1", @@ -507,16 +507,16 @@ } }, "node_modules/sharp": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz", - "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.1.tgz", + "integrity": "sha512-GR8M1wBwOiFKLkm9JPun27OQnNRZdHfSf9VwcdZX6UrRmM1/XnOrLFTF0GAil+y/YK4E6qcM/ugxs80QirsHxg==", "hasInstallScript": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.1", "node-addon-api": "^5.0.0", "prebuild-install": "^7.1.1", - "semver": "^7.3.8", + "semver": "^7.3.7", "simple-get": "^4.0.1", "tar-fs": "^2.1.1", "tunnel-agent": "^0.6.0" @@ -1083,15 +1083,15 @@ } }, "sharp": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz", - "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.1.tgz", + "integrity": "sha512-GR8M1wBwOiFKLkm9JPun27OQnNRZdHfSf9VwcdZX6UrRmM1/XnOrLFTF0GAil+y/YK4E6qcM/ugxs80QirsHxg==", "requires": { "color": "^4.2.3", "detect-libc": "^2.0.1", "node-addon-api": "^5.0.0", "prebuild-install": "^7.1.1", - "semver": "^7.3.8", + "semver": "^7.3.7", "simple-get": "^4.0.1", "tar-fs": "^2.1.1", "tunnel-agent": "^0.6.0" diff --git a/package.json b/package.json index ea3fd44..09a3c62 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,10 @@ "dependencies": { "dotenv": "^16.0.3", "node-fetch": "^2.6.7", - "sharp": "^0.31.1" + "sharp": "0.31.1" + }, + "devDependencies": { + "ts-node": "^10.9.1", + "typescript": "^5.0.4" } } diff --git a/src/classes/Feed.ts b/src/Feed.ts similarity index 97% rename from src/classes/Feed.ts rename to src/Feed.ts index 56a1824..a78f119 100644 --- a/src/classes/Feed.ts +++ b/src/Feed.ts @@ -6,8 +6,8 @@ import Platform from "./Platform"; import Folder from "./Folder"; import Post from "./Post"; import { PostStatus } from "./Post"; -import * as platforms from '../platforms'; -import { PlatformSlug } from '../platforms'; +import * as platforms from './platforms'; +import { PlatformSlug } from './platforms'; export default class Feed { @@ -20,7 +20,7 @@ export default class Feed { constructor(configPath?: string) { if (configPath) { - const configPathResolved = path.resolve(__dirname+'/../../../'+configPath); + const configPathResolved = path.resolve(__dirname+'/../../'+configPath); dotenv.config({ path:configPathResolved }); } else { dotenv.config(); @@ -33,7 +33,7 @@ export default class Feed { this.interval = Number(process.env.FAIRPOST_FEED_INTERVAL ?? 7); const activePlatformSlugs = process.env.FAIRPOST_FEED_PLATFORMS.split(','); - const platformClasses = fs.readdirSync(path.resolve(__dirname+'/../platforms')); + const platformClasses = fs.readdirSync(path.resolve(__dirname+'/platforms')); platformClasses.forEach(file=> { const constructor = file.replace('.ts','').replace('.js',''); if (platforms[constructor] !== undefined) { diff --git a/src/classes/Folder.ts b/src/Folder.ts similarity index 100% rename from src/classes/Folder.ts rename to src/Folder.ts diff --git a/src/classes/Platform.ts b/src/Platform.ts similarity index 98% rename from src/classes/Platform.ts rename to src/Platform.ts index 2f0458e..1a81b8e 100644 --- a/src/classes/Platform.ts +++ b/src/Platform.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import Folder from "./Folder"; import Post from "./Post"; import { PostStatus } from "./Post"; -import { PlatformSlug } from "../platforms"; +import { PlatformSlug } from "./platforms"; diff --git a/src/classes/Post.ts b/src/Post.ts similarity index 81% rename from src/classes/Post.ts rename to src/Post.ts index 92f0876..081eecf 100644 --- a/src/classes/Post.ts +++ b/src/Post.ts @@ -56,6 +56,16 @@ export default class Post { this.save(); } + report(): string { + let report = ''; + report += '\nPost: '+this.platform.slug+' : '+this.folder.path; + report += '\n - valid: '+this.valid; + report += '\n - status: '+this.status; + report += '\n - scheduled: '+this.scheduled; + report += '\n - posted: '+this.posted; + return report; + } + } export enum PostStatus { diff --git a/src/platforms/AsFacebook.ts b/src/platforms/AsFacebook.ts index 24bc0b5..17a1105 100644 --- a/src/platforms/AsFacebook.ts +++ b/src/platforms/AsFacebook.ts @@ -1,8 +1,8 @@ import Ayrshare from "./Ayrshare"; import { PlatformSlug } from "."; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; +import Folder from "../Folder"; +import Post from "../Post"; import * as fs from 'fs'; import * as sharp from 'sharp'; diff --git a/src/platforms/AsInstagram.ts b/src/platforms/AsInstagram.ts index f5d2467..425943c 100644 --- a/src/platforms/AsInstagram.ts +++ b/src/platforms/AsInstagram.ts @@ -1,8 +1,8 @@ import Ayrshare from "./Ayrshare"; import { PlatformSlug } from "."; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; +import Folder from "../Folder"; +import Post from "../Post"; import * as sharp from 'sharp'; export default class AsInstagram extends Ayrshare { diff --git a/src/platforms/AsLinkedIn.ts b/src/platforms/AsLinkedIn.ts index d53c6a2..cd2fd6a 100644 --- a/src/platforms/AsLinkedIn.ts +++ b/src/platforms/AsLinkedIn.ts @@ -1,8 +1,8 @@ import Ayrshare from "./Ayrshare"; import { PlatformSlug } from "."; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; +import Folder from "../Folder"; +import Post from "../Post"; import * as fs from 'fs'; import * as sharp from 'sharp'; diff --git a/src/platforms/AsReddit.ts b/src/platforms/AsReddit.ts index 0b639ec..fa80d19 100644 --- a/src/platforms/AsReddit.ts +++ b/src/platforms/AsReddit.ts @@ -1,8 +1,8 @@ import Ayrshare from "./Ayrshare"; import { PlatformSlug } from "."; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; +import Folder from "../Folder"; +import Post from "../Post"; export default class AsReddit extends Ayrshare { slug = PlatformSlug.ASREDDIT; diff --git a/src/platforms/AsTikTok.ts b/src/platforms/AsTikTok.ts index 57fb237..12cd2a3 100644 --- a/src/platforms/AsTikTok.ts +++ b/src/platforms/AsTikTok.ts @@ -1,8 +1,8 @@ import Ayrshare from "./Ayrshare"; import { PlatformSlug } from "."; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; +import Folder from "../Folder"; +import Post from "../Post"; export default class AsTikTok extends Ayrshare { slug = PlatformSlug.ASTIKTOK; diff --git a/src/platforms/AsTwitter.ts b/src/platforms/AsTwitter.ts index b1dd9b0..9a35071 100644 --- a/src/platforms/AsTwitter.ts +++ b/src/platforms/AsTwitter.ts @@ -1,8 +1,8 @@ import Ayrshare from "./Ayrshare"; import { PlatformSlug } from "."; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; +import Folder from "../Folder"; +import Post from "../Post"; import * as fs from 'fs'; import * as sharp from 'sharp'; diff --git a/src/platforms/AsYouTube.ts b/src/platforms/AsYouTube.ts index e3cf37a..e74513c 100644 --- a/src/platforms/AsYouTube.ts +++ b/src/platforms/AsYouTube.ts @@ -1,8 +1,8 @@ import Ayrshare from "./Ayrshare"; import { PlatformSlug } from "."; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; +import Folder from "../Folder"; +import Post from "../Post"; export default class AsYouTube extends Ayrshare { slug = PlatformSlug.ASYOUTUBE; diff --git a/src/platforms/Ayrshare.ts b/src/platforms/Ayrshare.ts index 673abce..7d0e7b1 100644 --- a/src/platforms/Ayrshare.ts +++ b/src/platforms/Ayrshare.ts @@ -3,10 +3,10 @@ import * as fs from 'fs'; import * as path from 'path'; import { randomUUID } from 'crypto'; import { PlatformSlug } from "."; -import Platform from "../classes/Platform"; -import Folder from "../classes/Folder"; -import Post from "../classes/Post"; -import { PostStatus } from "../classes/Post"; +import Platform from "../Platform"; +import Folder from "../Folder"; +import Post from "../Post"; +import { PostStatus } from "../Post"; interface AyrshareResult { success: boolean;