don't flush album data all at once
This commit is contained in:
parent
fa3e91663d
commit
d9216fe8ce
2 changed files with 14 additions and 25 deletions
|
|
@ -60,9 +60,11 @@ router.get(path, async (req, res, next) => {
|
||||||
// TODO: stream to user
|
// TODO: stream to user
|
||||||
const filePath = await downloadSongFile(streamInfo.streamUrl, decryptionKey, codecType.codecType, trackMetadata);
|
const filePath = await downloadSongFile(streamInfo.streamUrl, decryptionKey, codecType.codecType, trackMetadata);
|
||||||
const fileExt = "." + filePath.split(".").at(-1) as string; // safe cast, filePath is always a valid path
|
const fileExt = "." + filePath.split(".").at(-1) as string; // safe cast, filePath is always a valid path
|
||||||
const fileName = formatSongForFs(trackAttributes) + fileExt;
|
|
||||||
|
|
||||||
|
const fileName = formatSongForFs(trackAttributes) + fileExt;
|
||||||
res.attachment(fileName);
|
res.attachment(fileName);
|
||||||
|
res.flushHeaders();
|
||||||
|
|
||||||
res.sendFile(filePath, { root: "." });
|
res.sendFile(filePath, { root: "." });
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
next(err);
|
next(err);
|
||||||
|
|
|
||||||
|
|
@ -32,22 +32,24 @@ paths[path] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
interface AlbumEntry {
|
|
||||||
path: string;
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: include album art?
|
// TODO: include album art?
|
||||||
router.get(path, async (req, res, next) => {
|
router.get(path, async (req, res, next) => {
|
||||||
try {
|
try {
|
||||||
const { id, codec } = (await validate(req, schema)).query;
|
const { id, codec } = (await validate(req, schema)).query;
|
||||||
|
|
||||||
const files: AlbumEntry[] = [];
|
|
||||||
|
|
||||||
const albumMetadata = await appleMusicApi.getAlbum(id);
|
const albumMetadata = await appleMusicApi.getAlbum(id);
|
||||||
const albumAttributes = albumMetadata.data[0].attributes;
|
const albumAttributes = albumMetadata.data[0].attributes;
|
||||||
const tracks = albumMetadata.data[0].relationships.tracks.data;
|
const tracks = albumMetadata.data[0].relationships.tracks.data;
|
||||||
|
|
||||||
|
const fileName = formatAlbumForFs(albumAttributes) + ".zip";
|
||||||
|
res.attachment(fileName);
|
||||||
|
res.flushHeaders();
|
||||||
|
|
||||||
|
const zipArchiver = archiver("zip");
|
||||||
|
zipArchiver.pipe(res);
|
||||||
|
zipArchiver.on("error", (err) => { throw err; });
|
||||||
|
zipArchiver.on("warning", (err) => { throw err; });
|
||||||
|
|
||||||
for (const track of tracks) {
|
for (const track of tracks) {
|
||||||
const trackId = track.attributes.playParams?.id;
|
const trackId = track.attributes.playParams?.id;
|
||||||
if (trackId === undefined) { throw new Error("track id gone, this may indicate your song isn't accessable w/ your subscription!"); }
|
if (trackId === undefined) { throw new Error("track id gone, this may indicate your song isn't accessable w/ your subscription!"); }
|
||||||
|
|
@ -75,28 +77,13 @@ router.get(path, async (req, res, next) => {
|
||||||
const fileExt = "." + filePath.split(".").at(-1) as string; // safe cast, filePath is always a valid path
|
const fileExt = "." + filePath.split(".").at(-1) as string; // safe cast, filePath is always a valid path
|
||||||
const fileName = formatSongForFs(trackAttributes) + fileExt;
|
const fileName = formatSongForFs(trackAttributes) + fileExt;
|
||||||
|
|
||||||
files.push({
|
zipArchiver.file(filePath, { name: fileName });
|
||||||
path: filePath,
|
|
||||||
name: fileName
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const fileName = formatAlbumForFs(albumAttributes) + ".zip";
|
|
||||||
const zipArchiver = archiver("zip");
|
|
||||||
|
|
||||||
zipArchiver.on("error", (err) => { throw err; });
|
|
||||||
zipArchiver.pipe(res);
|
|
||||||
|
|
||||||
for (const file of files) {
|
|
||||||
zipArchiver.file(file.path, { name: file.name });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const albumCover = await downloadAlbumCover(albumAttributes);
|
const albumCover = await downloadAlbumCover(albumAttributes);
|
||||||
const albumCoverExt = albumCover.slice(albumCover.lastIndexOf(".") + 1);
|
const albumCoverExt = albumCover.slice(albumCover.lastIndexOf(".") + 1);
|
||||||
zipArchiver.file(await downloadAlbumCover(albumAttributes), { name: `cover.${albumCoverExt}` });
|
zipArchiver.file(albumCover, { name: `cover.${albumCoverExt}` });
|
||||||
zipArchiver.finalize();
|
zipArchiver.finalize();
|
||||||
|
|
||||||
res.attachment(fileName);
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
next(err);
|
next(err);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue