diff --git a/app/[lang]/projects/sections/ProjectContent.tsx b/app/[lang]/projects/sections/ProjectContent.tsx
index 2ced6b9..1754b89 100644
--- a/app/[lang]/projects/sections/ProjectContent.tsx
+++ b/app/[lang]/projects/sections/ProjectContent.tsx
@@ -20,6 +20,8 @@ import { WikiSideNavigation } from "@/components/wiki-side-navigation"
import { useTranslation } from "@/app/i18n/client"
import { LocaleTypes } from "@/app/i18n/settings"
import { ProjectBlogArticles } from "@/components/blog/project-blog-articles"
+import { ProjectYouTubeVideos } from "@/components/sections/ProjectYouTubeVideos"
+import { ProjectTeamMembers } from "@/components/project/project-team"
export const ProjectContent = ({
id,
@@ -232,8 +234,25 @@ export const ProjectContent = ({
{content?.description}
)}
+
+ {project?.youtubeLinks &&
+ project.youtubeLinks.length > 0 && (
+
+ )}
+
+ {project?.team && project.team.length > 0 && (
+
+ )}
+
diff --git a/app/api/youtube/videos/route.ts b/app/api/youtube/videos/route.ts
new file mode 100644
index 0000000..2d46357
--- /dev/null
+++ b/app/api/youtube/videos/route.ts
@@ -0,0 +1,97 @@
+import { NextRequest, NextResponse } from "next/server"
+
+interface YoutubeVideoResponse {
+ items: {
+ id: string
+ snippet: {
+ title: string
+ description: string
+ publishedAt: string
+ channelTitle: string
+ thumbnails: {
+ high: {
+ url: string
+ }
+ standard?: {
+ url: string
+ }
+ maxres?: {
+ url: string
+ }
+ }
+ }
+ }[]
+}
+
+// Helper function to add CORS headers
+function corsHeaders() {
+ return {
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
+ "Access-Control-Allow-Headers": "Content-Type, Authorization",
+ }
+}
+
+// Handle OPTIONS requests for CORS preflight
+export async function OPTIONS() {
+ return NextResponse.json({}, { headers: corsHeaders() })
+}
+
+export async function GET(request: NextRequest) {
+ try {
+ const searchParams = request.nextUrl.searchParams
+ const ids = searchParams.get("ids")
+
+ if (!ids) {
+ return NextResponse.json(
+ { error: "No video IDs provided" },
+ { status: 400, headers: corsHeaders() }
+ )
+ }
+
+ // API key should be in env variables
+ const apiKey = process.env.YOUTUBE_API_KEY
+
+ if (!apiKey) {
+ return NextResponse.json(
+ { error: "YouTube API key not configured" },
+ { status: 500, headers: corsHeaders() }
+ )
+ }
+
+ const youtubeApiUrl = `https://www.googleapis.com/youtube/v3/videos?part=snippet&id=${ids}&key=${apiKey}`
+
+ const response = await fetch(youtubeApiUrl)
+
+ if (!response.ok) {
+ throw new Error(`YouTube API responded with status: ${response.status}`)
+ }
+
+ const data: YoutubeVideoResponse = await response.json()
+
+ const formattedVideos = data.items.map((item) => {
+ // Get best available thumbnail
+ const thumbnailUrl =
+ item.snippet.thumbnails.maxres?.url ||
+ item.snippet.thumbnails.standard?.url ||
+ item.snippet.thumbnails.high.url
+
+ return {
+ id: item.id,
+ title: item.snippet.title,
+ description: item.snippet.description,
+ thumbnailUrl,
+ publishedAt: item.snippet.publishedAt,
+ channelTitle: item.snippet.channelTitle,
+ }
+ })
+
+ return NextResponse.json(formattedVideos, { headers: corsHeaders() })
+ } catch (error) {
+ console.error("Error fetching YouTube videos:", error)
+ return NextResponse.json(
+ { error: "Failed to fetch videos from YouTube API" },
+ { status: 500, headers: corsHeaders() }
+ )
+ }
+}
diff --git a/app/i18n/locales/en/common.json b/app/i18n/locales/en/common.json
index e5b4837..3c0de0a 100644
--- a/app/i18n/locales/en/common.json
+++ b/app/i18n/locales/en/common.json
@@ -99,5 +99,9 @@
"joinOurDiscord": "Join our discord",
"prevBrandImage": "Previous branding",
"editThisPage": "Edit this page",
- "contents": "Contents"
+ "contents": "Contents",
+ "projectVideos": "Project Videos",
+ "errorLoadingVideos": "Error loading videos",
+ "projectTeam": "Team",
+ "youtubeVideos": "YouTube Videos"
}
diff --git a/components/icons.tsx b/components/icons.tsx
index 0a86daa..3658657 100644
--- a/components/icons.tsx
+++ b/components/icons.tsx
@@ -11,6 +11,21 @@ export type Icon = LucideIcon
export const Icons = {
sun: SunMedium,
+ email: (props: LucideProps) => (
+
+ ),
time: (props: LucideProps) => (