'use strict'; const config = require('config'); const Promise = require('bluebird'); const UrlPattern = require('url-pattern'); const interpolate = require('../interpolate'); const fetchItem = require('../fetch/item'); // const textToStream = require('./textToStream'); const save = require('./save'); const logger = require('../logger')(__filename); async function saveProfileImage(user, args) { if (!args.redownloadProfile && user.indexed.profile.image) { logger.verbose(`Ignoring already present profile image for '${user.name}' (https://reddit.com/user/${user.name})`); return user.indexed.profile.image; } if (config.library.profile.image && !user.fallback && !user.deleted) { const image = user.profile ? user.profile.image : user.image; if (config.library.profile.avoidAvatar && new UrlPattern('http(s)\\://(www.)redditstatic.com/avatars/:id(.:ext)(?:query)').match(image)) { logger.verbose(`Ignoring standard avatar profile image for '${user.name}' (https://reddit.com/user/${user.name})`); return null; } const filepath = interpolate( config.library.profile.image, { // pass profile image as item to interpolate extension variable url: image, }, null, null, null, user, ); try { const { protocol, hostname, pathname } = new URL(image); const stream = await fetchItem(`${protocol}//${hostname}${pathname}`, 0, { permalink: `https://reddit.com/user/${user.name}` }); const targets = await save(filepath, stream); return targets[0]; } catch (error) { logger.warn(`Could not save profile image for '${user.name}': ${error} (https://reddit.com/user/${user.name})`); return null; } } return null; } async function saveProfileDescription(user, args) { if (!args.redownloadProfile && user.indexed.profile.description) { logger.verbose(`Ignoring already present profile description for '${user.name}' (https://reddit.com/user/${user.name})`); return user.indexed.profile.description; } if (config.library.profile.description && !user.fallback && !user.deleted) { if (user.profile && user.profile.description) { const filepath = interpolate(config.library.profile.description, null, null, null, null, user); const stream = Buffer.from(user.profile.description, 'utf8'); try { const targets = await save(filepath, stream); return targets[0]; } catch (error) { logger.error(`Could not save profile description for '${user.name}': ${error} (https://reddit.com/user/${user.name})`); return null; } } logger.verbose(`No profile description for '${user.name}' (https://reddit.com/user/${user.name})`); return null; } return null; } async function saveProfileDetails(user, args) { const [image, description] = await Promise.all([saveProfileImage(user, args), saveProfileDescription(user, args)]); return { image, description }; } module.exports = saveProfileDetails;