feat(api): Basic api
This commit is contained in:
parent
d94735a9e8
commit
4ba189fa1f
4 changed files with 1343 additions and 2 deletions
1235
package-lock.json
generated
1235
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -5,8 +5,8 @@
|
||||||
"main": "src/download.ts",
|
"main": "src/download.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"start": "node dist/lucida.js",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"server": "npx ts-node src/index.ts"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -15,9 +15,12 @@
|
||||||
"author": "Tibo De Peuter <tibo@depeuter.dev>",
|
"author": "Tibo De Peuter <tibo@depeuter.dev>",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"body-parser": "^1.20.3",
|
||||||
|
"express": "^4.21.2",
|
||||||
"playwright": "1.47.0"
|
"playwright": "1.47.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/express": "^5.0.0",
|
||||||
"@types/node": "^22.10.2",
|
"@types/node": "^22.10.2",
|
||||||
"typescript": "^5.7.2"
|
"typescript": "^5.7.2"
|
||||||
}
|
}
|
||||||
|
|
38
src/index.ts
Normal file
38
src/index.ts
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
import express from 'express';
|
||||||
|
import bodyParser from "body-parser";
|
||||||
|
import QueueManager from './queueManager';
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
const port = 3000;
|
||||||
|
const server = new QueueManager();
|
||||||
|
|
||||||
|
app.use(bodyParser.urlencoded({ extended: true }));
|
||||||
|
app.use(bodyParser.json());
|
||||||
|
|
||||||
|
app.get('/api/queue', (req, res) => {
|
||||||
|
res.json(server.getQueue());
|
||||||
|
});
|
||||||
|
|
||||||
|
app.post('/api/queue', (req, res) => {
|
||||||
|
const album: URL = req.body.album;
|
||||||
|
|
||||||
|
if (!album) {
|
||||||
|
res.status(400).send('No album URL provided');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server.addToQueue(album)) {
|
||||||
|
res.status(201).send('Album added to queue');
|
||||||
|
} else {
|
||||||
|
res.status(409).send('Album already in queue');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`Server running on port ${port}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('SIGINT', async () => {
|
||||||
|
await server.forceStop();
|
||||||
|
process.exit();
|
||||||
|
});
|
65
src/queueManager.ts
Normal file
65
src/queueManager.ts
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
import {firefox, Browser, BrowserContext} from "playwright";
|
||||||
|
|
||||||
|
class QueueManager {
|
||||||
|
private browser: Browser | null;
|
||||||
|
private queue: URL[];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.browser = null;
|
||||||
|
this.queue = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
getQueue(): URL[] {
|
||||||
|
return this.queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
addToQueue(url: URL): boolean {
|
||||||
|
if (this.queue.includes(url)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.queue.push(url);
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
const promise = this.processQueue();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
forceStop(): Promise<void> {
|
||||||
|
if (this.browser === null) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.browser.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async processQueue(): Promise<void> {
|
||||||
|
if (this.browser !== null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Starting browser');
|
||||||
|
this.browser = await firefox.launch({headless: true});
|
||||||
|
const context: BrowserContext = await this.browser.newContext({
|
||||||
|
acceptDownloads: true,
|
||||||
|
baseURL: 'https://lucida.to'
|
||||||
|
});
|
||||||
|
|
||||||
|
while (this.queue.length > 0) {
|
||||||
|
const album: URL = new URL('https://google.com');
|
||||||
|
// TODO
|
||||||
|
console.log(`Processing ${album.href}`);
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 10000));
|
||||||
|
console.log(`Finished processing ${album.href}`);
|
||||||
|
|
||||||
|
this.queue.shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Shutting down browser');
|
||||||
|
await this.browser.close();
|
||||||
|
this.browser = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default QueueManager;
|
Reference in a new issue