Files
poyraz-portfolio/lib/content-page.ts
T
poyrazavsever c253bad8bf Add new podcast episodes and update content structure
- Created new podcast episode files for "Freelance Client Stories", "Productivity Without Burnout", "Conversations with Builders", "Stable Frontend Systems", "Writing Cleaner Service Layers", and "Foundations Over Tools" with relevant metadata and episode notes.
- Introduced a new TypeScript type definition for PodcastKind and PodcastEpisode to enhance type safety.
- Implemented a content reading function to fetch and sort podcast episodes by date.
- Updated package.json to include new dependencies: gray-matter for markdown parsing and pdfjs-dist for PDF handling.
- Added PDF files for Atomic Design and personal resume to the public directory.
2026-03-10 22:21:40 +03:00

74 lines
2.1 KiB
TypeScript

import { readdir, readFile } from "node:fs/promises";
import path from "node:path";
import matter from "gray-matter";
import type { PodcastEpisode, PodcastKind } from "@/data/content-types";
type EpisodeFrontmatter = {
title: string;
date: string;
youtubeUrl: string;
spotifyUrl: string;
podcast: PodcastKind;
};
const PODCAST_DIR = path.join(process.cwd(), "content", "podcasts");
const PDF_DIR = path.join(process.cwd(), "public", "pdf");
function sortEpisodesByDateDesc(episodes: PodcastEpisode[]) {
return [...episodes].sort((a, b) => {
const aTime = Number(new Date(a.date));
const bTime = Number(new Date(b.date));
if (!Number.isNaN(aTime) && !Number.isNaN(bTime)) {
return bTime - aTime;
}
return a.title.localeCompare(b.title);
});
}
async function readPodcastEpisodes(kind: PodcastKind): Promise<PodcastEpisode[]> {
const folder = path.join(PODCAST_DIR, kind);
const files = await readdir(folder);
const mdFiles = files.filter((file) => file.endsWith(".md"));
const episodes = await Promise.all(
mdFiles.map(async (file) => {
const fullPath = path.join(folder, file);
const raw = await readFile(fullPath, "utf8");
const parsed = matter(raw);
const data = parsed.data as Partial<EpisodeFrontmatter>;
return {
slug: file.replace(/\.md$/, ""),
title: data.title ?? "Untitled Episode",
date: data.date ?? "1970-01-01",
youtubeUrl: data.youtubeUrl ?? "",
spotifyUrl: data.spotifyUrl ?? "",
podcast: data.podcast ?? kind,
markdown: parsed.content.trim(),
} satisfies PodcastEpisode;
}),
);
return sortEpisodesByDateDesc(episodes);
}
export async function getPodcastCollections() {
const [yazilim, masaBasi] = await Promise.all([
readPodcastEpisodes("yazilim"),
readPodcastEpisodes("masa-basi"),
]);
return {
yazilim,
masaBasi,
};
}
export async function getPdfNotes() {
const files = await readdir(PDF_DIR);
const pdfFiles = files.filter((file) => file.toLowerCase().endsWith(".pdf"));
return pdfFiles.sort((a, b) => a.localeCompare(b));
}