126 lines
3.7 KiB
TypeScript
126 lines
3.7 KiB
TypeScript
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs"
|
|
import { randomUUID } from "crypto"
|
|
import { join } from "path"
|
|
|
|
const DATA_DIR = join(process.cwd(), "data")
|
|
const DATA_FILE = join(DATA_DIR, "videos.json")
|
|
|
|
export interface Video {
|
|
id: string
|
|
title: string
|
|
description: string
|
|
youtubeUrl: string
|
|
thumbnail: string
|
|
createdAt: string
|
|
}
|
|
|
|
function ensureDataDir() {
|
|
if (!existsSync(DATA_DIR)) {
|
|
mkdirSync(DATA_DIR, { recursive: true })
|
|
}
|
|
}
|
|
|
|
function seedDefaultVideos(): Video[] {
|
|
return [
|
|
{
|
|
id: randomUUID(),
|
|
title: "Getting Started with Your Android Box",
|
|
description: "Learn how to set up your new Android box and connect it to your TV",
|
|
youtubeUrl: "#",
|
|
thumbnail: "/images/android-box-setup.jpg",
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
{
|
|
id: randomUUID(),
|
|
title: "Installing Apps and Adding Channels",
|
|
description: "Step-by-step guide to installing your favorite streaming apps",
|
|
youtubeUrl: "#",
|
|
thumbnail: "/images/android-apps-streaming.jpg",
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
{
|
|
id: randomUUID(),
|
|
title: "Troubleshooting Common Issues",
|
|
description: "Quick fixes for buffering, connection issues, and more",
|
|
youtubeUrl: "#",
|
|
thumbnail: "/images/troubleshooting-tech-support.jpg",
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
{
|
|
id: randomUUID(),
|
|
title: "Optimizing Your Streaming Experience",
|
|
description: "Tips and tricks to get the best performance from your box",
|
|
youtubeUrl: "#",
|
|
thumbnail: "/images/streaming-optimization.jpg",
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
{
|
|
id: randomUUID(),
|
|
title: "Using the Remote Control",
|
|
description: "Master all the features of your remote control",
|
|
youtubeUrl: "#",
|
|
thumbnail: "/images/remote-control-android.jpg",
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
{
|
|
id: randomUUID(),
|
|
title: "Advanced Settings and Customization",
|
|
description: "Customize your Android box to match your viewing preferences",
|
|
youtubeUrl: "#",
|
|
thumbnail: "/images/android-settings-customization.jpg",
|
|
createdAt: new Date().toISOString(),
|
|
},
|
|
]
|
|
}
|
|
|
|
export function getVideos(): Video[] {
|
|
ensureDataDir()
|
|
if (!existsSync(DATA_FILE)) {
|
|
const defaults = seedDefaultVideos()
|
|
writeFileSync(DATA_FILE, JSON.stringify(defaults, null, 2))
|
|
return defaults
|
|
}
|
|
const raw = readFileSync(DATA_FILE, "utf-8")
|
|
return JSON.parse(raw)
|
|
}
|
|
|
|
export function addVideo(video: Omit<Video, "id" | "createdAt">): Video {
|
|
const videos = getVideos()
|
|
const newVideo: Video = {
|
|
...video,
|
|
id: randomUUID(),
|
|
createdAt: new Date().toISOString(),
|
|
}
|
|
videos.unshift(newVideo)
|
|
writeFileSync(DATA_FILE, JSON.stringify(videos, null, 2))
|
|
return newVideo
|
|
}
|
|
|
|
export function deleteVideo(id: string): boolean {
|
|
const videos = getVideos()
|
|
const filtered = videos.filter((v) => v.id !== id)
|
|
if (filtered.length === videos.length) return false
|
|
writeFileSync(DATA_FILE, JSON.stringify(filtered, null, 2))
|
|
return true
|
|
}
|
|
|
|
export function extractYoutubeId(url: string): string | null {
|
|
const patterns = [
|
|
/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/,
|
|
/youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/,
|
|
]
|
|
for (const pattern of patterns) {
|
|
const match = url.match(pattern)
|
|
if (match) return match[1]
|
|
}
|
|
return null
|
|
}
|
|
|
|
export function getYoutubeThumbnail(youtubeUrl: string): string {
|
|
const videoId = extractYoutubeId(youtubeUrl)
|
|
if (videoId) {
|
|
return `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`
|
|
}
|
|
return "/images/android-box-setup.jpg"
|
|
}
|