Tools: Build a Viral Content Predictor Using Early Engagement Signals

Tools: Build a Viral Content Predictor Using Early Engagement Signals

Source: Dev.to

The Science of Virality ## The Stack ## Step 1: Setup ## Step 2: Fetch Video Metrics ## Step 3: Calculate Viral Signals ## Step 4: The Viral Prediction Engine ## Step 5: The Main Predictor ## Step 6: Run It ## Sample Output ## What You Just Built ## Get Started Some videos get 10 views. Others get 10 million. The difference isn't luck. It's math. Viral content follows patterns. The first hour of engagement can predict the next million views with surprising accuracy. In this tutorial, we'll build a Viral Content Predictor that: Know if your content will pop before anyone else does. Researchers at Microsoft and Stanford found that viral content follows predictable patterns: Early signals that predict virality: The "Viral Threshold" on each platform: Analytics platforms charge hundreds for viral prediction: Your version does the core analysis for cents. The algorithm decides in the first hour. Now you can see what it sees. Virality isn't random. It's predictable. Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse CODE_BLOCK: mkdir viral-predictor cd viral-predictor npm init -y npm install axios openai dotenv Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: mkdir viral-predictor cd viral-predictor npm init -y npm install axios openai dotenv CODE_BLOCK: mkdir viral-predictor cd viral-predictor npm init -y npm install axios openai dotenv CODE_BLOCK: SOCIAVAULT_API_KEY=your_sociavault_key OPENAI_API_KEY=your_openai_key Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: SOCIAVAULT_API_KEY=your_sociavault_key OPENAI_API_KEY=your_openai_key CODE_BLOCK: SOCIAVAULT_API_KEY=your_sociavault_key OPENAI_API_KEY=your_openai_key COMMAND_BLOCK: require('dotenv').config(); const axios = require('axios'); const OpenAI = require('openai'); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); const SOCIAVAULT_BASE = 'https://api.sociavault.com'; const headers = { 'Authorization': `Bearer ${process.env.SOCIAVAULT_API_KEY}` }; // Platform benchmarks for viral prediction const VIRAL_BENCHMARKS = { tiktok: { engagementRate: { viral: 10, good: 5, average: 2 }, viewToFollowerRatio: { viral: 200, good: 50, average: 10 }, commentToLikeRatio: { viral: 0.05, good: 0.02, average: 0.01 }, shareToLikeRatio: { viral: 0.1, good: 0.03, average: 0.01 } }, instagram: { engagementRate: { viral: 8, good: 4, average: 2 }, reachMultiplier: { viral: 5, good: 2, average: 1 }, saveRate: { viral: 5, good: 2, average: 0.5 } }, youtube: { engagementRate: { viral: 8, good: 4, average: 2 }, viewsPerHour: { viral: 10000, good: 1000, average: 100 }, likeToViewRatio: { viral: 0.08, good: 0.04, average: 0.02 } }, twitter: { engagementRate: { viral: 5, good: 2, average: 0.5 }, retweetRatio: { viral: 0.3, good: 0.1, average: 0.02 }, replyRatio: { viral: 0.1, good: 0.03, average: 0.01 } } }; async function getTikTokVideoMetrics(videoUrl) { console.log('šŸ“± Fetching TikTok video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/tiktok/video-info`, { params: { url: videoUrl }, headers }); const data = response.data.data; // Get author info for follower count const authorRes = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/tiktok/profile`, { params: { handle: data.author?.uniqueId || data.authorMeta?.name }, headers }); const author = authorRes.data.data; return { platform: 'tiktok', videoId: data.id, description: data.desc || data.description, views: data.playCount || data.stats?.playCount || 0, likes: data.diggCount || data.stats?.diggCount || 0, comments: data.commentCount || data.stats?.commentCount || 0, shares: data.shareCount || data.stats?.shareCount || 0, saves: data.collectCount || data.stats?.collectCount || 0, authorFollowers: author.followerCount || author.fans || 0, duration: data.duration || data.videoMeta?.duration || 0, created: data.createTime ? new Date(data.createTime * 1000) : new Date(), music: data.music?.title || 'Original Sound', hashtags: data.challenges?.map(c => c.title) || [] }; } catch (error) { console.error('TikTok error:', error.message); return null; } } async function getInstagramReelMetrics(postUrl) { console.log('šŸ“ø Fetching Instagram Reel metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/instagram/post`, { params: { url: postUrl }, headers }); const data = response.data.data; // Get author profile const authorRes = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/instagram/profile`, { params: { handle: data.user?.username || data.owner?.username }, headers }); const author = authorRes.data.data; return { platform: 'instagram', postId: data.id || data.pk, description: data.caption || '', views: data.play_count || data.video_view_count || 0, likes: data.like_count || data.likes || 0, comments: data.comment_count || data.comments || 0, saves: data.save_count || 0, authorFollowers: author.follower_count || author.followers || 0, type: data.media_type, created: data.taken_at ? new Date(data.taken_at * 1000) : new Date() }; } catch (error) { console.error('Instagram error:', error.message); return null; } } async function getYouTubeVideoMetrics(videoUrl) { console.log('šŸŽ¬ Fetching YouTube video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/youtube/video`, { params: { url: videoUrl }, headers }); const data = response.data.data; return { platform: 'youtube', videoId: data.id, title: data.title, description: data.description, views: data.viewCount || data.views || 0, likes: data.likeCount || data.likes || 0, comments: data.commentCount || data.comments || 0, subscriberCount: data.channelSubscriberCount || data.channel?.subscriberCount || 0, duration: data.duration || data.lengthSeconds || 0, published: data.publishedAt ? new Date(data.publishedAt) : new Date() }; } catch (error) { console.error('YouTube error:', error.message); return null; } } async function getTwitterVideoMetrics(tweetUrl) { console.log('🐦 Fetching Twitter video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/twitter/tweet`, { params: { url: tweetUrl }, headers }); const data = response.data.data; return { platform: 'twitter', tweetId: data.id || data.rest_id, text: data.full_text || data.text, views: data.views_count || data.views || 0, likes: data.favorite_count || data.likes || 0, retweets: data.retweet_count || 0, replies: data.reply_count || 0, quotes: data.quote_count || 0, authorFollowers: data.user?.followers_count || 0, created: data.created_at ? new Date(data.created_at) : new Date() }; } catch (error) { console.error('Twitter error:', error.message); return null; } } Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: require('dotenv').config(); const axios = require('axios'); const OpenAI = require('openai'); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); const SOCIAVAULT_BASE = 'https://api.sociavault.com'; const headers = { 'Authorization': `Bearer ${process.env.SOCIAVAULT_API_KEY}` }; // Platform benchmarks for viral prediction const VIRAL_BENCHMARKS = { tiktok: { engagementRate: { viral: 10, good: 5, average: 2 }, viewToFollowerRatio: { viral: 200, good: 50, average: 10 }, commentToLikeRatio: { viral: 0.05, good: 0.02, average: 0.01 }, shareToLikeRatio: { viral: 0.1, good: 0.03, average: 0.01 } }, instagram: { engagementRate: { viral: 8, good: 4, average: 2 }, reachMultiplier: { viral: 5, good: 2, average: 1 }, saveRate: { viral: 5, good: 2, average: 0.5 } }, youtube: { engagementRate: { viral: 8, good: 4, average: 2 }, viewsPerHour: { viral: 10000, good: 1000, average: 100 }, likeToViewRatio: { viral: 0.08, good: 0.04, average: 0.02 } }, twitter: { engagementRate: { viral: 5, good: 2, average: 0.5 }, retweetRatio: { viral: 0.3, good: 0.1, average: 0.02 }, replyRatio: { viral: 0.1, good: 0.03, average: 0.01 } } }; async function getTikTokVideoMetrics(videoUrl) { console.log('šŸ“± Fetching TikTok video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/tiktok/video-info`, { params: { url: videoUrl }, headers }); const data = response.data.data; // Get author info for follower count const authorRes = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/tiktok/profile`, { params: { handle: data.author?.uniqueId || data.authorMeta?.name }, headers }); const author = authorRes.data.data; return { platform: 'tiktok', videoId: data.id, description: data.desc || data.description, views: data.playCount || data.stats?.playCount || 0, likes: data.diggCount || data.stats?.diggCount || 0, comments: data.commentCount || data.stats?.commentCount || 0, shares: data.shareCount || data.stats?.shareCount || 0, saves: data.collectCount || data.stats?.collectCount || 0, authorFollowers: author.followerCount || author.fans || 0, duration: data.duration || data.videoMeta?.duration || 0, created: data.createTime ? new Date(data.createTime * 1000) : new Date(), music: data.music?.title || 'Original Sound', hashtags: data.challenges?.map(c => c.title) || [] }; } catch (error) { console.error('TikTok error:', error.message); return null; } } async function getInstagramReelMetrics(postUrl) { console.log('šŸ“ø Fetching Instagram Reel metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/instagram/post`, { params: { url: postUrl }, headers }); const data = response.data.data; // Get author profile const authorRes = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/instagram/profile`, { params: { handle: data.user?.username || data.owner?.username }, headers }); const author = authorRes.data.data; return { platform: 'instagram', postId: data.id || data.pk, description: data.caption || '', views: data.play_count || data.video_view_count || 0, likes: data.like_count || data.likes || 0, comments: data.comment_count || data.comments || 0, saves: data.save_count || 0, authorFollowers: author.follower_count || author.followers || 0, type: data.media_type, created: data.taken_at ? new Date(data.taken_at * 1000) : new Date() }; } catch (error) { console.error('Instagram error:', error.message); return null; } } async function getYouTubeVideoMetrics(videoUrl) { console.log('šŸŽ¬ Fetching YouTube video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/youtube/video`, { params: { url: videoUrl }, headers }); const data = response.data.data; return { platform: 'youtube', videoId: data.id, title: data.title, description: data.description, views: data.viewCount || data.views || 0, likes: data.likeCount || data.likes || 0, comments: data.commentCount || data.comments || 0, subscriberCount: data.channelSubscriberCount || data.channel?.subscriberCount || 0, duration: data.duration || data.lengthSeconds || 0, published: data.publishedAt ? new Date(data.publishedAt) : new Date() }; } catch (error) { console.error('YouTube error:', error.message); return null; } } async function getTwitterVideoMetrics(tweetUrl) { console.log('🐦 Fetching Twitter video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/twitter/tweet`, { params: { url: tweetUrl }, headers }); const data = response.data.data; return { platform: 'twitter', tweetId: data.id || data.rest_id, text: data.full_text || data.text, views: data.views_count || data.views || 0, likes: data.favorite_count || data.likes || 0, retweets: data.retweet_count || 0, replies: data.reply_count || 0, quotes: data.quote_count || 0, authorFollowers: data.user?.followers_count || 0, created: data.created_at ? new Date(data.created_at) : new Date() }; } catch (error) { console.error('Twitter error:', error.message); return null; } } COMMAND_BLOCK: require('dotenv').config(); const axios = require('axios'); const OpenAI = require('openai'); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); const SOCIAVAULT_BASE = 'https://api.sociavault.com'; const headers = { 'Authorization': `Bearer ${process.env.SOCIAVAULT_API_KEY}` }; // Platform benchmarks for viral prediction const VIRAL_BENCHMARKS = { tiktok: { engagementRate: { viral: 10, good: 5, average: 2 }, viewToFollowerRatio: { viral: 200, good: 50, average: 10 }, commentToLikeRatio: { viral: 0.05, good: 0.02, average: 0.01 }, shareToLikeRatio: { viral: 0.1, good: 0.03, average: 0.01 } }, instagram: { engagementRate: { viral: 8, good: 4, average: 2 }, reachMultiplier: { viral: 5, good: 2, average: 1 }, saveRate: { viral: 5, good: 2, average: 0.5 } }, youtube: { engagementRate: { viral: 8, good: 4, average: 2 }, viewsPerHour: { viral: 10000, good: 1000, average: 100 }, likeToViewRatio: { viral: 0.08, good: 0.04, average: 0.02 } }, twitter: { engagementRate: { viral: 5, good: 2, average: 0.5 }, retweetRatio: { viral: 0.3, good: 0.1, average: 0.02 }, replyRatio: { viral: 0.1, good: 0.03, average: 0.01 } } }; async function getTikTokVideoMetrics(videoUrl) { console.log('šŸ“± Fetching TikTok video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/tiktok/video-info`, { params: { url: videoUrl }, headers }); const data = response.data.data; // Get author info for follower count const authorRes = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/tiktok/profile`, { params: { handle: data.author?.uniqueId || data.authorMeta?.name }, headers }); const author = authorRes.data.data; return { platform: 'tiktok', videoId: data.id, description: data.desc || data.description, views: data.playCount || data.stats?.playCount || 0, likes: data.diggCount || data.stats?.diggCount || 0, comments: data.commentCount || data.stats?.commentCount || 0, shares: data.shareCount || data.stats?.shareCount || 0, saves: data.collectCount || data.stats?.collectCount || 0, authorFollowers: author.followerCount || author.fans || 0, duration: data.duration || data.videoMeta?.duration || 0, created: data.createTime ? new Date(data.createTime * 1000) : new Date(), music: data.music?.title || 'Original Sound', hashtags: data.challenges?.map(c => c.title) || [] }; } catch (error) { console.error('TikTok error:', error.message); return null; } } async function getInstagramReelMetrics(postUrl) { console.log('šŸ“ø Fetching Instagram Reel metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/instagram/post`, { params: { url: postUrl }, headers }); const data = response.data.data; // Get author profile const authorRes = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/instagram/profile`, { params: { handle: data.user?.username || data.owner?.username }, headers }); const author = authorRes.data.data; return { platform: 'instagram', postId: data.id || data.pk, description: data.caption || '', views: data.play_count || data.video_view_count || 0, likes: data.like_count || data.likes || 0, comments: data.comment_count || data.comments || 0, saves: data.save_count || 0, authorFollowers: author.follower_count || author.followers || 0, type: data.media_type, created: data.taken_at ? new Date(data.taken_at * 1000) : new Date() }; } catch (error) { console.error('Instagram error:', error.message); return null; } } async function getYouTubeVideoMetrics(videoUrl) { console.log('šŸŽ¬ Fetching YouTube video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/youtube/video`, { params: { url: videoUrl }, headers }); const data = response.data.data; return { platform: 'youtube', videoId: data.id, title: data.title, description: data.description, views: data.viewCount || data.views || 0, likes: data.likeCount || data.likes || 0, comments: data.commentCount || data.comments || 0, subscriberCount: data.channelSubscriberCount || data.channel?.subscriberCount || 0, duration: data.duration || data.lengthSeconds || 0, published: data.publishedAt ? new Date(data.publishedAt) : new Date() }; } catch (error) { console.error('YouTube error:', error.message); return null; } } async function getTwitterVideoMetrics(tweetUrl) { console.log('🐦 Fetching Twitter video metrics...'); try { const response = await axios.get(`${SOCIAVAULT_BASE}/v1/scrape/twitter/tweet`, { params: { url: tweetUrl }, headers }); const data = response.data.data; return { platform: 'twitter', tweetId: data.id || data.rest_id, text: data.full_text || data.text, views: data.views_count || data.views || 0, likes: data.favorite_count || data.likes || 0, retweets: data.retweet_count || 0, replies: data.reply_count || 0, quotes: data.quote_count || 0, authorFollowers: data.user?.followers_count || 0, created: data.created_at ? new Date(data.created_at) : new Date() }; } catch (error) { console.error('Twitter error:', error.message); return null; } } COMMAND_BLOCK: function calculateViralSignals(metrics) { const { platform } = metrics; const signals = {}; switch (platform) { case 'tiktok': return calculateTikTokSignals(metrics); case 'instagram': return calculateInstagramSignals(metrics); case 'youtube': return calculateYouTubeSignals(metrics); case 'twitter': return calculateTwitterSignals(metrics); default: return { error: 'Unsupported platform' }; } } function calculateTikTokSignals(metrics) { const { views, likes, comments, shares, saves, authorFollowers, duration } = metrics; // Engagement rate (likes + comments + shares) / views const totalEngagement = likes + comments + shares; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; // View to follower ratio (viral content exceeds follower count) const viewToFollowerRatio = authorFollowers > 0 ? (views / authorFollowers) * 100 : 0; // Comment to like ratio (high = controversial/discussion-worthy) const commentToLikeRatio = likes > 0 ? comments / likes : 0; // Share to like ratio (shares = strongest signal) const shareToLikeRatio = likes > 0 ? shares / likes : 0; // Save rate (saves indicate rewatchable/valuable content) const saveRate = views > 0 ? (saves / views) * 100 : 0; // Engagement velocity (engagement per view, normalized by time) const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); const engagementVelocity = totalEngagement / hoursOld; return { platform: 'tiktok', metrics: { engagementRate: engagementRate.toFixed(2), viewToFollowerRatio: viewToFollowerRatio.toFixed(1), commentToLikeRatio: commentToLikeRatio.toFixed(4), shareToLikeRatio: shareToLikeRatio.toFixed(4), saveRate: saveRate.toFixed(2), engagementVelocity: Math.round(engagementVelocity) }, raw: { views, likes, comments, shares, saves, authorFollowers, hoursOld } }; } function calculateInstagramSignals(metrics) { const { views, likes, comments, saves, authorFollowers } = metrics; const totalEngagement = likes + comments; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; const reachMultiplier = authorFollowers > 0 ? views / authorFollowers : 0; const saveRate = views > 0 ? (saves / views) * 100 : 0; const commentRate = likes > 0 ? (comments / likes) * 100 : 0; const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); return { platform: 'instagram', metrics: { engagementRate: engagementRate.toFixed(2), reachMultiplier: reachMultiplier.toFixed(2), saveRate: saveRate.toFixed(2), commentRate: commentRate.toFixed(2) }, raw: { views, likes, comments, saves, authorFollowers, hoursOld } }; } function calculateYouTubeSignals(metrics) { const { views, likes, comments, subscriberCount, duration, published } = metrics; const engagementRate = views > 0 ? ((likes + comments) / views) * 100 : 0; const likeToViewRatio = views > 0 ? likes / views : 0; const commentToViewRatio = views > 0 ? comments / views : 0; const viewsPerSubscriber = subscriberCount > 0 ? views / subscriberCount : 0; const hoursOld = Math.max(1, (Date.now() - published.getTime()) / (1000 * 60 * 60)); const viewsPerHour = views / hoursOld; return { platform: 'youtube', metrics: { engagementRate: engagementRate.toFixed(2), likeToViewRatio: likeToViewRatio.toFixed(4), commentToViewRatio: commentToViewRatio.toFixed(4), viewsPerSubscriber: viewsPerSubscriber.toFixed(2), viewsPerHour: Math.round(viewsPerHour) }, raw: { views, likes, comments, subscriberCount, hoursOld } }; } function calculateTwitterSignals(metrics) { const { views, likes, retweets, replies, quotes, authorFollowers } = metrics; const totalEngagement = likes + retweets + replies + quotes; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; const retweetRatio = likes > 0 ? retweets / likes : 0; const replyRatio = likes > 0 ? replies / likes : 0; const viralityIndex = authorFollowers > 0 ? (retweets + quotes) / authorFollowers * 100 : 0; const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); return { platform: 'twitter', metrics: { engagementRate: engagementRate.toFixed(2), retweetRatio: retweetRatio.toFixed(4), replyRatio: replyRatio.toFixed(4), viralityIndex: viralityIndex.toFixed(2) }, raw: { views, likes, retweets, replies, quotes, authorFollowers, hoursOld } }; } Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: function calculateViralSignals(metrics) { const { platform } = metrics; const signals = {}; switch (platform) { case 'tiktok': return calculateTikTokSignals(metrics); case 'instagram': return calculateInstagramSignals(metrics); case 'youtube': return calculateYouTubeSignals(metrics); case 'twitter': return calculateTwitterSignals(metrics); default: return { error: 'Unsupported platform' }; } } function calculateTikTokSignals(metrics) { const { views, likes, comments, shares, saves, authorFollowers, duration } = metrics; // Engagement rate (likes + comments + shares) / views const totalEngagement = likes + comments + shares; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; // View to follower ratio (viral content exceeds follower count) const viewToFollowerRatio = authorFollowers > 0 ? (views / authorFollowers) * 100 : 0; // Comment to like ratio (high = controversial/discussion-worthy) const commentToLikeRatio = likes > 0 ? comments / likes : 0; // Share to like ratio (shares = strongest signal) const shareToLikeRatio = likes > 0 ? shares / likes : 0; // Save rate (saves indicate rewatchable/valuable content) const saveRate = views > 0 ? (saves / views) * 100 : 0; // Engagement velocity (engagement per view, normalized by time) const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); const engagementVelocity = totalEngagement / hoursOld; return { platform: 'tiktok', metrics: { engagementRate: engagementRate.toFixed(2), viewToFollowerRatio: viewToFollowerRatio.toFixed(1), commentToLikeRatio: commentToLikeRatio.toFixed(4), shareToLikeRatio: shareToLikeRatio.toFixed(4), saveRate: saveRate.toFixed(2), engagementVelocity: Math.round(engagementVelocity) }, raw: { views, likes, comments, shares, saves, authorFollowers, hoursOld } }; } function calculateInstagramSignals(metrics) { const { views, likes, comments, saves, authorFollowers } = metrics; const totalEngagement = likes + comments; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; const reachMultiplier = authorFollowers > 0 ? views / authorFollowers : 0; const saveRate = views > 0 ? (saves / views) * 100 : 0; const commentRate = likes > 0 ? (comments / likes) * 100 : 0; const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); return { platform: 'instagram', metrics: { engagementRate: engagementRate.toFixed(2), reachMultiplier: reachMultiplier.toFixed(2), saveRate: saveRate.toFixed(2), commentRate: commentRate.toFixed(2) }, raw: { views, likes, comments, saves, authorFollowers, hoursOld } }; } function calculateYouTubeSignals(metrics) { const { views, likes, comments, subscriberCount, duration, published } = metrics; const engagementRate = views > 0 ? ((likes + comments) / views) * 100 : 0; const likeToViewRatio = views > 0 ? likes / views : 0; const commentToViewRatio = views > 0 ? comments / views : 0; const viewsPerSubscriber = subscriberCount > 0 ? views / subscriberCount : 0; const hoursOld = Math.max(1, (Date.now() - published.getTime()) / (1000 * 60 * 60)); const viewsPerHour = views / hoursOld; return { platform: 'youtube', metrics: { engagementRate: engagementRate.toFixed(2), likeToViewRatio: likeToViewRatio.toFixed(4), commentToViewRatio: commentToViewRatio.toFixed(4), viewsPerSubscriber: viewsPerSubscriber.toFixed(2), viewsPerHour: Math.round(viewsPerHour) }, raw: { views, likes, comments, subscriberCount, hoursOld } }; } function calculateTwitterSignals(metrics) { const { views, likes, retweets, replies, quotes, authorFollowers } = metrics; const totalEngagement = likes + retweets + replies + quotes; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; const retweetRatio = likes > 0 ? retweets / likes : 0; const replyRatio = likes > 0 ? replies / likes : 0; const viralityIndex = authorFollowers > 0 ? (retweets + quotes) / authorFollowers * 100 : 0; const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); return { platform: 'twitter', metrics: { engagementRate: engagementRate.toFixed(2), retweetRatio: retweetRatio.toFixed(4), replyRatio: replyRatio.toFixed(4), viralityIndex: viralityIndex.toFixed(2) }, raw: { views, likes, retweets, replies, quotes, authorFollowers, hoursOld } }; } COMMAND_BLOCK: function calculateViralSignals(metrics) { const { platform } = metrics; const signals = {}; switch (platform) { case 'tiktok': return calculateTikTokSignals(metrics); case 'instagram': return calculateInstagramSignals(metrics); case 'youtube': return calculateYouTubeSignals(metrics); case 'twitter': return calculateTwitterSignals(metrics); default: return { error: 'Unsupported platform' }; } } function calculateTikTokSignals(metrics) { const { views, likes, comments, shares, saves, authorFollowers, duration } = metrics; // Engagement rate (likes + comments + shares) / views const totalEngagement = likes + comments + shares; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; // View to follower ratio (viral content exceeds follower count) const viewToFollowerRatio = authorFollowers > 0 ? (views / authorFollowers) * 100 : 0; // Comment to like ratio (high = controversial/discussion-worthy) const commentToLikeRatio = likes > 0 ? comments / likes : 0; // Share to like ratio (shares = strongest signal) const shareToLikeRatio = likes > 0 ? shares / likes : 0; // Save rate (saves indicate rewatchable/valuable content) const saveRate = views > 0 ? (saves / views) * 100 : 0; // Engagement velocity (engagement per view, normalized by time) const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); const engagementVelocity = totalEngagement / hoursOld; return { platform: 'tiktok', metrics: { engagementRate: engagementRate.toFixed(2), viewToFollowerRatio: viewToFollowerRatio.toFixed(1), commentToLikeRatio: commentToLikeRatio.toFixed(4), shareToLikeRatio: shareToLikeRatio.toFixed(4), saveRate: saveRate.toFixed(2), engagementVelocity: Math.round(engagementVelocity) }, raw: { views, likes, comments, shares, saves, authorFollowers, hoursOld } }; } function calculateInstagramSignals(metrics) { const { views, likes, comments, saves, authorFollowers } = metrics; const totalEngagement = likes + comments; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; const reachMultiplier = authorFollowers > 0 ? views / authorFollowers : 0; const saveRate = views > 0 ? (saves / views) * 100 : 0; const commentRate = likes > 0 ? (comments / likes) * 100 : 0; const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); return { platform: 'instagram', metrics: { engagementRate: engagementRate.toFixed(2), reachMultiplier: reachMultiplier.toFixed(2), saveRate: saveRate.toFixed(2), commentRate: commentRate.toFixed(2) }, raw: { views, likes, comments, saves, authorFollowers, hoursOld } }; } function calculateYouTubeSignals(metrics) { const { views, likes, comments, subscriberCount, duration, published } = metrics; const engagementRate = views > 0 ? ((likes + comments) / views) * 100 : 0; const likeToViewRatio = views > 0 ? likes / views : 0; const commentToViewRatio = views > 0 ? comments / views : 0; const viewsPerSubscriber = subscriberCount > 0 ? views / subscriberCount : 0; const hoursOld = Math.max(1, (Date.now() - published.getTime()) / (1000 * 60 * 60)); const viewsPerHour = views / hoursOld; return { platform: 'youtube', metrics: { engagementRate: engagementRate.toFixed(2), likeToViewRatio: likeToViewRatio.toFixed(4), commentToViewRatio: commentToViewRatio.toFixed(4), viewsPerSubscriber: viewsPerSubscriber.toFixed(2), viewsPerHour: Math.round(viewsPerHour) }, raw: { views, likes, comments, subscriberCount, hoursOld } }; } function calculateTwitterSignals(metrics) { const { views, likes, retweets, replies, quotes, authorFollowers } = metrics; const totalEngagement = likes + retweets + replies + quotes; const engagementRate = views > 0 ? (totalEngagement / views) * 100 : 0; const retweetRatio = likes > 0 ? retweets / likes : 0; const replyRatio = likes > 0 ? replies / likes : 0; const viralityIndex = authorFollowers > 0 ? (retweets + quotes) / authorFollowers * 100 : 0; const hoursOld = Math.max(1, (Date.now() - metrics.created.getTime()) / (1000 * 60 * 60)); return { platform: 'twitter', metrics: { engagementRate: engagementRate.toFixed(2), retweetRatio: retweetRatio.toFixed(4), replyRatio: replyRatio.toFixed(4), viralityIndex: viralityIndex.toFixed(2) }, raw: { views, likes, retweets, replies, quotes, authorFollowers, hoursOld } }; } COMMAND_BLOCK: function predictViralPotential(signals) { const { platform, metrics, raw } = signals; const benchmarks = VIRAL_BENCHMARKS[platform]; let score = 0; const factors = []; // Platform-specific scoring switch (platform) { case 'tiktok': score = scoreTikTok(metrics, benchmarks, factors, raw); break; case 'instagram': score = scoreInstagram(metrics, benchmarks, factors, raw); break; case 'youtube': score = scoreYouTube(metrics, benchmarks, factors, raw); break; case 'twitter': score = scoreTwitter(metrics, benchmarks, factors, raw); break; } // Determine verdict const verdict = getVerdict(score); return { score: Math.min(100, Math.max(0, score)), verdict, factors, prediction: generatePrediction(score, raw, platform) }; } function scoreTikTok(metrics, benchmarks, factors, raw) { let score = 0; // Engagement rate (30 points max) const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else if (engRate >= benchmarks.engagementRate.average) { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } else { factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+0', status: 'āŒ Low' }); } // View to follower ratio (25 points max) const vfRatio = parseFloat(metrics.viewToFollowerRatio); if (vfRatio >= benchmarks.viewToFollowerRatio.viral) { score += 25; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+25', status: 'šŸ”„ Breaking out' }); } else if (vfRatio >= benchmarks.viewToFollowerRatio.good) { score += 15; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+15', status: 'āœ… Good reach' }); } else { score += 5; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+5', status: 'āž– Normal' }); } // Share ratio (25 points max - shares are the strongest viral signal) const shareRatio = parseFloat(metrics.shareToLikeRatio); if (shareRatio >= benchmarks.shareToLikeRatio.viral) { score += 25; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High shareability' }); } else if (shareRatio >= benchmarks.shareToLikeRatio.good) { score += 15; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } // Comment ratio (20 points max - indicates discussion/controversy) const commentRatio = parseFloat(metrics.commentToLikeRatio); if (commentRatio >= benchmarks.commentToLikeRatio.viral) { score += 20; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+20', status: 'šŸ”„ High discussion' }); } else if (commentRatio >= benchmarks.commentToLikeRatio.good) { score += 12; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+12', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } // Velocity bonus (if content is new and performing well) if (raw.hoursOld < 24 && raw.views > 10000) { score += 10; factors.push({ factor: 'Early Velocity', value: `${raw.views.toLocaleString()} views in ${Math.round(raw.hoursOld)}h`, impact: '+10', status: 'šŸš€ Fast start' }); } return score; } function scoreInstagram(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 35; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+35', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 25; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+25', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const reachMult = parseFloat(metrics.reachMultiplier); if (reachMult >= benchmarks.reachMultiplier.viral) { score += 30; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+30', status: 'šŸ”„ Explore potential' }); } else if (reachMult >= benchmarks.reachMultiplier.good) { score += 20; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+20', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+5', status: 'āž– Low' }); } const saveRate = parseFloat(metrics.saveRate); if (saveRate >= benchmarks.saveRate.viral) { score += 25; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+25', status: 'šŸ”„ High value content' }); } else if (saveRate >= benchmarks.saveRate.good) { score += 15; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+5', status: 'āž– Low' }); } return score; } function scoreYouTube(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const vph = parseInt(metrics.viewsPerHour); if (vph >= benchmarks.viewsPerHour.viral) { score += 35; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+35', status: 'šŸ”„ Explosive growth' }); } else if (vph >= benchmarks.viewsPerHour.good) { score += 20; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+20', status: 'āœ… Good momentum' }); } else { score += 5; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+5', status: 'āž– Slow' }); } const ltv = parseFloat(metrics.likeToViewRatio); if (ltv >= benchmarks.likeToViewRatio.viral) { score += 25; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High approval' }); } else if (ltv >= benchmarks.likeToViewRatio.good) { score += 15; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } return score; } function scoreTwitter(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const rtRatio = parseFloat(metrics.retweetRatio); if (rtRatio >= benchmarks.retweetRatio.viral) { score += 35; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+35', status: 'šŸ”„ Highly shareable' }); } else if (rtRatio >= benchmarks.retweetRatio.good) { score += 20; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } const replyRatio = parseFloat(metrics.replyRatio); if (replyRatio >= benchmarks.replyRatio.viral) { score += 25; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High discussion' }); } else if (replyRatio >= benchmarks.replyRatio.good) { score += 15; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } return score; } function getVerdict(score) { if (score >= 85) return { status: 'VIRAL', emoji: 'šŸ”„šŸ”„šŸ”„', description: 'This content is going viral or has strong viral potential' }; if (score >= 70) return { status: 'HIGH POTENTIAL', emoji: 'šŸ”„šŸ”„', description: 'Strong signals - likely to exceed normal reach' }; if (score >= 50) return { status: 'PROMISING', emoji: 'šŸ”„', description: 'Above average performance - could break out' }; if (score >= 30) return { status: 'AVERAGE', emoji: 'āž–', description: 'Normal performance for the platform' }; return { status: 'LOW', emoji: 'šŸ“‰', description: 'Below average - unlikely to gain significant traction' }; } function generatePrediction(score, raw, platform) { const currentViews = raw.views; const hoursOld = raw.hoursOld; // Simple projection based on current velocity and viral score const velocityMultiplier = score >= 70 ? 3 : score >= 50 ? 1.5 : 1; const currentVelocity = currentViews / hoursOld; const projections = { '24h': Math.round(currentViews + (currentVelocity * (24 - hoursOld) * velocityMultiplier)), '48h': Math.round(currentViews + (currentVelocity * (48 - hoursOld) * velocityMultiplier * 0.8)), '7d': Math.round(currentViews + (currentVelocity * (168 - hoursOld) * velocityMultiplier * 0.5)) }; return { currentVelocity: Math.round(currentVelocity), projections, confidence: score >= 50 ? 'Medium-High' : 'Low' }; } Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: function predictViralPotential(signals) { const { platform, metrics, raw } = signals; const benchmarks = VIRAL_BENCHMARKS[platform]; let score = 0; const factors = []; // Platform-specific scoring switch (platform) { case 'tiktok': score = scoreTikTok(metrics, benchmarks, factors, raw); break; case 'instagram': score = scoreInstagram(metrics, benchmarks, factors, raw); break; case 'youtube': score = scoreYouTube(metrics, benchmarks, factors, raw); break; case 'twitter': score = scoreTwitter(metrics, benchmarks, factors, raw); break; } // Determine verdict const verdict = getVerdict(score); return { score: Math.min(100, Math.max(0, score)), verdict, factors, prediction: generatePrediction(score, raw, platform) }; } function scoreTikTok(metrics, benchmarks, factors, raw) { let score = 0; // Engagement rate (30 points max) const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else if (engRate >= benchmarks.engagementRate.average) { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } else { factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+0', status: 'āŒ Low' }); } // View to follower ratio (25 points max) const vfRatio = parseFloat(metrics.viewToFollowerRatio); if (vfRatio >= benchmarks.viewToFollowerRatio.viral) { score += 25; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+25', status: 'šŸ”„ Breaking out' }); } else if (vfRatio >= benchmarks.viewToFollowerRatio.good) { score += 15; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+15', status: 'āœ… Good reach' }); } else { score += 5; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+5', status: 'āž– Normal' }); } // Share ratio (25 points max - shares are the strongest viral signal) const shareRatio = parseFloat(metrics.shareToLikeRatio); if (shareRatio >= benchmarks.shareToLikeRatio.viral) { score += 25; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High shareability' }); } else if (shareRatio >= benchmarks.shareToLikeRatio.good) { score += 15; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } // Comment ratio (20 points max - indicates discussion/controversy) const commentRatio = parseFloat(metrics.commentToLikeRatio); if (commentRatio >= benchmarks.commentToLikeRatio.viral) { score += 20; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+20', status: 'šŸ”„ High discussion' }); } else if (commentRatio >= benchmarks.commentToLikeRatio.good) { score += 12; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+12', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } // Velocity bonus (if content is new and performing well) if (raw.hoursOld < 24 && raw.views > 10000) { score += 10; factors.push({ factor: 'Early Velocity', value: `${raw.views.toLocaleString()} views in ${Math.round(raw.hoursOld)}h`, impact: '+10', status: 'šŸš€ Fast start' }); } return score; } function scoreInstagram(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 35; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+35', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 25; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+25', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const reachMult = parseFloat(metrics.reachMultiplier); if (reachMult >= benchmarks.reachMultiplier.viral) { score += 30; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+30', status: 'šŸ”„ Explore potential' }); } else if (reachMult >= benchmarks.reachMultiplier.good) { score += 20; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+20', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+5', status: 'āž– Low' }); } const saveRate = parseFloat(metrics.saveRate); if (saveRate >= benchmarks.saveRate.viral) { score += 25; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+25', status: 'šŸ”„ High value content' }); } else if (saveRate >= benchmarks.saveRate.good) { score += 15; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+5', status: 'āž– Low' }); } return score; } function scoreYouTube(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const vph = parseInt(metrics.viewsPerHour); if (vph >= benchmarks.viewsPerHour.viral) { score += 35; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+35', status: 'šŸ”„ Explosive growth' }); } else if (vph >= benchmarks.viewsPerHour.good) { score += 20; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+20', status: 'āœ… Good momentum' }); } else { score += 5; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+5', status: 'āž– Slow' }); } const ltv = parseFloat(metrics.likeToViewRatio); if (ltv >= benchmarks.likeToViewRatio.viral) { score += 25; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High approval' }); } else if (ltv >= benchmarks.likeToViewRatio.good) { score += 15; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } return score; } function scoreTwitter(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const rtRatio = parseFloat(metrics.retweetRatio); if (rtRatio >= benchmarks.retweetRatio.viral) { score += 35; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+35', status: 'šŸ”„ Highly shareable' }); } else if (rtRatio >= benchmarks.retweetRatio.good) { score += 20; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } const replyRatio = parseFloat(metrics.replyRatio); if (replyRatio >= benchmarks.replyRatio.viral) { score += 25; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High discussion' }); } else if (replyRatio >= benchmarks.replyRatio.good) { score += 15; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } return score; } function getVerdict(score) { if (score >= 85) return { status: 'VIRAL', emoji: 'šŸ”„šŸ”„šŸ”„', description: 'This content is going viral or has strong viral potential' }; if (score >= 70) return { status: 'HIGH POTENTIAL', emoji: 'šŸ”„šŸ”„', description: 'Strong signals - likely to exceed normal reach' }; if (score >= 50) return { status: 'PROMISING', emoji: 'šŸ”„', description: 'Above average performance - could break out' }; if (score >= 30) return { status: 'AVERAGE', emoji: 'āž–', description: 'Normal performance for the platform' }; return { status: 'LOW', emoji: 'šŸ“‰', description: 'Below average - unlikely to gain significant traction' }; } function generatePrediction(score, raw, platform) { const currentViews = raw.views; const hoursOld = raw.hoursOld; // Simple projection based on current velocity and viral score const velocityMultiplier = score >= 70 ? 3 : score >= 50 ? 1.5 : 1; const currentVelocity = currentViews / hoursOld; const projections = { '24h': Math.round(currentViews + (currentVelocity * (24 - hoursOld) * velocityMultiplier)), '48h': Math.round(currentViews + (currentVelocity * (48 - hoursOld) * velocityMultiplier * 0.8)), '7d': Math.round(currentViews + (currentVelocity * (168 - hoursOld) * velocityMultiplier * 0.5)) }; return { currentVelocity: Math.round(currentVelocity), projections, confidence: score >= 50 ? 'Medium-High' : 'Low' }; } COMMAND_BLOCK: function predictViralPotential(signals) { const { platform, metrics, raw } = signals; const benchmarks = VIRAL_BENCHMARKS[platform]; let score = 0; const factors = []; // Platform-specific scoring switch (platform) { case 'tiktok': score = scoreTikTok(metrics, benchmarks, factors, raw); break; case 'instagram': score = scoreInstagram(metrics, benchmarks, factors, raw); break; case 'youtube': score = scoreYouTube(metrics, benchmarks, factors, raw); break; case 'twitter': score = scoreTwitter(metrics, benchmarks, factors, raw); break; } // Determine verdict const verdict = getVerdict(score); return { score: Math.min(100, Math.max(0, score)), verdict, factors, prediction: generatePrediction(score, raw, platform) }; } function scoreTikTok(metrics, benchmarks, factors, raw) { let score = 0; // Engagement rate (30 points max) const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else if (engRate >= benchmarks.engagementRate.average) { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } else { factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+0', status: 'āŒ Low' }); } // View to follower ratio (25 points max) const vfRatio = parseFloat(metrics.viewToFollowerRatio); if (vfRatio >= benchmarks.viewToFollowerRatio.viral) { score += 25; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+25', status: 'šŸ”„ Breaking out' }); } else if (vfRatio >= benchmarks.viewToFollowerRatio.good) { score += 15; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+15', status: 'āœ… Good reach' }); } else { score += 5; factors.push({ factor: 'Views vs Followers', value: `${vfRatio}%`, impact: '+5', status: 'āž– Normal' }); } // Share ratio (25 points max - shares are the strongest viral signal) const shareRatio = parseFloat(metrics.shareToLikeRatio); if (shareRatio >= benchmarks.shareToLikeRatio.viral) { score += 25; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High shareability' }); } else if (shareRatio >= benchmarks.shareToLikeRatio.good) { score += 15; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Share Ratio', value: `${(shareRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } // Comment ratio (20 points max - indicates discussion/controversy) const commentRatio = parseFloat(metrics.commentToLikeRatio); if (commentRatio >= benchmarks.commentToLikeRatio.viral) { score += 20; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+20', status: 'šŸ”„ High discussion' }); } else if (commentRatio >= benchmarks.commentToLikeRatio.good) { score += 12; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+12', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Discussion Factor', value: `${(commentRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } // Velocity bonus (if content is new and performing well) if (raw.hoursOld < 24 && raw.views > 10000) { score += 10; factors.push({ factor: 'Early Velocity', value: `${raw.views.toLocaleString()} views in ${Math.round(raw.hoursOld)}h`, impact: '+10', status: 'šŸš€ Fast start' }); } return score; } function scoreInstagram(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 35; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+35', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 25; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+25', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const reachMult = parseFloat(metrics.reachMultiplier); if (reachMult >= benchmarks.reachMultiplier.viral) { score += 30; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+30', status: 'šŸ”„ Explore potential' }); } else if (reachMult >= benchmarks.reachMultiplier.good) { score += 20; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+20', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Reach Multiplier', value: `${reachMult}x followers`, impact: '+5', status: 'āž– Low' }); } const saveRate = parseFloat(metrics.saveRate); if (saveRate >= benchmarks.saveRate.viral) { score += 25; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+25', status: 'šŸ”„ High value content' }); } else if (saveRate >= benchmarks.saveRate.good) { score += 15; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Save Rate', value: `${saveRate}%`, impact: '+5', status: 'āž– Low' }); } return score; } function scoreYouTube(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const vph = parseInt(metrics.viewsPerHour); if (vph >= benchmarks.viewsPerHour.viral) { score += 35; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+35', status: 'šŸ”„ Explosive growth' }); } else if (vph >= benchmarks.viewsPerHour.good) { score += 20; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+20', status: 'āœ… Good momentum' }); } else { score += 5; factors.push({ factor: 'Views/Hour', value: vph.toLocaleString(), impact: '+5', status: 'āž– Slow' }); } const ltv = parseFloat(metrics.likeToViewRatio); if (ltv >= benchmarks.likeToViewRatio.viral) { score += 25; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High approval' }); } else if (ltv >= benchmarks.likeToViewRatio.good) { score += 15; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Like Ratio', value: `${(ltv * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } return score; } function scoreTwitter(metrics, benchmarks, factors, raw) { let score = 0; const engRate = parseFloat(metrics.engagementRate); if (engRate >= benchmarks.engagementRate.viral) { score += 30; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+30', status: 'šŸ”„ VIRAL' }); } else if (engRate >= benchmarks.engagementRate.good) { score += 20; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 10; factors.push({ factor: 'Engagement Rate', value: `${engRate}%`, impact: '+10', status: 'āž– Average' }); } const rtRatio = parseFloat(metrics.retweetRatio); if (rtRatio >= benchmarks.retweetRatio.viral) { score += 35; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+35', status: 'šŸ”„ Highly shareable' }); } else if (rtRatio >= benchmarks.retweetRatio.good) { score += 20; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+20', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Retweet Ratio', value: `${(rtRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } const replyRatio = parseFloat(metrics.replyRatio); if (replyRatio >= benchmarks.replyRatio.viral) { score += 25; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+25', status: 'šŸ”„ High discussion' }); } else if (replyRatio >= benchmarks.replyRatio.good) { score += 15; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+15', status: 'āœ… Good' }); } else { score += 5; factors.push({ factor: 'Reply Ratio', value: `${(replyRatio * 100).toFixed(1)}%`, impact: '+5', status: 'āž– Low' }); } return score; } function getVerdict(score) { if (score >= 85) return { status: 'VIRAL', emoji: 'šŸ”„šŸ”„šŸ”„', description: 'This content is going viral or has strong viral potential' }; if (score >= 70) return { status: 'HIGH POTENTIAL', emoji: 'šŸ”„šŸ”„', description: 'Strong signals - likely to exceed normal reach' }; if (score >= 50) return { status: 'PROMISING', emoji: 'šŸ”„', description: 'Above average performance - could break out' }; if (score >= 30) return { status: 'AVERAGE', emoji: 'āž–', description: 'Normal performance for the platform' }; return { status: 'LOW', emoji: 'šŸ“‰', description: 'Below average - unlikely to gain significant traction' }; } function generatePrediction(score, raw, platform) { const currentViews = raw.views; const hoursOld = raw.hoursOld; // Simple projection based on current velocity and viral score const velocityMultiplier = score >= 70 ? 3 : score >= 50 ? 1.5 : 1; const currentVelocity = currentViews / hoursOld; const projections = { '24h': Math.round(currentViews + (currentVelocity * (24 - hoursOld) * velocityMultiplier)), '48h': Math.round(currentViews + (currentVelocity * (48 - hoursOld) * velocityMultiplier * 0.8)), '7d': Math.round(currentViews + (currentVelocity * (168 - hoursOld) * velocityMultiplier * 0.5)) }; return { currentVelocity: Math.round(currentVelocity), projections, confidence: score >= 50 ? 'Medium-High' : 'Low' }; } COMMAND_BLOCK: async function predictViral(videoUrl) { console.log('\nšŸ”® VIRAL CONTENT PREDICTOR\n'); console.log('═══════════════════════════════════════════\n'); // Detect platform const platform = detectPlatform(videoUrl); console.log(`Platform: ${platform.toUpperCase()}\n`); // Fetch metrics let metrics; switch (platform) { case 'tiktok': metrics = await getTikTokVideoMetrics(videoUrl); break; case 'instagram': metrics = await getInstagramReelMetrics(videoUrl); break; case 'youtube': metrics = await getYouTubeVideoMetrics(videoUrl); break; case 'twitter': metrics = await getTwitterVideoMetrics(videoUrl); break; default: console.log('Unsupported platform'); return; } if (!metrics) { console.log('Could not fetch video metrics.'); return; } // Display video info console.log('šŸ“¹ VIDEO INFO'); console.log('───────────────────────────────────────────'); console.log(`Views: ${metrics.views?.toLocaleString() || metrics.views}`); console.log(`Likes: ${metrics.likes?.toLocaleString()}`); console.log(`Comments: ${metrics.comments?.toLocaleString()}`); if (metrics.shares) console.log(`Shares: ${metrics.shares?.toLocaleString()}`); if (metrics.authorFollowers) console.log(`Creator Followers: ${metrics.authorFollowers?.toLocaleString()}`); console.log(`Posted: ${getTimeAgo(metrics.created || metrics.published)}\n`); // Calculate signals const signals = calculateViralSignals(metrics); // Predict viral potential const prediction = predictViralPotential(signals); // Display results console.log('═══════════════════════════════════════════'); console.log('šŸ“Š VIRAL SIGNALS'); console.log('═══════════════════════════════════════════\n'); prediction.factors.forEach(f => { console.log(`${f.status} ${f.factor}`); console.log(` Value: ${f.value} | Impact: ${f.impact}\n`); }); console.log('═══════════════════════════════════════════'); console.log('šŸŽÆ PREDICTION'); console.log('═══════════════════════════════════════════\n'); console.log(`${prediction.verdict.emoji} ${prediction.verdict.status}`); console.log(`Score: ${prediction.score}/100\n`); console.log(`${prediction.verdict.description}\n`); console.log('šŸ“ˆ VIEW PROJECTIONS:'); console.log(` Current velocity: ${prediction.prediction.currentVelocity.toLocaleString()} views/hour`); console.log(` 24 hours: ~${prediction.prediction.projections['24h'].toLocaleString()} views`); console.log(` 48 hours: ~${prediction.prediction.projections['48h'].toLocaleString()} views`); console.log(` 7 days: ~${prediction.prediction.projections['7d'].toLocaleString()} views`); console.log(` Confidence: ${prediction.prediction.confidence}`); return { metrics, signals, prediction }; } function detectPlatform(url) { if (url.includes('tiktok.com')) return 'tiktok'; if (url.includes('instagram.com')) return 'instagram'; if (url.includes('youtube.com') || url.includes('youtu.be')) return 'youtube'; if (url.includes('twitter.com') || url.includes('x.com')) return 'twitter'; return 'unknown'; } function getTimeAgo(date) { const hours = Math.round((Date.now() - date.getTime()) / (1000 * 60 * 60)); if (hours < 1) return 'Just now'; if (hours < 24) return `${hours} hours ago`; const days = Math.round(hours / 24); return `${days} days ago`; } Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: async function predictViral(videoUrl) { console.log('\nšŸ”® VIRAL CONTENT PREDICTOR\n'); console.log('═══════════════════════════════════════════\n'); // Detect platform const platform = detectPlatform(videoUrl); console.log(`Platform: ${platform.toUpperCase()}\n`); // Fetch metrics let metrics; switch (platform) { case 'tiktok': metrics = await getTikTokVideoMetrics(videoUrl); break; case 'instagram': metrics = await getInstagramReelMetrics(videoUrl); break; case 'youtube': metrics = await getYouTubeVideoMetrics(videoUrl); break; case 'twitter': metrics = await getTwitterVideoMetrics(videoUrl); break; default: console.log('Unsupported platform'); return; } if (!metrics) { console.log('Could not fetch video metrics.'); return; } // Display video info console.log('šŸ“¹ VIDEO INFO'); console.log('───────────────────────────────────────────'); console.log(`Views: ${metrics.views?.toLocaleString() || metrics.views}`); console.log(`Likes: ${metrics.likes?.toLocaleString()}`); console.log(`Comments: ${metrics.comments?.toLocaleString()}`); if (metrics.shares) console.log(`Shares: ${metrics.shares?.toLocaleString()}`); if (metrics.authorFollowers) console.log(`Creator Followers: ${metrics.authorFollowers?.toLocaleString()}`); console.log(`Posted: ${getTimeAgo(metrics.created || metrics.published)}\n`); // Calculate signals const signals = calculateViralSignals(metrics); // Predict viral potential const prediction = predictViralPotential(signals); // Display results console.log('═══════════════════════════════════════════'); console.log('šŸ“Š VIRAL SIGNALS'); console.log('═══════════════════════════════════════════\n'); prediction.factors.forEach(f => { console.log(`${f.status} ${f.factor}`); console.log(` Value: ${f.value} | Impact: ${f.impact}\n`); }); console.log('═══════════════════════════════════════════'); console.log('šŸŽÆ PREDICTION'); console.log('═══════════════════════════════════════════\n'); console.log(`${prediction.verdict.emoji} ${prediction.verdict.status}`); console.log(`Score: ${prediction.score}/100\n`); console.log(`${prediction.verdict.description}\n`); console.log('šŸ“ˆ VIEW PROJECTIONS:'); console.log(` Current velocity: ${prediction.prediction.currentVelocity.toLocaleString()} views/hour`); console.log(` 24 hours: ~${prediction.prediction.projections['24h'].toLocaleString()} views`); console.log(` 48 hours: ~${prediction.prediction.projections['48h'].toLocaleString()} views`); console.log(` 7 days: ~${prediction.prediction.projections['7d'].toLocaleString()} views`); console.log(` Confidence: ${prediction.prediction.confidence}`); return { metrics, signals, prediction }; } function detectPlatform(url) { if (url.includes('tiktok.com')) return 'tiktok'; if (url.includes('instagram.com')) return 'instagram'; if (url.includes('youtube.com') || url.includes('youtu.be')) return 'youtube'; if (url.includes('twitter.com') || url.includes('x.com')) return 'twitter'; return 'unknown'; } function getTimeAgo(date) { const hours = Math.round((Date.now() - date.getTime()) / (1000 * 60 * 60)); if (hours < 1) return 'Just now'; if (hours < 24) return `${hours} hours ago`; const days = Math.round(hours / 24); return `${days} days ago`; } COMMAND_BLOCK: async function predictViral(videoUrl) { console.log('\nšŸ”® VIRAL CONTENT PREDICTOR\n'); console.log('═══════════════════════════════════════════\n'); // Detect platform const platform = detectPlatform(videoUrl); console.log(`Platform: ${platform.toUpperCase()}\n`); // Fetch metrics let metrics; switch (platform) { case 'tiktok': metrics = await getTikTokVideoMetrics(videoUrl); break; case 'instagram': metrics = await getInstagramReelMetrics(videoUrl); break; case 'youtube': metrics = await getYouTubeVideoMetrics(videoUrl); break; case 'twitter': metrics = await getTwitterVideoMetrics(videoUrl); break; default: console.log('Unsupported platform'); return; } if (!metrics) { console.log('Could not fetch video metrics.'); return; } // Display video info console.log('šŸ“¹ VIDEO INFO'); console.log('───────────────────────────────────────────'); console.log(`Views: ${metrics.views?.toLocaleString() || metrics.views}`); console.log(`Likes: ${metrics.likes?.toLocaleString()}`); console.log(`Comments: ${metrics.comments?.toLocaleString()}`); if (metrics.shares) console.log(`Shares: ${metrics.shares?.toLocaleString()}`); if (metrics.authorFollowers) console.log(`Creator Followers: ${metrics.authorFollowers?.toLocaleString()}`); console.log(`Posted: ${getTimeAgo(metrics.created || metrics.published)}\n`); // Calculate signals const signals = calculateViralSignals(metrics); // Predict viral potential const prediction = predictViralPotential(signals); // Display results console.log('═══════════════════════════════════════════'); console.log('šŸ“Š VIRAL SIGNALS'); console.log('═══════════════════════════════════════════\n'); prediction.factors.forEach(f => { console.log(`${f.status} ${f.factor}`); console.log(` Value: ${f.value} | Impact: ${f.impact}\n`); }); console.log('═══════════════════════════════════════════'); console.log('šŸŽÆ PREDICTION'); console.log('═══════════════════════════════════════════\n'); console.log(`${prediction.verdict.emoji} ${prediction.verdict.status}`); console.log(`Score: ${prediction.score}/100\n`); console.log(`${prediction.verdict.description}\n`); console.log('šŸ“ˆ VIEW PROJECTIONS:'); console.log(` Current velocity: ${prediction.prediction.currentVelocity.toLocaleString()} views/hour`); console.log(` 24 hours: ~${prediction.prediction.projections['24h'].toLocaleString()} views`); console.log(` 48 hours: ~${prediction.prediction.projections['48h'].toLocaleString()} views`); console.log(` 7 days: ~${prediction.prediction.projections['7d'].toLocaleString()} views`); console.log(` Confidence: ${prediction.prediction.confidence}`); return { metrics, signals, prediction }; } function detectPlatform(url) { if (url.includes('tiktok.com')) return 'tiktok'; if (url.includes('instagram.com')) return 'instagram'; if (url.includes('youtube.com') || url.includes('youtu.be')) return 'youtube'; if (url.includes('twitter.com') || url.includes('x.com')) return 'twitter'; return 'unknown'; } function getTimeAgo(date) { const hours = Math.round((Date.now() - date.getTime()) / (1000 * 60 * 60)); if (hours < 1) return 'Just now'; if (hours < 24) return `${hours} hours ago`; const days = Math.round(hours / 24); return `${days} days ago`; } CODE_BLOCK: async function main() { const url = process.argv[2] || 'https://www.tiktok.com/@khaby.lame/video/7299831234567890'; await predictViral(url); } main(); Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: async function main() { const url = process.argv[2] || 'https://www.tiktok.com/@khaby.lame/video/7299831234567890'; await predictViral(url); } main(); CODE_BLOCK: async function main() { const url = process.argv[2] || 'https://www.tiktok.com/@khaby.lame/video/7299831234567890'; await predictViral(url); } main(); CODE_BLOCK: node index.js https://www.tiktok.com/@creator/video/1234567890 Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: node index.js https://www.tiktok.com/@creator/video/1234567890 CODE_BLOCK: node index.js https://www.tiktok.com/@creator/video/1234567890 CODE_BLOCK: šŸ”® VIRAL CONTENT PREDICTOR ═══════════════════════════════════════════ Platform: TIKTOK šŸ“± Fetching TikTok video metrics... šŸ“¹ VIDEO INFO ─────────────────────────────────────────── Views: 2,450,000 Likes: 312,000 Comments: 8,900 Shares: 45,200 Creator Followers: 1,200,000 Posted: 18 hours ago ═══════════════════════════════════════════ šŸ“Š VIRAL SIGNALS ═══════════════════════════════════════════ šŸ”„ VIRAL Engagement Rate Value: 14.9% | Impact: +30 šŸ”„ Breaking out Views vs Followers Value: 204.2% | Impact: +25 šŸ”„ High shareability Share Ratio Value: 14.5% | Impact: +25 āœ… Good Discussion Factor Value: 2.9% | Impact: +12 šŸš€ Fast start Early Velocity Value: 2,450,000 views in 18h | Impact: +10 ═══════════════════════════════════════════ šŸŽÆ PREDICTION ═══════════════════════════════════════════ šŸ”„šŸ”„šŸ”„ VIRAL Score: 92/100 This content is going viral or has strong viral potential šŸ“ˆ VIEW PROJECTIONS: Current velocity: 136,111 views/hour 24 hours: ~3,270,000 views 48 hours: ~5,890,000 views 7 days: ~18,200,000 views Confidence: Medium-High Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: šŸ”® VIRAL CONTENT PREDICTOR ═══════════════════════════════════════════ Platform: TIKTOK šŸ“± Fetching TikTok video metrics... šŸ“¹ VIDEO INFO ─────────────────────────────────────────── Views: 2,450,000 Likes: 312,000 Comments: 8,900 Shares: 45,200 Creator Followers: 1,200,000 Posted: 18 hours ago ═══════════════════════════════════════════ šŸ“Š VIRAL SIGNALS ═══════════════════════════════════════════ šŸ”„ VIRAL Engagement Rate Value: 14.9% | Impact: +30 šŸ”„ Breaking out Views vs Followers Value: 204.2% | Impact: +25 šŸ”„ High shareability Share Ratio Value: 14.5% | Impact: +25 āœ… Good Discussion Factor Value: 2.9% | Impact: +12 šŸš€ Fast start Early Velocity Value: 2,450,000 views in 18h | Impact: +10 ═══════════════════════════════════════════ šŸŽÆ PREDICTION ═══════════════════════════════════════════ šŸ”„šŸ”„šŸ”„ VIRAL Score: 92/100 This content is going viral or has strong viral potential šŸ“ˆ VIEW PROJECTIONS: Current velocity: 136,111 views/hour 24 hours: ~3,270,000 views 48 hours: ~5,890,000 views 7 days: ~18,200,000 views Confidence: Medium-High CODE_BLOCK: šŸ”® VIRAL CONTENT PREDICTOR ═══════════════════════════════════════════ Platform: TIKTOK šŸ“± Fetching TikTok video metrics... šŸ“¹ VIDEO INFO ─────────────────────────────────────────── Views: 2,450,000 Likes: 312,000 Comments: 8,900 Shares: 45,200 Creator Followers: 1,200,000 Posted: 18 hours ago ═══════════════════════════════════════════ šŸ“Š VIRAL SIGNALS ═══════════════════════════════════════════ šŸ”„ VIRAL Engagement Rate Value: 14.9% | Impact: +30 šŸ”„ Breaking out Views vs Followers Value: 204.2% | Impact: +25 šŸ”„ High shareability Share Ratio Value: 14.5% | Impact: +25 āœ… Good Discussion Factor Value: 2.9% | Impact: +12 šŸš€ Fast start Early Velocity Value: 2,450,000 views in 18h | Impact: +10 ═══════════════════════════════════════════ šŸŽÆ PREDICTION ═══════════════════════════════════════════ šŸ”„šŸ”„šŸ”„ VIRAL Score: 92/100 This content is going viral or has strong viral potential šŸ“ˆ VIEW PROJECTIONS: Current velocity: 136,111 views/hour 24 hours: ~3,270,000 views 48 hours: ~5,890,000 views 7 days: ~18,200,000 views Confidence: Medium-High - Analyzes early engagement metrics from any video - Compares against viral benchmarks - Predicts viral potential with a confidence score - First-hour engagement rate - Comment-to-like ratio (high ratio = controversial = viral) - Share velocity (shares in first 30 min) - Save rate (saves indicate high-value content) - Watch time / completion rate - TikTok: 10%+ engagement in first hour → 80% chance of algorithm push - Instagram Reels: 3%+ engagement → Featured on Explore - Twitter: 50+ engagements in first 15 min → Trending potential - YouTube Shorts: 70%+ retention → Recommended feed - Node.js: Runtime - SociaVault API: To fetch video metrics - OpenAI API: For content analysis - Tubular Labs: $1000+/month - Rival IQ: $239+/month - Sprout Social: $249+/month - Get your SociaVault API Key - Paste any video URL - Know if it's going viral before anyone else