added endpoint for downloading from extensions
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import {FastifyReply, FastifyRequest} from 'fastify';
|
||||
import fs from 'fs';
|
||||
import * as service from './local.service';
|
||||
import * as downloadService from './download.service';
|
||||
|
||||
type ScanQuery = {
|
||||
mode?: 'full' | 'incremental';
|
||||
@@ -16,6 +17,33 @@ type MatchBody = {
|
||||
matched_id: number | null;
|
||||
};
|
||||
|
||||
type DownloadAnimeBody = {
|
||||
anilist_id: number;
|
||||
episode_number: number;
|
||||
stream_url: string;
|
||||
quality?: string;
|
||||
subtitles?: Array<{
|
||||
language: string;
|
||||
url: string;
|
||||
}>;
|
||||
chapters?: Array<{
|
||||
title: string;
|
||||
start_time: number;
|
||||
end_time: number;
|
||||
}>;
|
||||
};
|
||||
|
||||
type DownloadBookBody = {
|
||||
anilist_id: number;
|
||||
chapter_number: number;
|
||||
format: 'manga' | 'novel';
|
||||
content?: string;
|
||||
images?: Array<{
|
||||
index: number;
|
||||
url: string;
|
||||
}>;
|
||||
};
|
||||
|
||||
export async function scanLibrary(request: FastifyRequest<{ Querystring: ScanQuery }>, reply: FastifyReply) {
|
||||
try {
|
||||
const mode = request.query.mode || 'incremental';
|
||||
@@ -182,4 +210,110 @@ export async function getPage(request: FastifyRequest, reply: FastifyReply) {
|
||||
}
|
||||
|
||||
return reply.status(400).send();
|
||||
}
|
||||
|
||||
export async function downloadAnime(request: FastifyRequest<{ Body: DownloadAnimeBody }>, reply: FastifyReply) {
|
||||
try {
|
||||
const {
|
||||
anilist_id,
|
||||
episode_number,
|
||||
stream_url,
|
||||
quality,
|
||||
subtitles,
|
||||
chapters
|
||||
} = request.body;
|
||||
|
||||
if (!anilist_id || !episode_number || !stream_url) {
|
||||
return reply.status(400).send({
|
||||
error: 'MISSING_REQUIRED_FIELDS',
|
||||
required: ['anilist_id', 'episode_number', 'stream_url']
|
||||
});
|
||||
}
|
||||
|
||||
const result = await downloadService.downloadAnimeEpisode({
|
||||
anilistId: anilist_id,
|
||||
episodeNumber: episode_number,
|
||||
streamUrl: stream_url,
|
||||
quality,
|
||||
subtitles,
|
||||
chapters
|
||||
});
|
||||
|
||||
if (result.status === 'ALREADY_EXISTS') {
|
||||
return reply.status(409).send(result);
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (err: any) {
|
||||
console.error('Error downloading anime:', err);
|
||||
|
||||
if (err.message === 'METADATA_NOT_FOUND') {
|
||||
return reply.status(404).send({ error: 'ANIME_NOT_FOUND_IN_ANILIST' });
|
||||
}
|
||||
|
||||
if (err.message === 'DOWNLOAD_FAILED') {
|
||||
return reply.status(500).send({ error: 'DOWNLOAD_FAILED', details: err.details });
|
||||
}
|
||||
|
||||
return reply.status(500).send({ error: 'FAILED_TO_DOWNLOAD_ANIME' });
|
||||
}
|
||||
}
|
||||
|
||||
export async function downloadBook(request: FastifyRequest<{ Body: DownloadBookBody }>, reply: FastifyReply) {
|
||||
try {
|
||||
const {
|
||||
anilist_id,
|
||||
chapter_number,
|
||||
format,
|
||||
content,
|
||||
images
|
||||
} = request.body;
|
||||
|
||||
if (!anilist_id || !chapter_number || !format) {
|
||||
return reply.status(400).send({
|
||||
error: 'MISSING_REQUIRED_FIELDS',
|
||||
required: ['anilist_id', 'chapter_number', 'format']
|
||||
});
|
||||
}
|
||||
|
||||
if (format === 'novel' && !content) {
|
||||
return reply.status(400).send({
|
||||
error: 'MISSING_CONTENT',
|
||||
message: 'content field is required for novels'
|
||||
});
|
||||
}
|
||||
|
||||
if (format === 'manga' && (!images || images.length === 0)) {
|
||||
return reply.status(400).send({
|
||||
error: 'MISSING_IMAGES',
|
||||
message: 'images field is required for manga'
|
||||
});
|
||||
}
|
||||
|
||||
const result = await downloadService.downloadBookChapter({
|
||||
anilistId: anilist_id,
|
||||
chapterNumber: chapter_number,
|
||||
format,
|
||||
content,
|
||||
images
|
||||
});
|
||||
|
||||
if (result.status === 'ALREADY_EXISTS') {
|
||||
return reply.status(409).send(result);
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (err: any) {
|
||||
console.error('Error downloading book:', err);
|
||||
|
||||
if (err.message === 'METADATA_NOT_FOUND') {
|
||||
return reply.status(404).send({ error: 'BOOK_NOT_FOUND_IN_ANILIST' });
|
||||
}
|
||||
|
||||
if (err.message === 'DOWNLOAD_FAILED') {
|
||||
return reply.status(500).send({ error: 'DOWNLOAD_FAILED', details: err.details });
|
||||
}
|
||||
|
||||
return reply.status(500).send({ error: 'FAILED_TO_DOWNLOAD_BOOK' });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user