const compilePostComments = require('./compilePostComments.js')(); const procPostMedia = require('./processPostMedia.js')(); const config = require('../config'); async function processReplies(data, post_id, depth, user_preferences) { let return_replies = []; for (var i = 0; i < data.length; i++) { let kind = data[i].kind; let reply = data[i].data; let obj = {}; if (kind !== 'more') { obj = { author: reply.author, body_html: reply.body_html, parent_id: reply.parent_id, created: reply.created_utc, edited: reply.edited, score: reply.score, ups: reply.ups, id: reply.id, permalink: teddifyUrl(reply.permalink), stickied: reply.stickied, distinguished: reply.distinguished, score_hidden: reply.score_hidden, edited: reply.edited, replies: [], depth: depth, user_flair: user_preferences.flairs != 'false' ? await formatUserFlair(reply) : '', controversiality: user_preferences.highlight_controversial != 'false' ? reply.controversiality : '', }; } else { obj = { type: 'load_more', count: reply.count, id: reply.id, parent_id: reply.parent_id, post_id: post_id, children: [], depth: depth, }; } if (reply.replies && kind !== 'more') { if (reply.replies.data.children.length) { for (var j = 0; j < reply.replies.data.children.length; j++) { let comment = reply.replies.data.children[j].data; let objct = {}; if (comment.author && comment.body_html) { objct = { author: comment.author, body_html: comment.body_html, parent_id: comment.parent_id, created: comment.created_utc, edited: comment.edited, score: comment.score, ups: comment.ups, id: comment.id, permalink: teddifyUrl(comment.permalink), score_hidden: comment.score_hidden, distinguished: comment.distinguished, distinguished: comment.edited, replies: [], depth: depth + 1, user_flair: user_preferences.flairs != 'false' ? await formatUserFlair(comment) : '', controversiality: user_preferences.highlight_controversial != 'false' ? comment.controversiality : '', }; } else { objct = { type: 'load_more', count: comment.count, id: comment.id, parent_id: comment.parent_id, post_id: post_id, children: [], depth: depth + 1, }; if (comment.children) { for (var k = 0; k < comment.children.length; k++) { objct.children.push(comment.children[k]); } } } if (comment.replies) { if (comment.replies.data) { if (comment.replies.data.children.length > 0) { objct.replies = await processReplies( comment.replies.data.children, post_id, depth, user_preferences ); } } } obj.replies.push(objct); } } } if (reply.children) { for (var j = 0; j < reply.children.length; j++) { obj.children.push(reply.children[j]); } } return_replies.push(obj); } return return_replies; } async function processJsonPost(json, parsed, user_preferences) { if (!parsed) { json = JSON.parse(json); } let post = json[0].data.children[0].data; let post_id = post.name; let comments = json[1].data.children; let obj = { author: post.author, created: post.created_utc, edited: post.edited, is_video: post.is_video, locked: post.locked, link_flair_text: post.link_flair_text, name: post_id, num_comments: post.num_comments, over_18: post.over_18, permalink: teddifyUrl(post.permalink), title: post.title, url: teddifyUrl(post.url, user_preferences), ups: post.ups, id: post.id, domain: post.domain, contest_mode: post.contest_mode, upvote_ratio: post.upvote_ratio, comments: null, has_media: false, media: null, images: null, crosspost: false, selftext: unescape(post.selftext_html), selftext_preview: post.selftext.substr(0, 120).replace(/\n/g, ' '), poll_data: post.poll_data, link_flair: user_preferences.flairs != 'false' ? await formatLinkFlair(post) : '', user_flair: user_preferences.flairs != 'false' ? await formatUserFlair(post) : '', }; let valid_embed_video_domains = ['gfycat.com']; let has_gif = false; let gif_to_mp4 = null; let reddit_video = null; let embed_video = false; if (post.media) if (valid_embed_video_domains.includes(post.media.type)) embed_video = true; if (post.preview && !embed_video) { if (post.preview.reddit_video_preview) { if (post.preview.reddit_video_preview.is_gif) { has_gif = true; gif_url = post.preview.reddit_video_preview.fallback_url; } else { let file_ext = getFileExtension( post.preview.reddit_video_preview.fallback_url ); if (file_ext === 'mp4') { post.media = true; reddit_video = post.preview.reddit_video_preview; } } } if (post.preview.images) { if (post.preview.images[0].source) { let file_ext = getFileExtension(post.preview.images[0].source.url); if (file_ext === 'gif') { has_gif = true; let resolutions = post.preview.images[0].variants.mp4.resolutions; gif_to_mp4 = resolutions[resolutions.length - 1]; } } } } obj = await processPostMedia( obj, post, post.media, has_gif, reddit_video, gif_to_mp4 ); if (post.crosspost_parent_list) { post.crosspost = post.crosspost_parent_list[0]; } if (post.crosspost) { obj = await processPostMedia( obj, post.crosspost, post.crosspost.media, has_gif, reddit_video, gif_to_mp4 ); obj.crosspost = { author: post.crosspost.author, created: post.crosspost.created_utc, subreddit: post.crosspost.subreddit, title: post.crosspost.title, name: post.crosspost.name, num_comments: post.crosspost.num_comments, over_18: post.crosspost.over_18, id: post.crosspost.id, permalink: teddifyUrl(post.crosspost.permalink), ups: post.crosspost.ups, selftext: unescape(post.selftext_html), selftext_crosspost: unescape(post.crosspost.selftext_html), poll_data: post.poll_data, is_crosspost: true, user_flair: user_preferences.flairs != 'false' ? await formatUserFlair(post) : '', }; } if (post.preview && !obj.has_media) { obj.images = { source: await downloadAndSave(post.preview.images[0].source.url), }; } if (obj.media) { if (obj.media.source === 'external') { if (post.preview) { obj.images = { source: await downloadAndSave(post.preview.images[0].source.url), }; } } } if (post.gallery_data) { obj.gallery = true; obj.gallery_items = []; for (var i = 0; i < post.gallery_data.items.length; i++) { let id = post.gallery_data.items[i].media_id; if (post.media_metadata) { if (post.media_metadata[id]) { if (post.media_metadata[id].p) { if (post.media_metadata[id].p[0]) { let item = { source: null, thumbnail: null, large: null }; if (post.media_metadata[id].s && post.media_metadata[id].p[0].u) { item = { type: post.media_metadata[id].e, source: await downloadAndSave(post.media_metadata[id].s.u), thumbnail: await downloadAndSave( post.media_metadata[id].p[0].u ), large: await downloadAndSave( post.media_metadata[id].p[ post.media_metadata[id].p.length - 1 ].u ), caption: post.gallery_data.items[i].caption || false, }; } obj.gallery_items.push(item); } } } } } } let comms = []; for (var i = 0; i < comments.length; i++) { let comment = comments[i].data; let kind = comments[i].kind; let obj = {}; if (kind !== 'more') { obj = { author: comment.author, body_html: comment.body_html, parent_id: comment.parent_id, created: comment.created_utc, edited: comment.edited, score: comment.score, ups: comment.ups, id: comment.id, permalink: teddifyUrl(comment.permalink), stickied: comment.stickied, distinguished: comment.distinguished, score_hidden: comment.score_hidden, edited: comment.edited, replies: [], depth: comment.depth, user_flair: user_preferences.flairs != 'false' ? await formatUserFlair(comment) : '', controversiality: user_preferences.highlight_controversial != 'false' ? comment.controversiality : '', }; } else { obj = { type: 'load_more', count: comment.count, id: comment.id, parent_id: comment.parent_id, post_id: post.name, children: [], }; } if (comment.replies && kind !== 'more') { if (comment.replies.data) { if (comment.replies.data.children.length > 0) { obj.replies = await processReplies( comment.replies.data.children, post_id, 1, user_preferences ); } } } if (comment.children) { for (var j = 0; j < comment.children.length; j++) { obj.children.push(comment.children[j]); } } comms.push(obj); } obj.comments = comms; return obj; } async function finalizeJsonPost( processed_json, post_id, post_url, morechildren_ids, viewing_comment, user_preferences ) { let comments_html = `
`; let comments = processed_json.comments; let last_known_depth = undefined; for (var i = 0; i < comments.length; i++) { let next_comment = false; if (comments[i + 1]) { next_comment = comments[i + 1]; } if (comments[i].depth != undefined) { last_known_depth = comments[i].depth; } comments_html += await compilePostCommentsHtml( comments[i], next_comment, post_id, post_url, morechildren_ids, processed_json.author, viewing_comment, user_preferences, last_known_depth ); } comments_html += `
`; delete processed_json['comments']; let post_data = processed_json; return { post_data: post_data, comments: comments_html }; } async function processJsonPostList(posts, mode) { let protocol = config.https_enabled || config.api_force_https ? 'https' : 'http'; for (var i = 0; i < posts.length; i++) { let link = posts[i]; let valid_reddit_self_domains = ['reddit.com']; let is_self_link = false; if (link.domain) { let tld = link.domain.split('self.'); if (tld.length > 1) { if (!tld[1].includes('.')) { is_self_link = true; link.url = teddifyUrl(link.url); } } if ( config.valid_media_domains.includes(link.domain) || valid_reddit_self_domains.includes(link.domain) ) { is_self_link = true; link.url = teddifyUrl(link.url); } } link.permalink = `${protocol}://${config.domain}${link.permalink}`; if (is_self_link) link.url = link.permalink; if (link.images) { if (link.images.thumb !== 'self') { link.images.thumb = `${protocol}://${config.domain}${link.images.thumb}`; } } if (mode === 'light') { link.selftext_html = null; } } return posts; } async function getPostItem(post_json, req, protocol) { let thumbnail = ''; let post_image = ''; let is_self_link = false; let valid_reddit_self_domains = ['reddit.com']; if (post_json.domain) { let tld = post_json.domain.split('self.'); if (tld.length > 1) { if (!tld[1].includes('.')) { is_self_link = true; post_json.url = teddifyUrl(post_json.url); } } if ( config.valid_media_domains.includes(post_json.domain) || valid_reddit_self_domains.includes(post_json.domain) ) { is_self_link = true; post_json.url = teddifyUrl(post_json.url); } } if (post_json.preview && post_json.thumbnail !== 'self') { if (!post_json.url.startsWith('/r/') && isGif(post_json.url)) { let s = await downloadAndSave(post_json.thumbnail, 'thumb_'); thumbnail = `${protocol}://${config.domain}${s}`; } else { if (post_json.preview.images[0].resolutions[0]) { let s = await downloadAndSave( post_json.preview.images[0].resolutions[0].url, 'thumb_' ); thumbnail = `${protocol}://${config.domain}${s}`; if (!isGif(post_json.url) && !post_json.post_hint.includes(':video')) { s = await downloadAndSave(post_json.preview.images[0].source.url); post_image = `${protocol}://${config.domain}${s}`; } } } } post_json.permalink = `${protocol}://${config.domain}${post_json.permalink}`; if (is_self_link) post_json.url = post_json.permalink; if (req.query.hasOwnProperty('full_thumbs')) { if (!post_image) post_image = thumbnail; thumbnail = post_image; } let enclosure = ''; if (thumbnail != '') { let mime = ''; let ext = thumbnail.split('.').pop(); if (ext === 'png') mime = 'image/png'; else mime = 'image/jpeg'; enclosure = ``; } let append_desc_html = `
[link] [comments]`; return ` ${post_json.title} ${post_json.author} ${post_json.created} ${new Date( post_json.created_utc * 1000 ).toGMTString()} ${post_json.domain} ${post_json.id} ${thumbnail} ${enclosure} ${post_json.permalink} ${post_json.url} ${post_json.num_comments} ${post_json.ups} ${post_json.stickied} ${is_self_link} `; } module.exports = { processReplies, processJsonPost, finalizeJsonPost, processJsonPostList, getPostItem };