diff --git a/] b/]
deleted file mode 100644
index 525d7829..00000000
--- a/]
+++ /dev/null
@@ -1,146 +0,0 @@
-
-
-
-
-
-
-
diff --git a/package-lock.json b/package-lock.json
index 74c6e730..35a6451a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6906,6 +6906,15 @@
}
}
},
+ "m3u8stream": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.7.1.tgz",
+ "integrity": "sha512-z6ldnAdhbuWOL6LmMkwptSZGzj+qbRytMKLTbNicwF/bJMjf9U9lqD57RNQUFecvWadEkzy6PDjcNJFFgi19uQ==",
+ "requires": {
+ "miniget": "^1.6.1",
+ "sax": "^1.2.4"
+ }
+ },
"make-dir": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
@@ -7210,6 +7219,11 @@
"webpack-sources": "^1.1.0"
}
},
+ "miniget": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/miniget/-/miniget-1.7.2.tgz",
+ "integrity": "sha512-USPNNK2bnHLOplX8BZVMehUkyQizS/DFpBdoH0TS+fM+hQoLNg9tWg4MeY9wE8gfY0pbzmx5UBEODujt3Lz8AA=="
+ },
"minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
diff --git a/package.json b/package.json
index abea53b7..e3858532 100644
--- a/package.json
+++ b/package.json
@@ -99,6 +99,7 @@
"knex": "^0.20.10",
"knex-migrate": "^1.7.4",
"longjohn": "^0.2.12",
+ "m3u8stream": "^0.7.1",
"mime": "^2.4.4",
"moment": "^2.24.0",
"nanoid": "^2.1.11",
diff --git a/src/scrapers/teencoreclub.js b/src/scrapers/teencoreclub.js
index a84d8b01..0f248942 100644
--- a/src/scrapers/teencoreclub.js
+++ b/src/scrapers/teencoreclub.js
@@ -1,8 +1,12 @@
'use strict';
+const fs = require('fs');
const moment = require('moment');
+const m3u8stream = require('m3u8stream');
+const logger = require('../logger')(__filename);
const http = require('../utils/http');
+const qu = require('../utils/qu');
const { prefixUrl } = require('../utils/qu');
function scrapeLatest(scenes, entity) {
@@ -36,12 +40,56 @@ function scrapeLatest(scenes, entity) {
release.tags = ['gay'];
}
- console.log(scene);
- console.log(release);
return release;
});
}
+async function scrapeScene({ query }, url, entity) {
+ const release = {};
+
+ const entryId = new URL(url).pathname.match(/\/video\/(\d+)/)[1];
+ release.entryId = entryId;
+
+ const title = query.meta('name=title');
+
+ if (/bic/i.test(title)) {
+ release.shootId = title.toUpperCase().replace('-', '_');
+ } else {
+ release.title = title;
+ }
+
+ release.date = query.date('.detail-meta li:nth-child(2)', 'YYYY');
+ release.datePrecision = 'year';
+
+ release.description = query.q('.detail-description', true);
+ release.duration = query.dur('.detail-meta li:first-child');
+
+ release.actors = [query.q('.detail-hero-title h1', true)];
+
+ release.poster = query.q('.detail-hero').style['background-image'].match(/url\((.+)\)/)[1];
+ release.photos = query.imgs('.detail-grabs img');
+
+ const streamData = await http.get(`${entity.url}/video/source/${entryId}`, {
+ host: new URL(entity.url).host,
+ referer: url,
+ });
+
+ if (streamData.ok && streamData.body.status === 'success') {
+ console.log(streamData.body);
+
+ await m3u8stream(streamData.body.link)
+ .pipe(fs.createWriteStream('./trailer.mp4'))
+ .on('progress', status => console.log(status))
+ .on('error', error => console.log(error));
+ }
+
+ if (streamData.body.status !== 'success') {
+ logger.warn(`Could not retrieve trailer from ${entity.name} (Teen Core Club): ${streamData.body.status}`);
+ }
+
+ return release;
+}
+
async function fetchLatest(entity, page = 1) {
// console.log(entity, page);
@@ -58,6 +106,17 @@ async function fetchLatest(entity, page = 1) {
return null;
}
+async function fetchScene(url, entity) {
+ const res = await qu.get(url);
+
+ if (res.ok) {
+ return scrapeScene(res.item, url, entity);
+ }
+
+ return res.status;
+}
+
module.exports = {
fetchLatest,
+ fetchScene,
};
diff --git a/src/utils/qu.js b/src/utils/qu.js
index c7ee1c75..58ec062b 100644
--- a/src/utils/qu.js
+++ b/src/utils/qu.js
@@ -5,7 +5,10 @@ const moment = require('moment');
const http = require('./http');
function trim(str) {
- if (!str) return null;
+ if (typeof str !== 'string') {
+ return null;
+ }
+
return str.trim().replace(/\s+/g, ' ');
}
@@ -263,6 +266,7 @@ function init(element, window) {
}),
...legacyContextFuncs,
qu: quContextFuncs,
+ query: quContextFuncs,
};
}