Published your App
Replit-Commit-Author: Deployment Replit-Commit-Session-Id: 413891e8-d784-4bea-b9f5-91a5a68316b4 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 9acaba5b-d1bd-445d-83cf-46e174f69cc1 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/413891e8-d784-4bea-b9f5-91a5a68316b4/igVW4lQ Replit-Commit-Deployment-Build-Id: d7d10bce-067c-481a-b090-e3d2518d7a39 Replit-Helium-Checkpoint-Created: true
This commit is contained in:
@@ -6,6 +6,7 @@ import { seedDatabase } from "./seed";
|
||||
import multer from "multer";
|
||||
import path from "path";
|
||||
import fs from "fs";
|
||||
import https from "https";
|
||||
|
||||
const uploadDir = path.join(process.cwd(), "client/public/uploads");
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
@@ -106,5 +107,70 @@ export async function registerRoutes(
|
||||
res.json({ url });
|
||||
});
|
||||
|
||||
function bunnyFetch(path: string): Promise<any> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const options = {
|
||||
hostname: "video.bunnycdn.com",
|
||||
path,
|
||||
method: "GET",
|
||||
headers: { "AccessKey": process.env.BUNNY_API_KEY || "", "Accept": "application/json" },
|
||||
};
|
||||
const req = https.request(options, (res) => {
|
||||
let body = "";
|
||||
res.on("data", (c: string) => (body += c));
|
||||
res.on("end", () => {
|
||||
try { resolve(JSON.parse(body)); } catch { reject(new Error(body)); }
|
||||
});
|
||||
});
|
||||
req.on("error", reject);
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
|
||||
const LIBRARY_ID = process.env.BUNNY_LIBRARY_ID || "476412";
|
||||
const CDN_HOST = process.env.BUNNY_CDN_HOST || "vz-7982dfc4-cc8.b-cdn.net";
|
||||
|
||||
app.get("/api/videos", async (req, res) => {
|
||||
try {
|
||||
const page = parseInt(req.query.page as string) || 1;
|
||||
const perPage = parseInt(req.query.perPage as string) || 20;
|
||||
const search = req.query.search as string || "";
|
||||
let path = `/library/${LIBRARY_ID}/videos?page=${page}&itemsPerPage=${perPage}&orderBy=date`;
|
||||
if (search) path += `&search=${encodeURIComponent(search)}`;
|
||||
const data = await bunnyFetch(path);
|
||||
const videos = (data.items || []).map((v: any) => ({
|
||||
guid: v.guid,
|
||||
title: (v.title || "").replace(/\.mp4$/i, ""),
|
||||
length: v.length,
|
||||
dateUploaded: v.dateUploaded,
|
||||
thumbnail: `https://${CDN_HOST}/${v.guid}/${v.thumbnailFileName || "thumbnail.jpg"}`,
|
||||
embedUrl: `https://player.mediadelivery.net/embed/${LIBRARY_ID}/${v.guid}`,
|
||||
hlsUrl: `https://${CDN_HOST}/${v.guid}/playlist.m3u8`,
|
||||
status: v.status,
|
||||
}));
|
||||
res.json({ items: videos, totalItems: data.totalItems, currentPage: data.currentPage });
|
||||
} catch (err: any) {
|
||||
res.status(500).json({ message: err.message });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/videos/:guid", async (req, res) => {
|
||||
try {
|
||||
const data = await bunnyFetch(`/library/${LIBRARY_ID}/videos/${req.params.guid}`);
|
||||
res.json({
|
||||
guid: data.guid,
|
||||
title: (data.title || "").replace(/\.mp4$/i, ""),
|
||||
length: data.length,
|
||||
dateUploaded: data.dateUploaded,
|
||||
thumbnail: `https://${CDN_HOST}/${data.guid}/${data.thumbnailFileName || "thumbnail.jpg"}`,
|
||||
embedUrl: `https://player.mediadelivery.net/embed/${LIBRARY_ID}/${data.guid}`,
|
||||
hlsUrl: `https://${CDN_HOST}/${data.guid}/playlist.m3u8`,
|
||||
status: data.status,
|
||||
});
|
||||
} catch (err: any) {
|
||||
res.status(500).json({ message: err.message });
|
||||
}
|
||||
});
|
||||
|
||||
return httpServer;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user