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, }; }