2024-01-22 00:41:59 +01:00
|
|
|
import { Router } from "express";
|
|
|
|
import { existsSync, readFileSync } from "fs";
|
|
|
|
import { FULL_SERVER_ROOT } from "../Modules/Constants";
|
|
|
|
import { CreateBlurl } from "../Modules/BLURL";
|
2024-01-22 23:04:46 +01:00
|
|
|
import { Song } from "../Schemas/Song";
|
2024-01-22 00:41:59 +01:00
|
|
|
|
|
|
|
const App = Router();
|
|
|
|
|
2024-01-22 23:04:46 +01:00
|
|
|
App.get("/song/download/:InternalID/:File", async (req, res) => {
|
|
|
|
//const Song = AvailableFestivalSongs.find(x => x.UUID === req.params.SongUUID);
|
|
|
|
const SongData = await Song.findOne({ where: { ID: req.params.InternalID } });
|
|
|
|
if (!SongData)
|
|
|
|
return res.status(404).json({ errorMessage: "Song not found." });
|
2024-01-22 00:41:59 +01:00
|
|
|
|
2024-01-22 23:04:46 +01:00
|
|
|
const BaseURL = `${FULL_SERVER_ROOT}/song/download/${SongData.ID}/`;
|
2024-01-22 00:41:59 +01:00
|
|
|
switch (req.params.File.toLowerCase()) {
|
|
|
|
case "master.blurl":
|
|
|
|
case "main.blurl":
|
|
|
|
return res.set("content-type", "text/plain").send(
|
|
|
|
CreateBlurl({
|
|
|
|
playlists: [
|
|
|
|
{
|
|
|
|
type: "main",
|
|
|
|
language: "en",
|
|
|
|
url: `${BaseURL}master.blurl`,
|
2024-01-22 23:04:46 +01:00
|
|
|
data: readFileSync(`${SongData.Directory}/Manifest.mpd`).toString().replaceAll("{BASEURL}", BaseURL)
|
2024-01-22 00:41:59 +01:00
|
|
|
}
|
|
|
|
],
|
|
|
|
type: "vod",
|
|
|
|
audioonly: true
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
case "manifest":
|
|
|
|
case "manifest.mpd":
|
2024-01-22 23:04:46 +01:00
|
|
|
return res.set("content-type", "application/dash+xml").send(Buffer.from(readFileSync(`${SongData.Directory}/Manifest.mpd`).toString().replaceAll("{BASEURL}", BaseURL)));
|
2024-01-22 00:41:59 +01:00
|
|
|
|
|
|
|
case "cover":
|
|
|
|
case "cover.png":
|
2024-01-22 23:04:46 +01:00
|
|
|
return existsSync(`${SongData.Directory}/Cover.png`) ? res.set("content-type", "image/png").send(readFileSync(`${SongData.Directory}/Cover.png`)) : res.sendStatus(404);
|
2024-01-22 00:41:59 +01:00
|
|
|
|
|
|
|
// ! we are not risking a lawsuit
|
|
|
|
//case "midi.dat": // dont forget to encrypt!
|
|
|
|
//return existsSync(`${Song.Directory}/Data.mid`) ? res.set("content-type", "application/octet-stream").send(AesEncrypt(readFileSync(`${Song.Directory}/Data.mid`))) : res.sendStatus(404);
|
|
|
|
|
|
|
|
// funny little tip: you dont actually need to encrypt midis LMFAO
|
|
|
|
case "midi":
|
|
|
|
case "midi.mid":
|
|
|
|
case "midi.midi": // forget to encrypt!
|
2024-01-22 23:04:46 +01:00
|
|
|
return existsSync(`${SongData.Directory}/Data.mid`) ? res.set("content-type", "application/octet-stream").send(readFileSync(`${SongData.Directory}/Data.mid`)) : res.sendStatus(404);
|
2024-01-22 00:41:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!/^[\w\-.]+$/g.test(req.params.File))
|
|
|
|
return res.status(400).send("File name failed validation.");
|
|
|
|
|
|
|
|
if (!req.params.File.endsWith(".m4s"))
|
|
|
|
return res.sendStatus(403);
|
|
|
|
|
2024-01-22 23:04:46 +01:00
|
|
|
if (!existsSync(`${SongData.Directory}/Chunks/${req.params.File}`))
|
2024-01-22 00:41:59 +01:00
|
|
|
return res.sendStatus(404);
|
|
|
|
|
|
|
|
res.set("content-type", "video/mp4")
|
2024-01-22 23:04:46 +01:00
|
|
|
res.send(readFileSync(`${SongData.Directory}/Chunks/${req.params.File}`));
|
|
|
|
});
|
|
|
|
|
2024-01-28 11:07:10 +01:00
|
|
|
App.get("/:InternalID", async (req, res, next) => {
|
2024-01-22 23:04:46 +01:00
|
|
|
const SongData = await Song.findOne({ where: { ID: req.params.InternalID } });
|
|
|
|
if (!SongData)
|
2024-01-28 11:07:10 +01:00
|
|
|
return next(); // trust me bro
|
2024-01-22 23:04:46 +01:00
|
|
|
|
|
|
|
const BaseURL = `${FULL_SERVER_ROOT}/song/download/${SongData.ID}/`;
|
|
|
|
res.set("content-type", "application/json");
|
|
|
|
res.json({
|
|
|
|
playlist: Buffer.from(readFileSync(`${SongData.Directory}/Manifest.mpd`).toString().replaceAll("{BASEURL}", BaseURL)).toString("base64"),
|
|
|
|
playlistType: "application/dash+xml",
|
|
|
|
metadata: {
|
|
|
|
assetId: "",
|
|
|
|
baseUrls: [ BaseURL ],
|
|
|
|
supportsCaching: true,
|
|
|
|
ucp: "a",
|
|
|
|
version: Math.floor(Date.now() / 1000)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
2024-01-22 00:41:59 +01:00
|
|
|
|
|
|
|
export default {
|
|
|
|
App
|
|
|
|
}
|