From a91fdf59c4d9bdc45bc7b943eb8ca2cbea322826 Mon Sep 17 00:00:00 2001 From: Urban Modig Date: Mon, 29 Sep 2025 17:28:46 +0200 Subject: [PATCH] init --- Dockerfile | 11 +++++++++ build.sh | 5 ++++ server.js | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ start.sh | 7 ++++++ 4 files changed, 90 insertions(+) create mode 100644 Dockerfile create mode 100644 build.sh create mode 100644 server.js create mode 100644 start.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..75a050e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM ghcr.io/puppeteer/puppeteer:latest + +USER pptruser + +WORKDIR /home/pptruser + +COPY server.js /home/pptruser + +RUN npm install express + +CMD node server.js diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..0e445dc --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +docker build -t urmo/pptr:latest . +docker tag urmo/pptr:latest rubble.se:5000/urmo/pptr +docker push rubble.se:5000/urmo/pptr diff --git a/server.js b/server.js new file mode 100644 index 0000000..443e380 --- /dev/null +++ b/server.js @@ -0,0 +1,67 @@ +const express = require('express') +const bodyParser = require('body-parser') +const app = express() +const port = 3000 +const puppeteer = require('puppeteer'); + +app.use(bodyParser.text()) +//app.use(bodyParser.urlencoded({ extended: false })) + +async function retry(promiseFactory, retryCount) { + try { + return await promiseFactory(); + } catch (error) { + if (retryCount <= 0) { + throw error; + } + return await retry(promiseFactory, retryCount - 1); + } +} + +function run (url) { + return new Promise(async (resolve, reject) => { + try { + const browser = await puppeteer.launch({headless: 'new'}); + const page = await browser.newPage(); + // "https://sxyprn.com/post/6461f5ddbc5c9.html" + // await page.goto(url); + + await retry( + () => page.goto(url), + 5 // retry this 5 times + ); + + let urls = await page.evaluate(() => { + //let item = document.querySelector('video#player_el'); + //return "https://sxyprn.com" + item.getAttribute('src'); + + let results = []; + let items = document.querySelectorAll('video#player_el'); + items.forEach((item) => { + results.push(document.title); + results.push("https://sxyprn.com" + item.getAttribute('src')); + }); + return results; + + }) + browser.close(); + return resolve(JSON.stringify(urls)); + } catch (e) { + return reject(e); + } + }) +} + + +// example req. curl -X POST localhost:3000 -H "Content-Type: text/plain" --data 'https://sxyprn.com/post/653e2c6329e1c.html' +app.post('/', (req, res) => { +console.log(req.body); + run(req.body) + .then((r) => { + res.send(r) + }); +}) + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..02e5bef --- /dev/null +++ b/start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +docker run -d --name Pptr \ + --cap-add=SYS_ADMIN \ + --restart unless-stopped \ + -p 3000:3000 \ + urmo/pptr