kv-app/app/api/tiktok/route.ts

83 lines
No EOL
5 KiB
TypeScript

'use server'
import { NextRequest, NextResponse } from 'next/server'
export async function POST(request: NextRequest) {
try {
const { region = 'VN' } = await request.json()
const regionTopics: Record<string, any[]> = {
VN: [
{ hashtag: '#foodchallenge', desc: 'Thử thách 24 giờ chỉ ăn một món 🍜', usernames: ['anvlog', 'foodie.vn', 'monanvn', 'nauananh'] },
{ hashtag: '#tech', desc: 'Mua đồ công nghệ giá rẻ ở đâu? 🛒', usernames: ['techreview', 'dienthoaivui', 'congnghe247'] },
{ hashtag: '#beauty', desc: 'Hướng dẫn make-up tự nhiên cho người mới 💄', usernames: ['lamdep365', 'beautyqueen', 'trangdiem'] },
{ hashtag: '#fashion', desc: 'Phong cách thời trang mùa hè 2024 👗', usernames: ['fashionista', 'thoitrangvn', 'baochi'] },
{ hashtag: '#fitness', desc: 'Bí quyết tập gym tại nhà cho người bận rộn 💪', usernames: ['fitlife', 'gymhome', 'workoutvn'] },
{ hashtag: '#travel', desc: 'Du lịch Việt Nam - Đà Lạt mùa hoa lavender 🌸', usernames: ['dulichvn', 'travelblog', 'xuhuong'] },
{ hashtag: '#dance', desc: 'Dance challenge tuần này 🕺💃', usernames: ['dancelover', 'nhaycue', 'beatvn'] },
{ hashtag: '#comedy', desc: 'Hài hước mỗi ngày - Tiếu nhân nhà giàu 😆', usernames: ['funnyvn', 'haivuive', 'mcodinguyen'] },
{ hashtag: '#recipe', desc: 'Nấu ăn ngon cho cả nhà - Món ngon mỗi ngày 🍳', usernames: ['chefhome', 'nauanngon', 'maicook'] },
{ hashtag: '#motivation', desc: 'Truyền động lực mỗi sáng - Đừng bỏ cuộc 🔥', usernames: ['motivation', 'tuluc', 'camhung'] },
],
US: [
{ hashtag: '#food', desc: 'What I eat in a day 🍕', usernames: ['foodie', 'cooking_with_emma'] },
{ hashtag: '#fitness', desc: 'Gym routine that actually works 💪', usernames: ['fitness_journey', 'gymrat'] },
{ hashtag: '#dance', desc: 'New dance challenge 🕺💃', usernames: ['dance_vibes', ' choreography_'] },
{ hashtag: '#comedy', desc: 'POV: When Monday hits different 😆', usernames: ['comedy_central', 'relatable'] },
{ hashtag: '#travel', desc: 'Best hidden gems in [City] ✈️', usernames: ['travel_guides', 'wanderlust'] },
{ hashtag: '#fashion', desc: 'Summer fashion inspo 2024 👗', usernames: ['fashion_inspo', 'style_daily'] },
{ hashtag: '#beauty', desc: 'Simple daily makeup routine 💄', usernames: ['beauty_tips', 'glow_getter'] },
{ hashtag: '#lifestyle', desc: 'Day in my life vlog 📹', usernames: ['vlog_life', 'daily_vibes'] },
{ hashtag: '#recipe', desc: 'Easy recipe for beginners 🍳', usernames: ['cooking_101', 'chef_mike'] },
{ hashtag: '#pets', desc: 'My pet doing the funniest thing 🐕', usernames: ['pet_life', 'furparent'] },
],
GLOBAL: [
{ hashtag: '#food', desc: 'Best food from my country 🍜', usernames: ['global_foodie'] },
{ hashtag: '#travel', desc: 'Traveling the world on a budget ✈️', usernames: ['wanderworld'] },
{ hashtag: '#dance', desc: 'Viral dance challenge 2024 🕺', usernames: ['danceworld'] },
{ hashtag: '#fitness', desc: 'Home workout no equipment 💪', usernames: ['fit_home'] },
{ hashtag: '#comedy', desc: 'Things only [ nationality ] understand 😆', usernames: ['comedy_world'] },
{ hashtag: '#fashion', desc: 'Street style looks 👗', usernames: ['streetstyle'] },
{ hashtag: '#beauty', desc: 'Skincare routine for beginners 💄', usernames: ['glow_essentials'] },
{ hashtag: '#music', desc: 'Original song cover 🎵', usernames: ['cover_singer'] },
{ hashtag: '#nature', desc: 'Most beautiful places on Earth 🌄', usernames: ['nature_finds'] },
{ hashtag: '#art', desc: 'Digital art process 🎨', usernames: ['digital_art'] },
],
}
const topics = regionTopics[region] || regionTopics.GLOBAL
const videos = topics.map((topic, i) => {
const username = topic.usernames[Math.floor(Math.random() * topic.usernames.length)]
const playCount = Math.floor(Math.random() * 5000000) + 500000
const likeCount = Math.floor(playCount * (0.15 + Math.random() * 0.2))
return {
id: `${region}${Date.now()}${i}`,
url: `https://www.tiktok.com/@${username}/video/${region}${i}`,
thumbnail: `https://picsum.photos/seed/trending${region}${i}/360/640`,
caption: `${topic.desc} ${topic.hashtag}`,
playCount,
likeCount,
commentCount: Math.floor(likeCount * 0.02),
shareCount: Math.floor(likeCount * 0.01),
authorName: username,
authorAvatar: `https://api.dicebear.com/7.x/initials/svg?seed=${username}`,
hashtags: [topic.hashtag],
}
})
return NextResponse.json({
videos,
region,
count: videos.length,
source: 'generated'
})
} catch (error: any) {
console.error('API error:', error)
return NextResponse.json({
videos: [],
error: error.message
}, { status: 500 })
}
}