Added multi-user support.

This commit is contained in:
DebaucheryLibrarian 2024-09-11 05:16:53 +02:00
parent e6425b3e3c
commit 67d573952b
3 changed files with 55 additions and 23 deletions

View File

@ -9,9 +9,14 @@ reddit-post-dump requires a arbitrarily recent version of Node.js. Before use, d
`node app.js --user={username}` `node app.js --user={username}`
### Optional parameters ### Optional parameters
* `--limit={number}`: Maximum amount posts to fetch content from * `--users={user1,user2}`: You may fetch posts from multiple users by either supplying a comma-separated list of usernames (no spaces) with `--users`, or using multiple individual `--user` arguments
* `--limit={number}`: Maximum amount posts per user to fetch content from
* `--sort={method}`: How posts should be sorted while fetched. This affects the `$postIndex` variable, and in combination with a `--limit` decides what posts will be included * `--sort={method}`: How posts should be sorted while fetched. This affects the `$postIndex` variable, and in combination with a `--limit` decides what posts will be included
### Examples
* `node app.js --user=ThePendulum`
* `node app.js --user=ThePendulum --limit=10 --sort=top`
## Configuration ## Configuration
The default configuration aims to be sensible, and the application may be used without any further tweaking. However, a multitude of options make this utility particularly powerful. The default configuration aims to be sensible, and the application may be used without any further tweaking. However, a multitude of options make this utility particularly powerful.

49
app.js
View File

@ -5,31 +5,34 @@ const util = require('util');
const yargs = require('yargs').argv; const yargs = require('yargs').argv;
const snoowrap = require('snoowrap'); const snoowrap = require('snoowrap');
const methods = require('./methods/methods.js'); const methods = require('./methods/methods.js');
const dissectLink = require('./dissectLink.js'); const curate = require('./curate.js');
const fetchContent = require('./fetchContent.js'); const fetchContent = require('./fetchContent.js');
const reddit = new snoowrap(config.reddit.api); const reddit = new snoowrap(config.reddit.api);
reddit.getUser(yargs.user).getSubmissions({ function getSubmissions(users) {
sort: yargs.sort || config.reddit.sort, return users.reduce((chain, user) => {
limit: yargs.limit || config.reddit.limit return chain.then(acc => {
}).then(submissions => { return reddit.getUser(user).getSubmissions({
const curatedPosts = submissions.map((submission, index) => { sort: yargs.sort || config.reddit.sort,
return { limit: yargs.limit || config.reddit.limit
id: submission.id, }).then(submissions => {
index: index, return acc.concat(submissions);
title: submission.title, });
text: submission.selftext, });
user: submission.author.name, }, Promise.resolve([]));
permalink: submission.permalink, };
url: submission.url,
datetime: submission.created_utc * 1000,
subreddit: submission.subreddit.display_name,
host: dissectLink(submission.url)
};
});
return Promise.all(curatedPosts.reduce((acc, post) => { Promise.resolve().then(() => {
if(yargs.user || yargs.users) {
const users = yargs.users ? yargs.users.split(',') : [].concat(yargs.user);
return getSubmissions(users);
}
return Promise.reject('Please supply at least one user with one or multiple --user, or --users!');
}).then(submissions => {
return Promise.all(curate(submissions).reduce((acc, post) => {
if(post.host && methods[post.host.method]) { if(post.host && methods[post.host.method]) {
acc = acc.concat(methods[post.host.method](post).then(content => { acc = acc.concat(methods[post.host.method](post).then(content => {
post.content = content; post.content = content;
@ -42,6 +45,8 @@ reddit.getUser(yargs.user).getSubmissions({
return acc; return acc;
}, [])); }, []));
}).then(posts => fetchContent(posts)).catch(error => { }).then(posts => {
console.error(error); return fetchContent(posts);
}).catch(error => {
return console.log('\x1b[33m%s\x1b[0m', error);
}); });

22
curate.js Normal file
View File

@ -0,0 +1,22 @@
'use strict';
const dissectLink = require('./dissectLink.js');
function curate(submissions) {
return submissions.map((submission, index) => {
return {
id: submission.id,
index: index,
title: submission.title,
text: submission.selftext,
user: submission.author.name,
permalink: submission.permalink,
url: submission.url,
datetime: submission.created_utc * 1000,
subreddit: submission.subreddit.display_name,
host: dissectLink(submission.url)
};
});
};
module.exports = curate;