feat: implement data management panel and blog data utilities
This commit is contained in:
@@ -61,10 +61,10 @@ const blogItems: CommandPaletteItem[] = [
|
||||
},
|
||||
{
|
||||
id: "blog-content-page",
|
||||
label: "Podcast ve İçerikler",
|
||||
label: "Video ve Notlar",
|
||||
href: "/content",
|
||||
icon: "mdi:microphone-outline",
|
||||
keywords: ["podcast", "yazılım", "masa başı", "içerik", "content"],
|
||||
icon: "mdi:video-outline",
|
||||
keywords: ["video", "youtube", "not", "pdf", "içerik", "content"],
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
+1
-64
@@ -1,71 +1,8 @@
|
||||
import { readdir, readFile } from "node:fs/promises";
|
||||
import { readdir } 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 ?? "Başlıksız Bölüm",
|
||||
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"));
|
||||
|
||||
Reference in New Issue
Block a user